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