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