]> source.dussan.org Git - vaadin-framework.git/commitdiff
Merge branch 'master' into grid-columnreorder
authorPekka Hyvönen <pekka@vaadin.com>
Fri, 6 Mar 2015 09:56:53 +0000 (11:56 +0200)
committerPekka Hyvönen <pekka@vaadin.com>
Fri, 6 Mar 2015 10:29:24 +0000 (12:29 +0200)
Conflicts:
uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridBasicFeaturesTest.java
uitest/src/com/vaadin/tests/widgetset/client/grid/GridBasicClientFeaturesWidget.java

Change-Id: Ic77c717b9bbdcc38585382d4944ee4491aba3f7d

1  2 
client/src/com/vaadin/client/connectors/GridConnector.java
client/src/com/vaadin/client/widgets/Escalator.java
client/src/com/vaadin/client/widgets/Grid.java
server/src/com/vaadin/ui/Grid.java
uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridBasicClientFeaturesTest.java
uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridBasicFeaturesTest.java
uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridColumnReorderTest.java
uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridColumnReorderTest.java
uitest/src/com/vaadin/tests/widgetset/client/grid/GridBasicClientFeaturesWidget.java

Simple merge
index 0e4f0272dd10733a611239f7339ed494b6a0bb7c,e22fcc422b0d72bfac54e11e856283728e164c37..e21f88794123e5addca1234d46ab7959103c46d5
@@@ -29,9 -26,7 +29,8 @@@ import org.openqa.selenium.interactions
  
  import com.vaadin.testbench.TestBenchElement;
  import com.vaadin.testbench.elements.GridElement;
- import com.vaadin.tests.annotations.TestCategory;
 +import com.vaadin.testbench.elements.GridElement.GridCellElement;
+ import com.vaadin.testbench.parallel.TestCategory;
  import com.vaadin.tests.tb3.MultiBrowserTest;
  
  @TestCategory("grid")
index d4892fb52ad58175d03366f959e9fbe63bcd1dcc,0000000000000000000000000000000000000000..685c00bbbd4c60ba2ecf942787c7ff0d82231d4a
mode 100644,000000..100644
--- /dev/null
@@@ -1,622 -1,0 +1,629 @@@
- import com.vaadin.tests.annotations.TestCategory;
 +/*
 + * 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.basicfeatures;
 +
 +import static org.junit.Assert.assertEquals;
 +import static org.junit.Assert.assertTrue;
 +
 +import org.junit.Before;
 +import org.junit.Test;
 +import org.openqa.selenium.By;
 +import org.openqa.selenium.WebElement;
 +import org.openqa.selenium.interactions.Actions;
 +
 +import com.vaadin.testbench.elements.GridElement.GridCellElement;
-         dragAndDropColumnHeader(0, 3, 4, 80);
++import com.vaadin.testbench.parallel.TestCategory;
 +
 +/**
 + * 
 + * @since
 + * @author Vaadin Ltd
 + */
 +@TestCategory("grid")
 +public class GridColumnReorderTest extends GridBasicClientFeaturesTest {
 +
 +    @Before
 +    public void before() {
 +        openTestURL();
 +    }
 +
 +    @Test
 +    public void columnReorderEventTriggered() {
 +        final int firstIndex = 3;
 +        final int secondIndex = 4;
 +        final String firstHeaderText = getGridElement().getHeaderCell(0,
 +                firstIndex).getText();
 +        final String secondHeaderText = getGridElement().getHeaderCell(0,
 +                secondIndex).getText();
 +        selectMenuPath("Component", "Internals", "Listeners",
 +                "Add ColumnReorder listener");
 +        selectMenuPath("Component", "Columns", "Column " + secondIndex,
 +                "Move column left");
 +        // columns 3 and 4 should have swapped to 4 and 3
 +        GridCellElement headerCell = getGridElement().getHeaderCell(0,
 +                firstIndex);
 +        assertEquals(secondHeaderText, headerCell.getText());
 +        headerCell = getGridElement().getHeaderCell(0, secondIndex);
 +        assertEquals(firstHeaderText, headerCell.getText());
 +
 +        // the reorder event should have typed the order to this label
 +        WebElement columnReorderElement = findElement(By.id("columnreorder"));
 +        int eventIndex = Integer.parseInt(columnReorderElement
 +                .getAttribute("columns"));
 +        assertEquals(1, eventIndex);
 +
 +        // trigger another event
 +        selectMenuPath("Component", "Columns", "Column " + secondIndex,
 +                "Move column left");
 +        columnReorderElement = findElement(By.id("columnreorder"));
 +        eventIndex = Integer.parseInt(columnReorderElement
 +                .getAttribute("columns"));
 +        assertEquals(2, eventIndex);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_onReorder_columnReorderEventTriggered() {
 +        final int firstIndex = 3;
 +        final int secondIndex = 4;
 +        final String firstHeaderText = getGridElement().getHeaderCell(0,
 +                firstIndex).getText();
 +        final String secondHeaderText = getGridElement().getHeaderCell(0,
 +                secondIndex).getText();
 +        selectMenuPath("Component", "Internals", "Listeners",
 +                "Add ColumnReorder listener");
 +        selectMenuPath("Component", "Columns", "Column " + secondIndex,
 +                "Move column left");
 +        // columns 3 and 4 should have swapped to 4 and 3
 +        GridCellElement headerCell = getGridElement().getHeaderCell(0,
 +                firstIndex);
 +        assertEquals(secondHeaderText, headerCell.getText());
 +        headerCell = getGridElement().getHeaderCell(0, secondIndex);
 +        assertEquals(firstHeaderText, headerCell.getText());
 +
 +        // the reorder event should have typed the order to this label
 +        WebElement columnReorderElement = findElement(By.id("columnreorder"));
 +        int eventIndex = Integer.parseInt(columnReorderElement
 +                .getAttribute("columns"));
 +        assertEquals(1, eventIndex);
 +
 +        // trigger another event
 +        selectMenuPath("Component", "Columns", "Column " + secondIndex,
 +                "Move column left");
 +        columnReorderElement = findElement(By.id("columnreorder"));
 +        eventIndex = Integer.parseInt(columnReorderElement
 +                .getAttribute("columns"));
 +        assertEquals(2, eventIndex);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_draggingSortedColumn_sortIndicatorShownOnDraggedElement() {
 +        // given
 +        toggleColumnReorder();
 +        toggleSortableColumn(0);
 +        sortColumn(0);
 +
 +        // when
 +        startDragButDontDropOnDefaultColumnHeader(0);
 +
 +        // then
 +        WebElement draggedElement = getDraggedHeaderElement();
 +        assertTrue(draggedElement.getAttribute("class").contains("sort"));
 +    }
 +
 +    @Test
 +    public void testColumnReorder_draggingSortedColumn_sortStays() {
 +        // given
 +        toggleColumnReorder();
 +        toggleSortableColumn(0);
 +        sortColumn(0);
 +
 +        // when
 +        dragAndDropDefaultColumnHeader(0, 2, 10);
 +
 +        // then
 +        assertColumnIsSorted(1);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_draggingFocusedHeader_focusShownOnDraggedElement() {
 +        // given
 +        toggleColumnReorder();
 +        focusDefaultHeader(0);
 +
 +        // when
 +        startDragButDontDropOnDefaultColumnHeader(0);
 +
 +        // then
 +        WebElement draggedElement = getDraggedHeaderElement();
 +        assertTrue(draggedElement.getAttribute("class").contains("focused"));
 +    }
 +
 +    @Test
 +    public void testColumnReorder_draggingFocusedHeader_focusIsKeptOnHeader() {
 +        // given
 +        toggleColumnReorder();
 +        focusDefaultHeader(0);
 +
 +        // when
 +        dragAndDropDefaultColumnHeader(0, 3, 10);
 +
 +        // then
 +        WebElement defaultColumnHeader = getDefaultColumnHeader(2);
 +        String attribute = defaultColumnHeader.getAttribute("class");
 +        assertTrue(attribute.contains("focused"));
 +    }
 +
 +    @Test
 +    public void testColumnReorder_draggingFocusedCellColumn_focusIsKeptOnCell() {
 +        // given
 +        toggleColumnReorder();
 +        focusCell(2, 2);
 +
 +        // when
 +        dragAndDropDefaultColumnHeader(2, 0, 10);
 +
 +        // then
 +        assertFocusedCell(2, 0);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_dragColumnFromRightToLeftOfFocusedCellColumn_focusIsKept() {
 +        // given
 +        toggleColumnReorder();
 +        focusCell(1, 3);
 +
 +        // when
 +        dragAndDropDefaultColumnHeader(4, 1, 10);
 +
 +        // then
 +        assertFocusedCell(1, 4);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_dragColumnFromLeftToRightOfFocusedCellColumn_focusIsKept() {
 +        // given
 +        toggleColumnReorder();
 +        focusCell(4, 2);
 +
 +        // when
 +        dragAndDropDefaultColumnHeader(0, 4, 10);
 +
 +        // then
 +        assertFocusedCell(4, 1);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_draggingHeaderRowThatHasColumnHeadersSpanned_cantDropInsideSpannedHeaderFromOutside() {
 +        // given
 +        toggleColumnReorder();
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 2", "Join columns 1, 2");
 +        assertColumnHeaderOrder(0, 1, 2, 3, 4);
 +
 +        // when
 +        dragAndDropColumnHeader(1, 3, 1, 80);
 +
 +        // then
 +        assertColumnHeaderOrder(0, 3, 1, 2, 4);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_anotherRowHasColumnHeadersSpanned_cantDropInsideSpannedHeaderFromOutside() {
 +        // given
 +        toggleColumnReorder();
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 2", "Join columns 1, 2");
 +        assertColumnHeaderOrder(0, 1, 2, 3, 4);
 +
 +        // when
 +        dragAndDropColumnHeader(0, 0, 2, 20);
 +
 +        // then
 +        assertColumnHeaderOrder(1, 2, 0, 3, 4);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_cellInsideSpannedHeader_cantBeDroppedOutsideSpannedArea() {
 +        // given
 +        toggleColumnReorder();
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 2", "Join columns 1, 2");
 +        assertColumnHeaderOrder(0, 1, 2, 3, 4);
 +
 +        // when
 +        dragAndDropColumnHeader(0, 2, 0, 20);
 +
 +        // then
 +        assertColumnHeaderOrder(0, 2, 1, 3, 4);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_cellInsideTwoCrossingSpanningHeaders_cantTouchThis() {
 +        // given
 +        toggleColumnReorder();
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 2", "Join column cells 0, 1");
 +        selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
 +        dragAndDropColumnHeader(0, 3, 0, 10);
 +        assertColumnHeaderOrder(3, 0, 1, 2, 4);
 +
 +        // when
 +        dragAndDropColumnHeader(0, 2, 0, 10);
 +
 +        // then
 +        assertColumnHeaderOrder(3, 0, 1, 2, 4);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_cellsInsideSpannedHeaderAndBlockedByOtherSpannedCells_cantTouchThose() {
 +        // given
 +        toggleColumnReorder();
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 2", "Join column cells 0, 1");
 +        selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
 +        dragAndDropColumnHeader(0, 3, 0, 10);
 +        assertColumnHeaderOrder(3, 0, 1, 2, 4);
 +
 +        // when then
 +        dragAndDropColumnHeader(0, 1, 3, 10);
 +        assertColumnHeaderOrder(3, 0, 1, 2, 4);
 +
 +        dragAndDropColumnHeader(1, 2, 1, 10);
 +        assertColumnHeaderOrder(3, 0, 1, 2, 4);
 +
 +        dragAndDropColumnHeader(2, 1, 3, -10);
 +        assertColumnHeaderOrder(3, 0, 1, 2, 4);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_cellsInsideSpannedHeaderAndBlockedByOtherSpannedCells_reorderingLimited() {
 +        // given
 +        toggleColumnReorder();
++        selectMenuPath("Component", "State", "Width", "750px");
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 2", "Join columns 3, 4, 5");
 +        dragAndDropColumnHeader(0, 0, 4, 100);
 +        selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
 +        scrollGridHorizontallyTo(0);
 +        assertColumnHeaderOrder(1, 2, 3, 4, 5);
 +
 +        // when then
 +        dragAndDropColumnHeader(0, 1, 4, 10);
 +        scrollGridHorizontallyTo(0);
 +        assertColumnHeaderOrder(1, 2, 3, 4, 5);
 +
 +        dragAndDropColumnHeader(0, 2, 4, 10);
 +        scrollGridHorizontallyTo(0);
 +        assertColumnHeaderOrder(1, 2, 3, 4, 5);
 +
-         dragAndDropColumnHeader(2, 3, 4, 80);
++        dragAndDropColumnHeader(0, 3, 4, 100);
 +        scrollGridHorizontallyTo(0);
 +        assertColumnHeaderOrder(1, 2, 3, 5, 4);
 +
 +        dragAndDropColumnHeader(0, 4, 2, 100);
 +        scrollGridHorizontallyTo(0);
 +        assertColumnHeaderOrder(1, 2, 3, 4, 5);
 +
++        dragAndDropColumnHeader(2, 3, 4, 100);
 +        scrollGridHorizontallyTo(0);
 +        assertColumnHeaderOrder(1, 2, 3, 5, 4);
 +
 +        dragAndDropColumnHeader(2, 4, 2, 100);
 +        scrollGridHorizontallyTo(0);
 +        assertColumnHeaderOrder(1, 2, 3, 4, 5);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_cellsInsideTwoAdjacentSpannedHeaders_reorderingLimited() {
 +        // given
 +        toggleColumnReorder();
++        selectMenuPath("Component", "State", "Width", "750px");
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 2", "Join columns 3, 4, 5");
 +        dragAndDropColumnHeader(0, 0, 4, 100);
 +        scrollGridHorizontallyTo(0);
 +        dragAndDropColumnHeader(0, 1, 4, 80);
 +        scrollGridHorizontallyTo(0);
 +        selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
 +        assertColumnHeaderOrder(1, 3, 4, 5, 2);
 +
 +        // when then
 +        dragAndDropColumnHeader(0, 1, 3, 80);
 +        assertColumnHeaderOrder(1, 4, 3, 5, 2);
 +
 +        dragAndDropColumnHeader(0, 2, 4, 10);
 +        assertColumnHeaderOrder(1, 4, 3, 5, 2);
 +
 +        dragAndDropColumnHeader(0, 2, 0, 10);
 +        assertColumnHeaderOrder(1, 3, 4, 5, 2);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_footerHasSpannedCells_cantDropInside() {
 +        // given
 +        toggleColumnReorder();
 +        selectMenuPath("Component", "Footer", "Append row");
 +        selectMenuPath("Component", "Footer", "Row 1", "Join columns 1, 2");
 +        assertColumnHeaderOrder(0, 1, 2, 3, 4);
 +
 +        // when
 +        dragAndDropColumnHeader(0, 3, 1, 80);
 +
 +        // then
 +        assertColumnHeaderOrder(0, 3, 1, 2, 4);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_cellInsideASpannedFooter_cantBeDroppedOutsideSpannedArea() {
 +        // given
 +        toggleColumnReorder();
 +        selectMenuPath("Component", "Footer", "Append row");
 +        selectMenuPath("Component", "Footer", "Row 1", "Join columns 1, 2");
 +        assertColumnHeaderOrder(0, 1, 2, 3, 4);
 +
 +        // when
 +        dragAndDropColumnHeader(0, 2, 0, 20);
 +
 +        // then
 +        assertColumnHeaderOrder(0, 2, 1, 3, 4);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_cellInsideTwoCrossingSpanningFooters_cantTouchThis() {
 +        // given
 +        toggleColumnReorder();
 +        selectMenuPath("Component", "Footer", "Append row");
 +        selectMenuPath("Component", "Footer", "Append row");
 +        selectMenuPath("Component", "Footer", "Row 1", "Join column cells 0, 1");
 +        selectMenuPath("Component", "Footer", "Row 2", "Join columns 1, 2");
 +        dragAndDropColumnHeader(0, 3, 0, 10);
 +        assertColumnHeaderOrder(3, 0, 1, 2, 4);
 +
 +        // when
 +        dragAndDropColumnHeader(0, 2, 0, 10);
 +
 +        // then
 +        assertColumnHeaderOrder(3, 0, 1, 2, 4);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_cellsInsideTwoAdjacentSpannedHeaderAndFooter_reorderingLimited() {
 +        // given
 +        toggleColumnReorder();
++        selectMenuPath("Component", "State", "Width", "750px");
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Footer", "Append row");
 +        selectMenuPath("Component", "Header", "Row 2", "Join columns 3, 4, 5");
 +        dragAndDropColumnHeader(0, 0, 4, 80);
 +        scrollGridHorizontallyTo(0);
 +        dragAndDropColumnHeader(0, 1, 4, 80);
 +        scrollGridHorizontallyTo(0);
 +        selectMenuPath("Component", "Footer", "Row 1", "Join columns 1, 2");
 +        assertColumnHeaderOrder(1, 3, 4, 5, 2);
 +
 +        // when then
 +        dragAndDropColumnHeader(0, 1, 3, 80);
 +        assertColumnHeaderOrder(1, 4, 3, 5, 2);
 +
 +        dragAndDropColumnHeader(0, 2, 4, 10);
 +        assertColumnHeaderOrder(1, 4, 3, 5, 2);
 +
 +        dragAndDropColumnHeader(0, 2, 0, 10);
 +        assertColumnHeaderOrder(1, 3, 4, 5, 2);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_draggingASpannedCell_dragWorksNormally() {
 +        // given
 +        toggleColumnReorder();
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 2", "Join columns 1, 2");
 +        assertColumnHeaderOrder(0, 1, 2, 3, 4);
 +
 +        // when
 +        dragAndDropColumnHeader(1, 1, 4, 10);
 +        scrollGridHorizontallyTo(0);
 +
 +        // then
 +        assertColumnHeaderOrder(0, 3, 1, 2, 4);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_twoEqualSpannedCells_bothCanBeDragged() {
 +        // given
 +        toggleColumnReorder();
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 2", "Join columns 1, 2");
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
 +        assertColumnHeaderOrder(0, 1, 2, 3, 4);
 +
 +        // when
 +        dragAndDropColumnHeader(1, 1, 4, 10);
 +        scrollGridHorizontallyTo(0);
 +
 +        // then
 +        assertColumnHeaderOrder(0, 3, 1, 2, 4);
 +
 +        // when
 +        dragAndDropColumnHeader(2, 3, 0, 10);
 +
 +        // then
 +        assertColumnHeaderOrder(1, 2, 0, 3, 4);
 +    }
 +
 +    @Test
 +    public void testColumReorder_twoCrossingSpanningHeaders_neitherCanBeDragged() {
 +        // given
 +        toggleColumnReorder();
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 2", "Join columns 1, 2");
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 3", "Join column cells 0, 1");
 +        assertColumnHeaderOrder(0, 1, 2, 3, 4);
 +
 +        // when
 +        dragAndDropColumnHeader(1, 1, 4, 10);
 +
 +        // then
 +        assertColumnHeaderOrder(0, 1, 2, 3, 4);
 +
 +        // when
 +        dragAndDropColumnHeader(2, 0, 3, 100);
 +
 +        // then
 +        assertColumnHeaderOrder(0, 1, 2, 3, 4);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_spannedCellHasAnotherSpannedCellInside_canBeDraggedNormally() {
 +        // given
 +        toggleColumnReorder();
++        selectMenuPath("Component", "State", "Width", "750px");
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 2", "Join columns 3, 4, 5");
 +        dragAndDropColumnHeader(1, 3, 1, 10);
 +        scrollGridHorizontallyTo(0);
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
 +        assertColumnHeaderOrder(0, 3, 4, 5, 1);
 +
 +        // when
 +        dragAndDropColumnHeader(1, 1, 0, 10);
 +
 +        // then
 +        assertColumnHeaderOrder(3, 4, 5, 0, 1);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_spannedCellInsideAnotherSpanned_canBeDraggedWithBoundaries() {
 +        // given
 +        toggleColumnReorder();
++        selectMenuPath("Component", "State", "Width", "750px");
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 2", "Join columns 3, 4, 5");
 +        dragAndDropColumnHeader(1, 3, 1, 10);
 +        scrollGridHorizontallyTo(0);
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
 +        assertColumnHeaderOrder(0, 3, 4, 5, 1);
 +
 +        // when
 +        dragAndDropColumnHeader(2, 1, 3, 100);
 +        scrollGridHorizontallyTo(0);
 +
 +        // then
 +        assertColumnHeaderOrder(0, 5, 3, 4, 1);
 +
 +        // when
 +        dragAndDropColumnHeader(2, 2, 0, 10);
 +        scrollGridHorizontallyTo(0);
 +
 +        // then
 +        assertColumnHeaderOrder(0, 3, 4, 5, 1);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_cellInsideAndNextToSpannedCells_canBeDraggedWithBoundaries() {
 +        // given
 +        toggleColumnReorder();
++        selectMenuPath("Component", "State", "Width", "750px");
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 2", "Join columns 3, 4, 5");
 +        dragAndDropColumnHeader(1, 3, 1, 10);
 +        scrollGridHorizontallyTo(0);
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
 +        assertColumnHeaderOrder(0, 3, 4, 5, 1);
 +
 +        // when
 +        dragAndDropColumnHeader(2, 3, 0, 10);
 +        scrollGridHorizontallyTo(0);
 +
 +        // then
 +        assertColumnHeaderOrder(0, 5, 3, 4, 1);
 +
 +        // when
 +        dragAndDropColumnHeader(2, 1, 4, 10);
 +        scrollGridHorizontallyTo(0);
 +
 +        // then
 +        assertColumnHeaderOrder(0, 3, 4, 5, 1);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_multipleSpannedCells_dragWorksNormally() {
 +        toggleColumnReorder();
++        selectMenuPath("Component", "State", "Width", "750px");
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 2", "Join columns 3, 4, 5");
 +        selectMenuPath("Component", "Header", "Append row");
 +        selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
 +        assertColumnHeaderOrder(0, 1, 2, 3, 4);
 +
 +        // when
 +        dragAndDropColumnHeader(1, 3, 2, -10);
 +        scrollGridHorizontallyTo(0);
 +
 +        // then
 +        assertColumnHeaderOrder(0, 3, 4, 5, 1);
 +
 +        // when
 +        scrollGridHorizontallyTo(100);
 +        dragAndDropColumnHeader(2, 4, 2, 10);
 +        scrollGridHorizontallyTo(0);
 +
 +        // then
 +        assertColumnHeaderOrder(0, 1, 2, 3, 4);
 +
 +        // when
 +        dragAndDropColumnHeader(0, 0, 3, 10);
 +        scrollGridHorizontallyTo(0);
 +
 +        // then
 +        assertColumnHeaderOrder(1, 2, 0, 3, 4);
 +    }
 +
 +    private void toggleColumnReorder() {
 +        selectMenuPath("Component", "State", "Column Reordering");
 +    }
 +
 +    private void toggleSortableColumn(int index) {
 +        selectMenuPath("Component", "Columns", "Column " + index, "Sortable");
 +    }
 +
 +    private void startDragButDontDropOnDefaultColumnHeader(int index) {
 +        new Actions(getDriver())
 +                .clickAndHold(getGridHeaderRowCells().get(index))
 +                .moveByOffset(100, 0).perform();
 +    }
 +
 +    private void sortColumn(int index) {
 +        getGridHeaderRowCells().get(index).click();
 +    }
 +
 +    private void focusDefaultHeader(int index) {
 +        getGridHeaderRowCells().get(index).click();
 +    }
 +
 +    private WebElement getDraggedHeaderElement() {
 +        return findElement(By.className("dragged-column-header"));
 +    }
 +}
index c7113dbd5e5f3d43a290fde595dfbe9005ac8c70,0000000000000000000000000000000000000000..7358894e9999e97ac2470474f4fbebbd1968e3be
mode 100644,000000..100644
--- /dev/null
@@@ -1,343 -1,0 +1,344 @@@
-         assertColumnHeaderOrder(0, 1, 2);
 +/*
 + * 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.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;
 +
 +/**
 + * Tests that Grid columns can be reordered by user with drag and drop #16643.
 + * 
 + * @author Vaadin Ltd
 + */
 +public class GridColumnReorderTest extends GridBasicFeaturesTest {
 +
 +    private static final String[] COLUMN_REORDERING_PATH = { "Component",
 +            "State", "Column Reordering Allowed" };
 +    private static final String[] COLUMN_REORDER_LISTENER_PATH = { "Component",
 +            "State", "ColumnReorderListener" };
 +
 +    @Before
 +    public void setUp() {
 +        setDebug(true);
 +    }
 +
 +    @Test
 +    public void testColumnReordering_firstColumnDroppedOnThird_dropOnLeftSide() {
 +        // given
 +        openTestURL();
 +        assertColumnHeaderOrder(0, 1, 2);
 +        toggleColumnReordering();
 +
 +        // when
 +        dragAndDropDefaultColumnHeader(0, 2, 10);
 +
 +        // then
 +        assertColumnHeaderOrder(1, 0, 2);
 +    }
 +
 +    @Test
 +    public void testColumnReordering_firstColumnDroppedOnThird_dropOnRightSide() {
 +        // given
 +        openTestURL();
 +        assertColumnHeaderOrder(0, 1, 2);
 +        toggleColumnReordering();
 +
 +        // when
 +        dragAndDropDefaultColumnHeader(0, 2, 110);
 +
 +        // then
 +        assertColumnHeaderOrder(1, 2, 0);
 +    }
 +
 +    @Test
 +    public void testColumnReordering_reorderingTwiceBackForth_reordered() {
 +        // given
 +        openTestURL();
-         assertColumnHeaderOrder(2, 0, 1, 3);
++        selectMenuPath("Component", "Size", "Width", "800px");
++        assertColumnHeaderOrder(0, 1, 2, 3, 4);
 +        toggleColumnReordering();
 +
 +        // when
 +        dragAndDropDefaultColumnHeader(2, 0, 10);
 +
 +        // then
-         dragAndDropDefaultColumnHeader(1, 3, 110);
++        assertColumnHeaderOrder(2, 0, 1, 3, 4);
 +
 +        // when
++        dragAndDropDefaultColumnHeader(1, 3, 150);
 +
 +        // then
 +        assertColumnHeaderOrder(2, 1, 3, 0);
 +    }
 +
 +    @Test
 +    public void testColumnReordering_notEnabled_noReordering() {
 +        // given
 +        openTestURL();
 +        assertColumnHeaderOrder(0, 1, 2);
 +
 +        // when
 +        dragAndDropDefaultColumnHeader(0, 2, 110);
 +
 +        // then
 +        assertColumnHeaderOrder(0, 1, 2);
 +    }
 +
 +    @Test
 +    public void testColumnReordering_userChangesRevertedByServer_columnsAreUpdated() {
 +        // given
 +        openTestURL();
 +        assertColumnHeaderOrder(0, 1, 2);
 +        toggleColumnReordering();
 +
 +        // when
 +        dragAndDropDefaultColumnHeader(0, 2, 10);
 +        assertColumnHeaderOrder(1, 0, 2);
 +        moveColumnManuallyLeftByOne(0);
 +
 +        // then
 +        assertColumnHeaderOrder(0, 1, 2);
 +    }
 +
 +    @Test
 +    public void testColumnReordering_concurrentUpdatesFromServer_columnOrderFromServerUsed() {
 +        // given
 +        openTestURL();
 +        assertColumnHeaderOrder(0, 1, 2);
 +        toggleColumnReordering();
 +
 +        // when
 +        selectMenuPath(new String[] { "Component", "Internals",
 +                "Update column order without updating client" });
 +        dragAndDropDefaultColumnHeader(2, 0, 10);
 +
 +        // then
 +        assertColumnHeaderOrder(1, 0, 2);
 +    }
 +
 +    @Test
 +    public void testColumnReordering_triggersReorderEvent_isUserInitiated() {
 +        // given
 +        openTestURL();
 +        toggleColumnReordering();
 +
 +        // when
 +        toggleColumnReorderListener();
 +        dragAndDropDefaultColumnHeader(0, 2, 10);
 +
 +        // then
 +        assertColumnReorderEvent(true);
 +    }
 +
 +    @Test
 +    public void testColumnReordering_addAndRemoveListener_registerUnRegisterWorks() {
 +        // given
 +        openTestURL();
 +        toggleColumnReordering();
 +        dragAndDropDefaultColumnHeader(0, 2, 10);
 +        assertNoColumnReorderEvent();
 +
 +        // when
 +        toggleColumnReorderListener();
 +        dragAndDropDefaultColumnHeader(0, 2, 110);
 +
 +        // then
 +        assertColumnReorderEvent(true);
 +
 +        // when
 +        toggleColumnReorderListener();
 +        dragAndDropDefaultColumnHeader(0, 3, 10);
 +
 +        // then
 +        assertNoColumnReorderEvent();
 +    }
 +
 +    @Test
 +    public void testColumnReorderingEvent_serverSideReorder_triggersReorderEvent() {
 +        openTestURL();
 +
 +        // when
 +        toggleColumnReorderListener();
 +        moveColumnManuallyLeftByOne(3);
 +
 +        // then
 +        assertColumnReorderEvent(false);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_draggingFrozenColumns_impossible() {
 +        // given
 +        openTestURL();
 +        toggleColumnReordering();
 +        setFrozenColumns(2);
 +        assertColumnHeaderOrder(0, 1, 2, 3);
 +
 +        // when
 +        dragAndDropDefaultColumnHeader(0, 2, 10);
 +
 +        // then
 +        assertColumnHeaderOrder(0, 1, 2, 3);
 +    }
 +
 +    @Test
 +    public void testColumnReorder_draggingColumnOnTopOfFrozenColumn_columnDroppedRightOfFrozenColumns() {
 +        // given
 +        openTestURL();
 +        toggleColumnReordering();
 +        setFrozenColumns(1);
 +        assertColumnHeaderOrder(0, 1, 2, 3);
 +
 +        // when
 +        dragAndDropDefaultColumnHeader(2, 0, 10);
 +
 +        // then
 +        assertColumnHeaderOrder(0, 2, 1, 3);
 +    }
 +
 +    @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();
 +        toggleColumnReordering();
 +        selectMenuPath("Component", "Header", "Append row");
 +        assertColumnHeaderOrder(0, 1, 2, 3);
 +
 +        // when
 +        dragAndDropColumnHeader(0, 0, 2, 100);
 +
 +        // then
 +        assertColumnHeaderOrder(1, 2, 0, 3);
 +    }
 +
 +    @Test
 +    public void testColumnReordering_twoHeaderRows_dndReorderingPossibleFromSecondRow() {
 +        // given
 +        openTestURL();
 +        toggleColumnReordering();
 +        selectMenuPath("Component", "Header", "Append row");
 +        assertColumnHeaderOrder(0, 1, 2, 3);
 +
 +        // when
 +        dragAndDropColumnHeader(1, 0, 2, 100);
 +
 +        // then
 +        assertColumnHeaderOrder(1, 2, 0, 3);
 +    }
 +
 +    private void toggleColumnReordering() {
 +        selectMenuPath(COLUMN_REORDERING_PATH);
 +    }
 +
 +    private void toggleColumnReorderListener() {
 +        selectMenuPath(COLUMN_REORDER_LISTENER_PATH);
 +    }
 +
 +    private void moveColumnManuallyLeftByOne(int index) {
 +        selectMenuPath(new String[] { "Component", "Columns",
 +                "Column " + index, "Move left" });
 +    }
 +
 +    private void assertColumnReorderEvent(boolean userOriginated) {
 +        final String logRow = getLogRow(0);
 +        assertTrue(logRow.contains("Columns reordered, userOriginated: "
 +                + userOriginated));
 +    }
 +
 +    private void assertNoColumnReorderEvent() {
 +        final String logRow = getLogRow(0);
 +        assertFalse(logRow.contains("Columns reordered"));
 +    }
 +
 +}
index 265a93fb597ed571c37ec5c1a8cbc15fdf04d011,4dc0195f228dbcd87e0636acc794f4120f48d01b..9e77438e3687808564013806820f54fe1ae07446
@@@ -676,15 -649,15 +676,51 @@@ public class GridBasicClientFeaturesWid
                  grid.setEnabled(!grid.isEnabled());
              }
          }, "Component", "State");
+         addMenuCommand("Reverse grid columns", new ScheduledCommand() {
  
+             @Override
+             public void execute() {
+                 List<Column> columns = new ArrayList<Column>(grid.getColumns());
+                 Collections.reverse(columns);
+                 grid.setColumnOrder(columns.toArray(new Column[columns.size()]));
+             }
+         }, "Component", "State");
 +        addMenuCommand("Column Reordering", new ScheduledCommand() {
 +
 +            @Override
 +            public void execute() {
 +                grid.setColumnReorderingAllowed(!grid
 +                        .isColumnReorderingAllowed());
 +            }
 +        }, "Component", "State");
++        addMenuCommand("250px", new ScheduledCommand() {
++
++            @Override
++            public void execute() {
++                grid.setWidth("250px");
++            }
++        }, "Component", "State", "Width");
++        addMenuCommand("500px", new ScheduledCommand() {
++
++            @Override
++            public void execute() {
++                grid.setWidth("500px");
++            }
++        }, "Component", "State", "Width");
++        addMenuCommand("750px", new ScheduledCommand() {
++
++            @Override
++            public void execute() {
++                grid.setWidth("750px");
++            }
++        }, "Component", "State", "Width");
++        addMenuCommand("1000px", new ScheduledCommand() {
++
++            @Override
++            public void execute() {
++                grid.setWidth("1000px");
++            }
++        }, "Component", "State", "Width");
      }
  
      private void createColumnsMenu() {