Use AutoSuggest in Examples demo instead of viewer

Updated AutoSuggest.js to be able to handle changing data sources
diff --git a/bundles/org.eclipse.rap.addons.dropdown/src/org/eclipse/rap/addons/dropdown/internal/resources/AutoSuggest.js b/bundles/org.eclipse.rap.addons.dropdown/src/org/eclipse/rap/addons/dropdown/internal/resources/AutoSuggest.js
index 8b6d2e5..dbb090b 100644
--- a/bundles/org.eclipse.rap.addons.dropdown/src/org/eclipse/rap/addons/dropdown/internal/resources/AutoSuggest.js
+++ b/bundles/org.eclipse.rap.addons.dropdown/src/org/eclipse/rap/addons/dropdown/internal/resources/AutoSuggest.js
@@ -45,7 +45,7 @@
 // Event Handling
 
 function onChangeDataSource( event ) {
-  processDataSource.apply( this );
+  this.set( "elements", null );
 }
 
 function onChangeElements( event ) {
diff --git a/examples/org.eclipse.rap.addons.dropdown.demo.examples/META-INF/MANIFEST.MF b/examples/org.eclipse.rap.addons.dropdown.demo.examples/META-INF/MANIFEST.MF
index e52c0be..2a7698c 100644
--- a/examples/org.eclipse.rap.addons.dropdown.demo.examples/META-INF/MANIFEST.MF
+++ b/examples/org.eclipse.rap.addons.dropdown.demo.examples/META-INF/MANIFEST.MF
@@ -4,12 +4,10 @@
 Bundle-SymbolicName: org.eclipse.rap.addons.dropdown.demo.examples
 Bundle-Version: 1.0.0.qualifier
 Import-Package: org.eclipse.rap.addons.dropdown;version="0.1.0",
- org.eclipse.rap.addons.dropdown.viewer;version="0.1.0",
  org.osgi.framework;version="1.3.0"
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-Vendor: Eclipse.org - RAP
 Require-Bundle: org.eclipse.rap.rwt;bundle-version="2.1.0",
- org.eclipse.rap.examples;bundle-version="2.1.0",
- org.eclipse.rap.jface;bundle-version="2.1.0"
+ org.eclipse.rap.examples;bundle-version="2.1.0"
 Export-Package: org.eclipse.rap.addons.dropdown.demo.examples;version="0.1.0"
 Bundle-Activator: org.eclipse.rap.addons.dropdown.demo.examples.Activator
diff --git a/examples/org.eclipse.rap.addons.dropdown.demo.examples/src/org/eclipse/rap/addons/dropdown/demo/examples/CountryInfo.java b/examples/org.eclipse.rap.addons.dropdown.demo.examples/src/org/eclipse/rap/addons/dropdown/demo/examples/CountryInfo.java
index 1758e69..41c19f9 100644
--- a/examples/org.eclipse.rap.addons.dropdown.demo.examples/src/org/eclipse/rap/addons/dropdown/demo/examples/CountryInfo.java
+++ b/examples/org.eclipse.rap.addons.dropdown.demo.examples/src/org/eclipse/rap/addons/dropdown/demo/examples/CountryInfo.java
@@ -36,6 +36,15 @@
     return countries;
   }
 
+  public Country findCountry( String name ) {
+    for( Country country : countries ) {
+      if( country.name.equals( name ) ) {
+        return country;
+      }
+    }
+    return null;
+  }
+
   private CountryInfo() {
     try {
       countries = readCountries();
@@ -116,6 +125,15 @@
       return cities;
     }
 
+    public City findCity( String name ) {
+      for( City city : cities ) {
+        if( city.name.equals( name ) ) {
+          return city;
+        }
+      }
+      return null;
+    }
+
   }
 
   static class City {
diff --git a/examples/org.eclipse.rap.addons.dropdown.demo.examples/src/org/eclipse/rap/addons/dropdown/demo/examples/DropDownExamplePage.java b/examples/org.eclipse.rap.addons.dropdown.demo.examples/src/org/eclipse/rap/addons/dropdown/demo/examples/DropDownExamplePage.java
index f136811..bb40e82 100644
--- a/examples/org.eclipse.rap.addons.dropdown.demo.examples/src/org/eclipse/rap/addons/dropdown/demo/examples/DropDownExamplePage.java
+++ b/examples/org.eclipse.rap.addons.dropdown.demo.examples/src/org/eclipse/rap/addons/dropdown/demo/examples/DropDownExamplePage.java
@@ -10,14 +10,14 @@
  ******************************************************************************/
 package org.eclipse.rap.addons.dropdown.demo.examples;
 
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
+import java.util.Arrays;
+
+import org.eclipse.rap.addons.dropdown.AutoSuggest;
+import org.eclipse.rap.addons.dropdown.DataProvider;
+import org.eclipse.rap.addons.dropdown.DataSource;
+import org.eclipse.rap.addons.dropdown.SuggestionSelectedListener;
 import org.eclipse.rap.addons.dropdown.demo.examples.CountryInfo.City;
 import org.eclipse.rap.addons.dropdown.demo.examples.CountryInfo.Country;
-import org.eclipse.rap.addons.dropdown.viewer.DropDownViewer;
 import org.eclipse.rap.examples.ExampleUtil;
 import org.eclipse.rap.examples.IExamplePage;
 import org.eclipse.swt.SWT;
@@ -34,6 +34,10 @@
 public class DropDownExamplePage implements IExamplePage {
 
   private CityMap cityMap;
+  private Text countryText;
+  private Text cityText;
+  private AutoSuggest cityAutoSuggest;
+  private Country currentCountry = null;
 
   public void createControl( Composite parent ) {
     parent.setLayout( ExampleUtil.createMainLayout( 2 ) );
@@ -46,46 +50,54 @@
     group.setText( "City Selection" );
     group.setLayout( new GridLayout( 2, false ) );
     group.setLayoutData( new GridData( SWT.LEFT, SWT.TOP, false, false ) );
-    Label countryLabel = new Label( group, SWT.NONE );
+    createCountryText( group );
+    createCityText( group );
+    createCityAutoSuggest();
+    createCountryAutoSuggest();
+  }
+
+  public void createCountryText( Composite parent ) {
+    Label countryLabel = new Label( parent, SWT.NONE );
     countryLabel.setText( "Country:" );
-    Text countryText = new Text( group, SWT.BORDER );
+    countryText = new Text( parent, SWT.BORDER );
     countryText.setLayoutData( new GridData( 300, SWT.DEFAULT ) );
-    Label cityLabel = new Label( group, SWT.NONE );
-    cityLabel.setText( "City:" );
-    Text cityText = new Text( group, SWT.BORDER );
-    cityText.setLayoutData( new GridData( 300, SWT.DEFAULT ) );
-    DropDownViewer cityViewer = createCityViewer( cityText );
-    createCountryViewer( countryText, cityViewer );
     countryText.setFocus();
+  }
+
+  public void createCityText( Composite parent ) {
+    Label cityLabel = new Label( parent, SWT.NONE );
+    cityLabel.setText( "City:" );
+    cityText = new Text( parent, SWT.BORDER );
+    cityText.setLayoutData( new GridData( 300, SWT.DEFAULT ) );
     cityText.setEnabled( false );
   }
 
-  private DropDownViewer createCityViewer( Text cityText ) {
-    DropDownViewer cityViewer = new DropDownViewer( cityText );
-    cityViewer.setContentProvider( new ArrayContentProvider() );
-    cityViewer.setLabelProvider( new LabelProvider() );
-    cityViewer.addSelectionChangedListener( new ISelectionChangedListener() {
-      public void selectionChanged( SelectionChangedEvent event ) {
-        IStructuredSelection selection = ( IStructuredSelection )event.getSelection();
-        cityMap.visit( ( City )selection.getFirstElement() );
+  private void createCountryAutoSuggest() {
+    AutoSuggest countryAutoSuggest = new AutoSuggest( countryText );
+    countryAutoSuggest.setAutoComplete( true );
+    countryAutoSuggest.setDataSource( createCountriesDataSource() );
+    countryAutoSuggest.addSelectionListener( new SuggestionSelectedListener() {
+      public void suggestionSelected() {
+        setCurrentCountry( countryText.getText() );
       }
     } );
-    return cityViewer;
   }
 
-  private void createCountryViewer( Text countryText, final DropDownViewer cityViewer ) {
-    DropDownViewer countryViewer = new DropDownViewer( countryText );
-    countryViewer.setContentProvider( new ArrayContentProvider() );
-    countryViewer.setLabelProvider( new LabelProvider() );
-    countryViewer.setInput( CountryInfo.getInstance().getCountries() );
-    countryViewer.addSelectionChangedListener( new ISelectionChangedListener() {
-      public void selectionChanged( SelectionChangedEvent event ) {
-        IStructuredSelection selection = ( IStructuredSelection )event.getSelection();
-        Country country = ( Country )selection.getFirstElement();
-        Text text = ( Text )cityViewer.getControl();
-        text.setText( "" );
-        text.setEnabled( true );
-        cityViewer.setInput( country.getCities() );
+  private void setCurrentCountry( String name ) {
+    cityText.setText( "" );
+    cityText.setEnabled( true );
+    currentCountry = CountryInfo.getInstance().findCountry( name );
+    cityAutoSuggest.setDataSource( createDataSource( currentCountry ) );
+  }
+
+  private void createCityAutoSuggest() {
+    cityAutoSuggest = new AutoSuggest( cityText );
+    cityAutoSuggest.setAutoComplete( true );
+    cityAutoSuggest.addSelectionListener( new SuggestionSelectedListener() {
+      public void suggestionSelected() {
+        String name = cityText.getText();
+        City city = currentCountry.findCity( name );
+        cityMap.visit( city );
       }
     } );
   }
@@ -99,4 +111,33 @@
     cityMap = new CityMap( browser );
   }
 
+  // TODO [tb] : re-use data sources
+  private static DataSource createCountriesDataSource() {
+    DataSource countriesDataSource = new DataSource();
+    countriesDataSource.setDataProvider( new DataProvider() {
+      public Iterable<?> getSuggestions() {
+        return Arrays.asList( CountryInfo.getInstance().getCountries() );
+      }
+      public String getValue( Object element ) {
+        return ( ( Country )element ).name;
+      }
+    } );
+    return countriesDataSource;
+  }
+
+   // TODO [tb] : re-use data sources
+   private static DataSource createDataSource( Country country ) {
+     DataSource dataSource = new DataSource();
+     final City[] cities = country.getCities();
+     dataSource.setDataProvider( new DataProvider() {
+       public Iterable< ? > getSuggestions() {
+         return Arrays.asList( cities );
+       }
+       public String getValue( Object element ) {
+         return element.toString();
+       }
+    } );
+     return dataSource;
+   }
+
 }
diff --git a/examples/org.eclipse.rap.addons.dropdown.demo/DropDown Demo 9494_dropdown.launch b/examples/org.eclipse.rap.addons.dropdown.demo/DropDown Demo 9494_dropdown.launch
index 70e1b17..54fd9fe 100644
--- a/examples/org.eclipse.rap.addons.dropdown.demo/DropDown Demo 9494_dropdown.launch
+++ b/examples/org.eclipse.rap.addons.dropdown.demo/DropDown Demo 9494_dropdown.launch
@@ -40,9 +40,9 @@
 <booleanAttribute key="org.eclipse.rap.launch.useSessionTimeout" value="false"/>

 <stringAttribute key="pde.version" value="3.3"/>

 <booleanAttribute key="show_selected_only" value="true"/>

-<stringAttribute key="target_bundles" value="com.ibm.icu.base,javax.servlet@default:default,javax.xml,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.eclipse.core.commands,org.eclipse.core.jobs,org.eclipse.equinox.common,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.util@default:default,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.eclipse.rap.jface,org.eclipse.rap.rwt.osgi@default:default,org.eclipse.rap.rwt@default:default"/>

+<stringAttribute key="target_bundles" value="com.ibm.icu.base@default:default,javax.servlet@default:default,javax.xml@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.util@default:default,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.eclipse.rap.rwt.osgi@default:default,org.eclipse.rap.rwt@default:default"/>

 <booleanAttribute key="tracing" value="false"/>

 <booleanAttribute key="useCustomFeatures" value="false"/>

 <booleanAttribute key="useDefaultConfigArea" value="true"/>

-<stringAttribute key="workspace_bundles" value="org.eclipse.rap.addons.dropdown,org.eclipse.rap.addons.dropdown.demo,org.eclipse.rap.addons.dropdown.viewer,org.eclipse.rap.clientscripting"/>

+<stringAttribute key="workspace_bundles" value="org.eclipse.rap.addons.dropdown.demo@default:default,org.eclipse.rap.addons.dropdown@default:default,org.eclipse.rap.clientscripting@default:default"/>

 </launchConfiguration>

diff --git a/tests/org.eclipse.rap.addons.dropdown.test/jasmine/jasmine/specs/AutoSuggestSpec.js b/tests/org.eclipse.rap.addons.dropdown.test/jasmine/jasmine/specs/AutoSuggestSpec.js
index d693c4f..559c942 100644
--- a/tests/org.eclipse.rap.addons.dropdown.test/jasmine/jasmine/specs/AutoSuggestSpec.js
+++ b/tests/org.eclipse.rap.addons.dropdown.test/jasmine/jasmine/specs/AutoSuggestSpec.js
@@ -204,16 +204,13 @@
 
     describe( "change:dataSource", function() {
 
-      it( "sets elements", function() {
+      it( "sets elements to null", function() {
         model.addListener( "change:dataSource", createClientListener( "AutoSuggest" ) );
-        var dataSource = rap.typeHandler[ "rwt.remote.Model" ].factory();
-        dataSource.set( "data", [ "foo", "bar" ] );
-        spyOn( rap, "getObject" ).andReturn( dataSource );
+        model.set( "elements", [] );
 
         model.set( "dataSource", "fooId" );
 
-        expect( rap.getObject ).toHaveBeenCalledWith( "fooId" );
-        expect( model.get( "elements" ) ).toEqual( [ "foo", "bar" ] );
+        expect( model.get( "elements" ) ).toBeNull();
       } );
 
     } );