| package org.eclipse.gmf.tooling.runtime.linklf.editparts; |
| |
| import org.eclipse.draw2d.Connection; |
| import org.eclipse.gef.EditPolicy; |
| import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart; |
| import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionNodeEditPart; |
| import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ConnectionBendpointEditPolicy; |
| import org.eclipse.gmf.runtime.diagram.ui.internal.editpolicies.ConnectionLineSegEditPolicy; |
| import org.eclipse.gmf.runtime.diagram.ui.internal.editpolicies.TreeConnectionBendpointEditPolicy; |
| 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.l10n.Cursors; |
| import org.eclipse.gmf.runtime.notation.NotationPackage; |
| import org.eclipse.gmf.runtime.notation.RoutingStyle; |
| import org.eclipse.gmf.runtime.notation.View; |
| |
| /** |
| * This class is a workaround for a bunch of private methods dealing with the |
| * default edit policies for the {@link ConnectionNodeEditPart} |
| * <p/> |
| * This class is expected to become obsolete and removed in the Mars+1 release, |
| * once the corresponding methods made protected in the super-class |
| * <p/> |
| * [GMFR make protected] |
| * |
| * @see OverridableConnectionNodeEditPart#installBendpointEditPolicy() |
| * @since 3.3 |
| */ |
| public abstract class OverridableConnectionNodeEditPart extends ConnectionNodeEditPart { |
| |
| public OverridableConnectionNodeEditPart(View view) { |
| super(view); |
| } |
| |
| /** |
| * This method is private in {@link ConnectionEditPart} while being called |
| * from the methods which have to be overridden in the LinkLF framework. |
| * <p/> |
| * This class does NOT change the logic from the super class, it only allows |
| * to override it in subclasses |
| */ |
| protected void installBendpointEditPolicy() { |
| if (getConnectionFigure().getConnectionRouter() instanceof ForestRouter) { |
| installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, |
| new TreeConnectionBendpointEditPolicy()); |
| } else if (getConnectionFigure().getConnectionRouter() instanceof OrthogonalRouter) { |
| installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, |
| new ConnectionLineSegEditPolicy()); |
| } else { |
| installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, |
| new ConnectionBendpointEditPolicy()); |
| } |
| refreshConnectionCursor(); |
| } |
| |
| /** |
| * This method is part of the private |
| * {@link ConnectionEditPart#installBendpointEditPolicy}, extracted to |
| * simplify the overriding code in the sub-classes. |
| * |
| * @see OverridableConnectionNodeEditPart#installBendpointEditPolicy() |
| */ |
| protected void refreshConnectionCursor() { |
| 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); |
| } |
| }; |
| }); |
| } |
| |
| /** |
| * This method is copy-pasted from In contrast to super-class, this code |
| * calls the local version of {@link #installBendpointEditPolicy()} which |
| * can be overridden in sub-class |
| */ |
| @Override |
| protected void refreshRouterChange() { |
| refreshBendpoints(); |
| installBendpointEditPolicy(); |
| } |
| |
| /** |
| * This method is copy-pasted from the |
| * {@link ConnectionEditPart#refreshRoutingStyles}. |
| * <p/> |
| * In contrast to super-class, this code calls the local version of |
| * {@link #installBendpointEditPolicy()} which can be overridden in |
| * sub-class. |
| */ |
| @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(); |
| } |
| } |
| } |
| |
| } |