/******************************************************************************* * Copyright (c) 2004, 2006 Sybase, Inc. 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: * Sybase, Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.jst.jsf.facesconfig.ui.preference; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Vector; import org.eclipse.draw2d.ConnectionAnchor; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Layer; import org.eclipse.draw2d.LayoutManager; import org.eclipse.draw2d.PolylineConnection; import org.eclipse.draw2d.PositionConstants; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Insets; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.swt.graphics.Image; /** * The <code>BaseNodeFigure</code> class is the base class for all the figures * representing DiagramNodes, ie those that can have ports with maxConnections * to other nodes. * * Assumes that all NodeFigures have some number of input and output ports * * @author ddean * */ /*package*/ class BaseNodeFigure extends Figure implements IBaseFigure { private IBaseFigure baseFigure; private boolean anchorsVisible = true; private Hashtable connectionAnchors = new Hashtable(7); private Vector inputConnectionAnchors = new Vector(2, 2); private Vector outputConnectionAnchors = new Vector(2, 2); private Vector topConnectionAnchors = new Vector(); private Vector bottomConnectionAnchors = new Vector(); private Vector leftConnectionAnchors = new Vector(); private Vector rightConnectionAnchors = new Vector(); /** * @param figure */ public BaseNodeFigure(IBaseFigure figure) { setBaseFigure(figure); ObserveVisibleXYLayout layout = new ObserveVisibleXYLayout(); layout.setObserveVisibility(true); setLayoutManager(layout); } /** * @param figure */ public void setBaseFigure(IBaseFigure figure) { setBaseFigure(figure, new Rectangle(0, 0, -1, -1)); } public void setHighlight(boolean flag) { if (baseFigure != null) { moveToTop(this, baseFigure); baseFigure.setHighlight(flag); } } /** * @param figure * @param constraint */ public void setBaseFigure(IBaseFigure figure, Rectangle constraint) { if (!getChildren().contains(figure)) { if (getChildren().contains(baseFigure)) remove(baseFigure); baseFigure = figure; if (!getChildren().contains(baseFigure)) { // CR389070: Figures are abbreviating rule figures names and // making them unreadable if (getParent() != null && getParent().getLayoutManager() != null) { Rectangle r = getBounds().getCopy(); r.width = -1; r.height = -1; getParent().getLayoutManager().setConstraint(this, r); } // CR389495: Working with nested complex activities causes in // the BP editor causes lockup // ensure that constraints are set on figure before add() - this // will cause a layout() this.add(baseFigure, constraint, 0); } } } /** * @return the base figure */ public IBaseFigure getBaseFigure() { return baseFigure; } /*************************************************************************** * Input/Output Ports **************************************************************************/ /** * Add an input port and its anchor * * @param portName * unique name to refer to the port */ public void addInput(String portName) { InputPortFigure inputPort = new InputPortFigure(); add(inputPort); inputPort.setToolTipText(portName); PortConnectionAnchor anchor = new PortConnectionAnchor(inputPort); getTargetConnectionAnchors().add(anchor); connectionAnchors.put(portName, anchor); } /** * Add an output port and its anchor * * @param portName * unique name to refer to the port * @return the connection anchor */ public PortConnectionAnchor addOutput(String portName) { OutputPortFigure outputPort = new OutputPortFigure(); add(outputPort); outputPort.setToolTipText(portName); PortConnectionAnchor anchor = new PortConnectionAnchor(outputPort); getSourceConnectionAnchors().add(anchor); connectionAnchors.put(portName, anchor); return anchor; } /** * Searches for and returns the anchor on this figure that is closest to the * reference point <code>p</code> * * @param p * the reference point * @return the anchor on this figure that is closest to <code>p</code> */ public ConnectionAnchor connectionAnchorAt(Point p) { ConnectionAnchor closest = null; long min = Long.MAX_VALUE; Enumeration e = getSourceConnectionAnchors().elements(); while (e.hasMoreElements()) { ConnectionAnchor c = (ConnectionAnchor) e.nextElement(); Point p2 = c.getLocation(null); long d = p.getDistance2(p2); if (d < min) { min = d; closest = c; } } e = getTargetConnectionAnchors().elements(); while (e.hasMoreElements()) { ConnectionAnchor c = (ConnectionAnchor) e.nextElement(); Point p2 = c.getLocation(null); long d = p.getDistance2(p2); if (d < min) { min = d; closest = c; } } return closest; } /** * returns an anchor given its name * * @param portName * name of the anchor * @return the anchor with the name <code>portName</code> */ public ConnectionAnchor getConnectionAnchor(String portName) { return (ConnectionAnchor) connectionAnchors.get(portName); } /** * returns the name of the specified anchor * * @param c * the anchor whose name is requested * @return the name of the specifed anchor */ public String getConnectionAnchorName(ConnectionAnchor c) { Enumeration enumer = connectionAnchors.keys(); String key; while (enumer.hasMoreElements()) { key = (String) enumer.nextElement(); if (connectionAnchors.get(key).equals(c)) return key; } return null; } /** * returns the source connection anchor that is closest to the reference * point * * @param p * the reference point * @return the closest connection anchor to <code>p</code> */ public ConnectionAnchor getSourceConnectionAnchorAt(Point p) { ConnectionAnchor closest = null; long min = Long.MAX_VALUE; Enumeration e = getSourceConnectionAnchors().elements(); while (e.hasMoreElements()) { ConnectionAnchor c = (ConnectionAnchor) e.nextElement(); Point p2 = c.getLocation(null); long d = p.getDistance2(p2); if (d < min) { min = d; closest = c; } } return closest; } /** * returns all the source connection anchors on this node figure * * @return a vector of all the source connection anchors for this figure */ public Vector getSourceConnectionAnchors() { return outputConnectionAnchors; } /** * returns the target connection anchor that is closest to the reference * point * * @param p * the reference point * @return the closest target connection anchor to <code>p</code> */ public ConnectionAnchor getTargetConnectionAnchorAt(Point p) { ConnectionAnchor closest = null; long min = Long.MAX_VALUE; Enumeration e = getTargetConnectionAnchors().elements(); while (e.hasMoreElements()) { ConnectionAnchor c = (ConnectionAnchor) e.nextElement(); Point p2 = c.getLocation(null); long d = p.getDistance2(p2); if (d < min) { min = d; closest = c; } } return closest; } /** * returns all the target connection anchors on this node figure * * @return a vector of all the target connection anchors for this figure */ public Vector getTargetConnectionAnchors() { return inputConnectionAnchors; } /** * Returns the name of the specified anchor * * @param anchor * the connectio anchor whose name is requested * @return the anchor's name */ public String getNameForAnchor(ConnectionAnchor anchor) { if (anchor != null) { Iterator it = connectionAnchors.keySet().iterator(); String name; while (it.hasNext()) { name = (String) it.next(); if (anchor.equals(connectionAnchors.get(name))) { return name; } } } return null; } /** * @param visible */ public void setAnchorsVisible(boolean visible) { if (anchorsVisible != visible) { anchorsVisible = visible; //ConnectionAnchor port; List all = new ArrayList(); all.addAll(getTargetConnectionAnchors()); all.addAll(getSourceConnectionAnchors()); Iterator it = all.iterator(); while (it.hasNext()) { IFigure fig = ((ConnectionAnchor) it.next()).getOwner(); fig.setVisible(visible); } validate(); } } /** * Determine which side of the figure to place each anchor based on the * relative position (north, south, east or west) of the connection line's * opposite anchor. If the anchor is not connected to anything else, the * default is to place target (input) anchors on the left and source * (output) anchors on the right. */ private void determineAnchorPositions() { Iterator it; topConnectionAnchors.clear(); bottomConnectionAnchors.clear(); leftConnectionAnchors.clear(); rightConnectionAnchors.clear(); if (anchorsVisible) { //final Dimension size = baseFigure.getPreferredSize(); PortConnectionAnchor port; // start with outputs it = getSourceConnectionAnchors().iterator(); while (it.hasNext()) { port = (PortConnectionAnchor) it.next(); // CR386077: SplitActivity True and False outputs switch // positions based on their targets int direction = port.getOrientation(); if (direction == PositionConstants.NONE) { Point loc = port.getOwner().getParent().getBounds() .getLocation(); // loc.x += size.width/2; // loc.y += size.height/2; Iterator itc = port.getConnections().iterator(); if (itc.hasNext()) { while (itc.hasNext()) { PolylineConnection conn = (PolylineConnection) itc .next(); ConnectionAnchor otherPort; if (port == conn.getSourceAnchor()) otherPort = conn.getTargetAnchor(); else otherPort = conn.getSourceAnchor(); if (otherPort.getOwner() == null) continue; Point otherLoc = otherPort.getOwner().getParent() .getBounds().getLocation(); // Dimension otherSize = // ((BaseNodeFigure)otherPort.getOwner().getParent()).getBaseFigure().getPreferredSize(); // otherLoc.x += otherSize.width/2; // otherLoc.y += otherSize.height/2; direction = loc.getPosition(otherLoc); if (direction == PositionConstants.NORTH) topConnectionAnchors.add(port); else if (direction == PositionConstants.SOUTH) bottomConnectionAnchors.add(port); else if (direction == PositionConstants.WEST) leftConnectionAnchors.add(port); else rightConnectionAnchors.add(port); ((PortFigure) port.getOwner()) .setOrientation(direction); break; // currently, only the first connection is // considered } } else { rightConnectionAnchors.add(port); ((PortFigure) port.getOwner()) .setOrientation(PositionConstants.EAST); } } else { // CR386077: SplitActivity True and False outputs switch // positions based on their targets if (direction == PositionConstants.NORTH) topConnectionAnchors.add(port); else if (direction == PositionConstants.SOUTH) bottomConnectionAnchors.add(port); else if (direction == PositionConstants.WEST) leftConnectionAnchors.add(port); else rightConnectionAnchors.add(port); } } it = getTargetConnectionAnchors().iterator(); while (it.hasNext()) { port = (PortConnectionAnchor) it.next(); // CR386077: SplitActivity True and False outputs switch // positions based on their targets int direction = port.getOrientation(); if (direction == PositionConstants.NONE) { Point loc = port.getOwner().getParent().getBounds() .getLocation(); // loc.x += size.width/2; // loc.y += size.height/2; Iterator itc = port.getConnections().iterator(); if (itc.hasNext()) { while (itc.hasNext()) { PolylineConnection conn = (PolylineConnection) itc .next(); ConnectionAnchor otherPort; if (port == conn.getSourceAnchor()) otherPort = conn.getTargetAnchor(); else otherPort = conn.getSourceAnchor(); if (otherPort.getOwner() == null) continue; Point otherLoc = otherPort.getOwner().getParent() .getBounds().getLocation(); // Dimension otherSize = // ((BaseNodeFigure)otherPort.getOwner().getParent()).getBaseFigure().getPreferredSize(); // otherLoc.x += otherSize.width/2; // otherLoc.y += otherSize.height/2; direction = loc.getPosition(otherLoc); if (direction == PositionConstants.NORTH) topConnectionAnchors.add(port); else if (direction == PositionConstants.SOUTH) bottomConnectionAnchors.add(port); else if (direction == PositionConstants.EAST) rightConnectionAnchors.add(port); else leftConnectionAnchors.add(port); ((PortFigure) port.getOwner()) .setOrientation(direction); break; // currently, only the first connection is // considered } } else { leftConnectionAnchors.add(port); ((PortFigure) port.getOwner()) .setOrientation(PositionConstants.WEST); } } else { // CR386077: SplitActivity True and False outputs switch // positions based on their targets if (direction == PositionConstants.NORTH) topConnectionAnchors.add(port); else if (direction == PositionConstants.SOUTH) bottomConnectionAnchors.add(port); else if (direction == PositionConstants.EAST) rightConnectionAnchors.add(port); else leftConnectionAnchors.add(port); } } Comparator comparePorts = new Comparator() { public int compare(Object arg0, Object arg1) { PortConnectionAnchor port0 = (PortConnectionAnchor) arg0; if (port0.getConnections().size() < 1) return 0; PortConnectionAnchor port1 = (PortConnectionAnchor) arg1; if (port1.getConnections().size() < 1) return 0; // CR386077: SplitActivity True and False outputs switch // positions based on their targets if (port0.getOrientation() != PositionConstants.NONE) return 0; if (port1.getOrientation() != PositionConstants.NONE) return 0; PolylineConnection conn0 = (PolylineConnection) port0 .getConnections().get(0); ConnectionAnchor otherPort0; if (port0 == conn0.getSourceAnchor()) otherPort0 = conn0.getTargetAnchor(); else otherPort0 = conn0.getSourceAnchor(); Point otherLoc0 = otherPort0.getOwner().getParent() .getBounds().getLocation(); // Dimension otherSize0 = // ((BaseNodeFigure)otherPort0.getOwner().getParent()).getBaseFigure().getPreferredSize(); // otherLoc0.x += otherSize0.width/2; // otherLoc0.y += otherSize0.height/2; PolylineConnection conn1 = (PolylineConnection) port1 .getConnections().get(0); ConnectionAnchor otherPort1; if (port1 == conn1.getSourceAnchor()) otherPort1 = conn1.getTargetAnchor(); else otherPort1 = conn1.getSourceAnchor(); Point otherLoc1 = otherPort1.getOwner().getParent() .getBounds().getLocation(); // Dimension otherSize1 = ((BaseNodeFigure) otherPort1 // .getOwner().getParent()).getBaseFigure() // .getPreferredSize(); // otherLoc1.x += otherSize1.width/2; // otherLoc1.y += otherSize1.height/2; switch (((PortFigure) port0.getOwner()).getOrientation()) { case PositionConstants.NORTH: case PositionConstants.SOUTH: return otherLoc0.x - otherLoc1.x; case PositionConstants.EAST: case PositionConstants.WEST: return otherLoc0.y - otherLoc1.y; } return 0; } }; // order the anchors on each side so connection lines don't cross Collections.sort(topConnectionAnchors, comparePorts); Collections.sort(leftConnectionAnchors, comparePorts); Collections.sort(bottomConnectionAnchors, comparePorts); Collections.sort(rightConnectionAnchors, comparePorts); } } private void placeAnchors() { determineAnchorPositions(); if (anchorsVisible) { Iterator it; PortConnectionAnchor port; int y, x; Dimension sz = baseFigure.getPreferredSize(); LayoutManager layout = getLayoutManager(); // CR389070: Figures are abbreviating rule figures names and making // them unreadable Dimension d = getAnchorSize(); // left ports x = 0; y = FigureConstants.PORT_SPACING / 2; // CR374981: Long activity labels do not get wrapped or truncated // keep a constant inset on all 4 sides of the icon // if ( topConnectionAnchors.size()>0 ) y += d.height; y += (sz.height - (leftConnectionAnchors.size() * (d.height + FigureConstants.PORT_SPACING))) / 2; it = leftConnectionAnchors.iterator(); while (it.hasNext()) { port = (PortConnectionAnchor) it.next(); Rectangle r = new Rectangle(x, y, -1, -1); Rectangle oldrect = (Rectangle) layout.getConstraint(port .getOwner()); if (!r.equals(oldrect)) layout.setConstraint(port.getOwner(), new Rectangle(x, y, -1, -1)); y += d.height + FigureConstants.PORT_SPACING; } // right ports x = sz.width; // CR374981: Long activity labels do not get wrapped or truncated // if ( leftConnectionAnchors.size()>0 ) x += d.width; y = FigureConstants.PORT_SPACING / 2; // CR374981: Long activity labels do not get wrapped or truncated // if ( topConnectionAnchors.size()>0 ) y += d.height; y += (sz.height - (rightConnectionAnchors.size() * (d.height + FigureConstants.PORT_SPACING))) / 2; it = rightConnectionAnchors.iterator(); while (it.hasNext()) { port = (PortConnectionAnchor) it.next(); Rectangle r = new Rectangle(x, y, -1, -1); Rectangle oldrect = (Rectangle) layout.getConstraint(port .getOwner()); if (!r.equals(oldrect)) layout.setConstraint(port.getOwner(), new Rectangle(x, y, -1, -1)); y += d.height + FigureConstants.PORT_SPACING; } // top ports y = 0; x = FigureConstants.PORT_SPACING / 2; // CR374981: Long activity labels do not get wrapped or truncated // if ( leftConnectionAnchors.size()>0 ) x += d.width; x += (sz.width - (topConnectionAnchors.size() * (d.width + FigureConstants.PORT_SPACING))) / 2; it = topConnectionAnchors.iterator(); while (it.hasNext()) { port = (PortConnectionAnchor) it.next(); Rectangle r = new Rectangle(x, y, -1, -1); Rectangle oldrect = (Rectangle) layout.getConstraint(port .getOwner()); if (!r.equals(oldrect)) layout.setConstraint(port.getOwner(), new Rectangle(x, y, -1, -1)); x += d.width + FigureConstants.PORT_SPACING; } // bottom ports y = sz.height; // CR374981: Long activity labels do not get wrapped or truncated // if ( topConnectionAnchors.size()>0 ) y += d.height; x = FigureConstants.PORT_SPACING / 2; // CR374981: Long activity labels do not get wrapped or truncated // if ( leftConnectionAnchors.size()>0 ) x += d.width; x += (sz.width - (bottomConnectionAnchors.size() * (d.width + FigureConstants.PORT_SPACING))) / 2; it = bottomConnectionAnchors.iterator(); while (it.hasNext()) { port = (PortConnectionAnchor) it.next(); Rectangle r = new Rectangle(x, y, -1, -1); Rectangle oldrect = (Rectangle) layout.getConstraint(port .getOwner()); if (!r.equals(oldrect)) layout.setConstraint(port.getOwner(), new Rectangle(x, y, -1, -1)); x += d.width + FigureConstants.PORT_SPACING; } } } /** * CR389070: Figures are abbreviating rule figures names and making them * unreadable Anchor size is now dependent on icon size, not constant. Asks * the connection anchor for its size. */ private Dimension getAnchorSize() { Dimension d = new Dimension(FigureConstants.PORT_SIDE, FigureConstants.PORT_SIDE); if (!connectionAnchors.isEmpty()) { Iterator iter = connectionAnchors.values().iterator(); PortConnectionAnchor a = (PortConnectionAnchor) iter.next(); d = a.getOwner().getPreferredSize(); } return d; } /** * @return the anchor insets */ protected final Insets getAnchorInsets() { Insets in = new Insets(0, 0, 0, 0); // CR389070: Figures are abbreviating rule figures names and making them // unreadable Dimension d = getAnchorSize(); // CR374981: Long activity labels do not get wrapped or truncated // if ( leftConnectionAnchors.size()>0 ) in.left = d.width; // CR374981: Long activity labels do not get wrapped or truncated // if ( rightConnectionAnchors.size()>0 ) in.right = d.width; // CR374981: Long activity labels do not get wrapped or truncated // if ( topConnectionAnchors.size()>0 ) in.top = d.height; // CR374981: Long activity labels do not get wrapped or truncated // if ( bottomConnectionAnchors.size()>0 ) in.bottom = d.height; return in; } public void invalidate() { super.invalidate(); } /** * validate method override to arrange the input and output ports around the * links of the node figures */ public void validate() { placeAnchors(); // CR389070: Figures are abbreviating rule figures names and making them // unreadable int x = 0; int y = 0; // if anchors are not visible (CompoundNodeFigure is maximized) always // set position at 0,0 if (anchorsVisible) { Dimension d = getAnchorSize(); // CR374981: Long activity labels do not get wrapped or truncated // if ( leftConnectionAnchors.size()>0 ) x = d.width; // CR374981: Long activity labels do not get wrapped or truncated // if ( topConnectionAnchors.size()>0 ) y = d.height; } getLayoutManager().setConstraint(baseFigure, new Rectangle(x, y, -1, -1)); layout(); super.validate(); } /*************************************************************************** * Miscellaneous **************************************************************************/ /* * (non-Javadoc) * * @see org.eclipse.draw2d.Figure#useLocalCoordinates() */ protected boolean useLocalCoordinates() { return true; } /* * (non-Javadoc) * * @see org.eclipse.draw2d.IFigure#setBounds(org.eclipse.draw2d.geometry.Rectangle) */ public void setBounds(Rectangle rect) { Rectangle r = rect.getCopy(); r.x = 0; r.y = 0; if (anchorsVisible) { // CR389070: Figures are abbreviating rule figures names and making // them unreadable Dimension d = getAnchorSize(); // CR374981: Long activity labels do not get wrapped or truncated // if ( leftConnectionAnchors.size()>0 ) { r.x += d.width; r.width -= d.width; } // CR374981: Long activity labels do not get wrapped or truncated // if ( rightConnectionAnchors.size()>0 ) r.width -= d.width; // CR374981: Long activity labels do not get wrapped or truncated // if ( topConnectionAnchors.size()>0 ) { r.y += d.height; r.height -= d.height; } // CR374981: Long activity labels do not get wrapped or truncated // if ( bottomConnectionAnchors.size()>0 ) r.height -= d.height; } baseFigure.setBounds(r); r.setLocation(rect.getLocation()); super.setBounds(r); } public Rectangle getBounds() { Dimension size = baseFigure.getBounds().getSize(); if (anchorsVisible) { // CR389070: Figures are abbreviating rule figures names and making // them unreadable Dimension d = getAnchorSize(); // CR374981: Long activity labels do not get wrapped or truncated // if ( leftConnectionAnchors.size()>0 ) size.width += d.width; // CR374981: Long activity labels do not get wrapped or truncated // if ( rightConnectionAnchors.size()>0 ) size.width += d.width; // CR374981: Long activity labels do not get wrapped or truncated // if ( topConnectionAnchors.size()>0 ) size.height += d.height; // CR374981: Long activity labels do not get wrapped or truncated // if ( bottomConnectionAnchors.size()>0 ) size.height += d.height; } Rectangle r = super.getBounds(); r.setSize(size); return r; } /* * (non-Javadoc) * * @see org.eclipse.draw2d.IFigure#getPreferredSize(int, int) */ public Dimension getPreferredSize(int wHint, int hHint) { Dimension size = baseFigure.getPreferredSize(wHint, hHint).getCopy(); if (anchorsVisible) { // CR389070: Figures are abbreviating rule figures names and making // them unreadable Dimension d = getAnchorSize(); // CR374981: Long activity labels do not get wrapped or truncated // if ( leftConnectionAnchors.size()>0 ) size.width += d.width; // CR374981: Long activity labels do not get wrapped or truncated // if ( rightConnectionAnchors.size()>0 ) size.width += d.width; // CR374981: Long activity labels do not get wrapped or truncated // if ( topConnectionAnchors.size()>0 ) size.height += d.height; // CR374981: Long activity labels do not get wrapped or truncated // if ( bottomConnectionAnchors.size()>0 ) size.height += d.height; } return size; } private static void moveToTop(IFigure parent, IFigure child) { parent.getChildren().remove(child); parent.getChildren().add(child); } /** * move to top layer */ protected final void moveToTop() { IFigure parent = getParent(); IFigure child = this; while (parent != null && !(parent instanceof Layer)) { child = parent; parent = parent.getParent(); } if (parent instanceof Layer) { parent.getChildren().remove(child); parent.getChildren().add(child); } } /*************************************************************************** * IBaseFigure methods delegate to the baseFigure **************************************************************************/ /* * (non-Javadoc) * * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setText(java.lang.String) */ public void setText(String text) { baseFigure.setText(text); } public void setIcon(Image image) { baseFigure.setIcon(image); } /** * The description property of a DiagramNode is displayed as a tool tip. * This method is used to set it. Passing a null or zero-length string will * remove the tool tip * * @param text * the description to use for this node's tool tip * * @see IBaseFigure#setToolTipText(java.lang.String) */ public void setToolTipText(String text) { baseFigure.setToolTipText(text); } /* * (non-Javadoc) * * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#addDecorator(com.sybase.stf.gem.diagram.editor.figures.BaseFigureDecorator) */ public void addDecorator(BaseFigureDecorator decorator) { baseFigure.addDecorator(decorator); } /* * (non-Javadoc) * * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator() */ public void removeDecorator() { baseFigure.removeDecorator(); } /* * (non-Javadoc) * * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator(int) */ public void removeDecorator(int position) { baseFigure.removeDecorator(position); } /* * (non-Javadoc) * * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getDecorators() */ public List getDecorators() { return baseFigure.getDecorators(); } /* * (non-Javadoc) * * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getText() */ public String getText() { return baseFigure.getText(); } /* * CR374981: Long activity labels do not get wrapped or truncated This * method was added to the IBaseFigure interface to support direct edit of * figure labels on the canvas. */ public Rectangle getTextBounds() { Rectangle r = baseFigure.getTextBounds().getCopy(); r.x += getBounds().x; r.y += getBounds().y; return r; } /* * (non-Javadoc) * * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getIcon() */ public Image getIcon() { return baseFigure.getIcon(); } /* * (non-Javadoc) * * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getToolTipText() */ public String getToolTipText() { return baseFigure.getToolTipText(); } }