    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: }