/******************************************************************************* * Copyright (c) 2013 Dirk Fauth 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: * Dirk Fauth <dirk.fauth@gmail.com> - initial API and implementation *******************************************************************************/ package org.eclipse.nebula.widgets.nattable.edit.command; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.Serializable; import java.util.List; import org.eclipse.nebula.widgets.nattable.config.CellConfigAttributes; import org.eclipse.nebula.widgets.nattable.config.IEditableRule; import org.eclipse.nebula.widgets.nattable.coordinate.PositionCoordinate; import org.eclipse.nebula.widgets.nattable.data.IRowDataProvider; import org.eclipse.nebula.widgets.nattable.data.IRowIdAccessor; import org.eclipse.nebula.widgets.nattable.data.ListDataProvider; import org.eclipse.nebula.widgets.nattable.data.ReflectiveColumnPropertyAccessor; import org.eclipse.nebula.widgets.nattable.data.convert.DefaultBooleanDisplayConverter; import org.eclipse.nebula.widgets.nattable.dataset.fixture.data.RowDataFixture; import org.eclipse.nebula.widgets.nattable.dataset.fixture.data.RowDataListFixture; import org.eclipse.nebula.widgets.nattable.edit.ActiveCellEditorRegistry; import org.eclipse.nebula.widgets.nattable.edit.EditConfigAttributes; import org.eclipse.nebula.widgets.nattable.edit.editor.CheckBoxCellEditor; import org.eclipse.nebula.widgets.nattable.edit.editor.ICellEditor; import org.eclipse.nebula.widgets.nattable.edit.editor.TextCellEditor; import org.eclipse.nebula.widgets.nattable.layer.DataLayer; import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell; import org.eclipse.nebula.widgets.nattable.selection.RowSelectionModel; import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer; import org.eclipse.nebula.widgets.nattable.style.DisplayMode; import org.eclipse.nebula.widgets.nattable.test.fixture.NatTableFixture; import org.eclipse.nebula.widgets.nattable.test.fixture.layer.GridLayerFixture; import org.junit.Before; import org.junit.Test; @SuppressWarnings("deprecation") public class RowSelectionEditUtilsTest { private static final String TEST_LABEL = "testLabel"; private NatTableFixture natTable; private GridLayerFixture gridLayerStack; private SelectionLayer selectionLayer; @Before public void setup() { List<RowDataFixture> listFixture = RowDataListFixture.getList(10); IRowDataProvider<RowDataFixture> bodyDataProvider = new ListDataProvider<RowDataFixture>(listFixture, new ReflectiveColumnPropertyAccessor<RowDataFixture>(RowDataListFixture.getPropertyNames())); this.gridLayerStack = new GridLayerFixture(bodyDataProvider); this.selectionLayer = this.gridLayerStack.getBodyLayer().getSelectionLayer(); this.selectionLayer.setSelectionModel(new RowSelectionModel<RowDataFixture>( this.selectionLayer, bodyDataProvider, new IRowIdAccessor<RowDataFixture>() { @Override public Serializable getRowId(RowDataFixture rowObject) { return rowObject.getSecurity_id(); } })); this.natTable = new NatTableFixture(this.gridLayerStack); // Ensure no active editor (static) is present // Although deprecated this needs to still work for backwards // compatibility assertNull(ActiveCellEditorRegistry.getActiveCellEditor()); } @Test public void testGetLastSelectedCellWithoutSelection() { assertNull(EditUtils.getLastSelectedCell(this.selectionLayer)); } @Test public void testGetLastSelectedCellWithSingleSelection() { this.selectionLayer.selectCell(1, 1, false, false); ILayerCell cell = EditUtils.getLastSelectedCell(this.selectionLayer); assertNotNull(cell); assertEquals(1, cell.getColumnIndex()); assertEquals(1, cell.getRowIndex()); } @Test public void testGetLastSelectedCellWithMultiSelection() { this.selectionLayer.selectCell(1, 1, false, true); this.selectionLayer.selectCell(2, 2, false, true); this.selectionLayer.selectCell(3, 3, false, true); ILayerCell cell = EditUtils.getLastSelectedCell(this.selectionLayer); assertNotNull(cell); assertEquals(3, cell.getColumnIndex()); assertEquals(3, cell.getRowIndex()); } @Test public void testGetLastSelectedCellEditorWithoutSelection() { assertNull(EditUtils.getLastSelectedCellEditor(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testGetLastSelectedCellEditorWithSingleSelection() { this.selectionLayer.selectCell(1, 1, false, false); ICellEditor editor = EditUtils.getLastSelectedCellEditor( this.selectionLayer, this.natTable.getConfigRegistry()); assertNotNull(editor); assertTrue(editor instanceof TextCellEditor); } @Test public void testGetLastSelectedCellEditorWithMultiSelection() { this.selectionLayer.selectCell(1, 1, false, true); this.selectionLayer.selectCell(2, 2, false, true); this.selectionLayer.selectCell(3, 3, false, true); ICellEditor editor = EditUtils.getLastSelectedCellEditor( this.selectionLayer, this.natTable.getConfigRegistry()); assertNotNull(editor); assertTrue(editor instanceof TextCellEditor); } @Test public void testAllCellsEditableWithoutSelection() { assertTrue(EditUtils.allCellsEditable(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testAllCellsEditableWithoutSelectionEnableEditing() { this.natTable.enableEditingOnAllCells(); assertTrue(EditUtils.allCellsEditable(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testAllCellsEditableWithSingleSelection() { this.selectionLayer.selectCell(1, 1, false, false); assertFalse(EditUtils.allCellsEditable(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testAllCellsEditableWithSingleSelectionEnableEditing() { this.natTable.enableEditingOnAllCells(); this.selectionLayer.selectCell(1, 1, false, false); assertTrue(EditUtils.allCellsEditable(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testAllCellsEditableWithSingleSelectionOneColumnEditable() { DataLayer bodyDataLayer = (DataLayer) this.gridLayerStack.getBodyDataLayer(); this.natTable.registerLabelOnColumn(bodyDataLayer, 1, TEST_LABEL); this.natTable.getConfigRegistry().registerConfigAttribute( EditConfigAttributes.CELL_EDITABLE_RULE, IEditableRule.ALWAYS_EDITABLE, DisplayMode.EDIT, TEST_LABEL); this.selectionLayer.selectCell(1, 1, false, false); assertTrue(EditUtils.allCellsEditable(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testAllCellsEditableWithSingleSelectionOneColumnEditableSelectNonEditable() { DataLayer bodyDataLayer = (DataLayer) this.gridLayerStack.getBodyDataLayer(); this.natTable.registerLabelOnColumn(bodyDataLayer, 1, TEST_LABEL); this.natTable.getConfigRegistry().registerConfigAttribute( EditConfigAttributes.CELL_EDITABLE_RULE, IEditableRule.ALWAYS_EDITABLE, DisplayMode.EDIT, TEST_LABEL); this.selectionLayer.selectCell(2, 1, false, false); assertFalse(EditUtils.allCellsEditable(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testAllCellsEditableWithMultiSelection() { this.selectionLayer.selectCell(1, 1, false, true); this.selectionLayer.selectCell(2, 2, false, true); this.selectionLayer.selectCell(3, 3, false, true); assertFalse(EditUtils.allCellsEditable(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testAllCellsEditableWithMultiSelectionEnableEditing() { this.natTable.enableEditingOnAllCells(); this.selectionLayer.selectCell(1, 1, false, true); this.selectionLayer.selectCell(2, 2, false, true); this.selectionLayer.selectCell(3, 3, false, true); assertTrue(EditUtils.allCellsEditable(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testAllCellsEditableWithMultiSelectionOneColumnEditableMultiSelection() { DataLayer bodyDataLayer = (DataLayer) this.gridLayerStack.getBodyDataLayer(); this.natTable.registerLabelOnColumn(bodyDataLayer, 1, TEST_LABEL); this.natTable.getConfigRegistry().registerConfigAttribute( EditConfigAttributes.CELL_EDITABLE_RULE, IEditableRule.ALWAYS_EDITABLE, DisplayMode.EDIT, TEST_LABEL); this.selectionLayer.selectCell(1, 1, false, true); this.selectionLayer.selectCell(1, 2, false, true); this.selectionLayer.selectCell(1, 3, false, true); assertTrue(EditUtils.allCellsEditable(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testIsCellEditableWithoutSelection() { PositionCoordinate coord = new PositionCoordinate(this.selectionLayer, 0, 0); assertFalse(EditUtils.isCellEditable(this.selectionLayer, this.natTable.getConfigRegistry(), coord)); } @Test public void testIsCellEditableWithoutSelectionEnableEditing() { this.natTable.enableEditingOnAllCells(); PositionCoordinate coord = new PositionCoordinate(this.selectionLayer, 0, 0); assertTrue(EditUtils.isCellEditable(this.selectionLayer, this.natTable.getConfigRegistry(), coord)); } @Test public void testIsCellEditableWithSingleSelection() { this.selectionLayer.selectCell(1, 1, false, false); PositionCoordinate coord = new PositionCoordinate(this.selectionLayer, 1, 1); assertFalse(EditUtils.isCellEditable(this.selectionLayer, this.natTable.getConfigRegistry(), coord)); } @Test public void testIsCellEditableWithSingleSelectionEnableEditing() { this.natTable.enableEditingOnAllCells(); this.selectionLayer.selectCell(1, 1, false, false); PositionCoordinate coord = new PositionCoordinate(this.selectionLayer, 1, 1); assertTrue(EditUtils.isCellEditable(this.selectionLayer, this.natTable.getConfigRegistry(), coord)); } @Test public void testIsEditorSameWithoutSelection() { assertTrue(EditUtils.isEditorSame(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testIsEditorSameWithSingleSelection() { this.selectionLayer.selectCell(1, 1, false, false); assertTrue(EditUtils.isEditorSame(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testIsEditorSameWithSingleSelectionOneChangedEditor() { DataLayer bodyDataLayer = (DataLayer) this.gridLayerStack.getBodyDataLayer(); this.natTable.registerLabelOnColumn(bodyDataLayer, 1, TEST_LABEL); this.natTable.getConfigRegistry().registerConfigAttribute( EditConfigAttributes.CELL_EDITOR, new CheckBoxCellEditor(), DisplayMode.EDIT, TEST_LABEL); this.selectionLayer.selectCell(1, 1, false, false); assertTrue(EditUtils.isEditorSame(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testIsEditorSameWithMultiSelectionOneColumnEditorMultiSelection() { DataLayer bodyDataLayer = (DataLayer) this.gridLayerStack.getBodyDataLayer(); this.natTable.registerLabelOnColumn(bodyDataLayer, 1, TEST_LABEL); this.natTable.getConfigRegistry().registerConfigAttribute( EditConfigAttributes.CELL_EDITOR, new CheckBoxCellEditor(), DisplayMode.EDIT, TEST_LABEL); this.selectionLayer.selectCell(1, 1, false, true); this.selectionLayer.selectCell(1, 2, false, true); this.selectionLayer.selectCell(1, 3, false, true); assertTrue(EditUtils.isEditorSame(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testIsEditorSameWithMultiSelection() { this.selectionLayer.selectCell(1, 1, false, true); this.selectionLayer.selectCell(2, 2, false, true); this.selectionLayer.selectCell(3, 3, false, true); assertTrue(EditUtils.isEditorSame(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testIsEditorSameWithMultiSelectionOneChangedEditor() { this.selectionLayer.selectCell(1, 1, false, true); this.selectionLayer.selectCell(2, 2, false, true); this.selectionLayer.selectCell(3, 3, false, true); DataLayer bodyDataLayer = (DataLayer) this.gridLayerStack.getBodyDataLayer(); this.natTable.registerLabelOnColumn(bodyDataLayer, 1, TEST_LABEL); this.natTable.getConfigRegistry().registerConfigAttribute( EditConfigAttributes.CELL_EDITOR, new CheckBoxCellEditor(), DisplayMode.EDIT, TEST_LABEL); // the result is true here because using the IRowSelectionModel the // anchor is used to determine the cells to edit assertTrue(EditUtils.isEditorSame(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testIsConverterSameWithoutSelection() { assertTrue(EditUtils.isConverterSame(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testIsConverterSameWithSingleSelection() { this.selectionLayer.selectCell(1, 1, false, false); assertTrue(EditUtils.isConverterSame(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testIsConverterSameWithMultiSelection() { this.selectionLayer.selectCell(1, 1, false, true); this.selectionLayer.selectCell(2, 2, false, true); this.selectionLayer.selectCell(3, 3, false, true); assertTrue(EditUtils.isConverterSame(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testIsConverterSameWithSingleSelectionOneChangedConverter() { DataLayer bodyDataLayer = (DataLayer) this.gridLayerStack.getBodyDataLayer(); this.natTable.registerLabelOnColumn(bodyDataLayer, 1, TEST_LABEL); this.natTable.getConfigRegistry().registerConfigAttribute( CellConfigAttributes.DISPLAY_CONVERTER, new DefaultBooleanDisplayConverter(), DisplayMode.EDIT, TEST_LABEL); this.selectionLayer.selectCell(1, 1, false, false); assertTrue(EditUtils.isConverterSame(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testIsConverterSameWithMultiSelectionOneColumnConverterMultiSelection() { DataLayer bodyDataLayer = (DataLayer) this.gridLayerStack.getBodyDataLayer(); this.natTable.registerLabelOnColumn(bodyDataLayer, 1, TEST_LABEL); this.natTable.getConfigRegistry().registerConfigAttribute( CellConfigAttributes.DISPLAY_CONVERTER, new DefaultBooleanDisplayConverter(), DisplayMode.EDIT, TEST_LABEL); this.selectionLayer.selectCell(1, 1, false, true); this.selectionLayer.selectCell(1, 2, false, true); this.selectionLayer.selectCell(1, 3, false, true); assertTrue(EditUtils.isConverterSame(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testIsConverterSameWithMultiSelectionOneChangedConverter() { this.selectionLayer.selectCell(1, 1, false, true); this.selectionLayer.selectCell(2, 2, false, true); this.selectionLayer.selectCell(3, 3, false, true); DataLayer bodyDataLayer = (DataLayer) this.gridLayerStack.getBodyDataLayer(); this.natTable.registerLabelOnColumn(bodyDataLayer, 1, TEST_LABEL); this.natTable.getConfigRegistry().registerConfigAttribute( CellConfigAttributes.DISPLAY_CONVERTER, new DefaultBooleanDisplayConverter(), DisplayMode.EDIT, TEST_LABEL); // the result is true here because using the IRowSelectionModel the // anchor is used to determine the cells to edit assertTrue(EditUtils.isConverterSame(this.selectionLayer, this.natTable.getConfigRegistry())); } @Test public void testIsValueSameWithoutSelection() { assertTrue(EditUtils.isValueSame(this.selectionLayer)); } @Test public void testIsValueSameWithSingleSelection() { this.selectionLayer.selectCell(1, 1, false, false); assertTrue(EditUtils.isValueSame(this.selectionLayer)); } @Test public void testIsValueSameWithMultiSelection() { this.selectionLayer.selectCell(1, 1, false, true); this.selectionLayer.selectCell(2, 2, false, true); this.selectionLayer.selectCell(3, 3, false, true); assertFalse(EditUtils.isValueSame(this.selectionLayer)); } @Test public void testIsValueSameWithMultiSelectionEnsureSameValues() { this.selectionLayer.selectCell(1, 1, false, true); this.selectionLayer.selectCell(1, 2, false, true); this.selectionLayer.selectCell(1, 3, false, true); this.selectionLayer.doCommand(new UpdateDataCommand(this.selectionLayer, 1, 1, "Test")); this.selectionLayer.doCommand(new UpdateDataCommand(this.selectionLayer, 1, 2, "Test")); this.selectionLayer.doCommand(new UpdateDataCommand(this.selectionLayer, 1, 3, "Test")); assertTrue(EditUtils.isValueSame(this.selectionLayer)); } }