blob: cee45e8fb29ccb6393b1f16452b7cff3aef64e75 [file] [log] [blame]
/*******************************************************************************
* 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 java.util.ArrayList;
import java.util.List;
import org.eclipse.bpel.common.ui.layouts.AlignedFlowLayout;
import org.eclipse.bpel.model.CompensationHandler;
import org.eclipse.bpel.model.BPELExtensibleElement;
import org.eclipse.bpel.model.FaultHandler;
import org.eclipse.bpel.ui.BPELUIPlugin;
import org.eclipse.bpel.ui.IBPELUIConstants;
import org.eclipse.bpel.ui.adapters.ICompensationHandlerHolder;
import org.eclipse.bpel.ui.adapters.IFaultHandlerHolder;
import org.eclipse.bpel.ui.adapters.ILabeledElement;
import org.eclipse.bpel.ui.editparts.borders.LeafBorder;
import org.eclipse.bpel.ui.editparts.figures.GradientFigure;
import org.eclipse.bpel.ui.figures.CenteredConnectionAnchor;
import org.eclipse.bpel.ui.figures.ILayoutAware;
import org.eclipse.bpel.ui.figures.InvokeHandlerLinker;
import org.eclipse.bpel.ui.util.BPELDragEditPartsTracker;
import org.eclipse.bpel.ui.util.BPELUtil;
import org.eclipse.bpel.ui.util.ModelHelper;
import org.eclipse.bpel.ui.util.marker.BPELEditPartMarkerDecorator;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.FlowLayout;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.LayoutManager;
import org.eclipse.draw2d.MarginBorder;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.DragTracker;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Request;
/**
* There is a lot of code here copied from ScopeEditPart, but there was
* no obvious way to share this code in a meaningful way.
*/
public class InvokeEditPart extends LeafEditPart implements ILayoutAware{
// Whether to show each of the handlers.
// TODO: Initialize these from the preferences store
private boolean showFH = false, showCH = false;
// The figure which holds contentFigure and auxilaryFigure as children
private IFigure parentFigure;
// The figure which holds fault handler, compensation handler and event handler
private IFigure auxilaryFigure;
// The Handler which handles the drawing of links to the handlers.
private InvokeHandlerLinker handlerLinker;
/**
* Override getDragTracker to supply double-click behaviour to expand
* the fault handler if one exists
*/
@Override
public DragTracker getDragTracker(Request request) {
return new BPELDragEditPartsTracker(this) {
@Override
protected boolean handleButtonDown(int button) {
Point point = getLocation();
if (border.isPointInFaultImage(point.x, point.y)) {
setShowFaultHandler(!getShowFaultHandler());
}
if (border.isPointInCompensationImage(point.x, point.y)) {
setShowCompensationHandler(!getShowCompensationHandler());
}
return super.handleButtonDown(button);
}
};
}
/**
* @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals()
*/
@Override
public void refreshVisuals() {
super.refreshVisuals();
border.setShowFault(getFaultHandler() != null);
border.setShowCompensation(getCompensationHandler() != null);
if(ModelHelper.isHorizontalLayout(getModel())){
auxilaryFigure.getInsets().top = contentFigure.getBounds().height+10;
}else
auxilaryFigure.getInsets().top = 0;
getFigure().repaint();
}
// here's the one from scope edit part
@Override
protected IFigure createFigure() {
if (image == null) {
ILabeledElement element = BPELUtil.adapt(getActivity(), ILabeledElement.class);
image = element.getSmallImage(getActivity());
}
this.imageLabel = new Label(image);
this.nameLabel = new Label(getLabel());
editPartMarkerDecorator = new BPELEditPartMarkerDecorator((EObject)getModel(), new LeafDecorationLayout());
editPartMarkerDecorator.addMarkerMotionListener(getMarkerMotionListener());
this.parentFigure = new Figure();
AlignedFlowLayout layout = new AlignedFlowLayout();
layout.setHorizontal(true);
layout.setHorizontalSpacing(0);
layout.setVerticalSpacing(0);
parentFigure.setLayoutManager(layout);
IFigure gradient = new GradientFigure(getModel());
FlowLayout flowLayout = new FlowLayout();
flowLayout.setMinorAlignment(FlowLayout.ALIGN_CENTER);
gradient.setLayoutManager(flowLayout);
gradient.setForegroundColor(BPELUIPlugin.INSTANCE.getColorRegistry().get(IBPELUIConstants.COLOR_BLACK));
gradient.add(imageLabel);
gradient.add(nameLabel);
gradient.addMouseMotionListener(getMouseMotionListener());
this.contentFigure = gradient;
parentFigure.add(contentFigure);
this.auxilaryFigure = new Figure();
layout = new AlignedFlowLayout();
layout.setHorizontal(!ModelHelper.isHorizontalLayout(getModel()));
auxilaryFigure.setBorder(new MarginBorder(0,0,0,0));
auxilaryFigure.setLayoutManager(layout);
parentFigure.add(auxilaryFigure);
this.border = new LeafBorder(gradient);
this.border.setEditPart(this);
border.setShowFault(getFaultHandler() != null);
border.setShowCompensation(getCompensationHandler() != null);
gradient.setBorder(border);
return editPartMarkerDecorator.createFigure(parentFigure);
}
public void setShowFaultHandler(boolean showFaultHandler) {
this.showFH = showFaultHandler;
// Call refresh so that both refreshVisuals and refreshChildren will be called.
refresh();
}
public void setShowCompensationHandler(boolean showCompensationHandler) {
this.showCH = showCompensationHandler;
// Call refresh so that both refreshVisuals and refreshChildren will be called.
refresh();
}
public boolean getShowFaultHandler() {
return showFH;
}
public boolean getShowCompensationHandler() {
return showCH;
}
public FaultHandler getFaultHandler() {
IFaultHandlerHolder holder = BPELUtil.adapt(getActivity(), IFaultHandlerHolder.class);
if (holder != null) {
return holder.getFaultHandler(getActivity());
}
return null;
}
public CompensationHandler getCompensationHandler() {
ICompensationHandlerHolder holder = BPELUtil.adapt(getActivity(), ICompensationHandlerHolder.class);
if (holder != null) {
return holder.getCompensationHandler(getActivity());
}
return null;
}
/**
* The top inner implicit connection needs an offset of eight to compensate for
* the expansion icon. All other connections are centered on the contentFigure
* with an offset of 0.
*/
@Override
public ConnectionAnchor getConnectionAnchor(int location) {
switch(location){
case CenteredConnectionAnchor.TOP_INNER:
return new CenteredConnectionAnchor(contentFigure, location, 8);
case CenteredConnectionAnchor.LEFT:
return new CenteredConnectionAnchor(contentFigure, CenteredConnectionAnchor.LEFT_INNER, 0);
case CenteredConnectionAnchor.RIGHT:
return new CenteredConnectionAnchor(contentFigure, CenteredConnectionAnchor.RIGHT_INNER,0);
default:
return new CenteredConnectionAnchor(contentFigure,location,0);
}
}
/**
* Override addChildVisual so that it adds the childEditPart to the correct
* figure. FH/EH/CH go in a different figure than the activity does.
*/
@Override
protected void addChildVisual(EditPart childEditPart, int index) {
IFigure child = ((GraphicalEditPart)childEditPart).getFigure();
IFigure content = getContentPane(childEditPart);
if (content != null) {
if (content == auxilaryFigure && content.getChildren().size() > 0) {
// The handlers have to get sorted to properly display the handlerlinks
content.add(child, getIndexForChild(childEditPart));
} else
content.add(child);
}
}
private int getIndexForChild(EditPart editPart) {
return editPart.getModel() instanceof CompensationHandler ? 0 : 1;
}
/**
* Override removeChildVisual so that it removes the childEditPart from
* the correct figure. FH/EH/CH live in a different figure than the
* activity does.
*/
@Override
protected void removeChildVisual(EditPart childEditPart) {
IFigure child = ((GraphicalEditPart)childEditPart).getFigure();
getContentPane(childEditPart).remove(child);
}
/**
* Also overridden to call getContentPane(child) in the appropriate place.
*/
@Override
protected void reorderChild(EditPart child, int index) {
// Save the constraint of the child so that it does not
// get lost during the remove and re-add.
IFigure childFigure = ((GraphicalEditPart) child).getFigure();
LayoutManager layout = getContentPane(child).getLayoutManager();
Object constraint = null;
if (layout != null)
constraint = layout.getConstraint(childFigure);
removeChildVisual(child);
List<EditPart> children = getChildren();
children.remove(child);
children.add(index, child);
addChildVisual(child, index);
setLayoutConstraint(child, childFigure, constraint);
}
/**
* Yet Another Overridden Method.
*/
@Override
public void setLayoutConstraint(EditPart child, IFigure childFigure, Object constraint) {
getContentPane(child).setConstraint(childFigure, constraint);
}
/**
* This method hopefully shouldn't be called, in favour of getContentPane(EditPart).
*/
@Override
public IFigure getContentPane() {
return contentFigure;
}
/**
* Return the appropriate content pane into which the given child
* should be inserted. For faultHandler, compensationHandler and
* eventHandler, the answer is auxilaryFigure; for activities it
* is the contentFigure.
*/
protected IFigure getContentPane(EditPart childEditPart) {
Object model = childEditPart.getModel();
if (model instanceof FaultHandler) {
return auxilaryFigure;
} else if (model instanceof CompensationHandler) {
return auxilaryFigure;
}
return contentFigure;
}
/**
* Return a list of the model children that should be displayed.
* This includes fault handlers and compensation handlers.
*/
@Override
protected List<BPELExtensibleElement> getModelChildren() {
ArrayList<BPELExtensibleElement> children = new ArrayList<BPELExtensibleElement>();
if (showFH) {
FaultHandler faultHandler = this.getFaultHandler();
if (faultHandler != null) children.add(children.size(), faultHandler);
}
if (showCH) {
CompensationHandler compensationHandler = this.getCompensationHandler();
if (compensationHandler != null) children.add(children.size(), compensationHandler);
}
return children;
}
@Override
public IFigure getMainActivityFigure() {
return contentFigure;
}
@Override
public void refresh() {
super.refresh();
getHandlerLinker().refreshHandlerLinks();
}
private InvokeHandlerLinker getHandlerLinker() {
if(handlerLinker == null){
handlerLinker = new InvokeHandlerLinker(this);
}
return handlerLinker;
}
@Override
protected void clearConnections() {
super.clearConnections();
getHandlerLinker().clearHandlerConnections();
}
@Override
protected void handleModelChanged() {
super.handleModelChanged();
this.showCH = getCompensationHandler() != null ? true : false;
this.showFH = getFaultHandler() != null ? true : false;
refresh();
}
public void switchLayout(boolean horizontal) {
((AlignedFlowLayout)auxilaryFigure.getLayoutManager()).setHorizontal(!horizontal);
}
}