blob: cbcae9f7b29dc9283fb45c47d338c51a10525a12 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2020 Original authors and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Original authors and others - initial API and implementation
******************************************************************************/
package org.eclipse.nebula.widgets.nattable.examples._400_Configuration._440_Editing;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.nebula.widgets.nattable.NatTable;
import org.eclipse.nebula.widgets.nattable.config.AbstractRegistryConfiguration;
import org.eclipse.nebula.widgets.nattable.config.CellConfigAttributes;
import org.eclipse.nebula.widgets.nattable.config.DefaultNatTableStyleConfiguration;
import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
import org.eclipse.nebula.widgets.nattable.config.IEditableRule;
import org.eclipse.nebula.widgets.nattable.data.convert.DefaultIntegerDisplayConverter;
import org.eclipse.nebula.widgets.nattable.data.validate.DataValidator;
import org.eclipse.nebula.widgets.nattable.data.validate.IDataValidator;
import org.eclipse.nebula.widgets.nattable.data.validate.ValidationFailedException;
import org.eclipse.nebula.widgets.nattable.dataset.NumberValues;
import org.eclipse.nebula.widgets.nattable.edit.EditConfigAttributes;
import org.eclipse.nebula.widgets.nattable.edit.config.DialogErrorHandling;
import org.eclipse.nebula.widgets.nattable.examples.AbstractNatExample;
import org.eclipse.nebula.widgets.nattable.examples.runner.StandaloneNatExampleRunner;
import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultGridLayer;
import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
import org.eclipse.nebula.widgets.nattable.layer.cell.ColumnOverrideLabelAccumulator;
import org.eclipse.nebula.widgets.nattable.style.CellStyleAttributes;
import org.eclipse.nebula.widgets.nattable.style.DisplayMode;
import org.eclipse.nebula.widgets.nattable.style.Style;
import org.eclipse.nebula.widgets.nattable.util.GUIHelper;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
public class _446_EditErrorHandlingExample extends AbstractNatExample {
public static void main(String[] args) throws Exception {
StandaloneNatExampleRunner.run(1024, 400,
new _446_EditErrorHandlingExample());
}
@Override
public String getDescription() {
return "This example demonstrates the modified edit behaviour of the NatTable using error handling strategies. "
+ "The columns are configured differently for handling conversion and validation errors:\n"
+ "\n"
+ "- Column 1:\n"
+ "No error handling for conversion and validation failures registered\n"
+ "\n"
+ "- Column 2:\n"
+ "Dialog error handling for conversion failures registered\n"
+ "No error handling for validation failures registered\n"
+ "\n"
+ "- Column 3:\n"
+ "No error handling for conversion failures registered\n"
+ "Dialog error handling for validation failures registered\n"
+ "\n"
+ "- Column 4:\n"
+ "Dialog error handling for conversion failures registered\n"
+ "Dialog error handling for validation failures registered\n"
+ "\n"
+ "- Column 5:\n"
+ "Will simulate to throw an IllegalArgumentException with default configuration on validation to show that "
+ "other exceptions than the defined ones for conversion and validation failures are logged completely.";
}
public static final String COLUMN_ONE_LABEL = "ColumnOneLabel";
public static final String COLUMN_TWO_LABEL = "ColumnTwoLabel";
public static final String COLUMN_THREE_LABEL = "ColumnThreeLabel";
public static final String COLUMN_FOUR_LABEL = "ColumnFourLabel";
public static final String COLUMN_FIVE_LABEL = "ColumnFiveLabel";
public static final String COLUMN_SIX_LABEL = "ColumnSixLabel";
public static final String COLUMN_SEVEN_LABEL = "ColumnSevenLabel";
public static final String COLUMN_EIGHT_LABEL = "ColumnEightLabel";
public static final String COLUMN_NINE_LABEL = "ColumnNineLabel";
@Override
public Control createExampleControl(Composite parent) {
// property names of the NumberValues class
String[] propertyNames = { "columnOneNumber", "columnTwoNumber",
"columnThreeNumber", "columnFourNumber", "columnFiveNumber" };
// mapping from property to label, needed for column header labels
Map<String, String> propertyToLabelMap = new HashMap<>();
propertyToLabelMap.put("columnOneNumber", "Column 1");
propertyToLabelMap.put("columnTwoNumber", "Column 2");
propertyToLabelMap.put("columnThreeNumber", "Column 3");
propertyToLabelMap.put("columnFourNumber", "Column 4");
propertyToLabelMap.put("columnFiveNumber", "Column 5");
DefaultGridLayer gridLayer = new DefaultGridLayer(
createNumberValuesList(), propertyNames, propertyToLabelMap);
DataLayer bodyDataLayer = (DataLayer) gridLayer.getBodyDataLayer();
final ColumnOverrideLabelAccumulator columnLabelAccumulator = new ColumnOverrideLabelAccumulator(
bodyDataLayer);
bodyDataLayer.setConfigLabelAccumulator(columnLabelAccumulator);
registerColumnLabels(columnLabelAccumulator);
NatTable natTable = new NatTable(parent, gridLayer, false);
natTable.addConfiguration(new DefaultNatTableStyleConfiguration());
natTable.addConfiguration(new TableEditConfiguration());
natTable.configure();
return natTable;
}
private List<NumberValues> createNumberValuesList() {
List<NumberValues> result = new ArrayList<>();
NumberValues nv = null;
for (int i = 0; i < 10; i++) {
nv = new NumberValues();
nv.setColumnOneNumber(11111);
nv.setColumnTwoNumber(22222);
nv.setColumnThreeNumber(33333);
nv.setColumnFourNumber(44444);
nv.setColumnFiveNumber(55555);
nv.setColumnSixNumber(66666);
nv.setColumnSevenNumber(77777);
nv.setColumnEightNumber(88888);
nv.setColumnNineNumber(99999);
result.add(nv);
}
return result;
}
private void registerColumnLabels(
ColumnOverrideLabelAccumulator columnLabelAccumulator) {
columnLabelAccumulator.registerColumnOverrides(0, COLUMN_ONE_LABEL);
columnLabelAccumulator.registerColumnOverrides(1, COLUMN_TWO_LABEL);
columnLabelAccumulator.registerColumnOverrides(2, COLUMN_THREE_LABEL);
columnLabelAccumulator.registerColumnOverrides(3, COLUMN_FOUR_LABEL);
columnLabelAccumulator.registerColumnOverrides(4, COLUMN_FIVE_LABEL);
}
}
class TableEditConfiguration extends AbstractRegistryConfiguration {
@Override
public void configureRegistry(IConfigRegistry configRegistry) {
configRegistry.registerConfigAttribute(
EditConfigAttributes.CELL_EDITABLE_RULE,
IEditableRule.ALWAYS_EDITABLE);
configRegistry.registerConfigAttribute(
CellConfigAttributes.DISPLAY_CONVERTER,
new DefaultIntegerDisplayConverter(), DisplayMode.NORMAL);
configRegistry.registerConfigAttribute(
CellConfigAttributes.DISPLAY_CONVERTER,
new DefaultIntegerDisplayConverter(false), DisplayMode.EDIT);
configRegistry.registerConfigAttribute(
EditConfigAttributes.DATA_VALIDATOR, getExampleValidator(),
DisplayMode.EDIT);
configRegistry.registerConfigAttribute(
EditConfigAttributes.DATA_VALIDATOR, getExceptionValidator(),
DisplayMode.EDIT,
_446_EditErrorHandlingExample.COLUMN_FIVE_LABEL);
registerErrorHandlingStrategies(configRegistry);
registerErrorHandlingStyles(configRegistry);
}
private void registerErrorHandlingStrategies(IConfigRegistry configRegistry) {
configRegistry.registerConfigAttribute(
EditConfigAttributes.CONVERSION_ERROR_HANDLER,
new DialogErrorHandling(), DisplayMode.EDIT,
_446_EditErrorHandlingExample.COLUMN_TWO_LABEL);
configRegistry.registerConfigAttribute(
EditConfigAttributes.VALIDATION_ERROR_HANDLER,
new DialogErrorHandling(), DisplayMode.EDIT,
_446_EditErrorHandlingExample.COLUMN_THREE_LABEL);
configRegistry.registerConfigAttribute(
EditConfigAttributes.CONVERSION_ERROR_HANDLER,
new DialogErrorHandling(), DisplayMode.EDIT,
_446_EditErrorHandlingExample.COLUMN_FOUR_LABEL);
configRegistry.registerConfigAttribute(
EditConfigAttributes.VALIDATION_ERROR_HANDLER,
new DialogErrorHandling(), DisplayMode.EDIT,
_446_EditErrorHandlingExample.COLUMN_FOUR_LABEL);
}
private void registerErrorHandlingStyles(IConfigRegistry configRegistry) {
// this is needed to support different styling on just in time
// conversion/validation
// error rendering in a text editor
Style conversionErrorStyle = new Style();
conversionErrorStyle.setAttributeValue(
CellStyleAttributes.BACKGROUND_COLOR, GUIHelper.COLOR_RED);
conversionErrorStyle.setAttributeValue(
CellStyleAttributes.FOREGROUND_COLOR, GUIHelper.COLOR_WHITE);
configRegistry.registerConfigAttribute(
EditConfigAttributes.CONVERSION_ERROR_STYLE,
conversionErrorStyle, DisplayMode.EDIT,
_446_EditErrorHandlingExample.COLUMN_TWO_LABEL);
Style validationErrorStyle = new Style();
validationErrorStyle.setAttributeValue(
CellStyleAttributes.BACKGROUND_COLOR, GUIHelper.COLOR_BLACK);
validationErrorStyle.setAttributeValue(
CellStyleAttributes.FOREGROUND_COLOR, GUIHelper.COLOR_WHITE);
configRegistry.registerConfigAttribute(
EditConfigAttributes.VALIDATION_ERROR_STYLE,
validationErrorStyle, DisplayMode.EDIT,
_446_EditErrorHandlingExample.COLUMN_TWO_LABEL);
}
private IDataValidator getExampleValidator() {
return new DataValidator() {
@Override
public boolean validate(int columnIndex, int rowIndex,
Object newValue) {
if (newValue instanceof Integer
&& ((Integer) newValue).intValue() > 10000) {
return true;
} else {
throw new ValidationFailedException(
"The value has to be bigger than 10000");
}
}
};
}
private IDataValidator getExceptionValidator() {
return new DataValidator() {
@Override
public boolean validate(int columnIndex, int rowIndex,
Object newValue) {
throw new IllegalArgumentException(
"This is an exception throwed because of missing constraint checks!");
}
};
}
}