01: import java.awt.BasicStroke;
02: import java.awt.Graphics2D;
03: import java.awt.Shape;
04: import java.awt.geom.Line2D;
05: import java.awt.geom.Point2D;
06: import java.awt.geom.Rectangle2D;
07: 
08: /**
09:    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();
22: 
23:    public Rectangle2D getBounds(Graphics2D g2)
24:    {
25:       return getShape().getBounds();
26:    }
27: 
28:    public boolean contains(Point2D aPoint)
29:    {
30:       final double MAX_DIST = 3;
31: 
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;
38: 
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: }