blob: 743291039a33395761da88adcffb7ff44324fc8f [file] [log] [blame]
/*******************************************************************************
* 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();
}
}