diff options
author | Leif Åstrand <leif@vaadin.com> | 2012-07-31 12:00:44 +0300 |
---|---|---|
committer | Leif Åstrand <leif@vaadin.com> | 2012-07-31 12:00:44 +0300 |
commit | e6ba86347ce0aea0b2dd7aa064586ce4fe7f2096 (patch) | |
tree | 5d07d002edd4984536ade795c8c42451651d6f5c /src/com/vaadin/ui/AbstractSelect.java | |
parent | 569a82a7bfc4958a9ac164e16caecc3fb47fdbc7 (diff) | |
parent | 64c7bbb569d5194eb9c5c083726a8c96053368e8 (diff) | |
download | vaadin-framework-e6ba86347ce0aea0b2dd7aa064586ce4fe7f2096.tar.gz vaadin-framework-e6ba86347ce0aea0b2dd7aa064586ce4fe7f2096.zip |
Merge remote-tracking branch 'origin/6.8'
Conflicts:
src/com/vaadin/terminal/gwt/client/ui/popupview/VPopupView.java
tests/testbench/com/vaadin/tests/components/popupview/PopupViewClickShortcut.java
tests/testbench/com/vaadin/tests/containers/sqlcontainer/CheckboxUpdateProblem.java
Diffstat (limited to 'src/com/vaadin/ui/AbstractSelect.java')
-rw-r--r-- | src/com/vaadin/ui/AbstractSelect.java | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/src/com/vaadin/ui/AbstractSelect.java b/src/com/vaadin/ui/AbstractSelect.java index 63e7ae92fe..0a97ceb649 100644 --- a/src/com/vaadin/ui/AbstractSelect.java +++ b/src/com/vaadin/ui/AbstractSelect.java @@ -436,7 +436,8 @@ public abstract class AbstractSelect extends AbstractField<Object> implements // Selection change if (variables.containsKey("selected")) { - final String[] ka = (String[]) variables.get("selected"); + final String[] clientSideSelectedKeys = (String[]) variables + .get("selected"); // Multiselect mode if (isMultiSelect()) { @@ -444,19 +445,20 @@ public abstract class AbstractSelect extends AbstractField<Object> implements // TODO Optimize by adding repaintNotNeeded when applicable // Converts the key-array to id-set - final LinkedList<Object> s = new LinkedList<Object>(); - for (int i = 0; i < ka.length; i++) { - final Object id = itemIdMapper.get(ka[i]); + final LinkedList<Object> acceptedSelections = new LinkedList<Object>(); + for (int i = 0; i < clientSideSelectedKeys.length; i++) { + final Object id = itemIdMapper + .get(clientSideSelectedKeys[i]); if (!isNullSelectionAllowed() && (id == null || id == getNullSelectionItemId())) { // skip empty selection if nullselection is not allowed requestRepaint(); } else if (id != null && containsId(id)) { - s.add(id); + acceptedSelections.add(id); } } - if (!isNullSelectionAllowed() && s.size() < 1) { + if (!isNullSelectionAllowed() && acceptedSelections.size() < 1) { // empty selection not allowed, keep old value requestRepaint(); return; @@ -464,27 +466,32 @@ public abstract class AbstractSelect extends AbstractField<Object> implements // Limits the deselection to the set of visible items // (non-visible items can not be deselected) - final Collection<?> visible = getVisibleItemIds(); - if (visible != null) { + Collection<?> visibleNotSelected = getVisibleItemIds(); + if (visibleNotSelected != null) { + visibleNotSelected = new HashSet<Object>(visibleNotSelected); + // Don't remove those that will be added to preserve order + visibleNotSelected.removeAll(acceptedSelections); + @SuppressWarnings("unchecked") Set<Object> newsel = (Set<Object>) getValue(); if (newsel == null) { - newsel = new HashSet<Object>(); + newsel = new LinkedHashSet<Object>(); } else { - newsel = new HashSet<Object>(newsel); + newsel = new LinkedHashSet<Object>(newsel); } - newsel.removeAll(visible); - newsel.addAll(s); + newsel.removeAll(visibleNotSelected); + newsel.addAll(acceptedSelections); setValue(newsel, true); } } else { // Single select mode if (!isNullSelectionAllowed() - && (ka.length == 0 || ka[0] == null || ka[0] == getNullSelectionItemId())) { + && (clientSideSelectedKeys.length == 0 + || clientSideSelectedKeys[0] == null || clientSideSelectedKeys[0] == getNullSelectionItemId())) { requestRepaint(); return; } - if (ka.length == 0) { + if (clientSideSelectedKeys.length == 0) { // Allows deselection only if the deselected item is // visible final Object current = getValue(); @@ -493,7 +500,8 @@ public abstract class AbstractSelect extends AbstractField<Object> implements setValue(null, true); } } else { - final Object id = itemIdMapper.get(ka[0]); + final Object id = itemIdMapper + .get(clientSideSelectedKeys[0]); if (!isNullSelectionAllowed() && id == null) { requestRepaint(); } else if (id != null @@ -675,10 +683,10 @@ public abstract class AbstractSelect extends AbstractField<Object> implements if (isMultiSelect()) { if (newValue == null) { - super.setValue(new HashSet<Object>(), repaintIsNotNeeded); + super.setValue(new LinkedHashSet<Object>(), repaintIsNotNeeded); } else if (Collection.class.isAssignableFrom(newValue.getClass())) { - super.setValue(new HashSet<Object>((Collection<?>) newValue), - repaintIsNotNeeded); + super.setValue(new LinkedHashSet<Object>( + (Collection<?>) newValue), repaintIsNotNeeded); } } else if (newValue == null || items.containsId(newValue)) { super.setValue(newValue, repaintIsNotNeeded); |