blob: cd5a44b1da0f29f5182e1280e7c3aac95fec2e8d [file] [log] [blame]
/**
*
*/
package org.eclipse.epf.diagram.core.actions;
import java.util.Iterator;
import java.util.List;
import org.eclipse.draw2d.AbsoluteBendpoint;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.epf.diagram.core.DiagramCoreResources;
import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
import org.eclipse.epf.diagram.core.bridge.DiagramAdapter;
import org.eclipse.epf.diagram.core.commands.ChangeBoundsCommand;
import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
import org.eclipse.epf.diagram.core.util.DiagramConstants;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
import org.eclipse.gmf.runtime.diagram.ui.actions.DiagramAction;
import org.eclipse.gmf.runtime.diagram.ui.commands.CommandProxy;
import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.Edge;
import org.eclipse.gmf.runtime.notation.Node;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.gmf.runtime.notation.RelativeBendpoints;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
/**
* Action class to move diagram elements in diagram area using keyboard up, down, left, right keys.
* Useful for Accessibility, and also does move bendpoints of control flow.
*
* @author Shashidhar Kannoori
*/
public class AccessibilityMoveAction extends DiagramAction {
public static final String MOVE_LEFT_ACTION = "move_left_action"; //$NON-NLS-1$
public static final String MOVE_RIGHT_ACTION = "move_right_action"; //$NON-NLS-1$
public static final String MOVE_DOWN_ACTION = "move_down_action"; //$NON-NLS-1$
public static final String MOVE_UP_ACTION = "move_up_action"; //$NON-NLS-1$
private int direction;
/**
* @param workbenchPage
*/
public AccessibilityMoveAction(IWorkbenchPage workbenchPage) {
super(workbenchPage);
}
/**
* @param workbenchpart
*/
public AccessibilityMoveAction(IWorkbenchPart workbenchpart, int direction) {
super(workbenchpart);
this.direction = direction;
}
/* (non-Javadoc)
* @see org.eclipse.gmf.runtime.diagram.ui.actions.DiagramAction#createTargetRequest()
*/
@Override
protected Request createTargetRequest() {
return null;
}
/* (non-Javadoc)
* @see org.eclipse.gmf.runtime.diagram.ui.actions.DiagramAction#isSelectionListener()
*/
@Override
protected boolean isSelectionListener() {
return true;
}
@Override
public void init() {
super.init();
setId(DiagramConstants.MOVE_ACTION);
}
public void setDirection(int direction){
this.direction = direction;
}
@Override
protected Command getCommand() {
List list = getSelectedObjects();
CompositeCommand cc = new CompositeCommand(DiagramCoreResources.AbstractDiagramEditor_MoveNode_label);
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
Object part = iterator.next();
if(part instanceof GraphicalEditPart){
Command c = move(direction, (GraphicalEditPart)part);
if(c != null){
cc.compose(new CommandProxy(c));
}
}
}
return cc.isEmpty() ? null : new ICommandProxy(cc.reduce());
}
public Command move(int direction, GraphicalEditPart part) {
if (part.getModel() instanceof Node) {
View view = (View) part.getModel();
Object x = ViewUtil.getStructuralFeatureValue(view,
NotationPackage.eINSTANCE.getLocation_X());
Object y = ViewUtil.getStructuralFeatureValue(view,
NotationPackage.eINSTANCE.getLocation_Y());
Point point = new Point(((Integer) x).intValue(), ((Integer) y).intValue());
int newx = point.x;
int newy = point.y;
int presslength = 1;
switch (direction) {
case PositionConstants.EAST:
newx = point.x + presslength;
break;
case PositionConstants.SOUTH:
newy += presslength;
break;
case PositionConstants.NORTH:
newy -= presslength;
break;
case PositionConstants.WEST:
newx -= presslength;
break;
default:
break;
}
org.eclipse.gef.commands.Command c = new ChangeBoundsCommand(
getEditingDomain(),
view, new Point(newx, newy), -1, -1);
return c;
}
return null;
}
public Command moveBendPoint(int direction, ConnectionEditPart part){
// TODO- check adding more bendpoint, capture bendpoint
// index on fly
if (part.getModel() instanceof Edge) {
Edge edge = (Edge) part.getModel();
RelativeBendpoints bPoints = (RelativeBendpoints)edge.getBendpoints();
List blist = bPoints.getPoints();
int index = 0;
if (blist != null && blist.size() > 0) {
AbsoluteBendpoint point = (AbsoluteBendpoint) blist
.get(index);
int newx = point.x;
int newy = point.y;
int presslength = 5;
switch (direction) {
case 1:
newx = point.x + presslength;
break;
case 2:
newy += presslength;
break;
case 3:
newy -= presslength;
break;
case 4:
newx -= presslength;
break;
default:
break;
}
//TODO: implement the movebendpoint command.
// org.eclipse.gef.commands.Command c = new MoveBendpointCommand(
// link, new Point(newx, newy), index);
// getCommandStack().execute(c);
}
}
return null;
}
public TransactionalEditingDomain getEditingDomain(){
return ((AbstractDiagramEditor)getDiagramWorkbenchPart()).getEditingDomain();
}
@Override
public String getId() {
switch(direction){
case PositionConstants.EAST:
return MOVE_RIGHT_ACTION;
case PositionConstants.SOUTH:
return MOVE_DOWN_ACTION;
case PositionConstants.NORTH:
return MOVE_UP_ACTION;
case PositionConstants.WEST:
return MOVE_LEFT_ACTION;
}
return DiagramConstants.MOVE_ACTION;
}
@Override
public boolean isEnabled() {
if(TngUtil.isLocked(getOwningProcess()))
return false;
if(BridgeHelper.isReadOnly(((AbstractDiagramEditor)getDiagramWorkbenchPart()).getDiagram()))
return false;
if(getSelectedObjects().isEmpty()) return false;
return super.isEnabled();
}
private org.eclipse.epf.uma.Process getOwningProcess(){
IWorkbenchPart targetPart = getDiagramWorkbenchPart();
if(targetPart != null){
Diagram d = ((AbstractDiagramEditor)targetPart).getDiagram();
DiagramAdapter adapter = BridgeHelper.getDiagramAdapter(d.getElement());
if(adapter != null){
return TngUtil.getOwningProcess(adapter.getActivity());
}
}
return null;
}
}