/******************************************************************************* | |
* Copyright (c) 2005, 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.editparts; | |
import org.eclipse.bpel.model.CompensationHandler; | |
import org.eclipse.bpel.model.EventHandler; | |
import org.eclipse.bpel.model.TerminationHandler; | |
import org.eclipse.bpel.ui.BPELUIPlugin; | |
import org.eclipse.bpel.ui.IBPELUIConstants; | |
import org.eclipse.bpel.ui.editparts.borders.RoundRectangleBorderWithDecoration; | |
import org.eclipse.bpel.ui.editparts.policies.BPELContainerEditPolicy; | |
import org.eclipse.bpel.ui.editparts.policies.BPELOrderedLayoutEditPolicy; | |
import org.eclipse.bpel.ui.editparts.policies.ContainerHighlightEditPolicy; | |
import org.eclipse.bpel.ui.figures.ILayoutAware; | |
import org.eclipse.bpel.ui.util.ModelHelper; | |
import org.eclipse.draw2d.Border; | |
import org.eclipse.draw2d.Figure; | |
import org.eclipse.draw2d.FlowLayout; | |
import org.eclipse.draw2d.IFigure; | |
import org.eclipse.draw2d.MarginBorder; | |
import org.eclipse.draw2d.geometry.Insets; | |
import org.eclipse.gef.EditPolicy; | |
import org.eclipse.swt.graphics.Image; | |
public class FaultHandlerEditPart extends BPELEditPart implements ILayoutAware{ | |
private Image image; | |
private IFigure contentPane; | |
private Border containerBorder; | |
public static final int LEFT_MARGIN = 30; | |
@Override | |
protected void createEditPolicies() { | |
super.createEditPolicies(); | |
// Show the selection rectangle | |
installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new ContainerHighlightEditPolicy(false, false)); | |
installEditPolicy(EditPolicy.CONTAINER_ROLE, new BPELContainerEditPolicy()); | |
installEditPolicy(EditPolicy.LAYOUT_ROLE, new BPELOrderedLayoutEditPolicy()); | |
} | |
@Override | |
protected IFigure createFigure() { | |
IFigure figure = new Figure(); | |
FlowLayout layout = new FlowLayout(); | |
layout.setMinorAlignment(FlowLayout.ALIGN_CENTER); | |
boolean vertical = (getModel() instanceof CompensationHandler) || (getModel() instanceof TerminationHandler); | |
boolean horizontalLayout = ModelHelper.isHorizontalLayout(getModel()); | |
layout.setHorizontal(horizontalLayout ? vertical : !vertical); | |
figure.setLayoutManager(layout); | |
if (image == null) { | |
// Get Image from registry | |
if (getModel() instanceof EventHandler) { | |
image = BPELUIPlugin.INSTANCE.getImage(IBPELUIConstants.ICON_EVENT_INDICATOR); | |
} else if (getModel() instanceof CompensationHandler) { | |
image = BPELUIPlugin.INSTANCE.getImage(IBPELUIConstants.ICON_COMPENSATION_INDICATOR); | |
} else if (getModel() instanceof TerminationHandler) { | |
image = BPELUIPlugin.INSTANCE.getImage(IBPELUIConstants.ICON_TERMINATION_INDICATOR); | |
} else { | |
image = BPELUIPlugin.INSTANCE.getImage(IBPELUIConstants.ICON_FAULT_INDICATOR); | |
} | |
} | |
figure.setBorder(new RoundRectangleBorderWithDecoration(figure, image, new Insets(20, 10, 20, 10))); | |
figure.setOpaque(true); | |
this.contentPane = figure; | |
int topMargin = calcTopMargin(horizontalLayout); | |
int leftMargin = calcLeftMargin(horizontalLayout); | |
IFigure container = new Figure(); | |
this.containerBorder = new MarginBorder(topMargin,leftMargin,0,0); | |
container.setBorder(containerBorder); | |
container.add(figure); | |
layout = new FlowLayout(); | |
layout.setHorizontal(false); | |
container.setLayoutManager(layout); | |
return container; | |
} | |
@Override | |
public void deactivate() { | |
if (!isActive()) return; | |
super.deactivate(); | |
if (this.image != null) { | |
//this.image.dispose(); | |
this.image = null; | |
} | |
} | |
@Override | |
public IFigure getContentPane() { | |
return contentPane; | |
} | |
public void switchLayout(boolean horizontal) { | |
boolean vertical = (getModel() instanceof CompensationHandler) || (getModel() instanceof TerminationHandler); | |
boolean horizontalLayout = ModelHelper.isHorizontalLayout(getModel()); | |
((FlowLayout)getContentPane().getLayoutManager()).setHorizontal(horizontalLayout ? vertical : !vertical); | |
int leftMargin = calcLeftMargin(horizontal); | |
int topMargin = calcTopMargin(horizontal); | |
getFigure().setBorder(new MarginBorder(topMargin,leftMargin,0,0)); | |
} | |
/** | |
* Calculates the top margin regarding the layout orientation | |
* @return | |
*/ | |
private int calcTopMargin(boolean horizontal){ | |
int topMargin = 0; | |
if(horizontal){ | |
topMargin = 2; | |
}else{ | |
if(getParent() instanceof ScopeEditPart){ | |
// Four possible handlers | |
topMargin = 42; | |
}else if(getParent() instanceof InvokeEditPart){ | |
// Standard offset | |
topMargin = 17; | |
}else | |
topMargin = 16; | |
} | |
return topMargin; | |
} | |
/** | |
* Calculates the left margin regarding the layout orientation | |
* @return | |
*/ | |
private int calcLeftMargin(boolean horizontal){ | |
int leftMargin = 0; | |
if(horizontal && getParent() instanceof ProcessEditPart){ | |
leftMargin = LEFT_MARGIN; | |
} | |
return leftMargin; | |
} | |
} |