diff options
4 files changed, 120 insertions, 9 deletions
diff --git a/client/src/com/vaadin/client/connectors/GridConnector.java b/client/src/com/vaadin/client/connectors/GridConnector.java index 2ae04b2be2..71450f6146 100644 --- a/client/src/com/vaadin/client/connectors/GridConnector.java +++ b/client/src/com/vaadin/client/connectors/GridConnector.java @@ -370,7 +370,9 @@ public class GridConnector extends AbstractHasComponentsConnector implements List<Column<?, JsonObject>> columns = getWidget().getColumns(); final List<String> newColumnOrder = new ArrayList<String>(); for (Column<?, JsonObject> column : columns) { - newColumnOrder.add(((CustomGridColumn) column).id); + if (column instanceof CustomGridColumn) { + newColumnOrder.add(((CustomGridColumn) column).id); + } // the other case would be the multi selection column } getRpcProxy(GridServerRpc.class).columnsReordered( newColumnOrder, columnOrder); diff --git a/client/src/com/vaadin/client/widget/grid/AutoScroller.java b/client/src/com/vaadin/client/widget/grid/AutoScroller.java index 71851d67c8..f7c80df623 100644 --- a/client/src/com/vaadin/client/widget/grid/AutoScroller.java +++ b/client/src/com/vaadin/client/widget/grid/AutoScroller.java @@ -669,14 +669,23 @@ public class AutoScroller { } private double getFrozenColumnsWidth() { - // TODO handle the case where the checkbox column is present - double value = 0; + double value = getMultiSelectColumnWidth(); for (int i = 0; i < grid.getFrozenColumnCount(); i++) { value += grid.getColumn(i).getWidthActual(); } return value; } + private double getMultiSelectColumnWidth() { + if (grid.getFrozenColumnCount() >= 0 + && grid.getSelectionModel().getSelectionColumnRenderer() != null) { + // frozen checkbox column is present + return getTheadElement().getFirstChildElement() + .getFirstChildElement().getOffsetWidth(); + } + return 0.0; + } + private double getMaxScrollLeft() { return grid.getScrollWidth() - (getTableElement().getParentElement().getOffsetWidth() - getFrozenColumnsWidth()); diff --git a/client/src/com/vaadin/client/widgets/Grid.java b/client/src/com/vaadin/client/widgets/Grid.java index 3fd119d9ea..c237a7ba2f 100644 --- a/client/src/com/vaadin/client/widgets/Grid.java +++ b/client/src/com/vaadin/client/widgets/Grid.java @@ -3054,6 +3054,9 @@ public class Grid<T> extends ResizeComposite implements latestColumnDropIndex--; } reordered.add(latestColumnDropIndex, moved); + reordered.remove(selectionColumn); // since setColumnOrder will + // add it anyway! + @SuppressWarnings("unchecked") Column<?, T>[] array = reordered.toArray(new Column[reordered .size()]); @@ -3112,11 +3115,36 @@ public class Grid<T> extends ResizeComposite implements } private double getFrozenColumnsWidth() { - double result = 0.0d; + double value = getMultiSelectColumnWidth(); for (int i = 0; i < getFrozenColumnCount(); i++) { - result += getColumn(i).getWidthActual(); + value += getColumn(i).getWidthActual(); + } + return value; + } + + private double getMultiSelectColumnWidth() { + if (getSelectionModel().getSelectionColumnRenderer() != null) { + // frozen checkbox column is present, it is always the first + // column + return escalator.getHeader().getElement() + .getFirstChildElement().getFirstChildElement() + .getOffsetWidth(); + } + return 0.0; + } + + /** + * Returns the amount of frozen columns. The selection column is always + * considered frozen, since it can't be moved. + */ + private int getSelectionAndFrozenColumnCount() { + // no matter if selection column is frozen or not, it is considered + // frozen for column dnd reorder + if (getSelectionModel().getSelectionColumnRenderer() != null) { + return Math.max(0, getFrozenColumnCount()) + 1; + } else { + return Math.max(0, getFrozenColumnCount()); } - return result; } private void calculatePossibleDropPositions() { @@ -3125,10 +3153,9 @@ public class Grid<T> extends ResizeComposite implements if (!calculatePossibleDropPositionInsideSpannedHeader()) { HashMap<Integer, Double> columnIndexToDropPositionMap = new HashMap<Integer, Double>(); - final int frozenColumns = Math.max(0, getFrozenColumnCount()); + final int frozenColumns = getSelectionAndFrozenColumnCount(); double position = getFrozenColumnsWidth(); // add all columns except frozen columns - // TODO handle the case where the checkbox column is present for (int i = frozenColumns; i < getColumnCount(); i++) { columnIndexToDropPositionMap.put(i, position); position += getColumn(i).getWidthActual(); diff --git a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridColumnReorderTest.java b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridColumnReorderTest.java index ae0ab62aab..c7113dbd5e 100644 --- a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridColumnReorderTest.java +++ b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridColumnReorderTest.java @@ -18,9 +18,12 @@ package com.vaadin.tests.components.grid.basicfeatures.server; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import java.util.List; + import org.junit.Before; import org.junit.Test; +import com.vaadin.testbench.TestBenchElement; import com.vaadin.tests.components.grid.basicfeatures.GridBasicFeaturesTest; /** @@ -213,6 +216,77 @@ public class GridColumnReorderTest extends GridBasicFeaturesTest { } @Test + public void testColumnReorder_draggingColumnLeftOfMultiSelectionColumn_columnDroppedRight() { + // given + openTestURL(); + toggleColumnReordering(); + selectMenuPath("Component", "State", "Selection mode", "multi"); + List<TestBenchElement> gridHeaderRowCells = getGridHeaderRowCells(); + assertTrue(gridHeaderRowCells.get(0).getText().equals("")); + assertColumnHeader("Column 0", gridHeaderRowCells.get(1)); + assertColumnHeader("Column 1", gridHeaderRowCells.get(2)); + assertColumnHeader("Column 2", gridHeaderRowCells.get(3)); + + // when + dragAndDropDefaultColumnHeader(2, 0, 2); + + // then + gridHeaderRowCells = getGridHeaderRowCells(); + assertTrue(gridHeaderRowCells.get(0).getText().equals("")); + assertColumnHeader("Column 1", gridHeaderRowCells.get(1)); + assertColumnHeader("Column 0", gridHeaderRowCells.get(2)); + assertColumnHeader("Column 2", gridHeaderRowCells.get(3)); + } + + @Test + public void testColumnReorder_multiSelectionAndFrozenColumns_columnDroppedRight() { + // given + openTestURL(); + toggleColumnReordering(); + selectMenuPath("Component", "State", "Selection mode", "multi"); + setFrozenColumns(1); + List<TestBenchElement> gridHeaderRowCells = getGridHeaderRowCells(); + assertTrue(gridHeaderRowCells.get(0).getText().equals("")); + assertColumnHeader("Column 0", gridHeaderRowCells.get(1)); + assertColumnHeader("Column 1", gridHeaderRowCells.get(2)); + assertColumnHeader("Column 2", gridHeaderRowCells.get(3)); + + // when + dragAndDropDefaultColumnHeader(3, 0, 2); + + // then + gridHeaderRowCells = getGridHeaderRowCells(); + assertTrue(gridHeaderRowCells.get(0).getText().equals("")); + assertColumnHeader("Column 0", gridHeaderRowCells.get(1)); + assertColumnHeader("Column 2", gridHeaderRowCells.get(2)); + assertColumnHeader("Column 1", gridHeaderRowCells.get(3)); + } + + @Test + public void testColumnReordering_multiSelectionColumnNotFrozen_stillCantDropLeftSide() { + // given + openTestURL(); + toggleColumnReordering(); + selectMenuPath("Component", "State", "Selection mode", "multi"); + setFrozenColumns(-1); + List<TestBenchElement> gridHeaderRowCells = getGridHeaderRowCells(); + assertTrue(gridHeaderRowCells.get(0).getText().equals("")); + assertColumnHeader("Column 0", gridHeaderRowCells.get(1)); + assertColumnHeader("Column 1", gridHeaderRowCells.get(2)); + assertColumnHeader("Column 2", gridHeaderRowCells.get(3)); + + // when + dragAndDropDefaultColumnHeader(2, 0, 2); + + // then + gridHeaderRowCells = getGridHeaderRowCells(); + assertTrue(gridHeaderRowCells.get(0).getText().equals("")); + assertColumnHeader("Column 1", gridHeaderRowCells.get(1)); + assertColumnHeader("Column 0", gridHeaderRowCells.get(2)); + assertColumnHeader("Column 2", gridHeaderRowCells.get(3)); + } + + @Test public void testColumnReordering_twoHeaderRows_dndReorderingPossibleFromFirstRow() { // given openTestURL(); @@ -236,7 +310,6 @@ public class GridColumnReorderTest extends GridBasicFeaturesTest { assertColumnHeaderOrder(0, 1, 2, 3); // when - // when dragAndDropColumnHeader(1, 0, 2, 100); // then |