// main window, valid situation
return true;
}
- if (parent.getHeight() < 0) {
+ if (isEffectiveUndefinedHeight(component)) {
// Undefined height
if (parent instanceof Window) {
// Sub window with undefined size has a min-height
// Sub window with undefined size has a min-width
return true;
}
-
- if (parent.getWidth() < 0) {
- // Undefined width
-
+ if (isEffectiveUndefinedWidth(parent)) {
if (parent instanceof AbstractOrderedLayout) {
AbstractOrderedLayout ol = (AbstractOrderedLayout) parent;
boolean horizontal = true;
}
+ /**
+ * Checks if this component will be rendered with undefined width, either
+ * because it has been set to undefined wide or because the parent forces it
+ * to be (100% inside undefined)
+ *
+ */
+ private static boolean isEffectiveUndefinedWidth(Component parent) {
+ if (parent == null) {
+ return false;
+ } else if (parent.getWidth() < 0) {
+ return true;
+ } else if (parent.getWidthUnits() == Unit.PERCENTAGE) {
+ return isEffectiveUndefinedWidth(parent.getParent());
+ }
+ return false;
+ }
+
+ /**
+ * Checks if this component will be rendered with undefined Height, either
+ * because it has been set to undefined wide or because the parent forces it
+ * to be (100% inside undefined)
+ *
+ */
+ private static boolean isEffectiveUndefinedHeight(Component parent) {
+ if (parent == null) {
+ return false;
+ } else if (parent.getHeight() < 0) {
+ return true;
+ } else if (parent.getHeightUnits() == Unit.PERCENTAGE) {
+ return isEffectiveUndefinedHeight(parent.getParent());
+ }
+ return false;
+ }
+
private static boolean hasNonRelativeWidthComponent(Form form) {
Layout layout = form.getLayout();
Layout footer = form.getFooter();
--- /dev/null
+/*
+ * 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.orderedlayout;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.NativeButton;
+import com.vaadin.ui.VerticalLayout;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+public class NestedInvalidLayouts extends AbstractTestUI {
+ @Override
+ protected void setup(VaadinRequest request) {
+ fullWidthTest(getLayout(), null);
+ fullWidthTest(getLayout(), "100%");
+ fullHeightTest(getLayout(), null);
+ fullHeightTest(getLayout(), "100%");
+ }
+
+ private void fullWidthTest(VerticalLayout layout, String rootWidth) {
+ // Contains
+ // HL (-1)
+ // * VL (100%)
+ // ** Button (-1) (wide)
+ // ** Button (100%)
+
+ // This should be rendered just as if VL width was -1 (which it will
+ // become when sending width to client), i.e. both buttons should be
+ // equally wide
+
+ final VerticalLayout l = new VerticalLayout();
+ l.setWidth(rootWidth);
+ final Button c = new Button("blaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
+ c.setWidth(null);
+ l.addComponent(c);
+ final Button b = new Button("c");
+ b.setWidth("100%");
+ l.addComponent(b);
+ layout.addComponent(new HorizontalLayout(l));
+ }
+
+ private void fullHeightTest(VerticalLayout layout, String rootHeight) {
+ // Contains (height)
+ // VL (-1)
+ // * HL (100%)
+ // ** Button (200px) (high)
+ // ** Button (100%)
+
+ // This should be rendered just as if HL height was -1 (which it will
+ // become when sending height to client), i.e. both buttons should be
+ // equally high
+
+ final HorizontalLayout l = new HorizontalLayout();
+ l.setHeight(rootHeight);
+
+ final NativeButton c = new NativeButton("hiiiigh");
+ c.setWidth(null);
+ c.setHeight("200px");
+ l.addComponent(c);
+ final NativeButton b = new NativeButton("c");
+ b.setHeight("100%");
+ l.addComponent(b);
+ VerticalLayout vl = new VerticalLayout(l);
+ vl.setHeight("100%");
+ layout.addComponent(vl);
+ }
+
+}
--- /dev/null
+/*
+ * 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.orderedlayout;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.NativeButtonElement;
+import com.vaadin.tests.tb3.SingleBrowserTest;
+
+public class NestedInvalidLayoutsTest extends SingleBrowserTest {
+
+ @Test
+ public void ensureCorrectSizes() {
+ openTestURL();
+
+ // All Button components should have equal width
+ List<Integer> widths = new ArrayList<Integer>();
+ List<ButtonElement> all = $(ButtonElement.class).state(
+ "primaryStyleName", "v-button").all();
+ for (ButtonElement button : all) {
+ widths.add(button.getSize().getWidth());
+ }
+ assertAllEqual(widths);
+
+ // All NativeButton components should have equal height
+ List<Integer> heights = new ArrayList<Integer>();
+ for (NativeButtonElement button : $(NativeButtonElement.class).all()) {
+ heights.add(button.getSize().getHeight());
+ }
+ assertAllEqual(heights);
+ }
+
+ private void assertAllEqual(List<Integer> values) {
+ Integer first = values.get(0);
+ for (Integer w : values) {
+ Assert.assertEquals(first, w);
+ }
+ }
+}
layout.addComponent(table);
layout.setSizeFull();
addComponent(layout);
+ getContent().setSizeFull();
+ getLayout().setSizeFull();
}
/*