/*******************************************************************************
* Copyright (c) 2012, 2017 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
* Dirk Fauth <dirk.fauth@googlemail.com> - Bug 462143
******************************************************************************/
package org.eclipse.nebula.widgets.nattable.selection.action;
import org.eclipse.nebula.widgets.nattable.NatTable;
import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer.MoveDirectionEnum;
import org.eclipse.nebula.widgets.nattable.selection.command.SelectCellCommand;
import org.eclipse.nebula.widgets.nattable.viewport.action.AutoScrollDragMode;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Point;
/**
* Fires commands to select a range of cells when the mouse is dragged in the
* viewport.
*/
public class CellSelectionDragMode extends AutoScrollDragMode {
private Point lastDragInCellPosition = null;
public CellSelectionDragMode() {
super(true, true);
}
@Override
public void mouseDown(NatTable natTable, MouseEvent event) {
natTable.forceFocus();
this.lastDragInCellPosition = new Point(
natTable.getColumnPositionByX(event.x),
natTable.getRowPositionByY(event.y));
}
@Override
protected void performDragAction(
NatTable natTable,
int x, int y,
MoveDirectionEnum horizontal, MoveDirectionEnum vertical) {
if (!MoveDirectionEnum.NONE.equals(horizontal)
|| !MoveDirectionEnum.NONE.equals(vertical)) {
this.lastDragInCellPosition = null;
}
int selectedColumnPosition = natTable.getColumnPositionByX(x);
int selectedRowPosition = natTable.getRowPositionByY(y);
if (selectedColumnPosition > -1 && selectedRowPosition > -1) {
Point dragInCellPosition = new Point(selectedColumnPosition, selectedRowPosition);
if (this.lastDragInCellPosition == null
|| !dragInCellPosition.equals(this.lastDragInCellPosition)) {
this.lastDragInCellPosition = dragInCellPosition;
fireSelectionCommand(natTable, selectedColumnPosition, selectedRowPosition, true, false);
}
}
}
/**
* Execute a command to trigger selection.
*
* @param natTable
* The NatTable to execute the command on.
* @param columnPosition
* The column position of the cell to select.
* @param rowPosition
* The row position of the cell to select.
* @param shiftMask
* Flag to configure whether the SHIFT mask is activated or not.
* @param controlMask
* Flag to configure whether the CTRL mask is activated or not.
*/
public void fireSelectionCommand(
NatTable natTable,
int columnPosition, int rowPosition,
boolean shiftMask, boolean controlMask) {
boolean result = natTable.doCommand(
new SelectCellCommand(natTable, columnPosition, rowPosition, shiftMask, controlMask));
// If the command execution fails for cell coordinates pointing to
// position 0 try again with increased positions. Needed in case of grid
// compositions where position 0 in NatTable are typically the headers.
if (!result && columnPosition == 0) {
natTable.doCommand(
new SelectCellCommand(natTable, columnPosition + 1, rowPosition, shiftMask, controlMask));
} else if (!result && rowPosition == 0) {
natTable.doCommand(
new SelectCellCommand(natTable, columnPosition, rowPosition + 1, shiftMask, controlMask));
}
}
@Override
public void mouseUp(NatTable natTable, MouseEvent event) {
// Cancel any active viewport drag
super.mouseUp(natTable, event);
this.lastDragInCellPosition = null;
}
}