From 8006d359acce4fb31e7210ed2f20f1da3d7a1cd0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Maciej=20Przepio=CC=81ra?= Date: Mon, 21 Sep 2015 11:05:32 +0200 Subject: [PATCH] Write all empty cells for empty GridLayout in declarative #18805 Change-Id: I589ba0dbb4aea7578f85894046e99903d9202e37 --- server/src/com/vaadin/ui/GridLayout.java | 37 ++++++++++++++++++- .../gridlayout/GridLayoutDeclarativeTest.java | 23 ++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/server/src/com/vaadin/ui/GridLayout.java b/server/src/com/vaadin/ui/GridLayout.java index 792ad72dcc..8837ad71d1 100644 --- a/server/src/com/vaadin/ui/GridLayout.java +++ b/server/src/com/vaadin/ui/GridLayout.java @@ -1456,8 +1456,12 @@ public class GridLayout extends AbstractLayout implements writeMargin(design, getMargin(), def.getMargin(), designContext); - if (components.isEmpty() - || !designContext.shouldWriteChildren(this, def)) { + if (!designContext.shouldWriteChildren(this, def)) { + return; + } + + if (components.isEmpty()) { + writeEmptyColsAndRows(design, designContext); return; } @@ -1593,6 +1597,35 @@ public class GridLayout extends AbstractLayout implements } } + /** + * Fills in the design with rows and empty columns. This needs to be done + * for empty {@link GridLayout}, because there's no other way to serialize + * info about number of columns and rows if there are absolutely no + * components in the {@link GridLayout} + * + * @since + * @param design + * @param designContext + */ + private void writeEmptyColsAndRows(Element design, + DesignContext designContext) { + int rowCount = getState(false).rows; + int colCount = getState(false).columns; + + // only write cols and rows tags if size is not 1x1 + if (rowCount == 1 && colCount == 1) { + return; + } + + for (int i = 0; i < rowCount; i++) { + Element row = design.appendElement("row"); + for (int j = 0; j < colCount; j++) { + row.appendElement("column"); + } + } + + } + private int getRowSpan(Component[][] compMap, int i, int j, int colspan, Component child) { int rowspan = 1; diff --git a/server/tests/src/com/vaadin/tests/server/component/gridlayout/GridLayoutDeclarativeTest.java b/server/tests/src/com/vaadin/tests/server/component/gridlayout/GridLayoutDeclarativeTest.java index d69fd92984..fe2d1c4a23 100644 --- a/server/tests/src/com/vaadin/tests/server/component/gridlayout/GridLayoutDeclarativeTest.java +++ b/server/tests/src/com/vaadin/tests/server/component/gridlayout/GridLayoutDeclarativeTest.java @@ -15,6 +15,10 @@ */ package com.vaadin.tests.server.component.gridlayout; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + import org.junit.Assert; import org.junit.Test; @@ -22,6 +26,7 @@ import com.vaadin.tests.server.component.DeclarativeMarginTestBase; import com.vaadin.ui.Button; import com.vaadin.ui.Component; import com.vaadin.ui.GridLayout; +import com.vaadin.ui.declarative.Design; import com.vaadin.ui.declarative.DesignContext; public class GridLayoutDeclarativeTest extends @@ -236,4 +241,22 @@ public class GridLayoutDeclarativeTest extends testWrite(design, outer); } + + @Test + public void testEmptyGridLayoutWithColsAndRowsSet() throws IOException { + GridLayout layout = new GridLayout(); + layout.setRows(2); + layout.setColumns(2); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + DesignContext context = new DesignContext(); + context.setRootComponent(layout); + Design.write(context, out); + + ByteArrayInputStream input = new ByteArrayInputStream(out.toByteArray()); + Component component = Design.read(input); + GridLayout readLayout = (GridLayout) component; + + Assert.assertEquals(layout.getRows(), readLayout.getRows()); + } } -- 2.39.5