From a87bab838de81a0606f61cf2bf7d76013f58928a Mon Sep 17 00:00:00 2001 From: Juuso Valli Date: Mon, 19 May 2014 14:40:03 +0300 Subject: [PATCH] Fix caption measurement in VAbstractOrderedLayout (#13741) Change-Id: I7bb9a404c789f352477b752537ffdedfc60da91c --- .../vaadin/client/ui/orderedlayout/Slot.java | 23 ++++++ .../AbstractOrderedLayoutWithCaptions.java | 72 +++++++++++++++++++ ...AbstractOrderedLayoutWithCaptionsTest.java | 61 ++++++++++++++++ 3 files changed, 156 insertions(+) create mode 100644 uitest/src/com/vaadin/tests/components/AbstractOrderedLayoutWithCaptions.java create mode 100644 uitest/src/com/vaadin/tests/components/AbstractOrderedLayoutWithCaptionsTest.java diff --git a/client/src/com/vaadin/client/ui/orderedlayout/Slot.java b/client/src/com/vaadin/client/ui/orderedlayout/Slot.java index b1d7dd2804..f16351ab54 100644 --- a/client/src/com/vaadin/client/ui/orderedlayout/Slot.java +++ b/client/src/com/vaadin/client/ui/orderedlayout/Slot.java @@ -79,6 +79,25 @@ public final class Slot extends SimplePanel { } }; + /* + * This listener is only used to force the LayoutManager to measure the + * caption size. #13741 + */ + private static final ElementResizeListener CAPTION_DUMMY_LISTENER = new ElementResizeListener() { + @Override + public void onElementResize(ElementResizeEvent e) { + // Do nothing + // We must include a listener for the element so + // that it gets measured during layout. + + // TODO Alter the way in which LayoutManager + // determines which elements should be measured. + // There should be an easier way to do add items + // to LayoutManager.measuredNonConnectorElements + // (#13792) + } + }; + // Caption is placed after component unless there is some part which // moves it above. private CaptionPosition captionPosition = CaptionPosition.RIGHT; @@ -471,6 +490,8 @@ public final class Slot extends SimplePanel { if (captionText != null || icon != null || error != null || required) { if (caption == null) { caption = DOM.createDiv(); + layout.getLayoutManager().addElementResizeListener(caption, + CAPTION_DUMMY_LISTENER); captionWrap = DOM.createDiv(); captionWrap.addClassName(StyleConstants.UI_WIDGET); captionWrap.addClassName("v-has-caption"); @@ -489,6 +510,8 @@ public final class Slot extends SimplePanel { getElement().appendChild(widget.getElement()); adopt(widget); captionWrap.removeFromParent(); + layout.getLayoutManager().removeElementResizeListener(caption, + CAPTION_DUMMY_LISTENER); caption = null; captionWrap = null; diff --git a/uitest/src/com/vaadin/tests/components/AbstractOrderedLayoutWithCaptions.java b/uitest/src/com/vaadin/tests/components/AbstractOrderedLayoutWithCaptions.java new file mode 100644 index 0000000000..c5dcba7e7b --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/AbstractOrderedLayoutWithCaptions.java @@ -0,0 +1,72 @@ +/* + * 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; + +import com.vaadin.server.VaadinRequest; +import com.vaadin.ui.Label; +import com.vaadin.ui.Panel; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; + +/** + * Test to see if AbstractOrderedLayout displays captions correctly with + * expanding ratios. + * + * @author Vaadin Ltd + */ +public class AbstractOrderedLayoutWithCaptions extends AbstractTestUI { + + @Override + protected void setup(VaadinRequest request) { + VerticalLayout layout = new VerticalLayout(); + layout.setSizeFull(); + + TextField textField = new TextField("Input Text:"); + Label label1 = new Label("LABEL 1"); + Label label2 = new Label("LABEL 2"); + + layout.addComponent(textField); + + layout.addComponent(label1); + layout.setExpandRatio(label1, 1.0f); + + layout.addComponent(label2); + + Panel containingPanel = new Panel(layout); + containingPanel.setHeight("200px"); + addComponent(containingPanel); + } + + /* + * (non-Javadoc) + * + * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription() + */ + @Override + protected String getTestDescription() { + return "Test to see if AbstractOrderedLayout calculates captions correctly."; + } + + /* + * (non-Javadoc) + * + * @see com.vaadin.tests.components.AbstractTestUI#getTicketNumber() + */ + @Override + protected Integer getTicketNumber() { + return 13741; + } +} diff --git a/uitest/src/com/vaadin/tests/components/AbstractOrderedLayoutWithCaptionsTest.java b/uitest/src/com/vaadin/tests/components/AbstractOrderedLayoutWithCaptionsTest.java new file mode 100644 index 0000000000..4f5c16218e --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/AbstractOrderedLayoutWithCaptionsTest.java @@ -0,0 +1,61 @@ +/* + * 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; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.lessThanOrEqualTo; +import static org.hamcrest.core.Is.is; + +import java.util.List; + +import org.junit.Test; +import org.openqa.selenium.WebElement; + +import com.vaadin.testbench.By; +import com.vaadin.tests.tb3.MultiBrowserTest; + +/** + * Test to see if AbstractOrderedLayout displays captions correctly with + * expanding ratios. + * + * @author Vaadin Ltd + */ +public class AbstractOrderedLayoutWithCaptionsTest extends MultiBrowserTest { + + @Test + public void CaptionHeightMeasuredCorrectly() { + openTestURL(); + + WebElement div = getDriver().findElement( + By.cssSelector(".v-panel-content > div > div")); + String paddingTop = div.getCssValue("padding-top"); + Integer paddingHeight = Integer.parseInt(paddingTop.substring(0, + paddingTop.length() - 2)); + List children = getDriver().findElements( + By.cssSelector(".v-panel-content .v-slot")); + assertThat(children.size(), is(3)); + + Integer neededHeight = children.get(0).getSize().getHeight() + + children.get(2).getSize().getHeight(); + + if (BrowserUtil.isIE8(getDesiredCapabilities())) { + // IE8 Reports the first element height incorrectly. + --neededHeight; + } + assertThat(neededHeight, is(lessThanOrEqualTo(paddingHeight))); + + } +} -- 2.39.5