diff options
author | John Ahlroos <john@vaadin.com> | 2012-11-01 09:57:21 +0200 |
---|---|---|
committer | John Ahlroos <john@vaadin.com> | 2012-11-01 09:57:21 +0200 |
commit | 4028718760ec3a6e2a73f56cfa72de08efc1250c (patch) | |
tree | ca8defed22115b410263d4447f90494748134951 /client | |
parent | 8cf6a76827818f7fa32a3d0981f45d10cc0db2db (diff) | |
download | vaadin-framework-4028718760ec3a6e2a73f56cfa72de08efc1250c.tar.gz vaadin-framework-4028718760ec3a6e2a73f56cfa72de08efc1250c.zip |
Fixed Combobox popup positioning problem when located inside a PopupView #9768
Change-Id: I5c256483fcb5050b08eb7c481676385789e96f09
Diffstat (limited to 'client')
-rw-r--r-- | client/src/com/vaadin/client/ui/combobox/VFilterSelect.java | 100 |
1 files changed, 60 insertions, 40 deletions
diff --git a/client/src/com/vaadin/client/ui/combobox/VFilterSelect.java b/client/src/com/vaadin/client/ui/combobox/VFilterSelect.java index 4241daca6f..31b240ad80 100644 --- a/client/src/com/vaadin/client/ui/combobox/VFilterSelect.java +++ b/client/src/com/vaadin/client/ui/combobox/VFilterSelect.java @@ -24,6 +24,7 @@ import java.util.Iterator; import java.util.List; import java.util.Set; +import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.dom.client.Style; import com.google.gwt.dom.client.Style.Display; @@ -234,49 +235,68 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, * The total amount of suggestions */ public void showSuggestions( - Collection<FilterSelectSuggestion> currentSuggestions, - int currentPage, int totalSuggestions) { - - // Add TT anchor point - getElement().setId("VAADIN_COMBOBOX_OPTIONLIST"); - - menu.setSuggestions(currentSuggestions); - final int x = VFilterSelect.this.getAbsoluteLeft(); - topPosition = tb.getAbsoluteTop(); - topPosition += tb.getOffsetHeight(); - setPopupPosition(x, topPosition); - - int nullOffset = (nullSelectionAllowed && "".equals(lastFilter) ? 1 - : 0); - boolean firstPage = (currentPage == 0); - final int first = currentPage * pageLength + 1 - - (firstPage ? 0 : nullOffset); - final int last = first + currentSuggestions.size() - 1 - - (firstPage && "".equals(lastFilter) ? nullOffset : 0); - final int matches = totalSuggestions - nullOffset; - if (last > 0) { - // nullsel not counted, as requested by user - status.setInnerText((matches == 0 ? 0 : first) + "-" + last - + "/" + matches); - } else { - status.setInnerText(""); - } - // We don't need to show arrows or statusbar if there is only one - // page - if (totalSuggestions <= pageLength || pageLength == 0) { - setPagingEnabled(false); - } else { - setPagingEnabled(true); - } - setPrevButtonActive(first > 1); - setNextButtonActive(last < matches); + final Collection<FilterSelectSuggestion> currentSuggestions, + final int currentPage, final int totalSuggestions) { - // clear previously fixed width - menu.setWidth(""); - menu.getElement().getFirstChildElement().getStyle().clearWidth(); + /* + * We need to defer the opening of the popup so that the parent DOM + * has stabilized so we can calculate an absolute top and left + * correctly. This issue manifests when a Combobox is placed in + * another popupView which also needs to calculate the absoluteTop() + * to position itself. #9768 + */ + final SuggestionPopup popup = this; + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + @Override + public void execute() { + // Add TT anchor point + getElement().setId("VAADIN_COMBOBOX_OPTIONLIST"); + + menu.setSuggestions(currentSuggestions); + final int x = VFilterSelect.this.getAbsoluteLeft(); + + topPosition = tb.getAbsoluteTop(); + topPosition += tb.getOffsetHeight(); + + setPopupPosition(x, topPosition); + + int nullOffset = (nullSelectionAllowed + && "".equals(lastFilter) ? 1 : 0); + boolean firstPage = (currentPage == 0); + final int first = currentPage * pageLength + 1 + - (firstPage ? 0 : nullOffset); + final int last = first + + currentSuggestions.size() + - 1 + - (firstPage && "".equals(lastFilter) ? nullOffset + : 0); + final int matches = totalSuggestions - nullOffset; + if (last > 0) { + // nullsel not counted, as requested by user + status.setInnerText((matches == 0 ? 0 : first) + "-" + + last + "/" + matches); + } else { + status.setInnerText(""); + } + // We don't need to show arrows or statusbar if there is + // only one + // page + if (totalSuggestions <= pageLength || pageLength == 0) { + setPagingEnabled(false); + } else { + setPagingEnabled(true); + } + setPrevButtonActive(first > 1); + setNextButtonActive(last < matches); - setPopupPositionAndShow(this); + // clear previously fixed width + menu.setWidth(""); + menu.getElement().getFirstChildElement().getStyle() + .clearWidth(); + setPopupPositionAndShow(popup); + } + }); } /** |