    01: import java.awt.*;
    02: import java.awt.geom.*;
    03:
    04: /**
    05:    A class that supplies convenience implementations for
    06:    a number of methods in the Edge interface type.
    07: */
    08: public abstract class AbstractEdge implements Edge
    09: {
    10:    public Object clone()
    11:    {
    12:       try
    13:       {
    14:          return super.clone();
    15:       }
    16:       catch (CloneNotSupportedException exception)
    17:       {
    18:          return null;
    19:       }
    20:    }
    21:
    22:    public void connect(Node s, Node e)
    23:    {
    24:       start = s;
    25:       end = e;
    26:    }
    27:
    28:    public Node getStart()
    29:    {
    30:       return start;
    31:    }
    32:
    33:    public Node getEnd()
    34:    {
    35:       return end;
    36:    }
    37:
    38:    public Rectangle2D getBounds(Graphics2D g2)
    39:    {
    40:       Line2D conn = getConnectionPoints();
    41:       Rectangle2D r = new Rectangle2D.Double();
    42:       r.setFrameFromDiagonal(conn.getX1(), conn.getY1(),
    43:          conn.getX2(), conn.getY2());
    44:       return r;
    45:    }
    46:
    47:    public Line2D getConnectionPoints()
    48:    {
    49:       Rectangle2D startBounds = start.getBounds();
    50:       Rectangle2D endBounds = end.getBounds();
    51:       Point2D startCenter = new Point2D.Double(
    52:          startBounds.getCenterX(), startBounds.getCenterY());
    53:       Point2D endCenter = new Point2D.Double(
    54:          endBounds.getCenterX(), endBounds.getCenterY());
    55:       return new Line2D.Double(
    56:          start.getConnectionPoint(endCenter),
    57:          end.getConnectionPoint(startCenter));
    58:    }
    59:
    60:    private Node start;
    61:    private Node end;
    62: }