diff options
author | Artur <artur@vaadin.com> | 2017-01-12 09:11:11 +0200 |
---|---|---|
committer | Pekka Hyvönen <pekka@vaadin.com> | 2017-01-12 09:11:11 +0200 |
commit | 6897f6dcef2aa7b352529a3c34b86c69985ba788 (patch) | |
tree | 0fed4dd0251a17fea9b8efb08bdf13c08a57dd3f /client | |
parent | 62c0d733b77fc9ad8ab3a6f5f6bb632a5afdc299 (diff) | |
download | vaadin-framework-6897f6dcef2aa7b352529a3c34b86c69985ba788.tar.gz vaadin-framework-6897f6dcef2aa7b352529a3c34b86c69985ba788.zip |
Reset selected icon when blurring a ComboBox (#8082)
* Reset selected icon when blurring a ComboBox
Fixes #8073
* Merge branch '7.7' into _combobox-icon-reset-selection
* Merge branch '7.7' into _combobox-icon-reset-selection
Diffstat (limited to 'client')
-rw-r--r-- | client/src/main/java/com/vaadin/client/ui/VFilterSelect.java | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/client/src/main/java/com/vaadin/client/ui/VFilterSelect.java b/client/src/main/java/com/vaadin/client/ui/VFilterSelect.java index 38e067658b..e407aaafe4 100644 --- a/client/src/main/java/com/vaadin/client/ui/VFilterSelect.java +++ b/client/src/main/java/com/vaadin/client/ui/VFilterSelect.java @@ -1445,7 +1445,10 @@ public class VFilterSelect extends Composite }; private class IconWidget extends Widget { + private Icon icon; + IconWidget(Icon icon) { + this.icon = icon; setElement(icon.getElement()); addDomHandler(VFilterSelect.this, ClickEvent.getType()); } @@ -1903,25 +1906,59 @@ public class VFilterSelect extends Composite afterSelectedItemIconChange(); } } else { + IconWidget newIcon = new IconWidget(client.getIcon(iconUri)); + if (iconEquals(newIcon, selectedItemIcon)) { + /* + * Do not update the icon if nothing has changed. Otherwise we + * can cause problems such as not being able to click in the + * icon to open the popup (blur might occur and call this + * method, icon is replaced and the click event is not delivered + * to the new icon) + */ + return; + } + if (selectedItemIcon != null) { panel.remove(selectedItemIcon); } - selectedItemIcon = new IconWidget(client.getIcon(iconUri)); + // Older IE versions don't scale icon correctly if DOM // contains height and width attributes. - selectedItemIcon.getElement().removeAttribute("height"); - selectedItemIcon.getElement().removeAttribute("width"); - selectedItemIcon.addDomHandler(new LoadHandler() { + newIcon.getElement().removeAttribute("height"); + newIcon.getElement().removeAttribute("width"); + newIcon.addDomHandler(new LoadHandler() { @Override public void onLoad(LoadEvent event) { afterSelectedItemIconChange(); } }, LoadEvent.getType()); - panel.insert(selectedItemIcon, 0); + panel.insert(newIcon, 0); + selectedItemIcon = newIcon; afterSelectedItemIconChange(); } } + /** + * Checks if the icon widgets show the same icon. + * + * @param icon1 + * the first widget + * @param icon2 + * the second widget + * @return <code>true</code> if they show the same icon, <code>false</code> + * otherwise + */ + private static boolean iconEquals(IconWidget icon1, IconWidget icon2) { + if (icon1 == null) { + return icon2 == null; + } else if (icon2 == null) { + return false; + } else { + return icon1.icon.getUri().equals(icon2.icon.getUri()); + } + + } + private void afterSelectedItemIconChange() { if (BrowserInfo.get().isWebkit() || BrowserInfo.get().isIE8()) { // Some browsers need a nudge to reposition the text field @@ -2387,6 +2424,7 @@ public class VFilterSelect extends Composite } } else if (currentSuggestion != null) { setPromptingOff(currentSuggestion.caption); + setSelectedItemIcon(currentSuggestion.getIconUri()); } } removeStyleDependentName("focus"); |