1: import java.awt.BasicStroke; 2: import java.awt.Graphics2D; 3: import java.awt.Shape; 4: import java.awt.geom.Line2D; 5: import java.awt.geom.Point2D; 6: import java.awt.geom.Rectangle2D; 8: /** 9: A class that assumes that an edge can yield its shape 10: and then takes advantage of the fact that containment testing can 11: be done by stroking the shape with a fat stroke. 12: */ 13: public abstract class ShapeEdge extends AbstractEdge 14: { 15: /** 16: Returns the path that should be stroked to 17: draw this edge. The path does not include 18: arrow tips or labels. 19: @return a path along the edge 20: */ 21: public abstract Shape getShape(); 23: public Rectangle2D getBounds(Graphics2D g2) 24: { 25: return getShape().getBounds(); 26: } 28: public boolean contains(Point2D aPoint) 29: { 30: final double MAX_DIST = 3; 32: // the end points may contain small nodes, so don't 33: // match them 34: Line2D conn = getConnectionPoints(); 35: if (aPoint.distance(conn.getP1()) <= MAX_DIST 36: || aPoint.distance(conn.getP2()) <= MAX_DIST) 37: return false; 39: Shape p = getShape(); 40: BasicStroke fatStroke = new BasicStroke( 41: (float)(2 * MAX_DIST)); 42: Shape fatPath = fatStroke.createStrokedShape(p); 43: return fatPath.contains(aPoint); 44: } 45: }