/***************************************************************************** * 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.fillhandle.config; import org.eclipse.nebula.widgets.nattable.NatTable; import org.eclipse.nebula.widgets.nattable.config.AbstractLayerConfiguration; import org.eclipse.nebula.widgets.nattable.copy.InternalCellClipboard; import org.eclipse.nebula.widgets.nattable.copy.command.InternalCopyDataCommandHandler; import org.eclipse.nebula.widgets.nattable.fillhandle.FillHandleLayerPainter; import org.eclipse.nebula.widgets.nattable.fillhandle.action.FillHandleCursorAction; import org.eclipse.nebula.widgets.nattable.fillhandle.action.FillHandleDragMode; import org.eclipse.nebula.widgets.nattable.fillhandle.command.FillHandlePasteCommandHandler; import org.eclipse.nebula.widgets.nattable.fillhandle.event.FillHandleEventMatcher; import org.eclipse.nebula.widgets.nattable.fillhandle.event.FillHandleMarkupListener; import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer; import org.eclipse.nebula.widgets.nattable.ui.action.ClearCursorAction; import org.eclipse.nebula.widgets.nattable.ui.action.NoOpMouseAction; import org.eclipse.nebula.widgets.nattable.ui.binding.UiBindingRegistry; import org.eclipse.nebula.widgets.nattable.ui.matcher.MouseEventMatcher; /** * Default configuration for fill handle functionality. Registers the * corresponding painter, command handler and ui bindings. * * @since 1.4 */ public class FillHandleConfiguration extends AbstractLayerConfiguration<NatTable> { protected SelectionLayer selectionLayer; protected FillHandleLayerPainter painter; protected InternalCellClipboard clipboard; /** * Create the FillHandleConfiguration for a NatTable. * * @param selectionLayer * The {@link SelectionLayer} needed to determine the current * selection on which the fill handle will be rendered. Can not * be <code>null</code>. */ public FillHandleConfiguration(SelectionLayer selectionLayer) { if (selectionLayer == null) { throw new IllegalArgumentException("SelectionLayer can not be null"); //$NON-NLS-1$ } this.selectionLayer = selectionLayer; } @Override public void configureTypedLayer(NatTable natTable) { // initialization works here because configureLayer() is executed before // configureUiBindings() this.clipboard = natTable.getInternalCellClipboard(); this.painter = new FillHandleLayerPainter(); this.selectionLayer.setLayerPainter(this.painter); this.selectionLayer.addLayerListener(new FillHandleMarkupListener(this.selectionLayer)); this.selectionLayer.registerCommandHandler( new InternalCopyDataCommandHandler(this.selectionLayer, this.clipboard)); this.selectionLayer.registerCommandHandler( new FillHandlePasteCommandHandler(this.selectionLayer, this.clipboard)); } @Override public void configureUiBindings(UiBindingRegistry uiBindingRegistry) { FillHandleEventMatcher matcher = new FillHandleEventMatcher(this.painter); // Mouse move // Show fill handle cursor uiBindingRegistry.registerFirstMouseMoveBinding( matcher, new FillHandleCursorAction()); uiBindingRegistry.registerMouseMoveBinding( new MouseEventMatcher(), new ClearCursorAction()); // Mouse drag // trigger the handle drag operations uiBindingRegistry.registerFirstMouseDragMode( matcher, new FillHandleDragMode(this.selectionLayer, this.clipboard)); // Mouse click // ensure no selection is triggered on mouse down on the handle uiBindingRegistry.registerFirstMouseDownBinding( matcher, new NoOpMouseAction()); } }