Disable backspace key in a Richfaces application

Friday, 6. November 2009 Andreas Höhmann Leave a comment

If you want disable the Backspace key in your JSF Richfaces application put this in your view:

<rich:hotKey key="backspace" handler="return false;" disableInInput="true"/>

This will register a jQuery Hotkey handler for the document. The handler is not reqistered for input elements because in input fields you need the backspace ;-) . Tested for FF3 and IE6.

Then I found out that the following snippet doesn’t work:

<rich:hotKey key="backspace"
             disableInInput="true"
             handler="alert('Backspace is disabled'); return false;" />

The Browser open the alert box go to the previous page (in background?!). But there is fix for that:

<rich:hotKey key="backspace"
             disableInInput="true"
             handler="alert('Backspace is disabled'); event.stopPropagation(); event.preventDefault(); return false;" />

The event variable is available in the handler function (see org.richfaces.renderkit.html.HotKeyRenderer method doEncodeEnd).

Better IE scroll bar bugfix

Tuesday, 3. November 2009 Andreas Höhmann Leave a comment

Today I want to write about a better fix for the “ie scroll bar bug”.

First a short description of the problem …  a picture says more than 1000 words:

ie_scrollbar_bug

The horizontal scroll bar become visible as a result of the shown vertical scroll bar.

But I’m expecting this:

ie_scrollbar_bug_expected

I found some articles about solutions to void the unnecessary x scroll bar in internet explorer:

The IE quirks mode workaround is not my prefered solution, I want use the xhtml 11 doctype

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1//EN”
“http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”>

To hide the horizontal scoll bar is usefull if you doesn’t have content that can overflow the views width, i.e. if the view-content have a”width of 100%. But if you have view-content with a dynamic width (!= 100%) then you need horizontal scroll bars.

Here is my solution:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
  <style type="text/css">
    div.view {
      overflow: auto;
      width: 100%;
      background-color: #000044;
      color: white;
      height: 100px;
    }
    div.content {
      background-color: white;
      color: red;
    }
    * html div.verticalScrollerContainerFix {
      float: left;
    }
    * html div.verticalScrollerContainer {
      width: 100%;
      height: 100%;
    }
  </style>
</head>
<body>
  <div class="view">
    <div class="verticalScrollerContainerFix">
      <div class="verticalScrollerContainer">
        <div class="content" style="width: 400px; height: 2000px;">
          width: 400px; height: 2000px;
        </div>
        Foobar
      </div>
    </div>
  </div>
</body>
</html>

My solution based on conditional css styles  verticalScrollerContainerFix and  verticalScrollerContainer. The structure is always the same:

    <div class="verticalScrollerContainerFix">
      <!-- this div will float to left - place for the vertical scroll bar (if necessary) -->
      <div class="verticalScrollerContainer">
        <!-- a container for the content -->
        YOUR CONTENT HERE
      </div>
    </div>

Try it ;)

Categories: CSS, HTML Tags: , , ,

Toggle jrebel with a cygwin bash function and maven

Monday, 2. November 2009 Andreas Höhmann Leave a comment

I’m using java rebel for web development with maven.

Sometimes I would run jetty with jrebel sometimes without.

For that I’m using two simple bash functions:

# ~/.bashrc

#
# Maven options
#
export INTERNAL_MAVEN_OPTS="-Xmx512m -XX:PermSize=128m -XX:MaxPermSize=128m"

#
# Java Rebel
#
export JAVA_REBEL="-Drebel.spring_plugin=true -Drebel.log=false -noverify -javaagent:D:\tools\javarebel\jrebel.jar -Drebel.packages=de.ahoehma"

function jrebel_on() {
 export MAVEN_OPTS="$INTERNAL_MAVEN_OPTS $JAVA_REBEL"
}

function jrebel_off() {
 export MAVEN_OPTS="$INTERNAL_MAVEN_OPTS"
}

Now its very simple to enable

$ jrebel_on

or disable jrebel

$ jrebel_off
Categories: Java Tags: , , , , , ,

Private Digitalkopie bleibt erlaubt

Thursday, 29. October 2009 Andreas Höhmann Leave a comment

Quelle: handelsblatt

Wie im Urheberrechtsgesetz §53 nachzulesen:

(1) Zulässig sind einzelne Vervielfältigungen eines Werkes durch eine natürliche Person zum privaten Gebrauch auf beliebigen Trägern, sofern sie weder unmittelbar noch mittelbar Erwerbszwecken dienen, soweit nicht zur Vervielfältigung eine offensichtlich rechtswidrig hergestellte Vorlage verwendet wird. Der zur Vervielfältigung Befugte darf die Vervielfältigungsstücke auch durch einen anderen herstellen lassen, sofern dies unentgeltlich geschieht oder es sich um Vervielfältigungen auf Papier oder einem ähnlichen Träger mittels beliebiger photomechanischer Verfahren oder anderer Verfahren mit ähnlicher Wirkung handelt.

Die Klage der Musikindustrie wurde aus formalen Gründen abgelehnt.

Siehe auch hier: Gesetz über Urheberrecht und verwandte Schutzrechte

Categories: Medien Tags: , ,

Quality Center Mylyn Integration

Wednesday, 28. October 2009 Andreas Höhmann Leave a comment

There is a interesting project at sourceforge called qcMylyn.  The projects aims to provide a Mylyn connector for Quality Center. Support Eclipse 3.4.2, 3.5, Mylyn 3.0.5+.

I tried the released version 0.2.4 but it didn’t work because at work we are using an older version of QualityCenter (9.1). But this was no big problem I have the sourcecode (OS rocks) and I’m a programmer ;)

I found out that a other project called QcTools4J contains the java code for manipulation a QC system. They using a com4j bridge to bind QC’s otaclient.dll.

If you have trouble with a older/newer version of QC you have to update the qctools4j.

You find a short tutorial how to update qctools4j here. (read this first) … then you will come to the point where you want create a new otaclient.jar from you local otaclient.dll. Here is my simple solution for that.

I create my own otaclient maven project with the following pom:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>otaclient</groupId>
      <artifactId>otaclient</artifactId>
      <version>9.1.0.4372</version>
      <dependencies>
        <dependency>
          <groupId>org.jvnet.com4j</groupId>
          <artifactId>com4j</artifactId>
          <version>20080107</version>
        </dependency>
      </dependencies>
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <source>1.5</source>
              <target>1.5</target>
            </configuration>
          </plugin>
          <plugin>
            <groupId>org.jvnet.com4j</groupId>
            <artifactId>maven-com4j-plugin</artifactId>
            <executions>
              <execution>
                <id>gen-java-bridge</id>
                <goals>
                  <goal>gen</goal>
                </goals>
                <configuration>
                  <file>src/qc/OTAClient.dll</file>
                  <package>com.mercury.qualitycenter.otaclient</package>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </project>

I using the maven-com4j-plugin to generate the java layer for otaclient.

All you have to do is to extract your “qc client package” (could be download from every qc server page) into src/qc and start mvn clean package.

Then target will contain a otaclient-9.1.0.4372.jar. Copy this jar into qctools4j/lib/com.mercury.qualitycenter.otaclient-9.2.jar and rebuild qctools4j. That’s all :)

qcmylyn_otaclient

Then copy the qctools4j.jar into org.tszadel.qctools and rebuild the whole eclipse feature.

qcmylyn_qctools4j

Try it :)

Google Konfuzius Image

Monday, 28. September 2009 Andreas Höhmann Leave a comment

Today the google image contains a quotation from the first didactic play of Lùnyǔ:

有朋自遠方來,不亦樂乎?

In pinyin this meens

1 2 3 4 5 6, 7
yǒu péng yuǎn fāng lái, yìyuè
来, 不亦乐乎

1 exists, have, there is
2 friend
3 from
4 far, away
5 square
6 come
7 ???

If a friend visits you from far away, it is always a joy. Isn’t it?

or in german

Wenn ein Freund von weit her kommt, ist das nicht auch eine Freude?

Categories: china Tags: , , ,

My favourite java ide is eclipse

Monday, 21. September 2009 Andreas Höhmann Leave a comment
Categories: Java

Customized Richfaces Tree

Thursday, 10. September 2009 Andreas Höhmann Leave a comment

Yesterday I had to customize the Richfaces tree component, because my client wants a special layout. My solution is a little bit strange. I share it here for someone which is in the same situation ;) Here is the story …

Per default the rich:tree looks like a standard tree browser (i.e. explorer, eclipse, whatever):

rich_tree_standard

But I want this look:

rich_tree_customized

You see that the expand/collapse icon (rich_tree_expand) is on the same level with the node-icon (rich_tree_leaf). That’s very hard to fix this with CSS (it’s possible but i prefer my strange solution ;) ). The Richfaces documentation describes which parts of a tree could be customize.

We have:

  • rich-tree-node-handle and rich-tree-node-handleicon – a td which contains a link and a image to expand/collapse the node (only possible for a node not a leaf)
  • rich-tree-node-icon – is a td which contains the image for a node (a node with children)
  • rich-tree-node-icon-leaf – is a td which contains the image for a leaf (a node without children)

I decide to move the expand/collapse icon from the handle-td to the icon-td and “simulate” the user-click with Javascript:

rich_tree_expand_move

Listing 1 tree.xhtml:

<rich:tree id="tree"
              binding="#{treeBean.tree}"
              var="item"
              switchType="ajax"
              ajaxSubmitSelection="true"
              toggleOnClick="false"
              showConnectingLines="false"
              disableKeyboardNavigation="true">

    <f:facet name="iconCollapsed">
       <!-- no image for collapsed -->
       <rich:spacer width="0"  height="0" style="border: none;"/>
    </f:facet>
    <f:facet name="iconExpanded">
       <!-- no image for expanded -->
       <rich:spacer width="0"  height="0" style="border: none;"/>
    </f:facet>

    <f:facet name="icon">
       <!--  use normal node icon to toggle expand/collapse -->
       <h:panelGroup>
          <h:graphicImage value="#{item.isLeaf ? '/images/leaf.gif' : '/images/collapsed.gif'}"
                                 onclick="myToggleTreeNode(this);"
                                 rendered="#{!treeBean.isExpanded}"/>
          <h:graphicImage value="#{item.isLeaf ? '/images/leaf.gif' : '/images/expanded.gif'}"
                                 onclick="myToggleTreeNode(this);"
                                 rendered="#{treeBean.isExpanded}"/>
       </h:panelGroup>
    </f:facet>

    <f:facet name="iconLeaf">
       <h:graphicImage value="/images/leaf.gif"/>
    </f:facet>

    <rich:recursiveTreeNodesAdaptor roots="#{treeBean.roots}" var="item" nodes="#{item.children}">
       <rich:treeNode>
          <h:outputText value="#{item.name}"/>
       </rich:treeNode>
    </rich:recursiveTreeNodesAdaptor>
</rich:tree>

Listing 2 tree.js:

function myToggleTreeNode(element) {
  var elem = jQuery(element);
  // img -> span -> td
  var parent = elem.parent().parent();
  var elementId = parent.attr("id");
  // i.e. j_id31:tree:j__id39:18::j_id40:icon -> the td arround the icon-image
  var index = elementId.lastIndexOf(":icon");
  var treeNodeId = elementId.substring(0, index);
  // i.e. j_id31:tree:j__id39:18::j_id40:handle -> the td arround the original expand/collapse-image
  var handleId = treeNodeId+':handle';
  // pure jQuery not working here
  var expandElement = jQuery($(handleId));
  expandElement.trigger("click");
}

Listing 3 tree.css:

.rich-tree-node-handleicon {
  display: none;
}
Categories: JSF, Richfaces Tags: , , , ,

Nice example for a checked unchecked exception

Wednesday, 9. September 2009 Andreas Höhmann Leave a comment

Today I found a nice example for a “checked null pointer exception” in Ed burns blog.

@Override
public void encodeAll(FacesContext context) throws IOException {
   ResponseWriter writer = context.getResponseWriter();
   String viewName, libraryName, resourceName;
   try {
     viewName = this.getAttributes().get("viewName").toString();
     libraryName = this.getAttributes().get("libraryName").toString();
     resourceName = this.getAttributes().get("resourceName").toString();
    } catch (NullPointerException e) {
     throw new FacesException("Must supply viewName, libraryName and resourceName attributes");
   }
   ...
}

I have always tried to avoid NPE’s with code like this:

if (foobar == null) {
  throw new IllegalArgumentException("foobar must not be null").
}

But from now I will try to use the “checked” version of a npe check above more often.

Read more about checked / unchecked exceptions here:

  • [a] http://www.javapractices.com/topic/TopicAction.do?Id=129
  • [b] http://en.wikipedia.org/wiki/Exception_handling#Checked_exceptions
  • [c] http://de.wikipedia.org/wiki/Ausnahmebehandlung#Checked_Exceptions
  • [d] http://java.sun.com/docs/books/jls/second_edition/html/exceptions.doc.html
  • [e] http://www.mindview.net/Etc/Discussions/CheckedExceptions
Categories: Java Tags:

Risikio Schweinegrippe-Impfstoff

Tuesday, 8. September 2009 Andreas Höhmann Leave a comment

In Naturheil-Blog sind ein paar Hintergründe zum Impfstoff zu lesen, z.B. hier und hier. Den Grippe-Report sollte man sich auch mal durchlesen.

Categories: Gesundheit Tags: ,