/*******************************************************************************
* Copyright (c) 2012, 2014 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 - added ITraversalStrategy handling
******************************************************************************/
package org.eclipse.nebula.widgets.nattable.selection.action;
import org.eclipse.nebula.widgets.nattable.NatTable;
import org.eclipse.nebula.widgets.nattable.selection.ITraversalStrategy;
import org.eclipse.nebula.widgets.nattable.selection.MoveSelectionCommandHandler;
import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer.MoveDirectionEnum;
import org.eclipse.nebula.widgets.nattable.selection.command.MoveSelectionCommand;
import org.eclipse.nebula.widgets.nattable.ui.action.IKeyAction;
import org.eclipse.swt.events.KeyEvent;
/**
* {@link IKeyAction} to perform selection movements on key press. By default it
* will move the selection by 1 into the specified direction. It is possible to
* specify an {@link ITraversalStrategy} that should be used on moving into the
* given direction. This allows different traversal behavior on different key
* strokes, e.g. axis cycle on up/down, table cycle on left/right.
*/
public class MoveSelectionAction extends AbstractKeySelectAction {
/**
* The {@link ITraversalStrategy} to use. If <code>null</code> a step count
* of 1 and the {@link ITraversalStrategy} registered with the
* {@link MoveSelectionCommandHandler} subclass will be used.
*/
private ITraversalStrategy traversalStrategy;
/**
* Create a MoveSelectionAction that executes a {@link MoveSelectionCommand}
* to move the selection into the given direction by 1. Using this
* constructor the {@link ITraversalStrategy} registered with the
* {@link MoveSelectionCommandHandler} will be used to handle traversal.
*
* @param direction
* The direction the selection should move to.
*/
public MoveSelectionAction(MoveDirectionEnum direction) {
super(direction);
}
/**
* Create a MoveSelectionAction that executes a {@link MoveSelectionCommand}
* to move the selection into the given direction by 1. Using this
* constructor the {@link ITraversalStrategy} registered with the
* {@link MoveSelectionCommandHandler} will be used to handle traversal.
* <p>
* This constructor allows to specify if key modifiers should are activated.
* </p>
*
* @param direction
* The direction the selection should move to.
* @param shiftMask
* Whether the shift modifier is activated.
* @param ctrlMask
* Whether the control modifier is activated.
*/
public MoveSelectionAction(MoveDirectionEnum direction, boolean shiftMask, boolean ctrlMask) {
super(direction, shiftMask, ctrlMask);
}
/**
* Create a MoveSelectionAction that executes a {@link MoveSelectionCommand}
* to move the selection into the given direction by using the given
* {@link ITraversalStrategy}.
*
* @param direction
* The direction the selection should move to.
* @param traversalStrategy
* The {@link ITraversalStrategy} that should be used by moving
* the selection.
*/
public MoveSelectionAction(MoveDirectionEnum direction, ITraversalStrategy traversalStrategy) {
super(direction);
this.traversalStrategy = traversalStrategy;
}
/**
* Create a MoveSelectionAction that executes a {@link MoveSelectionCommand}
* to move the selection into the given direction by using the given
* {@link ITraversalStrategy}.
* <p>
* This constructor allows to specify if key modifiers should are activated.
* </p>
*
* @param direction
* The direction the selection should move to.
* @param traversalStrategy
* The {@link ITraversalStrategy} that should be used by moving
* the selection.
* @param shiftMask
* Whether the shift modifier is activated.
* @param ctrlMask
* Whether the control modifier is activated.
*/
public MoveSelectionAction(MoveDirectionEnum direction, ITraversalStrategy traversalStrategy,
boolean shiftMask, boolean ctrlMask) {
super(direction, shiftMask, ctrlMask);
this.traversalStrategy = traversalStrategy;
}
@Override
public void run(NatTable natTable, KeyEvent event) {
super.run(natTable, event);
MoveSelectionCommand command = null;
if (this.traversalStrategy == null) {
command = new MoveSelectionCommand(
getDirection(), 1, isShiftMask(), isControlMask());
}
else {
command = new MoveSelectionCommand(
getDirection(), this.traversalStrategy, isShiftMask(), isControlMask());
}
natTable.doCommand(command);
}
}