blob: b0670bd7cb0600e03920d9afb8f635963bdb5807 [file] [log] [blame]
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;
}
}