/***************************************************************************** * Copyright (c) 2015 CEA LIST. * * 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: * Dirk Fauth <dirk.fauth@googlemail.com> - Initial API and implementation * *****************************************************************************/ package org.eclipse.nebula.widgets.nattable.formula; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import java.math.BigDecimal; import org.eclipse.nebula.widgets.nattable.NatTable; import org.eclipse.nebula.widgets.nattable.config.AbstractRegistryConfiguration; import org.eclipse.nebula.widgets.nattable.config.EditableRule; import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry; import org.eclipse.nebula.widgets.nattable.copy.InternalCellClipboard; import org.eclipse.nebula.widgets.nattable.copy.command.CopyDataToClipboardCommand; import org.eclipse.nebula.widgets.nattable.copy.command.InternalCopyDataCommandHandler; import org.eclipse.nebula.widgets.nattable.data.IDataProvider; import org.eclipse.nebula.widgets.nattable.edit.EditConfigAttributes; import org.eclipse.nebula.widgets.nattable.fillhandle.command.FillHandlePasteCommand; import org.eclipse.nebula.widgets.nattable.fillhandle.command.FillHandlePasteCommand.FillHandleOperation; import org.eclipse.nebula.widgets.nattable.formula.command.FormulaFillHandlePasteCommandHandler; import org.eclipse.nebula.widgets.nattable.formula.config.DefaultFormulaConfiguration; import org.eclipse.nebula.widgets.nattable.layer.DataLayer; import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer; import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer.MoveDirectionEnum; import org.eclipse.nebula.widgets.nattable.test.fixture.NatTableFixture; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.junit.After; import org.junit.Before; import org.junit.Test; public class FormulaFillHandlePasteTest { IDataProvider dataProvider = new TwoDimensionalArrayDataProvider(new String[10][10]); FormulaDataProvider formulaDataProvider = new FormulaDataProvider(this.dataProvider); SelectionLayer selectionLayer = new SelectionLayer(new DataLayer(this.formulaDataProvider)); NatTable natTable = new NatTableFixture(this.selectionLayer, false); @Before public void setup() { InternalCellClipboard clipboard = new InternalCellClipboard(); this.selectionLayer.registerCommandHandler( new InternalCopyDataCommandHandler(this.selectionLayer, clipboard)); this.selectionLayer.registerCommandHandler( new FormulaFillHandlePasteCommandHandler(this.selectionLayer, clipboard, this.formulaDataProvider)); this.natTable.addConfiguration(new DefaultFormulaConfiguration( this.formulaDataProvider, this.selectionLayer, clipboard)); this.natTable.addConfiguration(new AbstractRegistryConfiguration() { @Override public void configureRegistry(IConfigRegistry configRegistry) { configRegistry.registerConfigAttribute( EditConfigAttributes.CELL_EDITABLE_RULE, EditableRule.ALWAYS_EDITABLE); } }); this.natTable.configure(); } @After public void tearDown() { this.selectionLayer.clear(); this.selectionLayer.setFillHandleRegion(null); } @Test public void testSingleCellDragOneDown() { this.dataProvider.setDataValue(4, 4, "Simpson"); this.selectionLayer.setSelectedCell(4, 4); testCellStates(new Point(4, 4)); this.natTable.doCommand(new CopyDataToClipboardCommand( "\t", //$NON-NLS-1$ System.getProperty("line.separator"), //$NON-NLS-1$ this.natTable.getConfigRegistry())); this.selectionLayer.setFillHandleRegion(new Rectangle(4, 4, 1, 2)); this.natTable.doCommand( new FillHandlePasteCommand(FillHandleOperation.COPY, MoveDirectionEnum.DOWN, this.natTable.getConfigRegistry())); assertEquals("Simpson", this.selectionLayer.getDataValueByPosition(4, 5)); testCellStates(new Point(4, 4), new Point(4, 5)); } @Test public void testSingleCellSeriesStringDragOneDown() { this.dataProvider.setDataValue(4, 4, "Simpson"); this.selectionLayer.setSelectedCell(4, 4); testCellStates(new Point(4, 4)); this.natTable.doCommand(new CopyDataToClipboardCommand( "\t", //$NON-NLS-1$ System.getProperty("line.separator"), //$NON-NLS-1$ this.natTable.getConfigRegistry())); this.selectionLayer.setFillHandleRegion(new Rectangle(4, 4, 1, 2)); this.natTable.doCommand( new FillHandlePasteCommand(FillHandleOperation.SERIES, MoveDirectionEnum.DOWN, this.natTable.getConfigRegistry())); assertEquals("Simpson", this.selectionLayer.getDataValueByPosition(4, 5)); testCellStates(new Point(4, 4), new Point(4, 5)); } @Test public void testSingleNumberCellDragDown() { this.dataProvider.setDataValue(4, 4, "1"); this.selectionLayer.setSelectedCell(4, 4); testCellStates(new Point(4, 4)); this.natTable.doCommand(new CopyDataToClipboardCommand( "\t", //$NON-NLS-1$ System.getProperty("line.separator"), //$NON-NLS-1$ this.natTable.getConfigRegistry())); this.selectionLayer.setFillHandleRegion(new Rectangle(4, 4, 1, 4)); this.natTable.doCommand( new FillHandlePasteCommand(FillHandleOperation.SERIES, MoveDirectionEnum.DOWN, this.natTable.getConfigRegistry())); assertEquals("1", this.selectionLayer.getDataValueByPosition(4, 4)); assertEquals("2", this.selectionLayer.getDataValueByPosition(4, 5)); assertEquals("3", this.selectionLayer.getDataValueByPosition(4, 6)); assertEquals("4", this.selectionLayer.getDataValueByPosition(4, 7)); testCellStates(new Point(4, 4), new Point(4, 5), new Point(4, 6), new Point(4, 7)); } @Test public void testMultiNumberCellDragDown() { this.dataProvider.setDataValue(4, 4, "2"); this.dataProvider.setDataValue(4, 5, "4"); this.selectionLayer.selectCell(4, 4, false, true); this.selectionLayer.selectCell(4, 5, false, true); testCellStates(new Point(4, 4), new Point(4, 5)); this.natTable.doCommand(new CopyDataToClipboardCommand( "\t", //$NON-NLS-1$ System.getProperty("line.separator"), //$NON-NLS-1$ this.natTable.getConfigRegistry())); this.selectionLayer.setFillHandleRegion(new Rectangle(4, 4, 1, 4)); this.natTable.doCommand( new FillHandlePasteCommand(FillHandleOperation.SERIES, MoveDirectionEnum.DOWN, this.natTable.getConfigRegistry())); assertEquals("2", this.selectionLayer.getDataValueByPosition(4, 4)); assertEquals("4", this.selectionLayer.getDataValueByPosition(4, 5)); assertEquals("6", this.selectionLayer.getDataValueByPosition(4, 6)); assertEquals("8", this.selectionLayer.getDataValueByPosition(4, 7)); testCellStates(new Point(4, 4), new Point(4, 5), new Point(4, 6), new Point(4, 7)); } @Test public void testFunctionCellDragDown() { this.dataProvider.setDataValue(4, 4, "2"); this.dataProvider.setDataValue(5, 4, "21"); this.dataProvider.setDataValue(6, 4, "=E5*F5"); this.dataProvider.setDataValue(4, 5, "3"); this.dataProvider.setDataValue(5, 5, "22"); this.selectionLayer.selectCell(6, 4, false, true); testCellStates(new Point(4, 4), new Point(5, 4), new Point(6, 4), new Point(4, 5), new Point(5, 5)); this.natTable.doCommand(new CopyDataToClipboardCommand( "\t", //$NON-NLS-1$ System.getProperty("line.separator"), //$NON-NLS-1$ this.natTable.getConfigRegistry())); this.selectionLayer.setFillHandleRegion(new Rectangle(6, 4, 1, 2)); this.natTable.doCommand( new FillHandlePasteCommand(FillHandleOperation.SERIES, MoveDirectionEnum.DOWN, this.natTable.getConfigRegistry())); assertEquals("2", this.selectionLayer.getDataValueByPosition(4, 4)); assertEquals("21", this.selectionLayer.getDataValueByPosition(5, 4)); assertEquals(new BigDecimal("42"), this.selectionLayer.getDataValueByPosition(6, 4)); assertEquals("3", this.selectionLayer.getDataValueByPosition(4, 5)); assertEquals("22", this.selectionLayer.getDataValueByPosition(5, 5)); assertEquals(new BigDecimal("66"), this.selectionLayer.getDataValueByPosition(6, 5)); testCellStates(new Point(4, 4), new Point(5, 4), new Point(6, 4), new Point(4, 5), new Point(5, 5), new Point(6, 5)); } @Test public void testFullFunctionCellDragDown() { this.dataProvider.setDataValue(4, 4, "2"); this.dataProvider.setDataValue(5, 4, "21"); this.dataProvider.setDataValue(6, 4, "=E5*F5"); assertEquals(new BigDecimal("42"), this.formulaDataProvider.getDataValue(6, 4)); this.selectionLayer.selectCell(4, 4, false, true); this.selectionLayer.selectCell(5, 4, false, true); this.selectionLayer.selectCell(6, 4, false, true); testCellStates(new Point(4, 4), new Point(5, 4), new Point(6, 4)); this.natTable.doCommand(new CopyDataToClipboardCommand( "\t", //$NON-NLS-1$ System.getProperty("line.separator"), //$NON-NLS-1$ this.natTable.getConfigRegistry())); this.selectionLayer.setFillHandleRegion(new Rectangle(4, 4, 3, 3)); this.natTable.doCommand( new FillHandlePasteCommand(FillHandleOperation.SERIES, MoveDirectionEnum.DOWN, this.natTable.getConfigRegistry())); assertEquals("2", this.selectionLayer.getDataValueByPosition(4, 4)); assertEquals("21", this.selectionLayer.getDataValueByPosition(5, 4)); assertEquals(new BigDecimal("42"), this.selectionLayer.getDataValueByPosition(6, 4)); assertEquals("3", this.selectionLayer.getDataValueByPosition(4, 5)); assertEquals("22", this.selectionLayer.getDataValueByPosition(5, 5)); assertEquals(new BigDecimal("66"), this.selectionLayer.getDataValueByPosition(6, 5)); assertEquals("4", this.selectionLayer.getDataValueByPosition(4, 6)); assertEquals("23", this.selectionLayer.getDataValueByPosition(5, 6)); assertEquals(new BigDecimal("92"), this.selectionLayer.getDataValueByPosition(6, 6)); testCellStates(new Point(4, 4), new Point(5, 4), new Point(6, 4), new Point(4, 5), new Point(5, 5), new Point(6, 5), new Point(4, 6), new Point(5, 6), new Point(6, 6)); } private void testCellStates(Point... nonNull) { for (int i = 0; i < this.dataProvider.getColumnCount(); i++) { for (int j = 0; j < this.dataProvider.getRowCount(); j++) { boolean check = true; for (Point p : nonNull) { if ((i == p.x) && (j == p.y)) { check = false; break; } } if (check) { assertNull("Position " + i + "/" + j + " is not null", this.selectionLayer.getDataValueByPosition(i, j)); } else { assertNotNull("Position " + i + "/" + j + " is null", this.selectionLayer.getDataValueByPosition(i, j)); } } } } }