import com.vaadin.client.widgets.Escalator.AbstractRowContainer; | import com.vaadin.client.widgets.Escalator.AbstractRowContainer; | ||||
import com.vaadin.client.widgets.Escalator.SubPartArguments; | import com.vaadin.client.widgets.Escalator.SubPartArguments; | ||||
import com.vaadin.client.widgets.Grid.Editor.State; | import com.vaadin.client.widgets.Grid.Editor.State; | ||||
import com.vaadin.client.widgets.Grid.StaticSection.StaticCell; | |||||
import com.vaadin.client.widgets.Grid.StaticSection.StaticRow; | import com.vaadin.client.widgets.Grid.StaticSection.StaticRow; | ||||
import com.vaadin.shared.Range; | import com.vaadin.shared.Range; | ||||
import com.vaadin.shared.Registration; | import com.vaadin.shared.Registration; | ||||
@Override | @Override | ||||
public void onDrop() { | public void onDrop() { | ||||
final int draggedColumnIndex = eventCell.getColumnIndex(); | final int draggedColumnIndex = eventCell.getColumnIndex(); | ||||
final int colspan = header.getRow(eventCell.getRowIndex()) | |||||
.getCell(eventCell.getColumn()).getColspan(); | |||||
final StaticRow<?> draggedCellRow = header | |||||
.getRow(eventCell.getRowIndex()); | |||||
int colspan = draggedCellRow | |||||
.getSizeOfCellGroup(getColumn(draggedColumnIndex)); | |||||
colspan = colspan == 0 ? 1 : colspan; | |||||
if (latestColumnDropIndex != draggedColumnIndex | if (latestColumnDropIndex != draggedColumnIndex | ||||
&& latestColumnDropIndex != draggedColumnIndex + colspan) { | && latestColumnDropIndex != draggedColumnIndex + colspan) { | ||||
List<Column<?, T>> columns = getColumns(); | List<Column<?, T>> columns = getColumns(); | ||||
} | } | ||||
final boolean isDraggedCellRow = row.equals(draggedCellRow); | final boolean isDraggedCellRow = row.equals(draggedCellRow); | ||||
for (int cellColumnIndex = frozenColumns; cellColumnIndex < getColumnCount(); cellColumnIndex++) { | for (int cellColumnIndex = frozenColumns; cellColumnIndex < getColumnCount(); cellColumnIndex++) { | ||||
StaticCell cell = row.getCell(getColumn(cellColumnIndex)); | |||||
int colspan = cell.getColspan(); | |||||
int colspan = row | |||||
.getSizeOfCellGroup(getColumn(cellColumnIndex)); | |||||
if (colspan <= 1) { | if (colspan <= 1) { | ||||
continue; | continue; | ||||
} | } | ||||
final int cellColumnRightIndex = cellColumnIndex + row | |||||
.getSizeOfCellGroup(getColumn(cellColumnIndex)); | |||||
final int cellColumnRightIndex = cellColumnIndex + colspan; | |||||
final Range cellRange = Range.between(cellColumnIndex, | final Range cellRange = Range.between(cellColumnIndex, | ||||
cellColumnRightIndex); | cellColumnRightIndex); | ||||
final boolean intersects = draggedCellRange | final boolean intersects = draggedCellRange |
package com.vaadin.tests.components.grid; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import com.vaadin.server.VaadinRequest; | |||||
import com.vaadin.tests.components.AbstractTestUI; | |||||
import com.vaadin.ui.Grid; | |||||
import com.vaadin.ui.Grid.Column; | |||||
import com.vaadin.ui.components.grid.HeaderRow; | |||||
public class GridReorderMerged extends AbstractTestUI { | |||||
@Override | |||||
protected void setup(VaadinRequest request) { | |||||
Grid<String> grid = new Grid<>(); | |||||
List<String> items = new ArrayList<>(); | |||||
HeaderRow headerRow = grid.prependHeaderRow(); | |||||
for (int i = 1; i < 10; ++i) { | |||||
String propertyId = "" + i; | |||||
Column<String, ?> column = grid | |||||
.addColumn(item -> propertyId.equals(item) ? item : "") | |||||
.setId(propertyId).setCaption(propertyId); | |||||
column.setHidable(true); | |||||
if (i == 5) { | |||||
column.setHidden(true); | |||||
} | |||||
items.add(propertyId); | |||||
} | |||||
grid.setItems(items); | |||||
headerRow.join("1", "2", "3").setText("1"); | |||||
headerRow.join("4", "5", "6").setText("2"); // middle column hidden | |||||
headerRow.join("7", "8", "9").setText("3"); | |||||
grid.setColumnReorderingAllowed(true); | |||||
addComponent(grid); | |||||
} | |||||
@Override | |||||
protected String getTestDescription() { | |||||
return "Reordering columns should respect joined cells " | |||||
+ "even when some columns are hidden."; | |||||
} | |||||
} |
package com.vaadin.tests.components.grid; | |||||
import static org.junit.Assert.assertEquals; | |||||
import org.junit.Test; | |||||
import org.openqa.selenium.interactions.Actions; | |||||
import com.vaadin.testbench.elements.GridElement; | |||||
import com.vaadin.testbench.elements.GridElement.GridCellElement; | |||||
import com.vaadin.tests.tb3.MultiBrowserTest; | |||||
public class GridReorderMergedTest extends MultiBrowserTest { | |||||
@Test | |||||
public void dragMerged() { | |||||
openTestURL(); | |||||
GridElement grid = $(GridElement.class).first(); | |||||
GridCellElement headerCell0_0 = grid.getHeaderCell(0, 0); | |||||
GridCellElement headerCell0_4 = grid.getHeaderCell(0, 4); | |||||
new Actions(driver).dragAndDrop(headerCell0_0, headerCell0_4).perform(); | |||||
// ensure the first merged block got dragged over the entire second | |||||
// merged block | |||||
assertEquals("Unexpected column order,", "6", | |||||
grid.getHeaderCell(1, 1).getText()); | |||||
} | |||||
@Test | |||||
public void dragMergedReverse() { | |||||
openTestURL(); | |||||
GridElement grid = $(GridElement.class).first(); | |||||
GridCellElement headerCell0_0 = grid.getHeaderCell(0, 0); | |||||
GridCellElement headerCell0_4 = grid.getHeaderCell(0, 4); | |||||
new Actions(driver).clickAndHold(headerCell0_4) | |||||
.moveByOffset(-headerCell0_0.getSize().getWidth(), | |||||
headerCell0_0.getSize().getHeight() / 2) | |||||
.release().perform(); | |||||
// ensure the second merged block got dragged over the first merged | |||||
// block entirely | |||||
assertEquals("Unexpected column order,", "6", | |||||
grid.getHeaderCell(1, 1).getText()); | |||||
} | |||||
} |