aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonatan Kronqvist <jonatan.kronqvist@itmill.com>2010-07-06 08:05:26 +0000
committerJonatan Kronqvist <jonatan.kronqvist@itmill.com>2010-07-06 08:05:26 +0000
commit49e3c3579a0b6ed52f3fbf6708372a80a97f6efa (patch)
treeee278b003c1e0fc80d9fbf2e62e7ff6d49e26336
parent5a87027870866bd274e09fdf2b66d286fcf58e07 (diff)
downloadvaadin-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.java70
-rw-r--r--tests/src/com/vaadin/tests/components/combobox/ComboBoxSlowInFF.java67
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;
+ }
+
+}