package org.eclipse.uml2.diagram.timing.edit.policies; import org.eclipse.draw2d.geometry.Point; import org.eclipse.gef.EditPart; import org.eclipse.gef.Request; import org.eclipse.gef.RootEditPart; import org.eclipse.gef.commands.Command; import org.eclipse.gef.editpolicies.AbstractEditPolicy; import org.eclipse.uml2.diagram.timing.edit.parts.DBlockEditPart; public class SetupAnchorsEditPolicy extends AbstractEditPolicy { public static final String ROLE = SetupAnchorsEditPolicy.class.getSimpleName() + ":Role"; private SegmentAnchorHelper myHelper; @Override public void activate() { super.activate(); myHelper = createHelper(); } @Override public boolean understandsRequest(Request req) { return req instanceof SetupAnchorsRequest; } @Override public Command getCommand(Request request) { if (myHelper == null){ return null; } if (request instanceof SetupAnchorsRequest){ SetupAnchorsRequest reqImpl = (SetupAnchorsRequest)request; Point globalLocation = reqImpl.getLocation(); SegmentAnchor anchor = myHelper.findSegmentAnchor(globalLocation); return new PushDataCommand(reqImpl, anchor); } return null; } protected SegmentAnchorHelper createHelper(){ DBlockEditPart blockEP = findBlockEditPart(getHost()); return blockEP == null ? null : new SegmentAnchorHelper(blockEP); } private DBlockEditPart findBlockEditPart(EditPart start){ RootEditPart root = start.getRoot(); EditPart current = start; while (false == current instanceof DBlockEditPart){ EditPart parent = current.getParent(); if (parent == null || parent == root || parent == current){ return null; } current = parent; } return (DBlockEditPart)current; } private static class PushDataCommand extends Command { private final SetupAnchorsRequest myRequest; private final SegmentAnchor myAnchor; public PushDataCommand(SetupAnchorsRequest request, SegmentAnchor anchor){ myRequest = request; myAnchor = anchor; } @Override public void execute() { SegmentAnchor.Util.putAnchor(myAnchor, myRequest); } } }