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