/******************************************************************************* * 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); } }