Restore user written text on selection reset in viewer
diff --git a/bundles/org.eclipse.rap.addons.dropdown.viewer/src/org/eclipse/rap/addons/dropdown/viewer/DropDownViewer.java b/bundles/org.eclipse.rap.addons.dropdown.viewer/src/org/eclipse/rap/addons/dropdown/viewer/DropDownViewer.java
index de2ba60..8930dc4 100644
--- a/bundles/org.eclipse.rap.addons.dropdown.viewer/src/org/eclipse/rap/addons/dropdown/viewer/DropDownViewer.java
+++ b/bundles/org.eclipse.rap.addons.dropdown.viewer/src/org/eclipse/rap/addons/dropdown/viewer/DropDownViewer.java
@@ -227,7 +227,7 @@
     return clientListeners.getDropDownHideListener();
   }
 
-  // TODO : make exchangeable by accepting a class that extends the holder in the constructor
+  // TODO : no longer planned to be replaceable, streamline.
   private ClientListenerHolder getClientListenerHolder() {
     Object result = RWT.getUISession().getAttribute( ATTR_CLIENT_LISTNER_HOLDER );
     if( result == null ) {
diff --git a/bundles/org.eclipse.rap.addons.dropdown.viewer/src/org/eclipse/rap/addons/dropdown/viewer/internal/resources/DropDownEventListener.js b/bundles/org.eclipse.rap.addons.dropdown.viewer/src/org/eclipse/rap/addons/dropdown/viewer/internal/resources/DropDownEventListener.js
index 40b3193..81d78ed 100644
--- a/bundles/org.eclipse.rap.addons.dropdown.viewer/src/org/eclipse/rap/addons/dropdown/viewer/internal/resources/DropDownEventListener.js
+++ b/bundles/org.eclipse.rap.addons.dropdown.viewer/src/org/eclipse/rap/addons/dropdown/viewer/internal/resources/DropDownEventListener.js
@@ -53,10 +53,10 @@
 }
 
 function handleSelection( event ) {
+  var dropdown = event.widget;
+  var viewer = rap.getObject( dropdown.getData( VIEWER_KEY ) );
+  var text = rap.getObject( viewer.get( "text" ) );
   if( event.text.length > 0 ) {
-    var dropdown = event.widget;
-    var viewer = rap.getObject( dropdown.getData( VIEWER_KEY ) );
-    var text = rap.getObject( viewer.get( "text" ) );
     text.setData( "selecting", true );
     text.setText( event.text );
     text.setSelection( [ 0, event.text.length ] );
@@ -64,6 +64,11 @@
       handleDefaultSelection( event );
       dropdown.hide();
     }
+  } else {
+    var userText = dropdown.getData( "userText" );
+    userText = userText ? userText : "";
+    text.setText( userText );
+    text.setSelection( [ userText.length, userText.length ] );
   }
 }
 
diff --git a/bundles/org.eclipse.rap.addons.dropdown.viewer/src/org/eclipse/rap/addons/dropdown/viewer/internal/resources/TextEventListener.js b/bundles/org.eclipse.rap.addons.dropdown.viewer/src/org/eclipse/rap/addons/dropdown/viewer/internal/resources/TextEventListener.js
index 257b0f7..765091b 100644
--- a/bundles/org.eclipse.rap.addons.dropdown.viewer/src/org/eclipse/rap/addons/dropdown/viewer/internal/resources/TextEventListener.js
+++ b/bundles/org.eclipse.rap.addons.dropdown.viewer/src/org/eclipse/rap/addons/dropdown/viewer/internal/resources/TextEventListener.js
@@ -34,11 +34,11 @@
   // See Bug 404896 - [ClientScripting] Verify event keyCode is always zero when replacing txt
   if( event.text !== "" /* && event.keyCode !== 0 */ ) {
     event.widget.setData( "typing", true );
+  } else {
+    event.widget.setData( "deleting", true );
   }
 }
 
-//TODO : This can get very slow with huge lists. Possible optimizations include caching results,
-//       limiting result length (at least until first selection occurs), and virtual rendering
 function handleModify( event ) {
   var widget = event.widget;
   var text = widget.getText().toLowerCase();
@@ -57,8 +57,12 @@
     showError( viewer, false )
   }
   var typing = widget.getData( "typing" );
+  if( typing || widget.getData( "deleting" ) ) {
+    dropdown.setData( "userText", widget.getText() );
+  }
   var selecting = widget.getData( "selecting" );
   widget.setData( "typing", false );
+  widget.setData( "deleting", false );
   widget.setData( "selecting", false );
   if( !selecting ) {
     if( result.items.length > 0 ) {