Adding MultiSelectionModel#clear() to clear all selected values. This is slightly more complicated because we resolveChanges() in a finally command, but the JavaDoc explains how we handle this. Review at http://gwt-code-reviews.appspot.com/1089801 Review by: rchandia@google.com git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9201 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/view/client/MultiSelectionModel.java b/user/src/com/google/gwt/view/client/MultiSelectionModel.java index 97c9145..2278cfe 100644 --- a/user/src/com/google/gwt/view/client/MultiSelectionModel.java +++ b/user/src/com/google/gwt/view/client/MultiSelectionModel.java
@@ -52,6 +52,25 @@ } /** + * Deselect all selected values. + */ + public void clear() { + // Clear the current list of pending changes. + selectionChanges.clear(); + + /* + * Add a pending change to deselect each value that is currently selected. + * We cannot just clear the selected set, because then we would not know + * which values were selected before we cleared, which we need to know to + * determine if we should fire an event. + */ + for (T value : selectedSet.values()) { + selectionChanges.put(value, false); + } + scheduleSelectionChangeEvent(); + } + + /** * Get the set of selected items as a copy. * * @return the set of selected items
diff --git a/user/test/com/google/gwt/view/client/AbstractSelectionModelTest.java b/user/test/com/google/gwt/view/client/AbstractSelectionModelTest.java index 3b98b65..1729795 100644 --- a/user/test/com/google/gwt/view/client/AbstractSelectionModelTest.java +++ b/user/test/com/google/gwt/view/client/AbstractSelectionModelTest.java
@@ -27,16 +27,24 @@ /** * A mock {@link SelectionChangeEvent.Handler} used for testing. */ - private static class MockSelectionChangeHandler + static class MockSelectionChangeHandler implements SelectionChangeEvent.Handler { private boolean eventFired; + /** + * Assert that a {@link SelectionChangeEvent} was fired and clear the + * boolean. + * + * @param expected the expected value + */ public void assertEventFired(boolean expected) { assertEquals(expected, eventFired); + eventFired = false; } public void onSelectionChange(SelectionChangeEvent event) { + assertFalse(eventFired); eventFired = true; } }
diff --git a/user/test/com/google/gwt/view/client/MultiSelectionModelTest.java b/user/test/com/google/gwt/view/client/MultiSelectionModelTest.java index 61f5c28..3b7ab88 100644 --- a/user/test/com/google/gwt/view/client/MultiSelectionModelTest.java +++ b/user/test/com/google/gwt/view/client/MultiSelectionModelTest.java
@@ -23,6 +23,67 @@ */ public class MultiSelectionModelTest extends AbstractSelectionModelTest { + public void testClear() { + MultiSelectionModel<String> model = createSelectionModel(null); + MockSelectionChangeHandler handler = new MockSelectionChangeHandler(); + model.addSelectionChangeHandler(handler); + + // Select a few values. + model.setSelected("test0", true); + model.setSelected("test1", true); + model.setSelected("test2", true); + assertTrue(model.isSelected("test0")); + handler.assertEventFired(true); + + // Clear selection and verify that an event is fired. + model.clear(); + assertFalse(model.isSelected("test")); + handler.assertEventFired(true); + } + + /** + * Clearing an empty {@link MultiSelectionModel} should not fire an event, + * even if there are pending changes. + */ + public void testClearWhenEmpty() { + MultiSelectionModel<String> model = createSelectionModel(null); + MockSelectionChangeHandler handler = new MockSelectionChangeHandler(); + model.addSelectionChangeHandler(handler); + + // Add a pending change. + model.setSelected("test", true); + + // Clear selection and verify that no event is fired. + model.clear(); + assertFalse(model.isSelected("test")); + handler.assertEventFired(false); + } + + /** + * Pending changes should apply after the list is cleared. An event should not + * be fired if all selected values are reselected. + */ + public void testClearAndReselect() { + MultiSelectionModel<String> model = createSelectionModel(null); + MockSelectionChangeHandler handler = new MockSelectionChangeHandler(); + model.addSelectionChangeHandler(handler); + + // Select a few values. + model.setSelected("test0", true); + model.setSelected("test1", true); + model.setSelected("test2", true); + assertTrue(model.isSelected("test0")); + handler.assertEventFired(true); + + // Clear selection and reselect. Verify that no event is fired. + model.clear(); + model.setSelected("test0", true); + model.setSelected("test1", true); + model.setSelected("test2", true); + assertTrue(model.isSelected("test0")); + handler.assertEventFired(false); + } + public void testGetSelectedSet() { MultiSelectionModel<String> model = createSelectionModel(null); Set<String> selected = new HashSet<String>();