blob: 52f8477f9c358e569ba0526a890fae48b69dfe37 [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2014 Montages AG 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:
* Anatoly Tishenko (ticher777@gmail.com) - Initial API and implementation
*/
package org.eclipse.gmf.tooling.runtime.linklf.editpolicies;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.requests.ChangeBoundsRequest;
import org.eclipse.gmf.runtime.common.core.command.ICommand;
import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart;
import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
import org.eclipse.gmf.runtime.notation.Edge;
import org.eclipse.gmf.runtime.notation.RelativeBendpoints;
import org.eclipse.gmf.tooling.runtime.linklf.AbsoluteBendpointsConvention;
/**
* This edit policy adjusts bendpoints for links between the nodes moved at the same time.
* Only absolute bendpoints (also possibly stored as relative, see {@link AbsoluteBendpointsConvention}) require adjustment.
*/
public class AdjustImplicitlyMovedLinksEditPolicy extends AdjustAbsoluteBendpointsEditPolicyBase {
/**
* Default role for registering this edit policy.
* <p/>
* The value is prefixed by class FQN in order to avoid conflicts, but the literal should NOT be used anywhere.
*/
public static final String ROLE = AdjustImplicitlyMovedLinksEditPolicy.class.getName() + ":Role";
@Override
protected Command getAdjustLinksCommand(ChangeBoundsRequest req) {
return getAdjustImplicitlyMovedLinksCommand(req);
}
/**
* Link is implicitly moved when its source and target are both moved (directly or indirectly).
* In this case, {@link RelativeBendpoints} should not be adjusted.
* But when the link has effectively absolute bendpoints (see {@link AbsoluteBendpointsConvention})
* all of them must be also moved to the same {@link ChangeBoundsRequest#getMoveDelta()}
* <p/>
* Default implementation of this method will only affect the <strong>outgoing</strong> links from the host edit part to one of the edit parts
* being moved. This way all affected links will be modified only once.
*/
protected Command getAdjustImplicitlyMovedLinksCommand(ChangeBoundsRequest req) {
final Point moveDelta = req.getMoveDelta();
if(moveDelta.x == 0 && moveDelta.y == 0) {
return null;
}
CachedEditPartsSet allMoved = getMovedEditPartsSet(req);
ICommand result = null;
for(Object next : getHost().getSourceConnections()) {
if(next instanceof ConnectionEditPart) {
ConnectionEditPart nextLinkEP = (ConnectionEditPart)next;
EditPart target = nextLinkEP.getTarget();
MovedNodeKind move = allMoved.isMoved(target);
if(move == MovedNodeKind.DIRECTLY || move == MovedNodeKind.INDIRECTLY) {
ICommand nextAdjustment = getAdjustOneLinkCommand(nextLinkEP, req);
result = compose(result, nextAdjustment);
}
}
}
return result == null ? null : new ICommandProxy(result.reduce());
}
private ICommand getAdjustOneLinkCommand(ConnectionEditPart linkEP, ChangeBoundsRequest req) {
SetAbsoluteBendpointsCommand result = null;
Edge edge = (Edge)linkEP.getNotationView();
if(AbsoluteBendpointsConvention.getInstance().hasAbsoluteStoredAsRelativeBendpoints(edge)) {
PointList newPoints = AbsoluteBendpointsConvention.getInstance().getPointList(edge, linkEP.getConnectionFigure().getRoutingConstraint());
newPoints.translate(req.getMoveDelta());
result = new SetAbsoluteBendpointsCommand(getDomain());
result.setEdgeAdapter(new EObjectAdapter(edge));
result.setNewPointList(newPoints);
}
return result;
}
}