/****************************************************************************** * Copyright (c) 2003, 2004 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.gmf.runtime.gef.ui.figures; import java.util.Iterator; import java.util.ListIterator; import org.eclipse.draw2d.Border; import org.eclipse.draw2d.ConnectionAnchor; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.StackLayout; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; /** * Wrapper <code>NodeFigure</code> figure to contain other figures, which may have different borders. * * @author sshaw */ public class WrapperNodeFigure extends NodeFigure { private IFigure subFigure; /** * Composite pattern for wrapping a template list compartment around any * potential figure. * * @param subFigure the <code>IFigure</code> that is being wrapped. */ public WrapperNodeFigure(IFigure subFigure) { setLayoutManager(new StackLayout() { public boolean isObservingVisibility() { return true; } }); add(subFigure); this.subFigure = subFigure; } /* * (non-Javadoc) * @see org.eclipse.draw2d.IFigure#containsPoint(int, int) */ public boolean containsPoint(int x, int y) { Iterator iter = this.getChildren().iterator(); while (iter.hasNext()){ Figure figure = (Figure)iter.next(); if (figure.containsPoint(x,y)){ return true; } } return false; } /* * (non-Javadoc) * @see org.eclipse.gef.handles.HandleBounds#getHandleBounds() */ public Rectangle getHandleBounds() { ListIterator li = getChildren().listIterator(); Rectangle unionBounds = null; while (li.hasNext()) { IFigure fig = (IFigure) li.next(); if (fig.isVisible()) { Rectangle figBounds = fig.getBounds(); if (fig instanceof NodeFigure) { figBounds = ((NodeFigure) fig).getHandleBounds(); } if (unionBounds == null) unionBounds = new Rectangle(figBounds); else unionBounds.union(figBounds); } } if (unionBounds != null) return unionBounds; return super.getHandleBounds(); } /* * (non-Javadoc) * @see org.eclipse.draw2d.Figure#paintFigure(org.eclipse.draw2d.Graphics) */ protected void paintFigure(Graphics graphics) { // Do nothing } /** * This will return null since we have override the setBorder(Border) api. */ public Border getBorder() { return super.getBorder(); } /** * Sets the subfigure border. We are not permitting them to update the * wrapper border. We intepret it as setting the border of the subFigure * instead. */ public void setBorder(Border border) { subFigure.setBorder(border); } /* * (non-Javadoc) * @see org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure#getSourceConnectionAnchorAt(org.eclipse.draw2d.geometry.Point) */ public ConnectionAnchor getSourceConnectionAnchorAt(Point p) { if( subFigure instanceof NodeFigure ) return ((NodeFigure)subFigure).getSourceConnectionAnchorAt(p); return super.getSourceConnectionAnchorAt(p); } /* * (non-Javadoc) * @see org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure#getTargetConnectionAnchorAt(org.eclipse.draw2d.geometry.Point) */ public ConnectionAnchor getTargetConnectionAnchorAt(Point p) { if( subFigure instanceof NodeFigure ) return ((NodeFigure)subFigure).getTargetConnectionAnchorAt(p); return super.getTargetConnectionAnchorAt(p); } /* * (non-Javadoc) * @see org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure#getConnectionAnchor(java.lang.String) */ public ConnectionAnchor getConnectionAnchor(String terminal) { if( subFigure instanceof NodeFigure ) return ((NodeFigure)subFigure).getConnectionAnchor(terminal); return super.getConnectionAnchor(terminal); } /* * (non-Javadoc) * @see org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure#getConnectionAnchorTerminal(org.eclipse.draw2d.ConnectionAnchor) */ public String getConnectionAnchorTerminal(ConnectionAnchor c) { if( subFigure instanceof NodeFigure ) return ((NodeFigure)subFigure).getConnectionAnchorTerminal(c); return super.getConnectionAnchorTerminal(c); } }