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