Reviewers: jlabanca,

Description:
Use the provided key in all decisions about whether the selections have
changed.

Review by: [email protected]

Please review this at http://gwt-code-reviews.appspot.com/1465802/

Affected files:
  M user/src/com/google/gwt/view/client/MultiSelectionModel.java
  M user/test/com/google/gwt/view/client/MultiSelectionModelTest.java


Index: user/src/com/google/gwt/view/client/MultiSelectionModel.java
===================================================================
--- user/src/com/google/gwt/view/client/MultiSelectionModel.java (revision 10345) +++ user/src/com/google/gwt/view/client/MultiSelectionModel.java (working copy)
@@ -111,9 +111,10 @@
       Object key = getKey(object);
       T oldValue = selectedSet.get(key);
       if (selected) {
-        if (oldValue == null || !oldValue.equals(object)) {
-          selectedSet.put(getKey(object), object);
-          changed = true;
+        selectedSet.put(key, object);
+        Object oldKey = getKey(oldValue);
+        if (!changed) {
+          changed = (oldKey == null) ? (key != null) : !oldKey.equals(key);
         }
       } else {
         if (oldValue != null) {
Index: user/test/com/google/gwt/view/client/MultiSelectionModelTest.java
===================================================================
--- user/test/com/google/gwt/view/client/MultiSelectionModelTest.java (revision 10345) +++ user/test/com/google/gwt/view/client/MultiSelectionModelTest.java (working copy)
@@ -148,6 +148,36 @@
     model.setSelected("test", false); // Should not fire change event
   }

+  /**
+ * Tests that reselecting the same key from a different object does not fire
+   * a change event.
+   */
+  public void testNoDuplicateChangeEventWithKeyProvider() {
+    ProvidesKey<String> keyProvider = new ProvidesKey<String>() {
+      public Object getKey(String item) {
+        return item.toUpperCase();
+      }
+    };
+    MultiSelectionModel<String> model = createSelectionModel(keyProvider);
+ SelectionChangeEvent.Handler handler = new SelectionChangeEvent.Handler() {
+      public void onSelectionChange(SelectionChangeEvent event) {
+        fail();
+      }
+    };
+
+    model.setSelected("test1", true);
+    assertTrue(model.isSelected("test1"));
+
+    model.addSelectionChangeHandler(handler);
+ // Selecting a different object with the same key should not be seen as a
+    // selection change
+    String replacement = "TEST1";
+    model.setSelected(replacement, true);
+    assertTrue(model.isSelected(replacement));
+    assertEquals(1, model.getSelectedSet().size());
+    assertSame(replacement, model.getSelectedSet().iterator().next());
+  }
+
   public void testSetSelected() {
     MultiSelectionModel<String> model = createSelectionModel(null);
     assertFalse(model.isSelected("test0"));


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

Reply via email to