aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/vaadin/ui/AbstractSelect.java
diff options
context:
space:
mode:
authorLeif Åstrand <leif@vaadin.com>2012-07-31 12:00:44 +0300
committerLeif Åstrand <leif@vaadin.com>2012-07-31 12:00:44 +0300
commite6ba86347ce0aea0b2dd7aa064586ce4fe7f2096 (patch)
tree5d07d002edd4984536ade795c8c42451651d6f5c /src/com/vaadin/ui/AbstractSelect.java
parent569a82a7bfc4958a9ac164e16caecc3fb47fdbc7 (diff)
parent64c7bbb569d5194eb9c5c083726a8c96053368e8 (diff)
downloadvaadin-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.java44
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);