/*******************************************************************************
* Copyright (c) 2012, 2013 Original authors and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Original authors and others - initial API and implementation
******************************************************************************/
package org.eclipse.nebula.widgets.nattable.test.integration;
import static org.junit.Assert.assertEquals;
import org.eclipse.nebula.widgets.nattable.coordinate.PositionCoordinate;
import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultGridLayer;
import org.eclipse.nebula.widgets.nattable.layer.stack.DummyGridLayerStack;
import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
import org.eclipse.nebula.widgets.nattable.selection.command.SelectCellCommand;
import org.eclipse.nebula.widgets.nattable.test.fixture.NatTableFixture;
import org.eclipse.swt.SWT;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* Integration test for all default selection behavior.
*/
public class SelectionIntegrationTest {
private static boolean NO_SHIFT = false;
private static boolean NO_CTRL = false;
private static boolean SHIFT = true;
private NatTableFixture natTable;
private DefaultGridLayer layerStack;
private SelectionLayer selectionLayer;
@Before
public void setup() {
this.layerStack = new DummyGridLayerStack(10, 5);
this.selectionLayer = this.layerStack.getBodyLayer().getSelectionLayer();
this.natTable = new NatTableFixture(this.layerStack, 1000, 200, true);
}
@Test
public void movingSelectionWithLeftArrow() throws Exception {
this.natTable.doCommand(new SelectCellCommand(this.natTable, 5, 2, NO_SHIFT,
NO_CTRL));
// Note: the co-ordinates from this point on are in selection later
// co-ordinates
SWTUtils.pressKey(SWT.ARROW_LEFT, this.natTable);
assertPositionEquals(3, 1, getSelectedCells()[0]);
assertSelectionAnchorEquals(3, 1);
SWTUtils.pressKey(SWT.ARROW_LEFT, SWT.SHIFT, this.natTable);
assertSelectCellsCount(2);
assertPositionEquals(2, 1, getSelectedCells()[0]);
assertPositionEquals(3, 1, getSelectedCells()[1]);
assertSelectionAnchorEquals(3, 1);
SWTUtils.pressKey(SWT.ARROW_LEFT, SWT.MOD1, this.natTable);
assertSelectCellsCount(1);
assertPositionEquals(0, 1, getSelectedCells()[0]);
assertSelectionAnchorEquals(0, 1);
}
@Test
public void movingSelectionWithRightArrow() throws Exception {
this.natTable.doCommand(new SelectCellCommand(this.natTable, 5, 2, NO_SHIFT,
NO_CTRL));
// Note: the co-ordinates from this point on are in selection later
// co-ordinates
SWTUtils.pressKey(SWT.ARROW_RIGHT, this.natTable);
assertPositionEquals(5, 1, this.selectionLayer.getLastSelectedCellPosition());
assertSelectionAnchorEquals(5, 1);
SWTUtils.pressKey(SWT.ARROW_RIGHT, SWT.SHIFT, this.natTable);
assertSelectCellsCount(2);
assertCellSelected(5, 1);
assertCellSelected(6, 1);
assertSelectionAnchorEquals(5, 1);
SWTUtils.pressKey(SWT.ARROW_RIGHT, SWT.MOD1, this.natTable);
assertSelectCellsCount(1);
assertPositionEquals(9, 1, this.selectionLayer.getSelectedCellPositions()[0]);
assertPositionEquals(9, 1, this.selectionLayer.getLastSelectedCellPosition());
assertSelectionAnchorEquals(9, 1);
}
@Test
public void movingSelectionWithDownArrow() throws Exception {
this.natTable.doCommand(new SelectCellCommand(this.natTable, 5, 2, NO_SHIFT,
NO_CTRL));
// Note: the co-ordinates from this point on are in selection later
// co-ordinates
SWTUtils.pressKey(SWT.ARROW_DOWN, this.natTable);
SWTUtils.pressKey(SWT.ARROW_DOWN, this.natTable);
assertPositionEquals(4, 3, this.selectionLayer.getLastSelectedCellPosition());
assertSelectionAnchorEquals(4, 3);
SWTUtils.pressKey(SWT.ARROW_DOWN, SWT.SHIFT, this.natTable);
SWTUtils.pressKey(SWT.ARROW_DOWN, SWT.SHIFT, this.natTable);
assertSelectCellsCount(2);
assertCellSelected(4, 3);
assertCellSelected(4, 4);
assertSelectionAnchorEquals(4, 3);
SWTUtils.pressKey(SWT.ARROW_DOWN, SWT.MOD1, this.natTable);
assertSelectCellsCount(1);
int lastRow = this.selectionLayer.getRowCount() - 1;
assertPositionEquals(4, lastRow,
this.selectionLayer.getSelectedCellPositions()[0]);
assertPositionEquals(4, lastRow,
this.selectionLayer.getLastSelectedCellPosition());
assertSelectionAnchorEquals(4, lastRow);
}
@Test
public void movingSelectionWithUpArrow() throws Exception {
this.natTable.doCommand(new SelectCellCommand(this.natTable, 5, 4, NO_SHIFT,
NO_CTRL));
// Note: the co-ordinates from this point on are in selection later
// co-ordinates
SWTUtils.pressKey(SWT.ARROW_UP, this.natTable);
assertPositionEquals(4, 2, this.selectionLayer.getSelectedCellPositions()[0]);
assertSelectionAnchorEquals(4, 2);
SWTUtils.pressKey(SWT.ARROW_UP, SWT.SHIFT, this.natTable);
SWTUtils.pressKey(SWT.ARROW_UP, SWT.SHIFT, this.natTable);
assertSelectCellsCount(3);
assertCellSelected(4, 0);
assertCellSelected(4, 1);
assertCellSelected(4, 2);
assertSelectionAnchorEquals(4, 2);
this.natTable.doCommand(new SelectCellCommand(this.natTable, 5, 4, NO_SHIFT,
NO_CTRL));
assertSelectCellsCount(1);
SWTUtils.pressKey(SWT.ARROW_UP, SWT.MOD1, this.natTable);
assertSelectCellsCount(1);
int lastRow = 0;
assertPositionEquals(4, lastRow,
this.selectionLayer.getSelectedCellPositions()[0]);
assertPositionEquals(4, lastRow,
this.selectionLayer.getLastSelectedCellPosition());
assertSelectionAnchorEquals(4, lastRow);
}
@Test
public void selectingRectangularAreasWithShiftKey() throws Exception {
this.natTable.doCommand(new SelectCellCommand(this.natTable, 2, 1, NO_SHIFT,
NO_CTRL));
this.natTable.doCommand(new SelectCellCommand(this.natTable, 2, 3, SHIFT, NO_CTRL));
assertSelectCellsCount(3);
assertSelectionAnchorEquals(1, 0);
assertCellSelected(1, 0);
assertCellSelected(1, 1);
assertCellSelected(1, 2);
SWTUtils.pressKey(SWT.ARROW_RIGHT, SWT.SHIFT, this.natTable);
// Previously selected rectangular area must be extended
assertSelectCellsCount(6);
assertSelectionAnchorEquals(1, 0);
assertCellSelected(1, 0);
assertCellSelected(1, 1);
assertCellSelected(1, 2);
assertCellSelected(2, 0);
assertCellSelected(2, 1);
assertCellSelected(2, 2);
SWTUtils.pressKey(SWT.ARROW_UP, SWT.SHIFT, this.natTable);
assertSelectCellsCount(4);
assertSelectionAnchorEquals(1, 0);
assertCellSelected(1, 0);
assertCellSelected(1, 1);
assertCellSelected(2, 0);
assertCellSelected(2, 1);
}
// Convenience asserts
private void assertCellSelected(int column, int row) {
PositionCoordinate[] selectedCells = this.selectionLayer
.getSelectedCellPositions();
boolean selected = false;
for (PositionCoordinate positionCoordinate : selectedCells) {
if (column == positionCoordinate.getColumnPosition()
&& row == positionCoordinate.getRowPosition()) {
selected = true;
break;
}
}
Assert.assertTrue(selected);
}
private PositionCoordinate[] getSelectedCells() {
return this.selectionLayer.getSelectedCellPositions();
}
private void assertSelectCellsCount(int count) {
assertEquals(count, this.selectionLayer.getSelectedCellPositions().length);
}
private void assertSelectionAnchorEquals(int column, int row) {
assertPositionEquals(column, row, this.selectionLayer.getSelectionAnchor());
}
private void assertPositionEquals(int column, int row,
PositionCoordinate position) {
assertEquals(column, position.getColumnPosition());
assertEquals(row, position.getRowPosition());
}
}