package org.eclipse.uml2.diagram.sequence.edit.policies;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.XYAnchor;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.RootEditPart;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CompoundCommand;
import org.eclipse.gef.requests.CreateConnectionRequest;
import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewAndElementRequest;
import org.eclipse.uml2.diagram.common.editpolicies.U2TCreateParametersImpl;
import org.eclipse.uml2.diagram.common.editpolicies.U2TGraphicalNodeEditPolicy;
import org.eclipse.uml2.diagram.sequence.edit.parts.InteractionEditPart;
public class SDGraphicalNodeEditPolicy extends U2TGraphicalNodeEditPolicy {
@Override
protected Command getConnectionAndRelationshipCompleteCommand(CreateConnectionViewAndElementRequest request) {
ICommandProxy result = (ICommandProxy)super.getConnectionAndRelationshipCompleteCommand(request);
if (result == null){
return result;
}
InteractionEditPart interactionEP = findInteractionEditPart(getHost());
if (interactionEP == null){
return result;
}
CompoundCommand withLayout = new CompoundCommand();
withLayout.add(result);
withLayout.add(interactionEP.getCommand(new InteractionNestedLayoutRequest()));
return withLayout.unwrap();
}
protected InteractionEditPart findInteractionEditPart(EditPart ep){
RootEditPart root = ep.getRoot();
while (ep != root && ep != null){
if (ep instanceof InteractionEditPart){
return (InteractionEditPart)ep;
}
ep = ep.getParent();
}
return null;
}
@Override
protected U2TCreateParametersImpl computeParameters(CreateConnectionRequest request) {
U2TCreateParametersImpl result = super.computeParameters(request);
Point relativeLocation = result.getRelativeLocation();
if (relativeLocation != null && getHost().getEditPolicy(EditPolicy.LAYOUT_ROLE) instanceof OrderedLayoutEditPolicy){
OrderedLayoutEditPolicy layout = (OrderedLayoutEditPolicy)getHost().getEditPolicy(EditPolicy.LAYOUT_ROLE);
OrderedLayoutEditPolicy.AnchoredSibling anchor = layout.findAnchoredSibling(relativeLocation);
if (anchor != null){
result.setAnchorSibling(anchor.getSiblingView());
result.setBeforeNotAfterAnchor(anchor.isBeforeNotAfterAnchor());
}
}
return result;
}
@Override
protected ConnectionAnchor getSourceConnectionAnchor(CreateConnectionRequest request) {
return new XYAnchor(request.getLocation());
}
@Override
protected ConnectionAnchor getTargetConnectionAnchor(CreateConnectionRequest request) {
return new XYAnchor(request.getLocation());
}
}