/******************************************************************************* * Copyright (c) 2008, 2012 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.ui.figures; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.eclipse.bpel.model.CompensationHandler; import org.eclipse.bpel.model.EventHandler; import org.eclipse.bpel.model.FaultHandler; import org.eclipse.bpel.model.TerminationHandler; import org.eclipse.bpel.ui.BPELEditor; import org.eclipse.bpel.ui.BPELUIPlugin; import org.eclipse.bpel.ui.IBPELUIConstants; import org.eclipse.bpel.ui.editparts.BPELEditPart; import org.eclipse.bpel.ui.editparts.FaultHandlerEditPart; import org.eclipse.bpel.ui.editparts.borders.RoundRectangleBorderWithDecoration; import org.eclipse.bpel.ui.util.ModelHelper; import org.eclipse.draw2d.ConnectionAnchor; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.PolylineConnection; import org.eclipse.draw2d.geometry.Ray; import org.eclipse.gef.LayerConstants; import org.eclipse.gef.editparts.LayerManager; public abstract class AbstractHandlerLinker { /** * List of all connections handled by this handlerLinker. This * list has to be maintained during the creation of the handlerLinks. */ private List<PolylineConnection> handlerConnectionsList = new ArrayList<PolylineConnection>(); /** * The editPart to which this handler belongs to */ private BPELEditPart editPart; /** * Reference to the GEF connectionLayer */ private IFigure connLayer; public AbstractHandlerLinker(BPELEditPart editPart) { this.editPart = editPart; connLayer = ((LayerManager) editPart.getViewer().getEditPartRegistry() .get(LayerManager.ID)) .getLayer(LayerConstants.CONNECTION_LAYER); } /** * Refreshes all handlerLinks */ public void refreshHandlerLinks() { clearHandlerConnections(); ConnectionAnchor source = null; ConnectionAnchor target = null; BPELEditor editor = ModelHelper.getBPELEditor(editPart.getModel()); if (editor == null) return; Map reg = editor.getGraphicalViewer().getEditPartRegistry(); FaultHandlerEditPart fhEditPart = (FaultHandlerEditPart) reg .get(getFaultHandler()); FaultHandlerEditPart ehEditPart = (FaultHandlerEditPart) reg .get(getEventHandler()); FaultHandlerEditPart chEditPart = (FaultHandlerEditPart) reg .get(getCompensationHandler()); FaultHandlerEditPart thEditPart = (FaultHandlerEditPart) reg .get(getTerminationHandler()); if (isShowFH()) { if (fhEditPart == null) // not yet initialized return; source = new CenteredConnectionAnchor(getFHFigure(),getFHSourceAnchorLoc(),0); target = new CenteredConnectionAnchor(getFHHandlerFigure(fhEditPart),getFHTargetAnchorLoc(),0); PolylineConnection conn = new PolylineConnection(); conn.setSourceAnchor(source); conn.setTargetAnchor(target); conn.setForegroundColor(BPELUIPlugin.INSTANCE.getColorRegistry() .get(IBPELUIConstants.COLOR_HANDLER_LINK_FH)); // conn.setConnectionRouter(new HandlerConnectionRouter()); conn .setConnectionRouter(new ManhattanConnectionRouterEx( getFHRoutingStartConstraint(), getFHRoutingEndConstraint())); handlerConnectionsList.add(conn); connLayer.add(conn); } if (isShowEH()) { if (ehEditPart == null) // not yet initialized return; source = new CenteredConnectionAnchor(getEHFigure(),getEHSourceAnchorLoc(),0); target = new CenteredConnectionAnchor(getFHHandlerFigure(ehEditPart),getEHTargetAnchorLoc(),0); PolylineConnection conn = new PolylineConnection(); conn.setSourceAnchor(source); conn.setTargetAnchor(target); conn.setForegroundColor(BPELUIPlugin.INSTANCE.getColorRegistry() .get(IBPELUIConstants.COLOR_HANDLER_LINK_EH)); // conn.setConnectionRouter(new HandlerConnectionRouter()); conn .setConnectionRouter(new ManhattanConnectionRouterEx( getEHRoutingStartConstraint(), getEHRoutingEndConstraint())); handlerConnectionsList.add(conn); connLayer.add(conn); } if (isShowCH()) { if (chEditPart == null) // not yet initialized return; source = new CenteredConnectionAnchor(getCHFigure(),getCHSourceAnchorLoc(),0); target = new CenteredConnectionAnchor(getFHHandlerFigure(chEditPart),getCHTargetAnchorLoc(),0); PolylineConnection conn = new PolylineConnection(); conn.setSourceAnchor(source); conn.setTargetAnchor(target); conn.setForegroundColor(BPELUIPlugin.INSTANCE.getColorRegistry() .get(IBPELUIConstants.COLOR_HANDLER_LINK_CH)); // conn.setConnectionRouter(new HandlerConnectionRouter()); conn .setConnectionRouter(new ManhattanConnectionRouterEx( getCHRoutingStartConstraint(), getCHRoutingEndConstraint())); handlerConnectionsList.add(conn); connLayer.add(conn); } if (isShowTH()) { if (thEditPart == null) // not yet initialized return; source = new CenteredConnectionAnchor(getTHFigure(),getTHSourceAnchorLoc(),0); target = new CenteredConnectionAnchor(getFHHandlerFigure(thEditPart),getTHTargetAnchorLoc(),0); PolylineConnection conn = new PolylineConnection(); conn.setSourceAnchor(source); conn.setTargetAnchor(target); conn.setForegroundColor(BPELUIPlugin.INSTANCE.getColorRegistry() .get(IBPELUIConstants.COLOR_HANDLER_LINK_TH)); // conn.setConnectionRouter(new HandlerConnectionRouter()); conn .setConnectionRouter(new ManhattanConnectionRouterEx( getTHRoutingStartConstraint(), getTHRoutingEndConstraint())); handlerConnectionsList.add(conn); connLayer.add(conn); } } /** * Removes all connections which are handled by this handlerLinker * from the connectionLayer */ public void clearHandlerConnections() { if (handlerConnectionsList.size() > 0) { for (PolylineConnection p : handlerConnectionsList) { connLayer.remove(p); } handlerConnectionsList.clear(); } } /** * Gets the faultHandler model * @return */ protected abstract FaultHandler getFaultHandler(); /** * Gets the eventHandler model * @return */ protected abstract EventHandler getEventHandler(); /** * Gets the compensationHandler model * @return */ protected abstract CompensationHandler getCompensationHandler(); /** * Gets the terminationHandler model * @return */ protected abstract TerminationHandler getTerminationHandler(); /** * Returns if the compensationHandler is shown * @return */ protected abstract boolean isShowCH(); /** * Returns if the eventHandler is shown * @return */ protected abstract boolean isShowEH(); /** * Returns if the faultHandler is shown * @return */ protected abstract boolean isShowFH(); /** * Returns if the terminationHandler is shown * @return */ protected abstract boolean isShowTH(); /** * Gets the position of the connectionAnchor of an faultHandler. * By default this is HandlerConnectionAnchor.LEFT in case of a horizontal * layout and HandlerConnectionAnchor.TOP if layout orientation is vertical. * @return */ protected int getFHTargetAnchorLoc(){ return isHorizontalLayout() ? CenteredConnectionAnchor.LEFT : CenteredConnectionAnchor.TOP; } /** * Gets the position of the connectionAnchor of an eventHandler. * By default this is HandlerConnectionAnchor.LEFT in case of a horizontal * layout and HandlerConnectionAnchor.TOP if layout orientation is vertical. * @return */ protected int getEHTargetAnchorLoc(){ return isHorizontalLayout() ? CenteredConnectionAnchor.LEFT : CenteredConnectionAnchor.TOP; } /** * Gets the position of the connectionAnchor of a compensationHandler. * By default this is HandlerConnectionAnchor.LEFT in case of a horizontal * layout and HandlerConnectionAnchor.TOP if layout orientation is vertical. * @return */ protected int getCHTargetAnchorLoc(){ return isHorizontalLayout() ? CenteredConnectionAnchor.LEFT : CenteredConnectionAnchor.TOP; } /** * Gets the position of the connectionAnchor of a terminationHandler. * By default this is HandlerConnectionAnchor.LEFT in case of a horizontal * layout and HandlerConnectionAnchor.TOP if layout orientation is vertical. * @return */ protected int getTHTargetAnchorLoc(){ return isHorizontalLayout() ? CenteredConnectionAnchor.LEFT : CenteredConnectionAnchor.TOP; } /** * Gets the direction in which the first segment of the connection * should point * @return */ protected Ray getFHRoutingStartConstraint(){ switch (getFHSourceAnchorLoc()) { case CenteredConnectionAnchor.BOTTOM: return ManhattanConnectionRouterEx.DOWN; default: return ManhattanConnectionRouterEx.RIGHT; } } /** * Gets the direction in which the last segment of the connection * should point * @return */ protected Ray getFHRoutingEndConstraint(){ switch (getFHTargetAnchorLoc()) { case CenteredConnectionAnchor.TOP: return ManhattanConnectionRouterEx.UP; default: return ManhattanConnectionRouterEx.LEFT; } } /** * Gets the direction in which the first segment of the connection * should point * @return */ protected Ray getEHRoutingStartConstraint(){ switch (getEHSourceAnchorLoc()) { case CenteredConnectionAnchor.BOTTOM: return ManhattanConnectionRouterEx.DOWN; default: return ManhattanConnectionRouterEx.RIGHT; } } /** * Gets the direction in which the last segment of the connection * should point * @return */ protected Ray getEHRoutingEndConstraint(){ switch (getEHTargetAnchorLoc()) { case CenteredConnectionAnchor.TOP: return ManhattanConnectionRouterEx.UP; default: return ManhattanConnectionRouterEx.LEFT; } } /** * Gets the direction in which the first segment of the connection * should point * @return */ protected Ray getCHRoutingStartConstraint(){ switch (getCHSourceAnchorLoc()) { case CenteredConnectionAnchor.BOTTOM: return ManhattanConnectionRouterEx.DOWN; default: return ManhattanConnectionRouterEx.RIGHT; } } /** * Gets the direction in which the last segment of the connection * should point * @return */ protected Ray getCHRoutingEndConstraint(){ switch (getCHTargetAnchorLoc()) { case CenteredConnectionAnchor.TOP: return ManhattanConnectionRouterEx.UP; default: return ManhattanConnectionRouterEx.LEFT; } } /** * Gets the direction in which the first segment of the connection * should point * @return */ protected Ray getTHRoutingStartConstraint(){ switch (getTHSourceAnchorLoc()) { case CenteredConnectionAnchor.BOTTOM: return ManhattanConnectionRouterEx.DOWN; default: return ManhattanConnectionRouterEx.RIGHT; } } /** * Gets the direction in which the last segment of the connection * should point * @return */ protected Ray getTHRoutingEndConstraint(){ switch (getCHTargetAnchorLoc()) { case CenteredConnectionAnchor.TOP: return ManhattanConnectionRouterEx.UP; default: return ManhattanConnectionRouterEx.LEFT; } } /** * Gets the faultHandlerFigure from the editPart * @return */ protected abstract IFigure getFHFigure(); /** * Gets the compensationHandlerFigure from the editPart * @return */ protected abstract IFigure getCHFigure(); /** * Gets the terminationHandlerFigure from the editPart * @return */ protected abstract IFigure getTHFigure(); /** * Gets the eventHandlerFigure from the editPart * @return */ protected abstract IFigure getEHFigure(); /** * Gets the location of the source connectionAnchor of the faultHandlerIcon * @return */ protected int getFHSourceAnchorLoc(){ return isHorizontalLayout() ? CenteredConnectionAnchor.BOTTOM : CenteredConnectionAnchor.RIGHT; } /** * Gets the location of the source connectionAnchor of the compensationHandlerIcon * @return */ protected int getCHSourceAnchorLoc(){ return isHorizontalLayout() ? CenteredConnectionAnchor.BOTTOM : CenteredConnectionAnchor.RIGHT; } /** * Gets the location of the source connectionAnchor of the terminationHandlerIcon * @return */ protected int getTHSourceAnchorLoc(){ return isHorizontalLayout() ? CenteredConnectionAnchor.BOTTOM : CenteredConnectionAnchor.RIGHT; } /** * Gets the location of the source connectionAnchor of the eventHandlerIcon * @return */ protected int getEHSourceAnchorLoc(){ return isHorizontalLayout() ? CenteredConnectionAnchor.BOTTOM : CenteredConnectionAnchor.RIGHT; } /** * Convenience method which gets the orientation property from the editor * * @return True if the orientation is horizontal, false if it is vertical */ protected boolean isHorizontalLayout() { return ModelHelper.getBPELEditor(editPart.getModel()) .isHorizontalLayout(); } /** * Convienience method which gets the HandlerIconFigure from a FaultHandler. * @return */ protected IFigure getFHHandlerFigure(FaultHandlerEditPart fhEditPart){ return ((RoundRectangleBorderWithDecoration)fhEditPart.getContentPane().getBorder()).getDecorationFigure(); } }