Revision: 10351
Author:   [email protected]
Date:     Fri Jun 17 12:00:32 2011
Log: Use the provided key in all decisions about whether the selections have changed.

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

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

Modified:
 /trunk/user/src/com/google/gwt/view/client/MultiSelectionModel.java
 /trunk/user/test/com/google/gwt/view/client/MultiSelectionModelTest.java

=======================================
--- /trunk/user/src/com/google/gwt/view/client/MultiSelectionModel.java Mon Nov 8 11:22:54 2010 +++ /trunk/user/src/com/google/gwt/view/client/MultiSelectionModel.java Fri Jun 17 12:00:32 2011
@@ -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) {
=======================================
--- /trunk/user/test/com/google/gwt/view/client/MultiSelectionModelTest.java Tue Nov 9 09:07:13 2010 +++ /trunk/user/test/com/google/gwt/view/client/MultiSelectionModelTest.java Fri Jun 17 12:00:32 2011
@@ -147,6 +147,36 @@
     model.setSelected("test", false); // Should not fire change event
     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);

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

Reply via email to