]> source.dussan.org Git - vaadin-framework.git/commitdiff
Method for requesting column width recalculation (#16748)
authorArtur Signell <artur@vaadin.com>
Fri, 27 Feb 2015 15:14:29 +0000 (17:14 +0200)
committerVaadin Code Review <review@vaadin.com>
Mon, 2 Mar 2015 12:44:38 +0000 (12:44 +0000)
Change-Id: I089f08a056a358d9857ce6608293878e2b8bbd9e

client/src/com/vaadin/client/connectors/GridConnector.java
client/src/com/vaadin/client/widgets/Grid.java
server/src/com/vaadin/ui/Grid.java
shared/src/com/vaadin/shared/ui/grid/GridClientRpc.java
uitest/src/com/vaadin/tests/components/grid/GridColumnWidthRecalculation.java [new file with mode: 0644]
uitest/src/com/vaadin/tests/components/grid/GridColumnWidthRecalculationTest.java [new file with mode: 0644]

index f263b476427f72c7b21f0b5587e618b4524e53dd..55f07ecf85f56e08a04ff4e2714a1385e4cff885 100644 (file)
@@ -454,6 +454,11 @@ public class GridConnector extends AbstractHasComponentsConnector implements
                     }
                 });
             }
+
+            @Override
+            public void recalculateColumnWidths() {
+                getWidget().recalculateColumnWidths();
+            }
         });
 
         getWidget().addSelectionHandler(internalSelectionChangeHandler);
index 71962d695375e7afaddf4cb8a6f44e603737fc6e..f9319b39d2e4366dbedba0f113c4f0b9e2d51839 100644 (file)
@@ -3027,11 +3027,11 @@ public class Grid<T> extends ResizeComposite implements
             }
 
             if (this.grid != null) {
-                this.grid.autoColumnWidthsRecalculator.schedule();
+                this.grid.recalculateColumnWidths();
             }
             this.grid = grid;
             if (this.grid != null) {
-                this.grid.autoColumnWidthsRecalculator.schedule();
+                this.grid.recalculateColumnWidths();
                 updateHeader();
             }
         }
@@ -3415,7 +3415,7 @@ public class Grid<T> extends ResizeComposite implements
 
         private void scheduleColumnWidthRecalculator() {
             if (grid != null) {
-                grid.autoColumnWidthsRecalculator.schedule();
+                grid.recalculateColumnWidths();
             } else {
                 /*
                  * NOOP
@@ -6279,4 +6279,17 @@ public class Grid<T> extends ResizeComposite implements
     public void resetSizesFromDom() {
         getEscalator().resetSizesFromDom();
     }
+
+    /**
+     * Requests that the column widths should be recalculated.
+     * <p>
+     * The actual recalculation is not necessarily done immediately so you
+     * cannot rely on the columns being the correct width after the call
+     * returns.
+     * 
+     * @since
+     */
+    public void recalculateColumnWidths() {
+        autoColumnWidthsRecalculator.schedule();
+    }
 }
index a32968bd738666345691fce5386729b780087a47..6ab6c6b1a4515677e1508b69313feeaffc1dcbbe 100644 (file)
@@ -5080,4 +5080,17 @@ public class Grid extends AbstractComponent implements SelectionNotifier,
     public void removeListener(ItemClickListener listener) {
         removeItemClickListener(listener);
     }
+
+    /**
+     * Requests that the column widths should be recalculated.
+     * <p>
+     * In most cases Grid will know when column widths need to be recalculated
+     * but this method can be used to force recalculation in situations when
+     * grid does not recalculate automatically.
+     * 
+     * @since
+     */
+    public void recalculateColumnWidths() {
+        getRpcProxy(GridClientRpc.class).recalculateColumnWidths();
+    }
 }
index ed849cb361b00df6e1e6d6249acc7bf4d2854f73..4ba081b5df829b0116f1eb9c2af2aebdcf5fb45c 100644 (file)
@@ -50,4 +50,9 @@ public interface GridClientRpc extends ClientRpc {
      */
     public void scrollToEnd();
 
+    /**
+     * Command client Grid to recalculate column widths.
+     */
+    public void recalculateColumnWidths();
+
 }
diff --git a/uitest/src/com/vaadin/tests/components/grid/GridColumnWidthRecalculation.java b/uitest/src/com/vaadin/tests/components/grid/GridColumnWidthRecalculation.java
new file mode 100644 (file)
index 0000000..43584eb
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * 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.grid;
+
+import java.util.ArrayList;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.data.Container.Indexed;
+import com.vaadin.data.Item;
+import com.vaadin.data.Property;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Grid;
+
+@Theme("valo")
+public class GridColumnWidthRecalculation extends AbstractTestUI {
+
+    @Override
+    protected void setup(VaadinRequest request) {
+        final Grid grid = new Grid();
+
+        grid.addColumn("Column 1");
+        grid.addColumn("Column 2");
+
+        grid.addRow("Narrow",
+                "Wiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiide");
+        addComponent(grid);
+
+        Button b = new Button("Swap content", new Button.ClickListener() {
+
+            @Override
+            public void buttonClick(ClickEvent event) {
+                swapData(grid);
+            }
+        });
+        addComponent(b);
+
+        b = new Button("Swap content and recalculate columns",
+                new Button.ClickListener() {
+
+                    @Override
+                    public void buttonClick(ClickEvent event) {
+                        swapData(grid);
+                        grid.recalculateColumnWidths();
+
+                    }
+                });
+        addComponent(b);
+    }
+
+    @SuppressWarnings("unchecked")
+    protected void swapData(Grid grid) {
+        Indexed dataSource = grid.getContainerDataSource();
+        Object itemId = dataSource.getItemIds().iterator().next();
+        Item item = dataSource.getItem(itemId);
+        ArrayList<Object> pIds = new ArrayList<Object>(
+                item.getItemPropertyIds());
+        for (int i = 0; i < pIds.size() / 2; i++) {
+            int j = pIds.size() - 1 - i;
+            Object pid1 = pIds.get(i);
+            Object pid2 = pIds.get(j);
+
+            Property<Object> property1 = item.getItemProperty(pid1);
+            Property<Object> property2 = item.getItemProperty(pid2);
+            Object tmp = property1.getValue();
+            property1.setValue(property2.getValue());
+            property2.setValue(tmp);
+        }
+    }
+
+    @Override
+    protected String getTestDescription() {
+        return "There should be a way to ask Grid to recalculate column widths from server-side.";
+    }
+
+    @Override
+    protected Integer getTicketNumber() {
+        return 16748;
+    }
+}
diff --git a/uitest/src/com/vaadin/tests/components/grid/GridColumnWidthRecalculationTest.java b/uitest/src/com/vaadin/tests/components/grid/GridColumnWidthRecalculationTest.java
new file mode 100644 (file)
index 0000000..fab3bd8
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * 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.grid;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.openqa.selenium.Dimension;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.GridElement;
+import com.vaadin.testbench.elements.GridElement.GridCellElement;
+import com.vaadin.tests.tb3.SingleBrowserTest;
+
+public class GridColumnWidthRecalculationTest extends SingleBrowserTest {
+
+    private GridElement grid;
+
+    @Before
+    public void open() {
+        openTestURL();
+        grid = $(GridElement.class).first();
+    }
+
+    @Test
+    public void columnWidthAfterSwap() {
+        int column0Width = getColumnWidth(0);
+        int column1Width = getColumnWidth(1);
+        Assert.assertTrue(
+                "Column 0 should be narrower than column 1 initially",
+                column0Width < column1Width);
+
+        $(ButtonElement.class).caption("Swap content").first().click();
+
+        Assert.assertEquals(
+                "Column 0 width should not change when swapping contents only",
+                column0Width, getColumnWidth(0));
+        Assert.assertEquals(
+                "Column 1 width should not change when swapping contents only",
+                column1Width, getColumnWidth(1));
+    }
+
+    @Test
+    public void columnWidthAfterSwapAndRecalculate() {
+        int column0Width = getColumnWidth(0);
+        int column1Width = getColumnWidth(1);
+        Assert.assertTrue(
+                "Column 0 should be narrower than column 1 initially",
+                column0Width < column1Width);
+
+        $(ButtonElement.class).caption("Swap content and recalculate columns")
+                .first().click();
+
+        column0Width = getColumnWidth(0);
+        column1Width = getColumnWidth(1);
+
+        Assert.assertTrue(
+                "Column 1 should be narrower than column 0 after resize",
+                column1Width < column0Width);
+    }
+
+    private int getColumnWidth(int columnIndex) {
+        GridCellElement headerColumn = grid.getHeaderCells(0).get(columnIndex);
+        Dimension column1Size = headerColumn.getSize();
+        int columnWidth = column1Size.getWidth();
+        return columnWidth;
+    }
+
+}