blob: 62d129cb606c268e26fc31bb8e6f3b6d171038bc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 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.copy.command;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.nebula.widgets.nattable.coordinate.IValueIterator;
import org.eclipse.nebula.widgets.nattable.coordinate.Range;
import org.eclipse.nebula.widgets.nattable.coordinate.RangeList;
import org.eclipse.nebula.widgets.nattable.data.IDataProvider;
import org.eclipse.nebula.widgets.nattable.grid.command.ClientAreaResizeCommand;
import org.eclipse.nebula.widgets.nattable.grid.layer.ColumnHeaderLayer;
import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultGridLayer;
import org.eclipse.nebula.widgets.nattable.grid.layer.RowHeaderLayer;
import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
import org.eclipse.nebula.widgets.nattable.selection.command.SelectCellCommand;
import org.eclipse.nebula.widgets.nattable.selection.command.SelectColumnCommand;
import org.eclipse.nebula.widgets.nattable.test.fixture.data.DataProviderFixture;
import org.eclipse.nebula.widgets.nattable.util.IClientAreaProvider;
public class CopyDataCommandHandlerTest {
private DefaultGridLayer gridLayer;
private RowHeaderLayer rowHeaderLayer;
private SelectionLayer selectionLayer;
private ColumnHeaderLayer columnHeaderLayer;
private CopyDataCommandHandler commandHandler;
@Before
public void setUp() {
final IDataProvider bodyDataProvider = new DataProviderFixture(10, 10);
gridLayer = new DefaultGridLayer(bodyDataProvider, getColumnHeaderDataProvider(bodyDataProvider), getRowHeaderDataProvider(bodyDataProvider));
gridLayer.setClientAreaProvider(new IClientAreaProvider() {
public Rectangle getClientArea() {
return new Rectangle(0,0,1050,1050);
}
});
gridLayer.doCommand(new ClientAreaResizeCommand(new Shell(Display.getDefault(), SWT.V_SCROLL | SWT.H_SCROLL)));
rowHeaderLayer = gridLayer.getRowHeaderLayer();
columnHeaderLayer = gridLayer.getColumnHeaderLayer();
selectionLayer = gridLayer.getBodyLayer().getSelectionLayer();
commandHandler = new CopyDataCommandHandler(selectionLayer, columnHeaderLayer, rowHeaderLayer);
}
private IDataProvider getRowHeaderDataProvider(final IDataProvider bodyDataProvider) {
return new IDataProvider() {
public int getColumnCount() {
return 1;
}
public Object getDataValue(int columnIndex, int rowIndex) {
return Integer.valueOf(rowIndex + 1);
}
public int getRowCount() {
return bodyDataProvider.getRowCount();
}
public void setDataValue(int columnIndex, int rowIndex, Object newValue) {
}
};
}
private IDataProvider getColumnHeaderDataProvider(final IDataProvider dependent) {
return new IDataProvider() {
public int getColumnCount() {
return dependent.getColumnCount();
}
public Object getDataValue(int columnIndex, int rowIndex) {
return "Column " + (columnIndex + 1);
}
public int getRowCount() {
return 1;
}
public void setDataValue(int columnIndex, int rowIndex, Object newValue) {
}
};
}
@Test
public void shouldReturnArrayOfCellsForColumnsInSelectionModel() {
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 2, 3, false, true));
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 4, 1, false, true));
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 9, 9, false, true));
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 1, 0, false, true));
RangeList selectedColumns = selectionLayer.getSelectedColumnPositions();
ILayerCell[] columns = commandHandler.assembleColumnHeader(selectedColumns, 1, 0);
assertEquals(5, columns.length);
assertEquals("Column 2", columns[1].getDataValue());
assertEquals("Column 3", columns[2].getDataValue());
assertEquals("Column 5", columns[3].getDataValue());
assertEquals("Column 10", columns[4].getDataValue());
}
@Test
public void shouldReturnOnlySelectedBodyCells() {
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 1, 2, false, true));
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 3, 7, false, true));
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 4, 8, false, true));
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 7, 9, false, true));
selectionLayer.doCommand(new SelectColumnCommand(selectionLayer, 8, 0, false, true));
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 9, 9, false, true));
selectionLayer.doCommand(new SelectColumnCommand(selectionLayer, 5, 0, false, true));
RangeList selectedColumns = selectionLayer.getSelectedColumnPositions();
ILayerCell[] bodyCells = commandHandler.assembleBody(selectedColumns, 1, 0);
assertEquals(8, bodyCells.length);
assertEquals("[5,0]", bodyCells[4].getDataValue());
assertEquals("[8,0]", bodyCells[6].getDataValue());
bodyCells = commandHandler.assembleBody(selectedColumns, 1, 9);
assertEquals("[9,9]", bodyCells[7].getDataValue());
}
/**
* Returns a collection representing a 11 x 11 grid. Only selected cells will have data, those are (col,row):
* (2,3),(4,1),(1,0),(9,9)
*
* TODO: Test is ignored since it passes locally and fails on the build. Can't figure out why.
*/
@Ignore
@Test
public void shouldReturnGridWithSelectedCellsAndHeaders() {
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 1, 2, false, true));
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 3, 7, false, true));
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 4, 8, false, true));
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 7, 9, false, true));
selectionLayer.doCommand(new SelectColumnCommand(selectionLayer, 8, 0, false, true));
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 9, 9, false, true));
selectionLayer.doCommand(new SelectColumnCommand(selectionLayer, 5, 0, false, true));
ILayerCell[][] copiedGrid = commandHandler.assembleCopiedDataStructure();
// Assert structure of assembled copy grid with headers
assertEquals(11, copiedGrid.length);
assertEquals(8, copiedGrid[0].length);
checkColumnHeaderCells(copiedGrid[0]);
checkBodyCells(copiedGrid);
}
@Test
public void shouldReturnGridWithSelectedCellsNoHeaders() {
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 1, 2, false, true));
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 3, 7, false, true));
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 4, 8, false, true));
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 7, 9, false, true));
selectionLayer.doCommand(new SelectColumnCommand(selectionLayer, 8, 0, false, true));
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 9, 9, false, true));
selectionLayer.doCommand(new SelectColumnCommand(selectionLayer, 5, 0, false, true));
commandHandler = new CopyDataCommandHandler(selectionLayer);
ILayerCell[][] copiedGrid = commandHandler.assembleCopiedDataStructure();
// Assert structure of assembled copy grid with headers
assertEquals(10, copiedGrid.length);
assertEquals(7, copiedGrid[0].length);
assertNotNull(copiedGrid[0][5]);
}
@Test
public void shouldCopySingleCell() {
selectionLayer.doCommand(new SelectCellCommand(selectionLayer, 3, 7, false, false));
CopyDataCommandHandler commandHandler = new CopyDataCommandHandler(selectionLayer);
commandHandler.assembleCopiedDataStructure();
ILayerCell[][] copiedGrid = commandHandler.assembleCopiedDataStructure();
assertNotNull(copiedGrid[0][0]);
}
private void checkColumnHeaderCells(ILayerCell[] cells) {
// First cell should be blank, this is the corner
assertNull(cells[0]);
// Should only have Column headers
final RangeList selectedColumns = selectionLayer.getSelectedColumnPositions();
IValueIterator columnsIter = selectedColumns.values().iterator();
for (int columnPosition = 1; columnPosition < cells.length; columnPosition++) {
ILayerCell cell = cells[columnPosition];
// Remember to substract offset from columnPosition
assertEquals(columnHeaderLayer.getDataValueByPosition(columnsIter.nextValue(), 0), cell.getDataValue());
}
}
private void checkBodyCells(ILayerCell[][] copiedGrid) {
int cellWithDataCounter = 0;
RangeList selectedColumns = selectionLayer.getSelectedColumnPositions();
RangeList selectedRowRanges = selectionLayer.getSelectedRowPositions();
Set<Integer> selectedRows = new HashSet<Integer>();
for (Range range : selectedRowRanges) {
selectedRows.addAll(range.getMembers());
}
Iterator<Integer> rowsIterator = selectedRows.iterator();
// Row zero is for column headers
IValueIterator columnsIter = selectedColumns.values().iterator();
for (int rowPosition = 1; rowPosition < copiedGrid.length; rowPosition ++) {
ILayerCell[] cells = copiedGrid[rowPosition];
assertEquals(rowHeaderLayer.getDataValueByPosition(0, rowPosition - 1), cells[0].getDataValue());
// Check body data
int selectedRowPosition = rowsIterator.next().intValue();
for (int columnPosition = 1; columnPosition < cells.length; columnPosition++) {
final ILayerCell cell = cells[columnPosition];
if (cell != null) {
cellWithDataCounter++;
assertEquals(selectionLayer.getDataValueByPosition(columnsIter.nextValue(), selectedRowPosition), cell
.getDataValue());
}
}
}
assertEquals(selectionLayer.getSelectedCellPositions().size(), cellWithDataCounter);
}
}