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