package org.eclipse.gmf.tooling.examples.linklf.diagram.edit.parts; import java.util.ArrayList; import java.util.List; import org.eclipse.draw2d.Bendpoint; import org.eclipse.draw2d.Connection; import org.eclipse.gef.EditPolicy; import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionNodeEditPart; import org.eclipse.gmf.runtime.diagram.ui.util.EditPartUtil; import org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx; import org.eclipse.gmf.runtime.draw2d.ui.internal.routers.ForestRouter; import org.eclipse.gmf.runtime.draw2d.ui.internal.routers.OrthogonalRouter; import org.eclipse.gmf.runtime.gef.ui.internal.editpolicies.LineMode; import org.eclipse.gmf.runtime.gef.ui.internal.l10n.Cursors; import org.eclipse.gmf.runtime.notation.NotationPackage; import org.eclipse.gmf.runtime.notation.RelativeBendpoints; import org.eclipse.gmf.runtime.notation.RoutingStyle; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.gmf.tooling.runtime.linklf.AbsoluteBendpointsConvention; import org.eclipse.gmf.tooling.runtime.linklf.editpolicies.LinksLFConnectionBendpointEditPolicy; import org.eclipse.gmf.tooling.runtime.linklf.editpolicies.DebugShowConnectionEndPointsAndAnchorsEditPolicy; public abstract class LinksLFConnectionEditPart extends ConnectionNodeEditPart { public LinksLFConnectionEditPart(View view) { super(view); } @Override protected void createDefaultEditPolicies() { super.createDefaultEditPolicies(); installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new DebugShowConnectionEndPointsAndAnchorsEditPolicy()); installBendpointEditPolicy(); } @Override protected void refreshBendpoints() { RelativeBendpoints bendpoints = (RelativeBendpoints) getEdge().getBendpoints(); List modelConstraint = bendpoints.getPoints(); List figureConstraint = new ArrayList(); for (int i = 0; i < modelConstraint.size(); i++) { org.eclipse.gmf.runtime.notation.datatype.RelativeBendpoint wbp = (org.eclipse.gmf.runtime.notation.datatype.RelativeBendpoint) modelConstraint.get(i); float weight; if (modelConstraint.size() == 1) { weight = 0.5f; } else { weight = i / ((float) modelConstraint.size() - 1); } Bendpoint bp = AbsoluteBendpointsConvention.getInstance(). d2dBendpoint(wbp, getConnectionFigure(), weight); figureConstraint.add(bp); } getConnectionFigure().setRoutingConstraint(figureConstraint); } /** * [GMFRT] make protected */ protected final void installBendpointEditPolicy() { if (getConnectionFigure().getConnectionRouter() instanceof ForestRouter) { installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, new LinksLFConnectionBendpointEditPolicy(LineMode.ORTHOGONAL_CONSTRAINED)); } else if (getConnectionFigure().getConnectionRouter() instanceof OrthogonalRouter) { installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, new LinksLFConnectionBendpointEditPolicy(LineMode.ORTHOGONAL_FREE)); } else { installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, new LinksLFConnectionBendpointEditPolicy(LineMode.OBLIQUE)); } EditPartUtil.synchronizeRunnableToMainThread(this, new Runnable() { public void run() { if (getConnectionFigure().getConnectionRouter() instanceof ForestRouter) { getConnectionFigure().setCursor(Cursors.CURSOR_SEG_MOVE); } else if (getConnectionFigure().getConnectionRouter() instanceof OrthogonalRouter) { getConnectionFigure().setCursor(Cursors.CURSOR_SEG_MOVE); } else { getConnectionFigure().setCursor(Cursors.CURSOR_SEG_ADD); } }; }); } protected void refreshRouterChange() { refreshBendpoints(); installBendpointEditPolicy(); } @Override protected void refreshRoutingStyles() { Connection connection = getConnectionFigure(); if (!(connection instanceof PolylineConnectionEx)) return; PolylineConnectionEx poly = (PolylineConnectionEx) connection; RoutingStyle style = (RoutingStyle) ((View) getModel()).getStyle(NotationPackage.Literals.ROUTING_STYLE); if (style != null) { boolean closestDistance = style.isClosestDistance(); boolean avoidObstruction = style.isAvoidObstructions(); poly.setRoutingStyles(closestDistance, avoidObstruction); if (avoidObstruction) installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, null); else installBendpointEditPolicy(); } } }