001: import java.awt.Graphics2D;
002: import java.awt.geom.Rectangle2D;
003: 
004: /**
005:    A class node in a class diagram.
006: */
007: public class ClassNode extends RectangularNode
008: {
009:    /**
010:       Construct a class node with a default size
011:    */
012:    public ClassNode()
013:    {
014:       name = new MultiLineString();
015:       name.setSize(MultiLineString.LARGE);
016:       attributes = new MultiLineString();
017:       attributes.setJustification(MultiLineString.LEFT);
018:       methods = new MultiLineString();
019:       methods.setJustification(MultiLineString.LEFT);
020:       setBounds(new Rectangle2D.Double(0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT));
021:       midHeight = DEFAULT_COMPARTMENT_HEIGHT;
022:       botHeight = DEFAULT_COMPARTMENT_HEIGHT;
023:    }
024: 
025:    public void draw(Graphics2D g2)
026:    {
027:       layout(g2);
028:       Rectangle2D top = new Rectangle2D.Double(getBounds().getX(),
029:          getBounds().getY(), getBounds().getWidth(), 
030:          getBounds().getHeight() - midHeight - botHeight);
031:       g2.draw(top);
032:       name.draw(g2, top);
033:       Rectangle2D mid = new Rectangle2D.Double(top.getX(),
034:          top.getMaxY(), top.getWidth(), midHeight);
035:       g2.draw(mid);
036:       attributes.draw(g2, mid);
037:       Rectangle2D bot = new Rectangle2D.Double(top.getX(),
038:          mid.getMaxY(), top.getWidth(), botHeight);
039:       g2.draw(bot);
040:       methods.draw(g2, bot);
041:    }
042: 
043:    /**
044:       Recomputes the layout of this node.
045:       @param g2 the graphics context
046:    */
047:    public void layout(Graphics2D g2)
048:    {
049:       Rectangle2D min = new Rectangle2D.Double(0, 0,
050:          DEFAULT_WIDTH, DEFAULT_COMPARTMENT_HEIGHT);
051:       Rectangle2D top = name.getBounds(g2); 
052:       top.add(min);
053:       Rectangle2D mid = attributes.getBounds(g2);
054:       Rectangle2D bot = methods.getBounds(g2);
055: 
056:       midHeight = mid.getHeight();
057:       botHeight = bot.getHeight();
058:       if (midHeight == 0 && botHeight == 0)
059:       {
060:          top.add(new Rectangle2D.Double(0, 0, 
061:                     DEFAULT_WIDTH, 
062:                     3 * DEFAULT_COMPARTMENT_HEIGHT));
063:       }
064:       else
065:       {
066:          mid.add(min);
067:          bot.add(min);
068:          midHeight = mid.getHeight();
069:          botHeight = bot.getHeight();
070:       }
071: 
072:       Rectangle2D b = new Rectangle2D.Double(
073:          getBounds().getX(), getBounds().getY(),
074:          Math.max(top.getWidth(), Math.max(mid.getWidth(),
075:             bot.getWidth())), 
076:          top.getHeight() + midHeight + botHeight);
077:       setBounds(b);
078:    }
079: 
080:    /**
081:       Sets the name property value.
082:       @param newValue the class name
083:    */
084:    public void setName(MultiLineString newValue)
085:    {
086:       name = newValue;
087:    }
088: 
089:    /**
090:       Gets the name property value.
091:       @return the class name
092:    */
093:    public MultiLineString getName()
094:    {
095:       return name;
096:    }
097: 
098:    /**
099:       Sets the attributes property value.
100:       @param newValue the attributes of this class
101:    */
102:    public void setAttributes(MultiLineString newValue)
103:    {
104:       attributes = newValue;
105:    }
106: 
107:    /**
108:       Gets the attributes property value.
109:       @return the attributes of this class
110:    */
111:    public MultiLineString getAttributes()
112:    {
113:       return attributes;
114:    }
115: 
116:    /**
117:       Sets the methods property value.
118:       @param newValue the methods of this class
119:    */
120:    public void setMethods(MultiLineString newValue)
121:    {
122:       methods = newValue;
123:    }
124: 
125:    /**
126:       Gets the methods property value.
127:       @return the methods of this class
128:    */
129:    public MultiLineString getMethods()
130:    {
131:       return methods;
132:    }
133: 
134:    public Object clone()
135:    {
136:       ClassNode cloned = (ClassNode) super.clone();
137:       cloned.name = (MultiLineString) name.clone();
138:       cloned.methods = (MultiLineString) methods.clone();
139:       cloned.attributes = (MultiLineString) attributes.clone();
140:       return cloned;
141:    }
142: 
143:    private double midHeight;
144:    private double botHeight;
145:    private MultiLineString name;
146:    private MultiLineString attributes;
147:    private MultiLineString methods;
148: 
149:    private static int DEFAULT_COMPARTMENT_HEIGHT = 20;
150:    private static int DEFAULT_WIDTH = 80;
151:    private static int DEFAULT_HEIGHT = 60;
152: }