/***************************************************************************** * 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.config; import org.eclipse.nebula.widgets.nattable.config.CellConfigAttributes; import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry; import org.eclipse.nebula.widgets.nattable.config.IConfiguration; import org.eclipse.nebula.widgets.nattable.config.IEditableRule; import org.eclipse.nebula.widgets.nattable.copy.InternalCellClipboard; import org.eclipse.nebula.widgets.nattable.copy.InternalClipboardStructuralChangeListener; import org.eclipse.nebula.widgets.nattable.copy.action.ClearClipboardAction; import org.eclipse.nebula.widgets.nattable.copy.action.PasteDataAction; import org.eclipse.nebula.widgets.nattable.copy.action.PasteOrMoveSelectionAction; import org.eclipse.nebula.widgets.nattable.edit.EditConfigAttributes; import org.eclipse.nebula.widgets.nattable.edit.action.DeleteSelectionAction; import org.eclipse.nebula.widgets.nattable.edit.command.DeleteSelectionCommandHandler; import org.eclipse.nebula.widgets.nattable.edit.editor.TextCellEditor; import org.eclipse.nebula.widgets.nattable.export.command.ExportCommandHandler; import org.eclipse.nebula.widgets.nattable.fillhandle.FillHandleLayerPainter; import org.eclipse.nebula.widgets.nattable.fillhandle.event.FillHandleEventMatcher; import org.eclipse.nebula.widgets.nattable.formula.FormulaDataProvider; import org.eclipse.nebula.widgets.nattable.formula.FormulaEditDisplayConverter; import org.eclipse.nebula.widgets.nattable.formula.FormulaResultDisplayConverter; import org.eclipse.nebula.widgets.nattable.formula.action.FormulaFillHandleDragMode; import org.eclipse.nebula.widgets.nattable.formula.command.DisableFormulaEvaluationCommandHandler; import org.eclipse.nebula.widgets.nattable.formula.command.EnableFormulaEvaluationCommandHandler; import org.eclipse.nebula.widgets.nattable.formula.command.FormulaCopyDataCommandHandler; import org.eclipse.nebula.widgets.nattable.formula.command.FormulaFillHandlePasteCommandHandler; import org.eclipse.nebula.widgets.nattable.formula.command.FormulaPasteDataCommandHandler; import org.eclipse.nebula.widgets.nattable.grid.GridRegion; import org.eclipse.nebula.widgets.nattable.layer.ILayer; import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer; import org.eclipse.nebula.widgets.nattable.style.BorderStyle; import org.eclipse.nebula.widgets.nattable.style.BorderStyle.LineStyleEnum; import org.eclipse.nebula.widgets.nattable.style.CellStyleAttributes; import org.eclipse.nebula.widgets.nattable.style.DisplayMode; import org.eclipse.nebula.widgets.nattable.style.IStyle; import org.eclipse.nebula.widgets.nattable.style.SelectionStyleLabels; import org.eclipse.nebula.widgets.nattable.style.Style; import org.eclipse.nebula.widgets.nattable.ui.binding.UiBindingRegistry; import org.eclipse.nebula.widgets.nattable.ui.matcher.KeyEventMatcher; import org.eclipse.nebula.widgets.nattable.util.GUIHelper; import org.eclipse.swt.SWT; /** * The default configuration for a formula supporting grid. * * @since 1.4 */ public class DefaultFormulaConfiguration implements IConfiguration { private FormulaDataProvider dataProvider; private SelectionLayer selectionLayer; private InternalCellClipboard clipboard; public DefaultFormulaConfiguration(FormulaDataProvider dataProvider, SelectionLayer selectionLayer, InternalCellClipboard clipboard) { this.dataProvider = dataProvider; this.selectionLayer = selectionLayer; this.clipboard = clipboard; } @Override public void configureRegistry(IConfigRegistry configRegistry) { configRegistry.registerConfigAttribute( EditConfigAttributes.CELL_EDITABLE_RULE, IEditableRule.ALWAYS_EDITABLE); // register converter to make editing of functions work configRegistry.registerConfigAttribute( CellConfigAttributes.DISPLAY_CONVERTER, new FormulaEditDisplayConverter(this.dataProvider), DisplayMode.EDIT); // register converter to show decimal values localized configRegistry.registerConfigAttribute( CellConfigAttributes.DISPLAY_CONVERTER, new FormulaResultDisplayConverter(this.dataProvider), DisplayMode.NORMAL, GridRegion.BODY); // register TextCellEditor that moves on arrow keys and enter configRegistry.registerConfigAttribute( EditConfigAttributes.CELL_EDITOR, new TextCellEditor(true, true, true)); // register the border style to use for copy border IStyle copyBorderStyle = new Style(); copyBorderStyle.setAttributeValue( CellStyleAttributes.BORDER_STYLE, new BorderStyle(1, GUIHelper.COLOR_BLACK, LineStyleEnum.DASHED)); configRegistry.registerConfigAttribute( CellConfigAttributes.CELL_STYLE, copyBorderStyle, DisplayMode.NORMAL, SelectionStyleLabels.COPY_BORDER_STYLE); } @Override public void configureUiBindings(UiBindingRegistry uiBindingRegistry) { // ui binding for deleting a cell value on pressing DEL uiBindingRegistry.registerFirstKeyBinding( new KeyEventMatcher(SWT.DEL), new DeleteSelectionAction()); // ui binding to perform a paste action on pressing CTRL+V uiBindingRegistry.registerFirstKeyBinding( new KeyEventMatcher(SWT.MOD1, 'v'), new PasteDataAction()); // ui binding to perform paste or selection movement on ENTER uiBindingRegistry.registerFirstKeyBinding( new KeyEventMatcher(SWT.NONE, SWT.CR), new PasteOrMoveSelectionAction(this.clipboard)); // ui binding to clear the InternalCellClipboard uiBindingRegistry.registerFirstKeyBinding( new KeyEventMatcher(SWT.NONE, SWT.ESC), new ClearClipboardAction(this.clipboard)); // Mouse drag // trigger the handle drag operations // Note: we ensure a FillHandleLayerPainter is set in configureLayer uiBindingRegistry.registerFirstMouseDragMode( new FillHandleEventMatcher((FillHandleLayerPainter) this.selectionLayer.getLayerPainter()), new FormulaFillHandleDragMode(this.selectionLayer, this.clipboard, this.dataProvider)); } @Override public void configureLayer(ILayer layer) { // register the command handler for deleting values layer.registerCommandHandler(new DeleteSelectionCommandHandler(this.selectionLayer)); // register the ExportCommandHandler to the current layer (should be a // layer on top of the GridLayer to override default GridLayer behavior) // that exports from the SelectionLayer downwards. This way the column // and row headers won't be exported. layer.registerCommandHandler(new ExportCommandHandler(this.selectionLayer)); // register the command handler for enabling/disabling formula // evaluation // register on the SelectionLayer so it works on export this.selectionLayer.registerCommandHandler(new DisableFormulaEvaluationCommandHandler(this.dataProvider)); this.selectionLayer.registerCommandHandler(new EnableFormulaEvaluationCommandHandler(this.dataProvider)); // add a layer listener that clears the internal clipboard on structural // changes this.selectionLayer.addLayerListener(new InternalClipboardStructuralChangeListener(this.clipboard)); // add the layer painter that renders a border around copied cells if (!(this.selectionLayer.getLayerPainter() instanceof FillHandleLayerPainter)) { this.selectionLayer.setLayerPainter(new FillHandleLayerPainter(this.clipboard)); } else { // ensure the clipboard is set ((FillHandleLayerPainter) this.selectionLayer.getLayerPainter()).setClipboard(this.clipboard); } // register special copy+paste command handlers layer.registerCommandHandler( new FormulaCopyDataCommandHandler(this.selectionLayer, this.clipboard)); layer.registerCommandHandler( new FormulaPasteDataCommandHandler(this.selectionLayer, this.clipboard, this.dataProvider)); layer.registerCommandHandler( new FormulaFillHandlePasteCommandHandler(this.selectionLayer, this.clipboard, this.dataProvider)); } }