summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetter Holmström <petter.holmstrom@outlook.com>2017-09-04 14:56:41 +0300
committerHenri Sara <henri.sara@gmail.com>2017-09-05 15:11:58 +0300
commitc2d1f3efb7fb50f93c455fad6f1ef4cf6dded211 (patch)
tree5b87bc3910fa401e7b35612f1664821e7660fb3a
parentea4cbc2cba7cc605e314dfe9d19fa62ab4a489f9 (diff)
downloadvaadin-framework-c2d1f3efb7fb50f93c455fad6f1ef4cf6dded211.tar.gz
vaadin-framework-c2d1f3efb7fb50f93c455fad6f1ef4cf6dded211.zip
Position caption correctly in GridLayout (#9909)
Position caption correctly when using different vertical alignment than TOP in GridLayout. Fixes #7895
-rw-r--r--client/src/main/java/com/vaadin/client/ui/layout/VLayoutSlot.java8
-rw-r--r--uitest/src/main/java/com/vaadin/tests/layouts/gridlayout/GridLayoutCaptionOnBottomAlignedComponent.java29
-rw-r--r--uitest/src/test/java/com/vaadin/tests/layouts/gridlayout/GridLayoutCaptionOnBottomAlignedComponentTest.java47
3 files changed, 83 insertions, 1 deletions
diff --git a/client/src/main/java/com/vaadin/client/ui/layout/VLayoutSlot.java b/client/src/main/java/com/vaadin/client/ui/layout/VLayoutSlot.java
index 1494900e62..4546d7c5d9 100644
--- a/client/src/main/java/com/vaadin/client/ui/layout/VLayoutSlot.java
+++ b/client/src/main/java/com/vaadin/client/ui/layout/VLayoutSlot.java
@@ -168,6 +168,7 @@ public abstract class VLayoutSlot {
int captionHeight;
VCaption caption = getCaption();
+ Style captionStyle = caption == null ? null : caption.getElement().getStyle();
if (caption == null || caption.shouldBePlacedAfterComponent()) {
style.clearPaddingTop();
captionHeight = 0;
@@ -215,10 +216,15 @@ public abstract class VLayoutSlot {
padding += captionHeight;
widget.getElement().getStyle().setTop(padding, Unit.PX);
+ if (captionStyle != null) {
+ captionStyle.setTop(padding - captionHeight, Unit.PX);
+ }
} else {
// Reset top when changing back to align top
widget.getElement().getStyle().clearTop();
-
+ if (captionStyle != null) {
+ captionStyle.setTop(0, Unit.PX);
+ }
}
}
diff --git a/uitest/src/main/java/com/vaadin/tests/layouts/gridlayout/GridLayoutCaptionOnBottomAlignedComponent.java b/uitest/src/main/java/com/vaadin/tests/layouts/gridlayout/GridLayoutCaptionOnBottomAlignedComponent.java
new file mode 100644
index 0000000000..e71ff3d9d6
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/layouts/gridlayout/GridLayoutCaptionOnBottomAlignedComponent.java
@@ -0,0 +1,29 @@
+package com.vaadin.tests.layouts.gridlayout;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Alignment;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.GridLayout;
+import com.vaadin.ui.TextField;
+
+public class GridLayoutCaptionOnBottomAlignedComponent extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ GridLayout layout = new GridLayout();
+ layout.setHeight("200px");
+ layout.setWidth("100%");
+
+ TextField component = new TextField("Oh Caption My Caption");
+ layout.addComponent(component);
+ layout.setComponentAlignment(component, Alignment.BOTTOM_CENTER);
+
+ addComponent(layout);
+
+ Button realign = new Button("Realign", evt -> {
+ layout.setComponentAlignment(component, Alignment.TOP_LEFT);
+ });
+ addComponent(realign);
+ }
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/layouts/gridlayout/GridLayoutCaptionOnBottomAlignedComponentTest.java b/uitest/src/test/java/com/vaadin/tests/layouts/gridlayout/GridLayoutCaptionOnBottomAlignedComponentTest.java
new file mode 100644
index 0000000000..0e5d3dea8a
--- /dev/null
+++ b/uitest/src/test/java/com/vaadin/tests/layouts/gridlayout/GridLayoutCaptionOnBottomAlignedComponentTest.java
@@ -0,0 +1,47 @@
+package com.vaadin.tests.layouts.gridlayout;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.GridLayoutElement;
+import com.vaadin.testbench.elements.TextFieldElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+import static org.junit.Assert.assertEquals;
+
+public class GridLayoutCaptionOnBottomAlignedComponentTest extends MultiBrowserTest {
+
+ @Test
+ public void captionShouldBeImmediatelyAboveItsComponent() {
+ openTestURL();
+ GridLayoutElement gridLayout = $(GridLayoutElement.class).first();
+ WebElement caption = gridLayout.findElement(By.className("v-caption"));
+ TextFieldElement component = $(TextFieldElement.class).first();
+
+ assertEquals("Caption and component have the same horizontal alignment",
+ caption.getLocation().x, component.getLocation().x);
+
+ // We have to do the assertion in this way because different browsers on different operating systems
+ // measure the height of the caption in different ways.
+ int diff = Math.abs(caption.getLocation().y - component.getLocation().y + caption.getSize().height);
+ assertLessThanOrEqual("Caption is placed directly above the component", diff, 1);
+ }
+
+ @Test
+ public void captionShouldStillBeImmediatelyAboveItsComponentEvenWhenRealigned() {
+ openTestURL();
+ GridLayoutElement gridLayout = $(GridLayoutElement.class).first();
+ WebElement caption = gridLayout.findElement(By.className("v-caption"));
+ TextFieldElement component = $(TextFieldElement.class).first();
+
+ // Click the button, this changes the alignment of the component
+ $(ButtonElement.class).first().click();
+
+ assertEquals("Caption and component have the same horizontal alignment",
+ caption.getLocation().x, component.getLocation().x);
+
+ assertEquals("Caption is placed in the top-left corner",
+ gridLayout.getLocation().y, caption.getLocation().y);
+ }
+}