Merge branch 'Text' into features/protocol-event-renaming
diff --git a/bundles/org.eclipse.rap.rwt/js/org/eclipse/rwt/KeyEventSupport.js b/bundles/org.eclipse.rap.rwt/js/org/eclipse/rwt/KeyEventSupport.js
index 00a194a..f9462f5 100644
--- a/bundles/org.eclipse.rap.rwt/js/org/eclipse/rwt/KeyEventSupport.js
+++ b/bundles/org.eclipse.rap.rwt/js/org/eclipse/rwt/KeyEventSupport.js
@@ -76,20 +76,28 @@
     _shouldSend : function( eventType, keyCode, charCode, domEvent, control ) {
       var result = false;
       if( this._isRelevant( keyCode, eventType, domEvent ) ) {
-        if( this._hasTraverseListener( control ) && this._isTraverseKey( keyCode ) ) {
+        result =    this._shouldSendTraverse( keyCode, charCode, domEvent, control )
+                 || this._shouldSendKeyDown( keyCode, charCode, domEvent, control );
+      }
+      return result;
+    },
+
+    _shouldSendTraverse : function( keyCode, charCode, domEvent, control ) {
+      return this._hasTraverseListener( control ) && this._isTraverseKey( keyCode );
+    },
+
+    _shouldSendKeyDown : function( keyCode, charCode, domEvent, control ) {
+      var result = false;
+      if( this._hasKeyListener( control ) ) {
+        var activeKeys = control.getUserData( "activeKeys" );
+        if( activeKeys ) {
+          result = this._isActive( activeKeys, domEvent, keyCode, charCode );
+        } else {
           result = true;
         }
-        if( !result && this._hasKeyListener( control ) ) {
-          var activeKeys = control.getUserData( "activeKeys" );
-          if( activeKeys ) {
-            result = this._isActive( activeKeys, domEvent, keyCode, charCode );
-          } else {
-            result = true;
-          }
-        }
-        if( !result ) {
-          result = this._isActive( this._keyBindings, domEvent, keyCode, charCode );
-        }
+      }
+      if( !result ) {
+        result = this._isActive( this._keyBindings, domEvent, keyCode, charCode );
       }
       return result;
     },
@@ -164,7 +172,12 @@
         "charCode" : finalCharCode
       };
       org.eclipse.swt.EventUtil.addModifierToProperties( properties );
-      serverObject.notify( "KeyDown", properties, true );
+      if( this._shouldSendTraverse( keyCode, charCode, domEvent, widget ) ) {
+        serverObject.notify( "Traverse", properties, true );
+      }
+      if( this._shouldSendKeyDown( keyCode, charCode, domEvent, widget ) ) {
+        serverObject.notify( "KeyDown", properties, true );
+      }
     },
 
     ///////////////
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/ClientMessageConst.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/ClientMessageConst.java
index 7cf45ce..dedaf04 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/ClientMessageConst.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/ClientMessageConst.java
@@ -35,6 +35,7 @@
   public static final String EVENT_MOUSE_UP = "MouseUp";
   public static final String EVENT_MOUSE_DOUBLE_CLICK = "MouseDoubleClick";
   public static final String EVENT_KEY_DOWN = "KeyDown";
+  public static final String EVENT_TRAVERSE = "Traverse";
   public static final String EVENT_HELP = "Help";
   public static final String EVENT_MENU_DETECT = "MenuDetect";
 
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/lifecycle/ControlLCAUtil.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/lifecycle/ControlLCAUtil.java
index b5fa65c..fe2086c 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/lifecycle/ControlLCAUtil.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/lifecycle/ControlLCAUtil.java
@@ -155,6 +155,21 @@
   }
 
   public static void processKeyEvents( Control control ) {
+    if( WidgetLCAUtil.wasEventSent( control, ClientMessageConst.EVENT_TRAVERSE ) ) {
+      int keyCode = readEventIntProperty( control,
+                                          ClientMessageConst.EVENT_TRAVERSE,
+                                          ClientMessageConst.EVENT_PARAM_KEY_CODE );
+      int charCode = readEventIntProperty( control,
+                                           ClientMessageConst.EVENT_TRAVERSE,
+                                           ClientMessageConst.EVENT_PARAM_CHAR_CODE );
+      int stateMask = EventLCAUtil.readStateMask( control, ClientMessageConst.EVENT_TRAVERSE );
+      int traverseKey = getTraverseKey( keyCode, stateMask );
+      if( traverseKey != SWT.TRAVERSE_NONE ) {
+        Event event = createKeyEvent( keyCode, charCode, stateMask );
+        event.detail = traverseKey;
+        control.notifyListeners( SWT.Traverse, event );
+      }
+    }
     if( WidgetLCAUtil.wasEventSent( control, ClientMessageConst.EVENT_KEY_DOWN ) ) {
       int keyCode = readEventIntProperty( control,
                                           ClientMessageConst.EVENT_KEY_DOWN,
@@ -163,14 +178,7 @@
                                            ClientMessageConst.EVENT_KEY_DOWN,
                                            ClientMessageConst.EVENT_PARAM_CHAR_CODE );
       int stateMask = EventLCAUtil.readStateMask( control, ClientMessageConst.EVENT_KEY_DOWN );
-      int traverseKey = getTraverseKey( keyCode, stateMask );
-      Event event;
-      if( traverseKey != SWT.TRAVERSE_NONE ) {
-        event = createKeyEvent( keyCode, charCode, stateMask );
-        event.detail = traverseKey;
-        control.notifyListeners( SWT.Traverse, event );
-      }
-      event = createKeyEvent( keyCode, charCode, stateMask );
+      Event event = createKeyEvent( keyCode, charCode, stateMask );
       control.notifyListeners( SWT.KeyDown, event );
       event = createKeyEvent( keyCode, charCode, stateMask );
       control.notifyListeners( SWT.KeyUp, event );
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/SelectionEvent.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/SelectionEvent.java
index 80c76c7..53372d3 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/SelectionEvent.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/SelectionEvent.java
@@ -138,19 +138,6 @@
    * @deprecated not part of the API, do not use in application code
    */
   @Deprecated
-  public static boolean hasListener( Widget adaptable ) {
-    boolean result = false;
-    for( int i = 0; !result && i < EVENT_TYPES.length; i++ ) {
-      result = adaptable.isListening( EVENT_TYPES[ i ] );
-    }
-    return result;
-  }
-
-  /**
-   * @since 2.0
-   * @deprecated not part of the API, do not use in application code
-   */
-  @Deprecated
   public static void addListener( Widget adaptable, SelectionListener listener ) {
     if( listener == null ) {
       SWT.error( SWT.ERROR_NULL_ARGUMENT );
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/events/EventLCAUtil.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/events/EventLCAUtil.java
index f3d32b7..b7fd37d 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/events/EventLCAUtil.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/events/EventLCAUtil.java
@@ -70,6 +70,19 @@
     return result;
   }
 
+  public static boolean hasScrollBarsSelectionListener( Scrollable scrollable ) {
+    boolean result = false;
+    ScrollBar horizontalBar = scrollable.getHorizontalBar();
+    if( horizontalBar != null ) {
+      result = result || horizontalBar.isListening( SWT.Selection );
+    }
+    ScrollBar verticalBar = scrollable.getVerticalBar();
+    if( verticalBar != null ) {
+      result = result || verticalBar.isListening( SWT.Selection );
+    }
+    return result;
+  }
+
   public static void processScrollBarSelection( Scrollable scrollable ) {
     String eventName = EventLCAUtil.EVENT_SCROLLBAR_SELECTED;
     if( WidgetLCAUtil.wasEventSent( scrollable, eventName ) ) {
diff --git a/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/custom/scrolledcompositekit/ScrolledCompositeLCA.java b/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/custom/scrolledcompositekit/ScrolledCompositeLCA.java
index 5f92c99..4831617 100644
--- a/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/custom/scrolledcompositekit/ScrolledCompositeLCA.java
+++ b/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/custom/scrolledcompositekit/ScrolledCompositeLCA.java
@@ -26,7 +26,6 @@
 import org.eclipse.rap.rwt.lifecycle.WidgetLCAUtil;
 import org.eclipse.rap.rwt.lifecycle.WidgetUtil;
 import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.internal.events.EventLCAUtil;
 import org.eclipse.swt.widgets.ScrollBar;
@@ -64,7 +63,7 @@
     preserveProperty( composite, PROP_SCROLLBARS_VISIBLE, getScrollBarsVisible( composite ) );
     preserveListener( composite,
                       PROP_SCROLLBARS_SELECTION_LISTENER,
-                      hasScrollBarsSelectionListener( composite ) );
+                      EventLCAUtil.hasScrollBarsSelectionListener( composite ) );
   }
 
   public void readData( Widget widget ) {
@@ -114,7 +113,7 @@
                     DEFAULT_SCROLLBARS_VISIBLE );
     renderListener( composite,
                     PROP_SCROLLBARS_SELECTION_LISTENER,
-                    hasScrollBarsSelectionListener( composite ),
+                    EventLCAUtil.hasScrollBarsSelectionListener( composite ),
                     false );
   }
 
@@ -153,16 +152,4 @@
     return verticalBar != null && verticalBar.getVisible();
   }
 
-  private static boolean hasScrollBarsSelectionListener( ScrolledComposite composite ) {
-    boolean result = false;
-    ScrollBar horizontalBar = composite.getHorizontalBar();
-    if( horizontalBar != null ) {
-      result = result || SelectionEvent.hasListener( horizontalBar );
-    }
-    ScrollBar verticalBar = composite.getVerticalBar();
-    if( verticalBar != null ) {
-      result = result || SelectionEvent.hasListener( verticalBar );
-    }
-    return result;
-  }
 }
diff --git a/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/buttonkit/ButtonLCAUtil.java b/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/buttonkit/ButtonLCAUtil.java
index 670769e..eeef06d 100644
--- a/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/buttonkit/ButtonLCAUtil.java
+++ b/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/buttonkit/ButtonLCAUtil.java
@@ -22,7 +22,6 @@
 import org.eclipse.rap.rwt.lifecycle.WidgetLCAUtil;
 import org.eclipse.rap.rwt.lifecycle.WidgetUtil;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.widgets.Button;
 
 
@@ -55,7 +54,7 @@
     preserveProperty( button, PROP_SELECTION, Boolean.valueOf( button.getSelection() ) );
     preserveProperty( button, PROP_GRAYED, Boolean.valueOf( button.getGrayed() ) );
     preserveProperty( button, PROP_ALIGNMENT, getAlignment( button ) );
-    preserveListener( button, PROP_SELECTION_LISTENERS, SelectionEvent.hasListener( button ) );
+    preserveListener( button, PROP_SELECTION_LISTENERS, button.isListening( SWT.Selection ) );
   }
 
   static void renderInitialization( Button button ) {
@@ -73,7 +72,7 @@
     renderProperty( button, PROP_ALIGNMENT, getAlignment( button ), DEFAULT_ALIGNMENT );
     renderProperty( button, PROP_SELECTION, button.getSelection(), false );
     renderProperty( button, PROP_GRAYED, button.getGrayed(), false );
-    renderListener( button, PROP_SELECTION_LISTENERS, SelectionEvent.hasListener( button ), false );
+    renderListener( button, PROP_SELECTION_LISTENERS, button.isListening( SWT.Selection ), false );
   }
 
   static boolean readSelection( Button button ) {
diff --git a/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/datetimekit/DateTimeLCAUtil.java b/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/datetimekit/DateTimeLCAUtil.java
index 6a862c9..0e47b37 100644
--- a/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/datetimekit/DateTimeLCAUtil.java
+++ b/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/datetimekit/DateTimeLCAUtil.java
@@ -21,7 +21,7 @@
 import org.eclipse.rap.rwt.lifecycle.ControlLCAUtil;
 import org.eclipse.rap.rwt.lifecycle.WidgetLCAUtil;
 import org.eclipse.rap.rwt.lifecycle.WidgetUtil;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.internal.widgets.IDateTimeAdapter;
@@ -50,7 +50,7 @@
   static void preserveValues( DateTime dateTime ) {
     ControlLCAUtil.preserveValues( dateTime );
     WidgetLCAUtil.preserveCustomVariant( dateTime );
-    preserveListener( dateTime, PROP_SELECTION_LISTENER, SelectionEvent.hasListener( dateTime ) );
+    preserveListener( dateTime, PROP_SELECTION_LISTENER, dateTime.isListening( SWT.Selection ) );
   }
 
   static void renderInitialization( DateTime dateTime ) {
@@ -65,7 +65,7 @@
     WidgetLCAUtil.renderCustomVariant( dateTime );
     renderListener( dateTime,
                     PROP_SELECTION_LISTENER,
-                    SelectionEvent.hasListener( dateTime ),
+                    dateTime.isListening( SWT.Selection ),
                     false );
   }
 
@@ -151,6 +151,7 @@
       this.height = bounds.height;
     }
 
+    @Override
     public boolean equals( Object obj ) {
       boolean result;
       if( obj == this ) {
@@ -168,6 +169,7 @@
       return result;
     }
 
+    @Override
     public int hashCode() {
       String msg = "SubWidgetBounds#hashCode() not implemented";
       throw new UnsupportedOperationException( msg );
diff --git a/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/tablekit/TableLCA.java b/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/tablekit/TableLCA.java
index 85425f9..5ade2e4 100644
--- a/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/tablekit/TableLCA.java
+++ b/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/tablekit/TableLCA.java
@@ -32,7 +32,6 @@
 import org.eclipse.rap.rwt.lifecycle.WidgetLCAUtil;
 import org.eclipse.rap.rwt.lifecycle.WidgetUtil;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.internal.events.EventLCAUtil;
 import org.eclipse.swt.internal.widgets.CellToolTipUtil;
@@ -113,7 +112,7 @@
     preserveProperty( table, PROP_SCROLLBARS_VISIBLE, getScrollBarsVisible( table ) );
     preserveListener( table,
                       PROP_SCROLLBARS_SELECTION_LISTENER,
-                      hasScrollBarsSelectionListener( table ) );
+                      EventLCAUtil.hasScrollBarsSelectionListener( table ) );
     preserveListener( table, PROP_SELECTION_LISTENER, table.isListening( SWT.Selection ) );
     preserveListener( table,
                       PROP_DEFAULT_SELECTION_LISTENER,
@@ -184,7 +183,7 @@
                     DEFAULT_SCROLLBARS_VISIBLE );
     renderListener( table,
                     PROP_SCROLLBARS_SELECTION_LISTENER,
-                    hasScrollBarsSelectionListener( table ),
+                    EventLCAUtil.hasScrollBarsSelectionListener( table ),
                     false );
     renderListener( table, PROP_SELECTION_LISTENER, table.isListening( SWT.Selection ), false );
     renderListener( table,
@@ -369,19 +368,6 @@
     return table.getAdapter( ITableAdapter.class ).hasVScrollBar();
   }
 
-  private static boolean hasScrollBarsSelectionListener( Table table ) {
-    boolean result = false;
-    ScrollBar horizontalBar = table.getHorizontalBar();
-    if( horizontalBar != null ) {
-      result = result || SelectionEvent.hasListener( horizontalBar );
-    }
-    ScrollBar verticalBar = table.getVerticalBar();
-    if( verticalBar != null ) {
-      result = result || SelectionEvent.hasListener( verticalBar );
-    }
-    return result;
-  }
-
   private static void processScrollBarSelection( ScrollBar scrollBar, int selection ) {
     if( scrollBar != null ) {
       scrollBar.setSelection( selection );
diff --git a/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/treekit/TreeLCA.java b/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/treekit/TreeLCA.java
index a6b0c91..5e25ad3 100644
--- a/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/treekit/TreeLCA.java
+++ b/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/treekit/TreeLCA.java
@@ -32,7 +32,6 @@
 import org.eclipse.rap.rwt.lifecycle.WidgetLCAUtil;
 import org.eclipse.rap.rwt.lifecycle.WidgetUtil;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.internal.events.EventLCAUtil;
 import org.eclipse.swt.internal.widgets.CellToolTipUtil;
@@ -112,7 +111,7 @@
     preserveProperty( tree, PROP_SCROLLBARS_VISIBLE, getScrollBarsVisible( tree ) );
     preserveListener( tree,
                       PROP_SCROLLBARS_SELECTION_LISTENER,
-                      hasScrollBarsSelectionListener( tree ) );
+                      EventLCAUtil.hasScrollBarsSelectionListener( tree ) );
     preserveListener( tree, PROP_SELECTION_LISTENER, tree.isListening( SWT.Selection ) );
     preserveListener( tree,
                       PROP_DEFAULT_SELECTION_LISTENER,
@@ -188,7 +187,7 @@
                     DEFAULT_SCROLLBARS_VISIBLE );
     renderListener( tree,
                     PROP_SCROLLBARS_SELECTION_LISTENER,
-                    hasScrollBarsSelectionListener( tree ),
+                    EventLCAUtil.hasScrollBarsSelectionListener( tree ),
                     false );
     renderListener( tree, PROP_SELECTION_LISTENER, tree.isListening( SWT.Selection ), false );
     renderListener( tree,
@@ -368,19 +367,6 @@
     return getTreeAdapter( tree ).hasVScrollBar();
   }
 
-  private static boolean hasScrollBarsSelectionListener( Tree tree ) {
-    boolean result = false;
-    ScrollBar horizontalBar = tree.getHorizontalBar();
-    if( horizontalBar != null ) {
-      result = result || SelectionEvent.hasListener( horizontalBar );
-    }
-    ScrollBar verticalBar = tree.getVerticalBar();
-    if( verticalBar != null ) {
-      result = result || SelectionEvent.hasListener( verticalBar );
-    }
-    return result;
-  }
-
   private static void processScrollBarSelection( ScrollBar scrollBar, int selection ) {
     if( scrollBar != null ) {
       scrollBar.setSelection( selection );
diff --git a/bundles/org.eclipse.rap.ui.forms/.settings/com.eclipsesource.jshint.ui.prefs b/bundles/org.eclipse.rap.ui.forms/.settings/com.eclipsesource.jshint.ui.prefs
index 325d172..cd31a3b 100644
--- a/bundles/org.eclipse.rap.ui.forms/.settings/com.eclipsesource.jshint.ui.prefs
+++ b/bundles/org.eclipse.rap.ui.forms/.settings/com.eclipsesource.jshint.ui.prefs
@@ -1,5 +1,5 @@
-eclipse.preferences.version=1
-globals=org\: true, qx\: true, qxsettings\: true, qxvariants\: true, namespace\: false
-included=js//*.js
-options=bitwise\: true, curly\: true, eqnull\: true, shadow\: true, funcscope\: true, undef\: true, browser\: true, laxbreak\: true
-projectSpecificOptions=true
+eclipse.preferences.version=1

+globals=org\:false,qx\:false,rwt\: false, namespace\: false

+included=js//*.js

+options=bitwise\: true, curly\: true, eqnull\: true, shadow\: true, funcscope\: true, undef\: true, browser\: true, laxbreak\: true

+projectSpecificOptions=true

diff --git a/bundles/org.eclipse.rap.ui.forms/js/org/eclipse/ui/forms/widgets/Hyperlink.js b/bundles/org.eclipse.rap.ui.forms/js/org/eclipse/ui/forms/widgets/Hyperlink.js
index a2e9ecb..e36a5c5 100644
--- a/bundles/org.eclipse.rap.ui.forms/js/org/eclipse/ui/forms/widgets/Hyperlink.js
+++ b/bundles/org.eclipse.rap.ui.forms/js/org/eclipse/ui/forms/widgets/Hyperlink.js
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2012 Innoopract Informationssysteme GmbH.
+ * Copyright (c) 2007, 2012 Innoopract Informationssysteme GmbH and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -48,7 +48,7 @@
     UNDERLINE_HOVER : 2,
     UNDERLINE_ALWAYS : 3
   },
-    
+
   members : {
 
     setText : function( value ) {
@@ -73,12 +73,12 @@
     setActiveTextColor : function( value ) {
       this._activeTextColor = value;      
     },
-    
+
     setUnderlineMode : function( value ) {
       this._underlineMode = value;      
     },
 
-    setHasSelectionListener : function( value ) {
+    setHasDefaultSelectionListener : function( value ) {
       if( value ) {
         this.addEventListener( "click", org.eclipse.swt.EventUtil.widgetDefaultSelected, this );
       } else {
diff --git a/bundles/org.eclipse.rap.ui.forms/js/org/eclipse/ui/forms/widgets/HyperlinkAdapter.js b/bundles/org.eclipse.rap.ui.forms/js/org/eclipse/ui/forms/widgets/HyperlinkAdapter.js
index 67474e5..528fa85 100644
--- a/bundles/org.eclipse.rap.ui.forms/js/org/eclipse/ui/forms/widgets/HyperlinkAdapter.js
+++ b/bundles/org.eclipse.rap.ui.forms/js/org/eclipse/ui/forms/widgets/HyperlinkAdapter.js
@@ -61,7 +61,7 @@
   } ),
 
   listeners : rwt.protocol.AdapterUtil.extendControlListeners( [
-    "selection"
+    "DefaultSelection"
   ] ),
 
   listenerHandler : rwt.protocol.AdapterUtil.extendControlListenerHandler( {} ),
diff --git a/bundles/org.eclipse.rap.ui.forms/js/org/eclipse/ui/forms/widgets/ToggleHyperlink.js b/bundles/org.eclipse.rap.ui.forms/js/org/eclipse/ui/forms/widgets/ToggleHyperlink.js
index a57bb29..3ef92e5 100644
--- a/bundles/org.eclipse.rap.ui.forms/js/org/eclipse/ui/forms/widgets/ToggleHyperlink.js
+++ b/bundles/org.eclipse.rap.ui.forms/js/org/eclipse/ui/forms/widgets/ToggleHyperlink.js
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2011 Innoopract Informationssysteme GmbH.
+ * Copyright (c) 2007, 2012 Innoopract Informationssysteme GmbH and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,7 +12,7 @@
 
 qx.Class.define( "org.eclipse.ui.forms.widgets.ToggleHyperlink", {
   extend : rwt.widgets.base.Image,
-  
+
   construct : function() {
     this.base( arguments );
     this.setCursor( qx.constant.Style.CURSOR_HAND );
@@ -25,12 +25,12 @@
     this.addEventListener( "mousemove", this._onMouseMove, this );
     this.addEventListener( "mouseout", this._onMouseOut, this );
   },
-  
+
   destruct : function() {
     this.removeEventListener( "mousemove", this._onMouseMove, this );
     this.removeEventListener( "mouseout", this._onMouseOut, this );
   },
-    
+
   members : {
 
     setImages : function( collapseNormal, collapseHover, expandNormal, expandHover ) {
@@ -46,7 +46,7 @@
       this._updateImage();
     },
 
-    setHasSelectionListener : function( value ) {
+    setHasDefaultSelectionListener : function( value ) {
       if( value ) {
         this.addEventListener( "click", org.eclipse.swt.EventUtil.widgetDefaultSelected, this );
       } else {
@@ -58,7 +58,7 @@
       this._hover = true;
       this._updateImage();
     },
-      
+
     _onMouseOut : function( evt ) {
       this._hover = false;
       this._updateImage();
@@ -75,6 +75,6 @@
     }
 
   }
-  
+
 } );
 
diff --git a/bundles/org.eclipse.rap.ui.forms/js/org/eclipse/ui/forms/widgets/ToggleHyperlinkAdapter.js b/bundles/org.eclipse.rap.ui.forms/js/org/eclipse/ui/forms/widgets/ToggleHyperlinkAdapter.js
index 0cb6c0f..4aeff56 100644
--- a/bundles/org.eclipse.rap.ui.forms/js/org/eclipse/ui/forms/widgets/ToggleHyperlinkAdapter.js
+++ b/bundles/org.eclipse.rap.ui.forms/js/org/eclipse/ui/forms/widgets/ToggleHyperlinkAdapter.js
@@ -36,7 +36,7 @@
   } ),
 
   listeners : rwt.protocol.AdapterUtil.extendControlListeners( [
-    "selection"
+    "DefaultSelection"
   ] ),
 
   listenerHandler : rwt.protocol.AdapterUtil.extendControlListenerHandler( {} ),
diff --git a/bundles/org.eclipse.rap.ui.forms/rap/org/eclipse/ui/forms/internal/widgets/hyperlinkkit/HyperlinkLCA.java b/bundles/org.eclipse.rap.ui.forms/rap/org/eclipse/ui/forms/internal/widgets/hyperlinkkit/HyperlinkLCA.java
index fa00f98..ce338ec 100644
--- a/bundles/org.eclipse.rap.ui.forms/rap/org/eclipse/ui/forms/internal/widgets/hyperlinkkit/HyperlinkLCA.java
+++ b/bundles/org.eclipse.rap.ui.forms/rap/org/eclipse/ui/forms/internal/widgets/hyperlinkkit/HyperlinkLCA.java
@@ -16,13 +16,14 @@
 import org.eclipse.rap.rwt.internal.protocol.ClientObjectFactory;
 import org.eclipse.rap.rwt.internal.protocol.IClientObject;
 import org.eclipse.rap.rwt.lifecycle.*;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.widgets.Widget;
 import org.eclipse.ui.forms.internal.widgets.IHyperlinkAdapter;
 import org.eclipse.ui.forms.widgets.Hyperlink;
 
 
+@SuppressWarnings("restriction")
 public class HyperlinkLCA extends AbstractWidgetLCA {
 
   private static final String TYPE = "forms.widgets.Hyperlink"; //$NON-NLS-1$
@@ -33,7 +34,7 @@
   private static final String PROP_UNDERLINE_MODE = "underlineMode"; //$NON-NLS-1$
   private static final String PROP_ACTIVE_FOREGROUND = "activeForeground"; //$NON-NLS-1$
   private static final String PROP_ACTIVE_BACKGROUND = "activeBackground"; //$NON-NLS-1$
-  private static final String PROP_SELECTION_LISTENER = "selection"; //$NON-NLS-1$
+  private static final String PROP_DEFAULT_SELECTION_LISTENER = "DefaultSelection"; //$NON-NLS-1$
 
   private static final int DEFAULT_UNDERLINE_MODE = 0;
 
@@ -43,6 +44,7 @@
     WidgetLCAUtil.processHelp( widget );
   }
 
+  @Override
   public void preserveValues( Widget widget ) {
     Hyperlink hyperlink = ( Hyperlink )widget;
     ControlLCAUtil.preserveValues( hyperlink );
@@ -56,10 +58,11 @@
     WidgetLCAUtil.preserveProperty( hyperlink,
                                     PROP_ACTIVE_BACKGROUND,
                                     getActiveBackground( hyperlink ) );
-    boolean hasListener = SelectionEvent.hasListener( hyperlink );
-    WidgetLCAUtil.preserveListener( hyperlink, PROP_SELECTION_LISTENER, hasListener );
+    boolean hasListener = hyperlink.isListening( SWT.DefaultSelection );
+    WidgetLCAUtil.preserveListener( hyperlink, PROP_DEFAULT_SELECTION_LISTENER, hasListener );
   }
 
+  @Override
   public void renderInitialization( Widget widget ) throws IOException {
     Hyperlink hyperlink = ( Hyperlink )widget;
     IClientObject clientObject = ClientObjectFactory.getClientObject( hyperlink );
@@ -68,6 +71,7 @@
     clientObject.set( "style", WidgetLCAUtil.getStyles( hyperlink, ALLOWED_STYLES ) ); //$NON-NLS-1$
   }
 
+  @Override
   public void renderChanges( Widget widget ) throws IOException {
     Hyperlink hyperlink = ( Hyperlink )widget;
     ControlLCAUtil.renderChanges( hyperlink );
@@ -86,10 +90,11 @@
                                   PROP_ACTIVE_BACKGROUND,
                                   getActiveBackground( hyperlink ),
                                   null );
-    boolean hasListener = SelectionEvent.hasListener( hyperlink );
-    WidgetLCAUtil.renderListener( hyperlink, PROP_SELECTION_LISTENER, hasListener, false );
+    boolean hasListener = hyperlink.isListening( SWT.DefaultSelection );
+    WidgetLCAUtil.renderListener( hyperlink, PROP_DEFAULT_SELECTION_LISTENER, hasListener, false );
   }
 
+  @Override
   public void renderDispose( Widget widget ) throws IOException {
     ClientObjectFactory.getClientObject( widget ).destroy();
   }
diff --git a/bundles/org.eclipse.rap.ui.forms/rap/org/eclipse/ui/forms/internal/widgets/togglehyperlinkkit/ToggleHyperlinkLCA.java b/bundles/org.eclipse.rap.ui.forms/rap/org/eclipse/ui/forms/internal/widgets/togglehyperlinkkit/ToggleHyperlinkLCA.java
index cba0994..2af6e68 100644
--- a/bundles/org.eclipse.rap.ui.forms/rap/org/eclipse/ui/forms/internal/widgets/togglehyperlinkkit/ToggleHyperlinkLCA.java
+++ b/bundles/org.eclipse.rap.ui.forms/rap/org/eclipse/ui/forms/internal/widgets/togglehyperlinkkit/ToggleHyperlinkLCA.java
@@ -17,7 +17,7 @@
 import org.eclipse.rap.rwt.internal.protocol.ClientObjectFactory;
 import org.eclipse.rap.rwt.internal.protocol.IClientObject;
 import org.eclipse.rap.rwt.lifecycle.*;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Widget;
 import org.eclipse.ui.forms.widgets.*;
@@ -27,13 +27,14 @@
  * This class serves as the LCA for org.eclipse.ui.forms.widgets.TreeNode and
  * org.eclipse.ui.forms.widgets.Twistie.
  */
+@SuppressWarnings("restriction")
 public final class ToggleHyperlinkLCA extends AbstractWidgetLCA {
 
   private static final String TYPE = "forms.widgets.ToggleHyperlink"; //$NON-NLS-1$
 
   private static final String PROP_IMAGES = "images"; //$NON-NLS-1$
   private static final String PROP_EXPANDED = "expanded"; //$NON-NLS-1$
-  private static final String PROP_SELECTION_LISTENER = "selection"; //$NON-NLS-1$
+  private static final String PROP_DEFAULT_SELECTION_LISTENER = "DefaultSelection"; //$NON-NLS-1$
 
   private static final String PREFIX = "resource/widget/rap/hyperlink/"; //$NON-NLS-1$
   private static final String MINUS_GIF = PREFIX + "minus.gif"; //$NON-NLS-1$
@@ -48,13 +49,14 @@
 
   private static final Image[] DEFAULT_IMAGES = new Image[] { null, null, null, null };
 
+  @Override
   public void preserveValues( Widget widget ) {
     ToggleHyperlink hyperlink = ( ToggleHyperlink )widget;
     ControlLCAUtil.preserveValues( hyperlink );
     WidgetLCAUtil.preserveCustomVariant( hyperlink );
     WidgetLCAUtil.preserveProperty( hyperlink, PROP_EXPANDED, hyperlink.isExpanded() );
-    boolean hasListener = SelectionEvent.hasListener( hyperlink );
-    WidgetLCAUtil.preserveListener( hyperlink, PROP_SELECTION_LISTENER, hasListener );
+    boolean hasListener = hyperlink.isListening( SWT.DefaultSelection );
+    WidgetLCAUtil.preserveListener( hyperlink, PROP_DEFAULT_SELECTION_LISTENER, hasListener );
   }
 
   public void readData( Widget widget ) {
@@ -64,6 +66,7 @@
     ControlLCAUtil.processDefaultSelection( widget, null );
   }
 
+  @Override
   public void renderInitialization( Widget widget ) throws IOException {
     ToggleHyperlink hyperlink = ( ToggleHyperlink )widget;
     IClientObject clientObject = ClientObjectFactory.getClientObject( hyperlink );
@@ -72,15 +75,17 @@
     WidgetLCAUtil.renderProperty( hyperlink, PROP_IMAGES, getImages( hyperlink ), DEFAULT_IMAGES );
   }
 
+  @Override
   public void renderChanges( Widget widget ) throws IOException {
     ToggleHyperlink hyperlink = ( ToggleHyperlink )widget;
     ControlLCAUtil.renderChanges( hyperlink );
     WidgetLCAUtil.renderCustomVariant( hyperlink );
     WidgetLCAUtil.renderProperty( hyperlink, PROP_EXPANDED, hyperlink.isExpanded(), false );
-    boolean hasListener = SelectionEvent.hasListener( hyperlink );
-    WidgetLCAUtil.renderListener( hyperlink, PROP_SELECTION_LISTENER, hasListener, false );
+    boolean hasListener = hyperlink.isListening( SWT.DefaultSelection );
+    WidgetLCAUtil.renderListener( hyperlink, PROP_DEFAULT_SELECTION_LISTENER, hasListener, false );
   }
 
+  @Override
   public void renderDispose( Widget widget ) throws IOException {
     ClientObjectFactory.getClientObject( widget ).destroy();
   }
diff --git a/tests/org.eclipse.rap.rwt.jstest/js/org/eclipse/rwt/test/tests/KeyEventSupportTest.js b/tests/org.eclipse.rap.rwt.jstest/js/org/eclipse/rwt/test/tests/KeyEventSupportTest.js
index e88ea49..a14ea8c 100644
--- a/tests/org.eclipse.rap.rwt.jstest/js/org/eclipse/rwt/test/tests/KeyEventSupportTest.js
+++ b/tests/org.eclipse.rap.rwt.jstest/js/org/eclipse/rwt/test/tests/KeyEventSupportTest.js
@@ -441,6 +441,18 @@
       this._disposeTextWidget( text );
     },
 
+    testNotifyTraverse : function() {
+      var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
+      var text = this._createTextWidget();
+
+      TestUtil.press( text, 9, false );
+
+      var msg = TestUtil.getMessageObject();
+      assertEquals( 9, msg.findNotifyProperty( "w3", "Traverse", "keyCode" ) );
+      assertEquals( 0, msg.findNotifyProperty( "w3", "Traverse", "charCode" ) );
+      this._disposeTextWidget( text );
+    },
+
     testKeyCodeLowerCase : function() {
       var TestUtil = org.eclipse.rwt.test.fixture.TestUtil;
       var text = this._createTextWidget();
@@ -688,7 +700,8 @@
         "target" : "w3",
         "action" : "listen",
         "properties" : {
-          "KeyDown" : true
+          "KeyDown" : true,
+          "Traverse" : true
         }
       } );
       var text = rwt.protocol.ObjectRegistry.getObject( "w3" );
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/lifecycle/ControlLCAUtil_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/lifecycle/ControlLCAUtil_Test.java
index 5865090..9779fd1 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/lifecycle/ControlLCAUtil_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/lifecycle/ControlLCAUtil_Test.java
@@ -293,7 +293,7 @@
     shell.addListener( SWT.KeyDown, listener );
     shell.addListener( SWT.KeyUp, listener );
 
-    fakeKeyDown( getId( shell ), 27, 0, "" );
+    fakeTraverse( getId( shell ), 27, 0, "" );
     Fixture.readDataAndProcessAction( display );
 
     assertEquals( 3, eventLog.size() );
@@ -1047,7 +1047,6 @@
     assertEquals( Boolean.FALSE, message.findListenProperty( control, "MenuDetect" ) );
   }
 
-
   private void fakeKeyDown( String target, int keyCode, int charCode, String modifier ) {
     Map<String, Object> properties = new HashMap<String, Object>();
     properties.put( ClientMessageConst.EVENT_PARAM_KEY_CODE, Integer.valueOf( keyCode ) );
@@ -1056,6 +1055,15 @@
     Fixture.fakeNotifyOperation( target, ClientMessageConst.EVENT_KEY_DOWN, properties  );
   }
 
+  private void fakeTraverse( String target, int keyCode, int charCode, String modifier ) {
+    Map<String, Object> properties = new HashMap<String, Object>();
+    properties.put( ClientMessageConst.EVENT_PARAM_KEY_CODE, Integer.valueOf( keyCode ) );
+    properties.put( ClientMessageConst.EVENT_PARAM_CHAR_CODE, Integer.valueOf( charCode ) );
+    properties.put( ClientMessageConst.EVENT_PARAM_MODIFIER, modifier );
+    Fixture.fakeNotifyOperation( target, ClientMessageConst.EVENT_KEY_DOWN, properties  );
+    Fixture.fakeNotifyOperation( target, ClientMessageConst.EVENT_TRAVERSE, properties  );
+  }
+
   private static void fakeSelectionEvent( Control control, String key, String value ) {
     String id = getId( control );
     Map<String, Object> parameters = new HashMap<String,Object>();
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/widgets/FileUpload_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/widgets/FileUpload_Test.java
index 797ddbc..2bf73ad 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/widgets/FileUpload_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/widgets/FileUpload_Test.java
@@ -21,7 +21,6 @@
 import org.eclipse.rap.rwt.testfixture.Fixture;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.graphics.Point;
@@ -167,29 +166,29 @@
   public void testAddRemoveSelectionListener() {
     FileUpload upload = new FileUpload( shell, SWT.NONE );
     SelectionListener listener = new SelectionAdapter() {};
-    assertFalse( SelectionEvent.hasListener( upload ) );
+    assertFalse( upload.isListening( SWT.Selection ) );
     upload.addSelectionListener( listener );
-    assertTrue( SelectionEvent.hasListener( upload ) );
+    assertTrue( upload.isListening( SWT.Selection ) );
     upload.removeSelectionListener( listener );
-    assertFalse( SelectionEvent.hasListener( upload ) );
+    assertFalse( upload.isListening( SWT.Selection ) );
   }
 
   public void testAddSelectionListenerRegistersUntypedListeners() {
     FileUpload upload = new FileUpload( shell, SWT.NONE );
 
     upload.addSelectionListener( mock( SelectionListener.class ) );
-    
+
     assertTrue( upload.isListening( SWT.Selection ) );
     assertTrue( upload.isListening( SWT.DefaultSelection ) );
   }
-  
+
   public void testRemoveSelectionListenerUnregistersUntypedListeners() {
     FileUpload upload = new FileUpload( shell, SWT.NONE );
     SelectionListener listener = mock( SelectionListener.class );
     upload.addSelectionListener( listener );
 
     upload.removeSelectionListener( listener );
-    
+
     assertFalse( upload.isListening( SWT.Selection ) );
     assertFalse( upload.isListening( SWT.DefaultSelection ) );
   }
@@ -253,6 +252,7 @@
     Fixture.tearDown();
   }
 
+  @SuppressWarnings( "resource" )
   private Image createImage( String name ) {
     ClassLoader loader = Fixture.class.getClassLoader();
     InputStream stream = loader.getResourceAsStream( name );
diff --git a/tests/org.eclipse.rap.ui.forms.test/src/org/eclipse/ui/forms/internal/widgets/hyperlinkkit/HyperlinkLCA_Test.java b/tests/org.eclipse.rap.ui.forms.test/src/org/eclipse/ui/forms/internal/widgets/hyperlinkkit/HyperlinkLCA_Test.java
index 4a4a3f5..ed4b90e 100644
--- a/tests/org.eclipse.rap.ui.forms.test/src/org/eclipse/ui/forms/internal/widgets/hyperlinkkit/HyperlinkLCA_Test.java
+++ b/tests/org.eclipse.rap.ui.forms.test/src/org/eclipse/ui/forms/internal/widgets/hyperlinkkit/HyperlinkLCA_Test.java
@@ -246,7 +246,7 @@
     lca.renderChanges( hyperlink );
 
     Message message = Fixture.getProtocolMessage();
-    assertEquals( Boolean.TRUE, message.findListenProperty( hyperlink, "selection" ) );
+    assertEquals( Boolean.TRUE, message.findListenProperty( hyperlink, "DefaultSelection" ) );
   }
 
   @SuppressWarnings("serial")
@@ -263,7 +263,7 @@
     lca.renderChanges( hyperlink );
 
     Message message = Fixture.getProtocolMessage();
-    assertNull( message.findListenOperation( hyperlink, "selection" ) );
+    assertNull( message.findListenOperation( hyperlink, "DefaultSelection" ) );
   }
 
   private IHyperlinkAdapter getAdapter( Hyperlink hyperlink ) {
diff --git a/tests/org.eclipse.rap.ui.forms.test/src/org/eclipse/ui/forms/internal/widgets/togglehyperlinkkit/ToggleHyperlinkLCA_Test.java b/tests/org.eclipse.rap.ui.forms.test/src/org/eclipse/ui/forms/internal/widgets/togglehyperlinkkit/ToggleHyperlinkLCA_Test.java
index c77b32c..ba065b8 100644
--- a/tests/org.eclipse.rap.ui.forms.test/src/org/eclipse/ui/forms/internal/widgets/togglehyperlinkkit/ToggleHyperlinkLCA_Test.java
+++ b/tests/org.eclipse.rap.ui.forms.test/src/org/eclipse/ui/forms/internal/widgets/togglehyperlinkkit/ToggleHyperlinkLCA_Test.java
@@ -106,7 +106,7 @@
     lca.renderChanges( twistie );
 
     Message message = Fixture.getProtocolMessage();
-    assertEquals( Boolean.TRUE, message.findListenProperty( twistie, "selection" ) );
+    assertEquals( Boolean.TRUE, message.findListenProperty( twistie, "DefaultSelection" ) );
   }
 
   @SuppressWarnings("serial")
@@ -124,7 +124,7 @@
     lca.renderChanges( twistie );
 
     Message message = Fixture.getProtocolMessage();
-    assertNull( message.findListenOperation( twistie, "selection" ) );
+    assertNull( message.findListenOperation( twistie, "DefaultSelection" ) );
   }
 
   public void testRenderInitialExpanded() throws IOException {