diff options
author | Jonatan Kronqvist <jonatan.kronqvist@itmill.com> | 2010-07-06 08:05:26 +0000 |
---|---|---|
committer | Jonatan Kronqvist <jonatan.kronqvist@itmill.com> | 2010-07-06 08:05:26 +0000 |
commit | 49e3c3579a0b6ed52f3fbf6708372a80a97f6efa (patch) | |
tree | ee278b003c1e0fc80d9fbf2e62e7ff6d49e26336 | |
parent | 5a87027870866bd274e09fdf2b66d286fcf58e07 (diff) | |
download | vaadin-framework-49e3c3579a0b6ed52f3fbf6708372a80a97f6efa.tar.gz vaadin-framework-49e3c3579a0b6ed52f3fbf6708372a80a97f6efa.zip |
Fix for #3663
svn changeset:14084/svn branch:6.4
-rw-r--r-- | src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java | 70 | ||||
-rw-r--r-- | tests/src/com/vaadin/tests/components/combobox/ComboBoxSlowInFF.java | 67 |
2 files changed, 109 insertions, 28 deletions
diff --git a/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java b/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java index c47aa2c0cf..7372d6610f 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java @@ -28,6 +28,7 @@ import com.google.gwt.event.logical.shared.CloseEvent; import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.DeferredCommand; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Window; @@ -36,9 +37,9 @@ import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.PopupPanel; -import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.PopupPanel.PositionCallback; import com.google.gwt.user.client.ui.SuggestOracle.Suggestion; +import com.google.gwt.user.client.ui.TextBox; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.EventId; @@ -260,9 +261,7 @@ public class VFilterSelect extends Composite implements Paintable, Field, private void setPrevButtonActive(boolean active) { if (active) { DOM.sinkEvents(up, Event.ONCLICK); - DOM - .setElementProperty(up, "className", CLASSNAME - + "-prevpage"); + DOM.setElementProperty(up, "className", CLASSNAME + "-prevpage"); } else { DOM.sinkEvents(up, 0); DOM.setElementProperty(up, "className", CLASSNAME @@ -283,8 +282,7 @@ public class VFilterSelect extends Composite implements Paintable, Field, menu.selectItem(newSelectedItem); tb.setText(newSelectedItem.getText()); tb.setSelectionRange(lastFilter.length(), newSelectedItem - .getText().length() - - lastFilter.length()); + .getText().length() - lastFilter.length()); } else if (hasNextPage()) { lastIndex = index - 1; // save for paging @@ -304,8 +302,7 @@ public class VFilterSelect extends Composite implements Paintable, Field, menu.selectItem(newSelectedItem); tb.setText(newSelectedItem.getText()); tb.setSelectionRange(lastFilter.length(), newSelectedItem - .getText().length() - - lastFilter.length()); + .getText().length() - lastFilter.length()); } else if (index == -1) { if (currentPage > 0) { lastIndex = index + 1; // save for paging @@ -317,8 +314,7 @@ public class VFilterSelect extends Composite implements Paintable, Field, menu.selectItem(newSelectedItem); tb.setText(newSelectedItem.getText()); tb.setSelectionRange(lastFilter.length(), newSelectedItem - .getText().length() - - lastFilter.length()); + .getText().length() - lastFilter.length()); } } @@ -388,8 +384,8 @@ public class VFilterSelect extends Composite implements Paintable, Field, offsetHeight = getOffsetHeight(); final int desiredWidth = getMainWidth(); - int naturalMenuWidth = DOM.getElementPropertyInt(DOM - .getFirstChild(menu.getElement()), "offsetWidth"); + int naturalMenuWidth = DOM.getElementPropertyInt( + DOM.getFirstChild(menu.getElement()), "offsetWidth"); if (popupOuterPadding == -1) { popupOuterPadding = Util.measureHorizontalPaddingAndBorder( @@ -433,8 +429,8 @@ public class VFilterSelect extends Composite implements Paintable, Field, } // fetch real width (mac FF bugs here due GWT popups overflow:auto ) - offsetWidth = DOM.getElementPropertyInt(DOM.getFirstChild(menu - .getElement()), "offsetWidth"); + offsetWidth = DOM.getElementPropertyInt( + DOM.getFirstChild(menu.getElement()), "offsetWidth"); if (offsetWidth + getPopupLeft() > Window.getClientWidth() + Window.getScrollLeft()) { left = VFilterSelect.this.getAbsoluteLeft() @@ -532,10 +528,9 @@ public class VFilterSelect extends Composite implements Paintable, Field, .getFirstChildElement(); while (child != null) { if (child.getNodeName().toLowerCase().equals("img")) { - DOM - .sinkEvents((Element) child.cast(), - (DOM.getEventsSunk((Element) child - .cast()) | Event.ONLOAD)); + DOM.sinkEvents( + (Element) child.cast(), + (DOM.getEventsSunk((Element) child.cast()) | Event.ONLOAD)); client.addPngFix((Element) child.cast()); } child = child.getNextSiblingElement(); @@ -620,9 +615,10 @@ public class VFilterSelect extends Composite implements Paintable, Field, } else if (item != null && !"".equals(lastFilter) && (filteringmode == FILTERINGMODE_CONTAINS ? item - .getText().toLowerCase().contains( - lastFilter.toLowerCase()) : item.getText() - .toLowerCase().startsWith(lastFilter.toLowerCase()))) { + .getText().toLowerCase() + .contains(lastFilter.toLowerCase()) : item + .getText().toLowerCase() + .startsWith(lastFilter.toLowerCase()))) { doItemAction(item, true); } else { // currentSuggestion has key="" for nullselection @@ -1039,10 +1035,9 @@ public class VFilterSelect extends Composite implements Paintable, Field, suggestionPopup.menu.selectItem(activeMenuItem); } - tb.setText(activeMenuItem.getText()); + setTextboxText(activeMenuItem.getText()); tb.setSelectionRange(lastFilter.length(), activeMenuItem - .getText().length() - - lastFilter.length()); + .getText().length() - lastFilter.length()); lastIndex = -1; // reset } @@ -1063,6 +1058,25 @@ public class VFilterSelect extends Composite implements Paintable, Field, initDone = true; } + /** + * Sets the text in the text box using a deferred command if on Gecko. This + * is required for performance reasons (see #3663). + * + * @param text + * the text to set in the text box + */ + private void setTextboxText(final String text) { + if (BrowserInfo.get().isGecko()) { + DeferredCommand.addCommand(new Command() { + public void execute() { + tb.setText(text); + } + }); + } else { + tb.setText(text); + } + } + /* * (non-Javadoc) * @@ -1088,7 +1102,7 @@ public class VFilterSelect extends Composite implements Paintable, Field, prompting = true; addStyleDependentName(CLASSNAME_PROMPT); } - tb.setText(inputPrompt); + setTextboxText(inputPrompt); } /** @@ -1099,7 +1113,7 @@ public class VFilterSelect extends Composite implements Paintable, Field, * The text the text box should contain. */ private void setPromptingOff(String text) { - tb.setText(text); + setTextboxText(text); if (prompting) { prompting = false; removeStyleDependentName(CLASSNAME_PROMPT); @@ -1580,8 +1594,8 @@ public class VFilterSelect extends Composite implements Paintable, Field, */ private int getTextboxPadding() { if (textboxPadding < 0) { - textboxPadding = Util.measureHorizontalPaddingAndBorder(tb - .getElement(), 4); + textboxPadding = Util.measureHorizontalPaddingAndBorder( + tb.getElement(), 4); } return textboxPadding; } diff --git a/tests/src/com/vaadin/tests/components/combobox/ComboBoxSlowInFF.java b/tests/src/com/vaadin/tests/components/combobox/ComboBoxSlowInFF.java new file mode 100644 index 0000000000..5c1dad4a30 --- /dev/null +++ b/tests/src/com/vaadin/tests/components/combobox/ComboBoxSlowInFF.java @@ -0,0 +1,67 @@ +package com.vaadin.tests.components.combobox; + +import com.vaadin.data.Item; +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.Component; +import com.vaadin.ui.Table; +import com.vaadin.ui.VerticalLayout; + +@SuppressWarnings("serial") +public class ComboBoxSlowInFF extends TestBase { + + @Override + protected void setup() { + VerticalLayout lo = new VerticalLayout(); + lo.setSizeFull(); + final Table t = new Table(); + t.setSizeFull(); + for (int i = 0; i < 5; i++) { + t.addContainerProperty("test" + i, Component.class, null); + } + + Button fill = new Button("fill it"); + fill.addListener(new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + t.removeAllItems(); + for (int i = 0; i < 200; i++) { + Item item = t.addItem(i); + for (int j = 0; j < 5; j++) { + item.getItemProperty("test" + j).setValue( + createComponent(i, j)); + } + } + } + }); + lo.addComponent(fill); + lo.addComponent(t); + lo.setExpandRatio(t, 1.0F); + addComponent(lo); + } + + private Component createComponent(int x, int y) { + ComboBox box = new ComboBox(); + // box.setMultiSelect(true); + box.addContainerProperty("name", String.class, ""); + box.setItemCaptionPropertyId("name"); + for (int ix = 0; ix < 20; ix++) { + box.addItem(x + 20 * y + ix).getItemProperty("name") + .setValue("" + x + ", " + y + " " + ix); + } + box.setValue(x + 20 * y); + return box; + } + + @Override + protected String getDescription() { + return "FF is very slow when rendering many ComboBoxes in a table"; + } + + @Override + protected Integer getTicketNumber() { + return 3663; + } + +} |