Revision: 9237
Author: [email protected]
Date: Tue Nov 16 08:49:35 2010
Log: Fixing a bug in SingleSelectionModel where deselecting a random value causes the selected value to be deselected, even if the deselected value wasn't selected to begin with.

Review at http://gwt-code-reviews.appspot.com/1114801

Review by: [email protected]
http://code.google.com/p/google-web-toolkit/source/detail?r=9237

Modified:
 /trunk/user/src/com/google/gwt/view/client/SelectionModel.java
 /trunk/user/src/com/google/gwt/view/client/SingleSelectionModel.java
 /trunk/user/test/com/google/gwt/view/client/SingleSelectionModelTest.java

=======================================
--- /trunk/user/src/com/google/gwt/view/client/SelectionModel.java Tue Oct 12 07:55:56 2010 +++ /trunk/user/src/com/google/gwt/view/client/SelectionModel.java Tue Nov 16 08:49:35 2010
@@ -71,7 +71,8 @@
     }

     public Object getKey(T item) {
-      return keyProvider == null ? item : keyProvider.getKey(item);
+      return (keyProvider == null || item == null) ? item
+          : keyProvider.getKey(item);
     }

     /**
=======================================
--- /trunk/user/src/com/google/gwt/view/client/SingleSelectionModel.java Tue Oct 12 07:55:56 2010 +++ /trunk/user/src/com/google/gwt/view/client/SingleSelectionModel.java Tue Nov 16 08:49:35 2010
@@ -68,6 +68,14 @@
   }

   public void setSelected(T object, boolean selected) {
+ // If we are deselecting a value that isn't actually selected, ignore it.
+    if (!selected) {
+ Object oldKey = newSelectedPending ? getKey(newSelectedObject) : curKey;
+      Object newKey = getKey(object);
+      if (!equalsOrBothNull(oldKey, newKey)) {
+        return;
+      }
+    }
     newSelectedObject = object;
     newSelected = selected;
     newSelectedPending = true;
@@ -81,14 +89,18 @@
     }
     resolveChanges();
   }
+
+  private boolean equalsOrBothNull(Object a, Object b) {
+    return (a == null) ? (b == null) : a.equals(b);
+  }

   private void resolveChanges() {
     if (!newSelectedPending) {
       return;
     }

- Object key = (newSelectedObject == null) ? null : getKey(newSelectedObject);
-    boolean sameKey = curKey == null ? key == null : curKey.equals(key);
+    Object key = getKey(newSelectedObject);
+    boolean sameKey = equalsOrBothNull(curKey, key);
     boolean changed = false;
     if (newSelected) {
       changed = !sameKey;
=======================================
--- /trunk/user/test/com/google/gwt/view/client/SingleSelectionModelTest.java Tue Sep 28 06:28:02 2010 +++ /trunk/user/test/com/google/gwt/view/client/SingleSelectionModelTest.java Tue Nov 16 08:49:35 2010
@@ -19,6 +19,18 @@
  * Tests for {...@link SingleSelectionModel}.
  */
 public class SingleSelectionModelTest extends AbstractSelectionModelTest {
+
+  /**
+ * Test that deselecting a value other than the pending selection does not
+   * cause the pending selection to be lost.
+   */
+  public void testDeselectWhileSelectionPending() {
+    SingleSelectionModel<String> model = createSelectionModel(null);
+    model.setSelected("test", true);
+    model.setSelected("other", false);
+    assertTrue(model.isSelected("test"));
+    assertEquals("test", model.getSelectedObject());
+  }

   public void testGetSelectedObject() {
     SingleSelectionModel<String> model = createSelectionModel(null);

--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to