package org.eclipse.gmf.tooling.runtime.linklf; import java.util.Arrays; import org.eclipse.draw2d.Connection; import org.eclipse.draw2d.ConnectionAnchor; import org.eclipse.draw2d.ConnectionRouter; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.PointList; import org.eclipse.gef.Request; import org.eclipse.gef.editparts.AbstractConnectionEditPart; import org.eclipse.gef.requests.DropRequest; import org.eclipse.gef.requests.ReconnectRequest; import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure; public class ShapeNodeAnchorDelegate { private NodeFigure myNodeFigure; public ShapeNodeAnchorDelegate(NodeFigure nodeFigure) { myNodeFigure = nodeFigure; } public NodeFigure getNodeFigure() { return myNodeFigure; } public ConnectionAnchor getSourceConnectionAnchor(Request request) { Point fromRequest = safeGetPointFromLinkRequest(request); ConnectionAnchor result = getNodeFigure().getSourceConnectionAnchorAt(fromRequest); if (request instanceof ReconnectRequest) { ReconnectRequest reqImpl = (ReconnectRequest) request; AbstractConnectionEditPart linkEP = (AbstractConnectionEditPart) reqImpl.getConnectionEditPart(); Connection conn = linkEP.getConnectionFigure(); ConnectionRouter router = conn.getConnectionRouter(); PointList pointsBefore = conn.getPoints().getCopy(); conn.setSourceAnchor(result); router.route(conn); PointList pointsAfter = conn.getPoints().getCopy(); Point routedLocation = pointsAfter.getFirstPoint(); conn.translateToAbsolute(routedLocation); result = getNodeFigure().getSourceConnectionAnchorAt(routedLocation); if (!Arrays.equals(pointsAfter.toIntArray(), pointsBefore.toIntArray())) { conn.setPoints(pointsBefore); } } return result; } public ConnectionAnchor getTargetConnectionAnchor(Request request) { Point fromRequestAbs = safeGetPointFromLinkRequest(request); ConnectionAnchor result = getNodeFigure().getTargetConnectionAnchorAt(fromRequestAbs); if (request instanceof ReconnectRequest) { ReconnectRequest reqImpl = (ReconnectRequest) request; AbstractConnectionEditPart linkEP = (AbstractConnectionEditPart) reqImpl.getConnectionEditPart(); Connection conn = linkEP.getConnectionFigure(); ConnectionRouter router = conn.getConnectionRouter(); PointList pointsBefore = conn.getPoints().getCopy(); conn.setTargetAnchor(result); router.route(conn); PointList pointsAfter = conn.getPoints().getCopy(); Point routedTarget = pointsAfter.getLastPoint(); conn.translateToAbsolute(routedTarget); result = getNodeFigure().getTargetConnectionAnchorAt(routedTarget); if (!Arrays.equals(pointsAfter.toIntArray(), pointsBefore.toIntArray())) { conn.setPoints(pointsBefore); } } return result; } private Point safeGetPointFromLinkRequest(Request request) { Point result = null; if (request instanceof DropRequest) { result = ((DropRequest) request).getLocation(); } //additional copy for ReconnectRequest, dont know why, //but see, e.g, ShapeNodeEditPart#getSourceConnectionAnchor if (result != null && request instanceof ReconnectRequest) { result = result.getCopy(); } return result; } }