Added SetSelectionModel interface and made Single- and MultiSelectionModels
implement it. Updated test just for SingleSelectionModel, as MultiSelectionModel
already implemented the interface.
Added some missing overrides in SelectionModel.

Review at http://gwt-code-reviews.appspot.com/1798806
Fixes issue 7578


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@11217 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/view/client/MultiSelectionModel.java b/user/src/com/google/gwt/view/client/MultiSelectionModel.java
index a782c0d..1beac98 100644
--- a/user/src/com/google/gwt/view/client/MultiSelectionModel.java
+++ b/user/src/com/google/gwt/view/client/MultiSelectionModel.java
@@ -27,7 +27,8 @@
  * 
  * @param <T> the data type of the items
  */
-public class MultiSelectionModel<T> extends AbstractSelectionModel<T> {
+public class MultiSelectionModel<T> extends AbstractSelectionModel<T>
+    implements SetSelectionModel<T> {
 
   /**
    * Stores an item and its pending selection state.
@@ -97,6 +98,7 @@
   /**
    * Deselect all selected values.
    */
+  @Override
   public void clear() {
     // Clear the current list of pending changes.
     selectionChanges.clear();
@@ -119,6 +121,7 @@
    * 
    * @return the set of selected items
    */
+  @Override
   public Set<T> getSelectedSet() {
     resolveChanges();
     return new HashSet<T>(selectedSet.values());
diff --git a/user/src/com/google/gwt/view/client/SelectionModel.java b/user/src/com/google/gwt/view/client/SelectionModel.java
index 9768b8f..026165a 100644
--- a/user/src/com/google/gwt/view/client/SelectionModel.java
+++ b/user/src/com/google/gwt/view/client/SelectionModel.java
@@ -61,15 +61,18 @@
       this.keyProvider = keyProvider;
     }
 
+    @Override
     public HandlerRegistration addSelectionChangeHandler(
         SelectionChangeEvent.Handler handler) {
       return handlerManager.addHandler(SelectionChangeEvent.getType(), handler);
     }
 
+    @Override
     public void fireEvent(GwtEvent<?> event) {
       handlerManager.fireEvent(event);
     }
 
+    @Override
     public Object getKey(T item) {
       return (keyProvider == null || item == null) ? item
           : keyProvider.getKey(item);
@@ -159,6 +162,7 @@
    * @param handler the handler
    * @return the registration for the event
    */
+  @Override
   HandlerRegistration addSelectionChangeHandler(SelectionChangeEvent.Handler handler);
 
   /**
diff --git a/user/src/com/google/gwt/view/client/SetSelectionModel.java b/user/src/com/google/gwt/view/client/SetSelectionModel.java
new file mode 100644
index 0000000..7149cbb
--- /dev/null
+++ b/user/src/com/google/gwt/view/client/SetSelectionModel.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.view.client;
+
+import java.util.Set;
+
+/**
+ * A model that allows getting all elements and clearing the selection.
+ *
+ * @param <T> the record data type
+ */
+public interface SetSelectionModel<T> extends SelectionModel<T> {
+  /**
+   * Clears the current selection.
+   */
+  void clear();
+
+  /**
+   * Get the set of selected items.
+   *
+   * @return the set of selected items
+   */
+  Set<T> getSelectedSet();
+}
diff --git a/user/src/com/google/gwt/view/client/SingleSelectionModel.java b/user/src/com/google/gwt/view/client/SingleSelectionModel.java
index b92aba6..c34c338 100644
--- a/user/src/com/google/gwt/view/client/SingleSelectionModel.java
+++ b/user/src/com/google/gwt/view/client/SingleSelectionModel.java
@@ -17,12 +17,16 @@
 
 import com.google.gwt.view.client.SelectionModel.AbstractSelectionModel;
 
+import java.util.HashSet;
+import java.util.Set;
+
 /**
  * A simple selection model that allows only one item to be selected a a time.
  * 
  * @param <T> the record data type
  */
-public class SingleSelectionModel<T> extends AbstractSelectionModel<T> {
+public class SingleSelectionModel<T> extends AbstractSelectionModel<T>
+    implements SetSelectionModel<T> {
 
   private Object curKey;
   private T curSelection;
@@ -49,6 +53,11 @@
     super(keyProvider);
   }
 
+  @Override
+  public void clear() {
+    setSelected(getSelectedObject(), false);
+  }
+
   /**
    * Gets the currently-selected item.
    * 
@@ -60,6 +69,15 @@
   }
 
   @Override
+  public Set<T> getSelectedSet() {
+    Set<T> set = new HashSet<T>();
+    if (curSelection != null) {
+      set.add(curSelection);
+    }
+    return set;
+  }
+
+  @Override
   public boolean isSelected(T item) {
     resolveChanges();
     if (curSelection == null || curKey == null || item == null) {
diff --git a/user/test/com/google/gwt/view/client/SingleSelectionModelTest.java b/user/test/com/google/gwt/view/client/SingleSelectionModelTest.java
index fda80ff..5ab75f1 100644
--- a/user/test/com/google/gwt/view/client/SingleSelectionModelTest.java
+++ b/user/test/com/google/gwt/view/client/SingleSelectionModelTest.java
@@ -38,9 +38,11 @@
 
     model.setSelected("test", true);
     assertEquals("test", model.getSelectedObject());
+    assertEquals("test", model.getSelectedSet().iterator().next());
 
     model.setSelected("test", false);
     assertNull(model.getSelectedObject());
+    assertEquals(0, model.getSelectedSet().size());
   }
 
   public void testSelectedChangeEvent() {
@@ -91,14 +93,18 @@
 
     model.setSelected("test0", true);
     assertTrue(model.isSelected("test0"));
+    assertEquals("test0", model.getSelectedSet().iterator().next());
 
     model.setSelected("test1", true);
     assertTrue(model.isSelected("test1"));
     assertFalse(model.isSelected("test0"));
+    assertEquals("test1", model.getSelectedSet().iterator().next());
+    assertEquals(1, model.getSelectedSet().size());
 
     model.setSelected("test1", false);
     assertFalse(model.isSelected("test1"));
     assertFalse(model.isSelected("test0"));
+    assertEquals(0, model.getSelectedSet().size());
   }
 
   public void testSetSelectedNull() {
@@ -112,6 +118,7 @@
     assertNull(model.getSelectedObject());
     assertFalse(model.isSelected("test"));
     assertFalse(model.isSelected(null));
+    assertEquals(0, model.getSelectedSet().size());
   }
 
   public void testSetSelectedWithKeyProvider() {