From: Markus Koivisto Date: Fri, 25 Apr 2014 13:58:53 +0000 (+0300) Subject: Force recalc of width when the ComboBox style has changed (#13444) X-Git-Tag: 7.3.0.alpha2^2~15 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=aa8761cc6338f48b4fa53025f0c8b02db15b9491;p=vaadin-framework.git Force recalc of width when the ComboBox style has changed (#13444) Change-Id: I7bb500c1b64502881824875e967cf43c5e49a999 --- diff --git a/client/src/com/vaadin/client/ui/VFilterSelect.java b/client/src/com/vaadin/client/ui/VFilterSelect.java index 94adc1c4b5..d21d5d2090 100644 --- a/client/src/com/vaadin/client/ui/VFilterSelect.java +++ b/client/src/com/vaadin/client/ui/VFilterSelect.java @@ -1924,6 +1924,20 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, * For internal use only. May be removed or replaced in the future. */ public void updateRootWidth() { + updateRootWidth(false); + } + + /** + * Calculates the width of the select if the select has undefined width. + * Should be called when the width changes or when the icon changes. + *

+ * For internal use only. May be removed or replaced in the future. + * + * @param forceUpdate + * a flag that forces a recalculation even if one would not + * normally be done + */ + public void updateRootWidth(boolean forceUpdate) { ComponentConnector paintable = ConnectorMap.get(client).getConnector( this); if (paintable.isUndefinedWidth()) { @@ -1936,7 +1950,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, * wide. */ int w = Util.getRequiredWidth(this); - if ((!initDone || currentPage + 1 < 0) + if ((forceUpdate || !initDone || currentPage + 1 < 0) && suggestionPopupMinWidth > w) { /* * We want to compensate for the paddings just to preserve the diff --git a/client/src/com/vaadin/client/ui/combobox/ComboBoxConnector.java b/client/src/com/vaadin/client/ui/combobox/ComboBoxConnector.java index 6c8ccf32a8..84d1475185 100644 --- a/client/src/com/vaadin/client/ui/combobox/ComboBoxConnector.java +++ b/client/src/com/vaadin/client/ui/combobox/ComboBoxConnector.java @@ -22,6 +22,7 @@ import java.util.List; import com.vaadin.client.ApplicationConnection; import com.vaadin.client.Paintable; import com.vaadin.client.UIDL; +import com.vaadin.client.communication.StateChangeEvent; import com.vaadin.client.ui.AbstractFieldConnector; import com.vaadin.client.ui.SimpleManagedLayout; import com.vaadin.client.ui.VFilterSelect; @@ -41,6 +42,10 @@ public class ComboBoxConnector extends AbstractFieldConnector implements // update textbox text by a changed item caption. private boolean oldSuggestionTextMatchTheOldSelection; + // Need to recompute the width of the combobox when styles change, see + // #13444 + private boolean stylesChanged; + /* * (non-Javadoc) * @@ -207,8 +212,11 @@ public class ComboBoxConnector extends AbstractFieldConnector implements getWidget().popupOpenerClicked = false; - if (!getWidget().initDone) { - getWidget().updateRootWidth(); + // styles have changed or this is our first time - either way we + // need to recalculate the root width. + if (!getWidget().initDone || stylesChanged) { + boolean forceUpdate = true; + getWidget().updateRootWidth(forceUpdate); } // Focus dependent style names are lost during the update, so we add @@ -217,6 +225,9 @@ public class ComboBoxConnector extends AbstractFieldConnector implements getWidget().addStyleDependentName("focus"); } + // width has been recalculated above, clear style change flag + stylesChanged = false; + getWidget().initDone = true; } @@ -307,4 +318,13 @@ public class ComboBoxConnector extends AbstractFieldConnector implements getWidget().enabled = widgetEnabled; getWidget().tb.setEnabled(widgetEnabled); } + + @Override + public void onStateChanged(StateChangeEvent event) { + super.onStateChanged(event); + if (event.hasPropertyChanged("styles")) { + stylesChanged = true; + } + } + } diff --git a/uitest/src/com/vaadin/tests/components/ui/ComboboxStyleChangeWidth.java b/uitest/src/com/vaadin/tests/components/ui/ComboboxStyleChangeWidth.java new file mode 100644 index 0000000000..6e5ca36f31 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/ui/ComboboxStyleChangeWidth.java @@ -0,0 +1,65 @@ +/* + * Copyright 2000-2014 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.tests.components.ui; + +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUIWithLog; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.ComboBox; + +/** + * Test UI for adding a stylename to a combobox with an undefined width. + * + * @author Vaadin Ltd + */ +public class ComboboxStyleChangeWidth extends AbstractTestUIWithLog { + + @Override + protected void setup(VaadinRequest request) { + final ComboBox cbFoo = new ComboBox(); + cbFoo.setImmediate(true); + cbFoo.setSizeUndefined(); + cbFoo.addItem("A really long string that causes an inline width to be set"); + + Button btn = new Button("Click to break CB", + new Button.ClickListener() { + @Override + public void buttonClick(ClickEvent event) { + cbFoo.addStyleName("foofoo"); + + } + }); + + addComponent(cbFoo); + addComponent(btn); + + } + + @Override + protected String getTestDescription() { + return "The computed inline width of an undefined-width ComboBox " + + "(with a sufficiently long option string) breaks when " + + "the component's stylename is changed after initial " + + "rendering."; + } + + @Override + protected Integer getTicketNumber() { + return Integer.valueOf(13444); + } + +} diff --git a/uitest/src/com/vaadin/tests/components/ui/ComboboxStyleChangeWidthTest.java b/uitest/src/com/vaadin/tests/components/ui/ComboboxStyleChangeWidthTest.java new file mode 100644 index 0000000000..c0845cabb0 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/ui/ComboboxStyleChangeWidthTest.java @@ -0,0 +1,52 @@ +/* + * Copyright 2000-2014 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.tests.components.ui; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +import com.vaadin.tests.tb3.MultiBrowserTest; + +/** + * Tests that changing a stylename will not cause the width parameter to be + * removed from a combobox. + * + * @author Vaadin Ltd + */ + +public class ComboboxStyleChangeWidthTest extends MultiBrowserTest { + + @Test + public void testWidthRetained() { + openTestURL(); + + WebElement comboBox = driver + .findElement(By.className("v-filterselect")); + String oldStyle = comboBox.getAttribute("style"); + + WebElement button = driver.findElement(By.className("v-button")); + button.click(); + String newStyle = comboBox.getAttribute("style"); + + assertEquals("width has changed, should remain equal", oldStyle, + newStyle); + + } + +}