/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.workflow.editor.commands;
import java.util.List;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.requests.ChangeBoundsRequest;
import de.rcenvironment.core.component.workflow.model.api.Connection;
import de.rcenvironment.core.component.workflow.model.api.WorkflowNode;
import de.rcenvironment.core.gui.workflow.ConnectionUtils;
/**
* Command to move a WorkflowNode to a new location on the screen.
*
* @author Heinrich Wendel
* @author Oliver Seebach
*/
public class WorkflowNodeMoveCommand extends Command {
/** The workflow node. **/
private WorkflowNode node;
/** the request. **/
private ChangeBoundsRequest request;
/** the new location. **/
private Point newLocation;
/** saved old location. **/
private Point oldLocation;
private List<Connection> relatedConnections;
private int deltaX;
private int deltaY;
/**
* Constructor.
*
* @param node The workflow node.
* @param req The request.
* @param newBounds The rectangle with the new location.
* @param relatedConnections The affected connections.
*/
public WorkflowNodeMoveCommand(WorkflowNode node, ChangeBoundsRequest req, Rectangle newBounds, List<Connection> relatedConnections) {
this.node = node;
this.request = req;
this.newLocation = newBounds.getLocation();
this.relatedConnections = relatedConnections;
}
@Override
public boolean canExecute() {
Object type = request.getType();
return (RequestConstants.REQ_MOVE.equals(type) || RequestConstants.REQ_MOVE_CHILDREN.equals(type));
}
@Override
public void execute() {
oldLocation = new Point(node.getX(), node.getY());
deltaX = (newLocation.x - oldLocation.x);
deltaY = (newLocation.y - oldLocation.y);
redo();
}
@Override
public void redo() {
node.setLocation(newLocation.x, newLocation.y);
// Shift by half the delta because both nodes will contribute to the shift
for (Connection connection : relatedConnections){
connection.setBendpoints(ConnectionUtils.translateBendpointListByOffset(connection.getBendpoints(), (deltaX/2), (deltaY/2)));
}
}
@Override
public void undo() {
node.setLocation(oldLocation.x, oldLocation.y);
// Shift by half the delta because both nodes will contribute to the shift
for (Connection connection : relatedConnections){
connection.setBendpoints(ConnectionUtils.translateBendpointListByOffset(connection.getBendpoints(), -(deltaX/2), -(deltaY/2)));
}
}
}