/******************************************************************************* * 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.ui.editparts.borders.DrawerBorder; import org.eclipse.bpel.ui.editparts.policies.BPELOrderedLayoutEditPolicy; import org.eclipse.bpel.ui.editparts.policies.ContainerHighlightEditPolicy; import org.eclipse.bpel.ui.figures.CenteredConnectionAnchor; import org.eclipse.bpel.ui.util.ImplicitLinkHandlerConnectionRouter; import org.eclipse.bpel.ui.util.ModelHelper; import org.eclipse.draw2d.ConnectionAnchor; import org.eclipse.draw2d.FlowLayout; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.PolylineConnection; import org.eclipse.gef.EditPolicy; /** * @author IBM, Original contribution. * @author Michal Chmielewski (michal.chmielewski@oracle.com) */ public class SequenceEditPart extends CollapsableEditPart { private class SequenceHorizontalBPELOrderedLayoutPolicy extends BPELOrderedLayoutEditPolicy{ @Override protected ArrayList<PolylineConnection> createHorizontalConnections(BPELEditPart parent) { ArrayList<PolylineConnection> connections = new ArrayList<PolylineConnection>(); List children = getConnectionChildren(parent); BPELEditPart sourcePart, targetPart; ConnectionAnchor sourceAnchor = null, targetAnchor = null; sourcePart = parent; sourceAnchor = sourcePart .getConnectionAnchor(CenteredConnectionAnchor.LEFT); if (children != null) { for (int i = 0; i < children.size(); i++) { if (i == 0) { // Link from the left border to the first child targetPart = (BPELEditPart) children.get(i); targetAnchor = targetPart .getConnectionAnchor(CenteredConnectionAnchor.LEFT); if (sourceAnchor != null && targetAnchor != null) connections.add(createConnection(sourceAnchor, targetAnchor, arrowColor)); } if (i < children.size() - 1) { sourcePart = (BPELEditPart) children.get(i); sourceAnchor = sourcePart .getConnectionAnchor(CenteredConnectionAnchor.RIGHT); targetPart = (BPELEditPart) children.get(i + 1); targetAnchor = targetPart .getConnectionAnchor(CenteredConnectionAnchor.LEFT); } else { // Link from the last child to the right border sourcePart = (BPELEditPart) children.get(i); sourceAnchor = sourcePart .getConnectionAnchor(CenteredConnectionAnchor.RIGHT); targetAnchor = parent .getConnectionAnchor(CenteredConnectionAnchor.RIGHT); } if (sourceAnchor != null && targetAnchor != null) { PolylineConnection connection = createConnection( sourceAnchor, targetAnchor, arrowColor); if (sourcePart instanceof StartNodeEditPart || sourcePart instanceof ScopeEditPart || sourcePart instanceof InvokeEditPart) { boolean horizontal = ModelHelper.getBPELEditor( getHost().getModel()).isHorizontalLayout(); connection .setConnectionRouter(new ImplicitLinkHandlerConnectionRouter( horizontal)); } connections.add(connection); } } } return connections; } } @Override protected void createEditPolicies() { super.createEditPolicies(); // Show the selection rectangle installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new ContainerHighlightEditPolicy(false, true) { @Override protected int getDrawerInset() { return DrawerBorder.DRAWER_WIDTH; } @Override protected int getNorthInset() { if (isCollapsed()) { return 0; } // This one is tricky, it depends on the font size. return 10 ; } @Override protected int getSouthInset() { return isCollapsed() ? 8 : 2; } @Override protected int getEastInset() { return DrawerBorder.DRAWER_WIDTH ; } @Override protected int getWestInset() { return DrawerBorder.DRAWER_WIDTH ; } }); BPELOrderedLayoutEditPolicy policy = null; if(ModelHelper.isHorizontalLayout(getModel())) policy = new SequenceHorizontalBPELOrderedLayoutPolicy(); else policy = new BPELOrderedLayoutEditPolicy(); installEditPolicy(EditPolicy.LAYOUT_ROLE, policy); } @Override protected void configureExpandedFigure(IFigure aFigure) { FlowLayout layout = new FlowLayout(); layout.setMinorAlignment(FlowLayout.ALIGN_CENTER); layout.setHorizontal(ModelHelper.isHorizontalLayout(getModel())); layout.setMajorSpacing(SPACING); layout.setMinorSpacing(SPACING); aFigure.setLayoutManager(layout); } public void switchLayout(boolean horizontal) { removeEditPolicy(EditPolicy.LAYOUT_ROLE); EditPolicy newPolicy = null; if(horizontal){ newPolicy = new SequenceHorizontalBPELOrderedLayoutPolicy(); }else newPolicy = new BPELOrderedLayoutEditPolicy(); installEditPolicy(EditPolicy.LAYOUT_ROLE, newPolicy); ((FlowLayout)contentFigure.getLayoutManager()).setHorizontal(horizontal); } }