blob: dea3c601f24b2905fb49d57ba5e0b4d96b16aaae [file] [log] [blame]
/*******************************************************************************
* 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 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.util.Arrays;
import org.eclipse.nebula.widgets.nattable.config.CellConfigAttributes;
import org.eclipse.nebula.widgets.nattable.config.ConfigRegistry;
import org.eclipse.nebula.widgets.nattable.config.IEditableRule;
import org.eclipse.nebula.widgets.nattable.coordinate.PositionCoordinate;
import org.eclipse.nebula.widgets.nattable.data.convert.DefaultBooleanDisplayConverter;
import org.eclipse.nebula.widgets.nattable.data.convert.DisplayConverter;
import org.eclipse.nebula.widgets.nattable.data.convert.IDisplayConverter;
import org.eclipse.nebula.widgets.nattable.data.validate.DataValidator;
import org.eclipse.nebula.widgets.nattable.data.validate.IDataValidator;
import org.eclipse.nebula.widgets.nattable.dataset.fixture.data.PricingTypeBean;
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.command.EditCellCommand;
import org.eclipse.nebula.widgets.nattable.edit.command.EditUtils;
import org.eclipse.nebula.widgets.nattable.edit.config.DefaultEditBindings;
import org.eclipse.nebula.widgets.nattable.edit.config.DefaultEditConfiguration;
import org.eclipse.nebula.widgets.nattable.edit.editor.CheckBoxCellEditor;
import org.eclipse.nebula.widgets.nattable.edit.editor.ComboBoxCellEditor;
import org.eclipse.nebula.widgets.nattable.edit.editor.ICellEditor;
import org.eclipse.nebula.widgets.nattable.edit.editor.TextCellEditor;
import org.eclipse.nebula.widgets.nattable.edit.event.InlineCellEditEvent;
import org.eclipse.nebula.widgets.nattable.grid.GridRegion;
import org.eclipse.nebula.widgets.nattable.grid.cell.AlternatingRowConfigLabelAccumulator;
import org.eclipse.nebula.widgets.nattable.grid.data.DummySpanningBodyDataProvider;
import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultGridLayer;
import org.eclipse.nebula.widgets.nattable.layer.CompositeLayer;
import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
import org.eclipse.nebula.widgets.nattable.layer.ILayerListener;
import org.eclipse.nebula.widgets.nattable.layer.SpanningDataLayer;
import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
import org.eclipse.nebula.widgets.nattable.layer.event.ILayerEvent;
import org.eclipse.nebula.widgets.nattable.layer.stack.DummyGridLayerStack;
import org.eclipse.nebula.widgets.nattable.painter.cell.CheckBoxPainter;
import org.eclipse.nebula.widgets.nattable.painter.cell.ComboBoxPainter;
import org.eclipse.nebula.widgets.nattable.painter.cell.ICellPainter;
import org.eclipse.nebula.widgets.nattable.resize.command.ColumnResizeCommand;
import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
import org.eclipse.nebula.widgets.nattable.selection.command.SelectCellCommand;
import org.eclipse.nebula.widgets.nattable.style.DisplayMode;
import org.eclipse.nebula.widgets.nattable.test.fixture.NatTableFixture;
import org.eclipse.nebula.widgets.nattable.viewport.ViewportLayer;
import org.eclipse.nebula.widgets.nattable.widget.NatCombo;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@SuppressWarnings("deprecation")
public class EditIntegrationTest {
private static final String TEST_LABEL = "testLabel";
private static final String TEST_LABEL_2 = "testLabel2";
private static final int COLUMN_HEADER_ROW_COUNT = 1;
private static final int ROW_HEADER_COLUMN_COUNT = 1;
private NatTableFixture natTable;
private DummyGridLayerStack gridLayerStack;
@Before
public void setup() {
this.gridLayerStack = new DummyGridLayerStack(5, 5);
this.natTable = new NatTableFixture(this.gridLayerStack);
// Ensure no active editor (static) is present
// Although deprecated this needs to still work for backwards
// compatibility
assertNull(this.natTable.getActiveCellEditor());
assertNull(ActiveCellEditorRegistry.getActiveCellEditor());
}
@After
public void tearDown() {
// ensure the editor is closed
this.natTable.commitAndCloseActiveCellEditor();
// as the test processing is too fast, we also need to unregister
// because the registry
// is only cleaned on disposal of the editor control, which might not
// happen in the tests
ActiveCellEditorRegistry.unregisterActiveCellEditor();
}
@Test
public void testNotEditableByDefault() {
ILayerCell cell = this.natTable.getCellByPosition(4, 4);
this.natTable.doCommand(new EditCellCommand(this.natTable, this.natTable
.getConfigRegistry(), cell));
assertNull(this.natTable.getActiveCellEditor());
assertNull(ActiveCellEditorRegistry.getActiveCellEditor());
}
@Test
public void testEditorActivatedDuringInlineCellEdit() {
this.natTable.enableEditingOnAllCells();
ILayerCell cell = this.natTable.getCellByPosition(4, 4);
this.natTable.doCommand(new EditCellCommand(this.natTable, this.natTable
.getConfigRegistry(), cell));
ICellEditor cellEditor = this.natTable.getActiveCellEditor();
assertNotNull(cellEditor);
assertTrue(cellEditor instanceof TextCellEditor);
TextCellEditor textCellEditor = (TextCellEditor) cellEditor;
assertEquals("Col: 4, Row: 4", textCellEditor.getCanonicalValue());
Control control = cellEditor.getEditorControl();
assertNotNull(control);
assertTrue(control instanceof Text);
}
@Test
public void testEditorClosesWhenANewEditCommandIsFired() {
// Even rows are editable, Odd rows are not
this.natTable.getConfigRegistry().registerConfigAttribute(
EditConfigAttributes.CELL_EDITABLE_RULE,
IEditableRule.ALWAYS_EDITABLE, DisplayMode.NORMAL,
AlternatingRowConfigLabelAccumulator.EVEN_ROW_CONFIG_TYPE);
this.natTable.getConfigRegistry().registerConfigAttribute(
EditConfigAttributes.CELL_EDITABLE_RULE,
IEditableRule.NEVER_EDITABLE, DisplayMode.NORMAL,
AlternatingRowConfigLabelAccumulator.ODD_ROW_CONFIG_TYPE);
this.natTable.doCommand(new EditCellCommand(this.natTable, this.natTable
.getConfigRegistry(), this.natTable.getCellByPosition(4,
COLUMN_HEADER_ROW_COUNT + 2)));
assertNotNull(this.natTable.getActiveCellEditor());
assertNotNull(ActiveCellEditorRegistry.getActiveCellEditor());
this.natTable.doCommand(new EditCellCommand(this.natTable, this.natTable
.getConfigRegistry(), this.natTable.getCellByPosition(4,
COLUMN_HEADER_ROW_COUNT + 3)));
assertNotNull(this.natTable.getActiveCellEditor());
assertFalse(this.natTable.getActiveCellEditor().isClosed());
assertNotNull(ActiveCellEditorRegistry.getActiveCellEditor());
assertFalse(ActiveCellEditorRegistry.getActiveCellEditor().isClosed());
}
@Test
public void testEditorResize() {
this.natTable.enableEditingOnAllCells();
ILayerCell cell = this.natTable.getCellByPosition(4, 4);
this.natTable.doCommand(new EditCellCommand(this.natTable, this.natTable
.getConfigRegistry(), cell));
assertEquals(new Rectangle(340, 80, 99, 19), this.natTable
.getActiveCellEditor().getEditorControl().getBounds());
this.natTable.doCommand(new ColumnResizeCommand(this.natTable, 2, 110));
assertEquals(new Rectangle(340, 80, 99, 19), this.natTable
.getActiveCellEditor().getEditorControl().getBounds());
this.natTable.getActiveCellEditor().getEditorControl()
.notifyListeners(SWT.FocusOut, null);
// ActiveCellEditor should be closed if a ColumnResizeCommand is
// executed and the editor loses focus
assertNull(this.natTable.getActiveCellEditor());
assertNull(ActiveCellEditorRegistry.getActiveCellEditor());
}
@Test
public void testDataValidation() {
DummyGridLayerStack gridLayerStack = new DummyGridLayerStack(5, 5);
this.natTable = new NatTableFixture(gridLayerStack);
// Register custom validation
DataLayer bodyDataLayer = (DataLayer) gridLayerStack.getBodyDataLayer();
this.natTable.registerLabelOnColumn(bodyDataLayer, 0, TEST_LABEL);
this.natTable.registerLabelOnColumn(bodyDataLayer, 1, TEST_LABEL_2);
this.natTable.enableEditingOnAllCells();
this.natTable.getConfigRegistry().registerConfigAttribute(
EditConfigAttributes.DATA_VALIDATOR,
IDataValidator.NEVER_VALID, DisplayMode.EDIT, TEST_LABEL);
this.natTable.getConfigRegistry().registerConfigAttribute(
EditConfigAttributes.DATA_VALIDATOR,
IDataValidator.ALWAYS_VALID, DisplayMode.EDIT, TEST_LABEL_2);
ILayerCell cell = this.natTable.getCellByPosition(1, 1);
assertEquals("Col: 1, Row: 1", cell.getDataValue());
// Column index 0 never valid
this.natTable.doCommand(new EditCellCommand(this.natTable, this.natTable
.getConfigRegistry(), cell));
assertFalse(this.natTable.getActiveCellEditor().validateCanonicalValue(
cell.getDataValue()));
cell = this.natTable.getCellByPosition(2, 1);
assertEquals("Col: 2, Row: 1", cell.getDataValue());
// Column index 1 always valid
this.natTable.doCommand(new EditCellCommand(this.natTable, this.natTable
.getConfigRegistry(), cell));
assertTrue(this.natTable.getActiveCellEditor().validateCanonicalValue(
cell.getDataValue()));
}
@Test
public void navigationWithTab() throws Exception {
this.natTable.enableEditingOnAllCells();
this.natTable.doCommand(new SelectCellCommand(this.natTable, 1, 1, false, false));
// Edit cell
ILayerCell cell = this.natTable.getCellByPosition(1, 1);
this.natTable.doCommand(new EditCellCommand(this.natTable, this.natTable
.getConfigRegistry(), cell));
// Press tab - 3 times
Text textControl = ((Text) this.natTable.getActiveCellEditor()
.getEditorControl());
textControl.notifyListeners(SWT.Traverse, SWTUtils.keyEvent(SWT.TAB));
this.natTable.notifyListeners(SWT.KeyDown, SWTUtils.keyEvent(SWT.TAB));
this.natTable.notifyListeners(SWT.KeyDown, SWTUtils.keyEvent(SWT.TAB));
this.natTable.notifyListeners(SWT.KeyDown, SWTUtils.keyEvent(SWT.TAB));
// Verify new cell selection
PositionCoordinate lastSelectedCellPosition = this.gridLayerStack
.getBodyLayer().getSelectionLayer().getSelectionAnchor();
assertEquals(4, lastSelectedCellPosition.columnPosition);
assertEquals(0, lastSelectedCellPosition.rowPosition);
// Verify that no cell is being edited
assertNull(this.natTable.getActiveCellEditor());
assertNull(ActiveCellEditorRegistry.getActiveCellEditor());
}
@Test
public void testNavigationUsingTabButtonWhenAnInvalidValueIsEntered()
throws InterruptedException {
this.natTable.enableEditingOnAllCells();
DataLayer bodyDataLayer = (DataLayer) this.gridLayerStack.getBodyDataLayer();
this.natTable.registerLabelOnColumn(bodyDataLayer, 0, TEST_LABEL);
this.natTable.getConfigRegistry().registerConfigAttribute(
EditConfigAttributes.DATA_VALIDATOR,
getStartingWithCValidator(), DisplayMode.EDIT, TEST_LABEL);
// Start editing 1,1
ILayerCell cell = this.natTable.getCellByPosition(1, 1);
assertEquals("Col: 1, Row: 1", cell.getDataValue());
this.natTable.doCommand(new SelectCellCommand(this.natTable, 1, 1, false, false));
// Column position 1 - originally valid
this.natTable.doCommand(new EditCellCommand(this.natTable, this.natTable
.getConfigRegistry(), cell));
assertTrue(this.natTable.getActiveCellEditor().validateCanonicalValue(
cell.getDataValue()));
// Set an invalid value in cell - AA
Text textControl = ((Text) this.natTable.getActiveCellEditor()
.getEditorControl());
textControl.setText("AA");
assertEquals("AA", this.natTable.getActiveCellEditor().getCanonicalValue());
assertFalse(this.natTable.getActiveCellEditor().validateCanonicalValue(
this.natTable.getActiveCellEditor().getCanonicalValue()));
// Press tab
textControl.notifyListeners(SWT.Traverse, SWTUtils.keyEvent(SWT.TAB));
assertEquals(textControl, this.natTable.getActiveCellEditor()
.getEditorControl());
assertEquals("AA", this.natTable.getActiveCellEditor().getCanonicalValue());
assertEquals(textControl, ActiveCellEditorRegistry
.getActiveCellEditor().getEditorControl());
assertEquals("AA", ActiveCellEditorRegistry.getActiveCellEditor()
.getCanonicalValue());
}
@Test
public void directlyTypingInACellShoudlStartEditing() throws Exception {
// Press 'A'
this.natTable.enableEditingOnAllCells();
this.natTable.doCommand(new SelectCellCommand(this.natTable, 1, 1, false, false));
this.natTable.notifyListeners(SWT.KeyDown, SWTUtils.keyEventWithChar('A'));
// Verify edit mode
assertNotNull(this.natTable.getActiveCellEditor());
assertEquals("A", this.natTable.getActiveCellEditor().getCanonicalValue());
assertNotNull(ActiveCellEditorRegistry.getActiveCellEditor());
assertEquals("A", ActiveCellEditorRegistry.getActiveCellEditor()
.getCanonicalValue());
}
@Test
public void mustCommitValidValuesOnPressingEnter() throws Exception {
this.natTable.enableEditingOnAllCells();
// Cell value is valid if starting with 'C'
DataLayer bodyDataLayer = (DataLayer) this.gridLayerStack.getBodyDataLayer();
this.natTable.registerLabelOnColumn(bodyDataLayer, 0, TEST_LABEL);
this.natTable.getConfigRegistry().registerConfigAttribute(
EditConfigAttributes.DATA_VALIDATOR,
getStartingWithCValidator(), DisplayMode.EDIT, TEST_LABEL);
// Enter 'A' in the cell
this.natTable.doCommand(new SelectCellCommand(this.natTable, 1, 1, false, false));
this.natTable.notifyListeners(SWT.KeyDown, SWTUtils.keyEventWithChar('A'));
assertEquals("A", this.natTable.getActiveCellEditor().getCanonicalValue());
assertFalse(this.natTable.getActiveCellEditor().validateCanonicalValue(
this.natTable.getActiveCellEditor().getCanonicalValue()));
// Press 'Enter'
this.natTable.getActiveCellEditor().getEditorControl()
.notifyListeners(SWT.KeyDown, SWTUtils.keyEvent(SWT.CR));
// Value not committed
assertNotNull(this.natTable.getActiveCellEditor().getEditorControl());
assertEquals("A", this.natTable.getActiveCellEditor().getCanonicalValue());
assertNotNull(ActiveCellEditorRegistry.getActiveCellEditor()
.getEditorControl());
assertEquals("A", ActiveCellEditorRegistry.getActiveCellEditor()
.getCanonicalValue());
// Enter a valid value - 'C'
this.natTable.notifyListeners(SWT.KeyDown, SWTUtils.keyEventWithChar('C'));
assertNotNull(this.natTable.getActiveCellEditor().getEditorControl());
assertEquals("C", this.natTable.getActiveCellEditor().getCanonicalValue());
assertNotNull(ActiveCellEditorRegistry.getActiveCellEditor()
.getEditorControl());
assertEquals("C", ActiveCellEditorRegistry.getActiveCellEditor()
.getCanonicalValue());
// Press 'Enter' again
this.natTable.getActiveCellEditor().getEditorControl()
.notifyListeners(SWT.KeyDown, SWTUtils.keyEvent(SWT.CR));
// Value committed and editor closed
assertEquals("C", this.natTable.getCellByPosition(1, 1).getDataValue());
assertNull(this.natTable.getActiveCellEditor());
assertNull(ActiveCellEditorRegistry.getActiveCellEditor());
}
@Test
public void clickingOnTheCheckBoxMustToggleItsValue() throws Exception {
DefaultGridLayer layerStack = new DefaultGridLayer(
RowDataListFixture.getList(),
RowDataListFixture.getPropertyNames(),
RowDataListFixture.getPropertyToLabelMap());
this.natTable = new NatTableFixture(layerStack, 1200, 300, false);
// Enable editing
this.natTable.enableEditingOnAllCells();
// Calculate pixel value to click on
int columnIndex = RowDataListFixture
.getColumnIndexOfProperty(RowDataListFixture.PUBLISH_FLAG_PROP_NAME);
int columnPosition = columnIndex + ROW_HEADER_COLUMN_COUNT;
int startX = this.natTable.getStartXOfColumnPosition(columnPosition);
int columnWidth = this.natTable.getColumnWidthByPosition(columnPosition);
int startY = this.natTable.getStartYOfRowPosition(1);
int rowHeight = this.natTable.getRowHeightByPosition(1);
// Register check box for the publish flag column
DataLayer bodyDataLayer = (DataLayer) layerStack.getBodyDataLayer();
this.natTable.registerLabelOnColumn(bodyDataLayer, columnIndex, TEST_LABEL);
registerCheckBoxEditor(this.natTable.getConfigRegistry(),
new CheckBoxPainter(), new CheckBoxCellEditor());
this.natTable.configure();
// Value before click
assertEquals(true, this.natTable.getDataValueByPosition(columnPosition, 1));
// Click on the check box
SWTUtils.leftClick(startX + (columnWidth / 2),
startY + (rowHeight / 2), SWT.NONE, this.natTable);
// Value After click
assertEquals(false, this.natTable.getDataValueByPosition(columnPosition, 1));
}
@Test
public void pressingESCMustDiscardTheValueEnteredAndCloseControl()
throws Exception {
this.natTable.enableEditingOnAllCells();
assertEquals("Col: 1, Row: 1", this.natTable.getDataValueByPosition(1, 1));
// Select cell, press A
this.natTable.doCommand(new SelectCellCommand(this.natTable, 1, 1, false, false));
SWTUtils.pressCharKey('A', this.natTable);
// Verify edit mode
assertNotNull(this.natTable.getActiveCellEditor());
assertEquals("A", this.natTable.getActiveCellEditor().getCanonicalValue());
assertNotNull(ActiveCellEditorRegistry.getActiveCellEditor());
assertEquals("A", ActiveCellEditorRegistry.getActiveCellEditor()
.getCanonicalValue());
// Press ESC
SWTUtils.pressKeyOnControl(SWT.ESC, this.natTable.getActiveCellEditor()
.getEditorControl());
// Verify state
assertNull(this.natTable.getActiveCellEditor());
assertNull(ActiveCellEditorRegistry.getActiveCellEditor());
assertEquals("Col: 1, Row: 1", this.natTable.getDataValueByPosition(1, 1));
}
@Test
public void comboBoxShouldCommitWhenAValueIsSelectedByClickingOnIt()
throws Exception {
if (SWTUtils.isRunningOnUnix()) {
return;
}
DefaultGridLayer layerStack = new DefaultGridLayer(
RowDataListFixture.getList(),
RowDataListFixture.getPropertyNames(),
RowDataListFixture.getPropertyToLabelMap());
this.natTable = new NatTableFixture(layerStack, 1200, 300, false);
// Enable editing
this.natTable.enableEditingOnAllCells();
// Calculate pixel value to click on
int columnIndex = RowDataListFixture
.getColumnIndexOfProperty(RowDataListFixture.PRICING_TYPE_PROP_NAME);
int columnPosition = columnIndex + ROW_HEADER_COLUMN_COUNT;
int rowPosition = 0 + COLUMN_HEADER_ROW_COUNT;
int startX = this.natTable.getStartXOfColumnPosition(columnPosition);
int startY = this.natTable.getStartYOfRowPosition(1);
// Register combo box for the publish flag column
DataLayer bodyDataLayer = (DataLayer) layerStack.getBodyDataLayer();
this.natTable.registerLabelOnColumn(bodyDataLayer, columnIndex, TEST_LABEL);
registerComboBox(
this.natTable.getConfigRegistry(),
new ComboBoxPainter(),
new ComboBoxCellEditor(Arrays.asList(new PricingTypeBean("MN"),
new PricingTypeBean("AT"))));
this.natTable.configure();
// Original value
assertTrue(this.natTable.getDataValueByPosition(columnPosition, rowPosition) instanceof PricingTypeBean);
assertEquals("MN",
this.natTable.getDataValueByPosition(columnPosition, rowPosition)
.toString());
// Click - expand combo
SWTUtils.leftClick(startX + 10, startY + 10, SWT.NONE, this.natTable);
NatCombo combo = (NatCombo) this.natTable.getActiveCellEditor()
.getEditorControl();
assertNotNull(combo);
assertTrue(this.natTable.getActiveCellEditor().getCanonicalValue() instanceof PricingTypeBean);
assertEquals("MN", this.natTable.getActiveCellEditor().getCanonicalValue()
.toString());
assertTrue(ActiveCellEditorRegistry.getActiveCellEditor()
.getCanonicalValue() instanceof PricingTypeBean);
assertEquals("MN", ActiveCellEditorRegistry.getActiveCellEditor()
.getCanonicalValue().toString());
// Click - expand select value 'Automatic'
combo.select(1);
SWTUtils.leftClickOnCombo(startX + 10, startY + 35, SWT.NONE, combo);
assertTrue(this.natTable.getDataValueByPosition(columnPosition, rowPosition) instanceof PricingTypeBean);
assertEquals("AT",
this.natTable.getDataValueByPosition(columnPosition, rowPosition)
.toString());
assertNull(this.natTable.getActiveCellEditor());
assertNull(ActiveCellEditorRegistry.getActiveCellEditor());
}
@Test
public void openEditorForSpannedCellsShouldOpenInline() throws Exception {
CompositeLayer layer = new CompositeLayer(1, 1);
SelectionLayer selectionLayer = new SelectionLayer(
new SpanningDataLayer(new DummySpanningBodyDataProvider(100,
100)));
layer.setChildLayer(GridRegion.BODY, new ViewportLayer(selectionLayer),
0, 0);
this.natTable = new NatTableFixture(layer, 1200, 300, false);
layer.addConfiguration(new DefaultEditBindings());
layer.addConfiguration(new DefaultEditConfiguration());
this.natTable.enableEditingOnAllCells();
final boolean[] inlineFired = new boolean[1];
inlineFired[0] = false;
selectionLayer.addLayerListener(new ILayerListener() {
@Override
public void handleLayerEvent(ILayerEvent event) {
if (event instanceof InlineCellEditEvent) {
inlineFired[0] = true;
}
}
});
this.natTable.configure();
this.natTable.doCommand(new SelectCellCommand(this.natTable, 1, 1, false, false));
this.natTable.notifyListeners(SWT.KeyDown, SWTUtils.keyEvent(SWT.F2));
// Verify edit mode
assertNotNull(this.natTable.getActiveCellEditor());
assertEquals("Col: 1, Row: 1", this.natTable.getActiveCellEditor()
.getCanonicalValue());
assertNotNull(ActiveCellEditorRegistry.getActiveCellEditor());
assertEquals("Col: 1, Row: 1", ActiveCellEditorRegistry
.getActiveCellEditor().getCanonicalValue());
// verify that inline editing is used and not dialog
assertTrue("No InlineCellEditEvent fired", inlineFired[0]);
}
@Test
public void updateAllUnderlyingCellsIfSpanned() throws Exception {
CompositeLayer layer = new CompositeLayer(1, 1);
DummySpanningBodyDataProvider dataProvider = new DummySpanningBodyDataProvider(
100, 100);
SelectionLayer selectionLayer = new SelectionLayer(
new SpanningDataLayer(dataProvider));
layer.setChildLayer(GridRegion.BODY, new ViewportLayer(selectionLayer),
0, 0);
this.natTable = new NatTableFixture(layer, 1200, 300, false);
layer.addConfiguration(new DefaultEditBindings());
layer.addConfiguration(new DefaultEditConfiguration());
this.natTable.enableEditingOnAllCells();
this.natTable.configure();
assertEquals("Col: 1, Row: 1", dataProvider.getDataValue(0, 0));
assertEquals("Col: 1, Row: 2", dataProvider.getDataValue(0, 1));
assertEquals("Col: 2, Row: 1", dataProvider.getDataValue(1, 0));
assertEquals("Col: 2, Row: 2", dataProvider.getDataValue(1, 1));
this.natTable.doCommand(new SelectCellCommand(this.natTable, 1, 1, false, false));
this.natTable.notifyListeners(SWT.KeyDown, SWTUtils.keyEventWithChar('C'));
assertNotNull(this.natTable.getActiveCellEditor());
this.natTable.getActiveCellEditor().getEditorControl()
.notifyListeners(SWT.KeyDown, SWTUtils.keyEvent(SWT.CR));
assertEquals("C", dataProvider.getDataValue(0, 0));
assertEquals("C", dataProvider.getDataValue(0, 1));
assertEquals("C", dataProvider.getDataValue(1, 0));
assertEquals("C", dataProvider.getDataValue(1, 1));
}
/**
* Test case that ensures that the active editor is also available via the
* {@linkplain ActiveCellEditorRegistry}.
* <p>
* Ensures that the backward compatibility is not broken.
* </p>
*/
@Test
public void testEditorRegisteredInActiveCellEditorRegistry() {
this.natTable.enableEditingOnAllCells();
ILayerCell cell = this.natTable.getCellByPosition(4, 4);
this.natTable.doCommand(new EditCellCommand(this.natTable, this.natTable
.getConfigRegistry(), cell));
assertNotNull(this.natTable.getActiveCellEditor());
assertNotNull(ActiveCellEditorRegistry.getActiveCellEditor());
assertEquals(this.natTable.getActiveCellEditor(),
ActiveCellEditorRegistry.getActiveCellEditor());
// Close the editor again
this.natTable.getActiveCellEditor().getEditorControl()
.notifyListeners(SWT.KeyDown, SWTUtils.keyEvent(SWT.CR));
assertNull(this.natTable.getActiveCellEditor());
assertNull(ActiveCellEditorRegistry.getActiveCellEditor());
}
/**
* Test case that ensures that an editor, which is committed through the
* {@linkplain EditUtils}, is also removed from the table.
* <p>
* Ensures that the backward compatibility is not broken.
* </p>
*/
@Test
public void testEditorRemovedWhenCommitted() {
this.natTable.enableEditingOnAllCells();
ILayerCell cell = this.natTable.getCellByPosition(4, 4);
this.natTable.doCommand(new EditCellCommand(this.natTable, this.natTable
.getConfigRegistry(), cell));
Text editor = (Text) this.natTable.getActiveCellEditor().getEditorControl();
editor.setText("A");
// Close the again
EditUtils.commitAndCloseActiveEditor();
// check if value is saved and editor is gone
assertEquals("A", this.natTable.getCellByPosition(4, 4).getDataValue());
assertNull(this.natTable.getActiveCellEditor());
assertNull(ActiveCellEditorRegistry.getActiveCellEditor());
}
/**
* Test case that ensures that an editor, which is closed via API, is also
* removed from the table.
* <p>
* Ensures that the backward compatibility is not broken.
* </p>
*/
@Test
public void testEditorRemovedWhenClosed() {
this.natTable.enableEditingOnAllCells();
ILayerCell cell = this.natTable.getCellByPosition(4, 4);
this.natTable.doCommand(new EditCellCommand(this.natTable, this.natTable
.getConfigRegistry(), cell));
// close the editor
ActiveCellEditorRegistry.getActiveCellEditor().close();
// check if editor is gone
assertNull(this.natTable.getActiveCellEditor());
assertNull(ActiveCellEditorRegistry.getActiveCellEditor());
}
// *** Convenience methods ***.
// Mostly code from the EditableGridExample.
// The sane fixtures are used to ensure that the example keeps working
// without fail
private static void registerComboBox(ConfigRegistry configRegistry,
ICellPainter comboBoxCellPainter, ICellEditor comboBoxCellEditor) {
configRegistry.registerConfigAttribute(
CellConfigAttributes.CELL_PAINTER, comboBoxCellPainter,
DisplayMode.NORMAL, TEST_LABEL);
configRegistry.registerConfigAttribute(
EditConfigAttributes.CELL_EDITOR, comboBoxCellEditor,
DisplayMode.NORMAL, TEST_LABEL);
configRegistry.registerConfigAttribute(
EditConfigAttributes.CELL_EDITOR, comboBoxCellEditor,
DisplayMode.EDIT, TEST_LABEL);
configRegistry.registerConfigAttribute(
CellConfigAttributes.DISPLAY_CONVERTER,
getPricingTypeDisplayConverter(), DisplayMode.NORMAL,
TEST_LABEL);
}
private static void registerCheckBoxEditor(ConfigRegistry configRegistry,
ICellPainter checkBoxCellPainter, ICellEditor checkBoxCellEditor) {
configRegistry.registerConfigAttribute(
CellConfigAttributes.CELL_PAINTER, checkBoxCellPainter,
DisplayMode.NORMAL, TEST_LABEL);
configRegistry.registerConfigAttribute(
CellConfigAttributes.DISPLAY_CONVERTER,
new DefaultBooleanDisplayConverter(), DisplayMode.NORMAL,
TEST_LABEL);
configRegistry.registerConfigAttribute(
EditConfigAttributes.CELL_EDITOR, checkBoxCellEditor,
DisplayMode.NORMAL, TEST_LABEL);
}
private static IDisplayConverter getPricingTypeDisplayConverter() {
return new DisplayConverter() {
@Override
public Object canonicalToDisplayValue(Object canonicalValue) {
if (canonicalValue == null) {
return null;
} else {
return canonicalValue.toString().equals("MN") ? "Manual"
: "Automatic";
}
}
@Override
public Object displayToCanonicalValue(Object displayValue) {
return displayValue.toString().equals("Manual") ? new PricingTypeBean(
"MN") : new PricingTypeBean("AT");
}
};
}
private IDataValidator getStartingWithCValidator() {
return new DataValidator() {
@Override
public boolean validate(int columnIndex, int rowIndex,
Object newValue) {
String asString = newValue.toString();
return asString.startsWith("C");
}
};
}
}