ClassView.java
package algorithmen.umleditor;
import java.awt.*;
import javax.swing.*;
/**
* View einer Class.
* Zuständig für die graphische Darstellung einer Class.
*/
public class ClassView extends View {
/**
* Erzeugt einen View für die Class model an der Position p.
*/
public ClassView(Class model, Point p) {
super(model, p);
}
/**
* Erzeugt einen Standard-View.
*/
public ClassView() {
this(new Class(), new Point(10, 10));
}
/**
* Zeichnet eine Klasse in UML-Notation.
*/
public void draw(Graphics g) {
// kann auch mit verschieden hohen Methoden- und Field-Strings umgehen.
initFonts(g);
Class c = (Class) model; // cast nötig für Class-Details
int maxX = 0; // wird die Maximalbreite aller Teilfelder
int curX = pos.x + sepSize + 1; // Startpunkt aller Strings
// abstrakte Klasse -> Name wird in bold + italics dargestellt
if (c.isAbstract()) {
g.setFont(curBoldFont);
} else {
g.setFont(boldFont);
}
// erst den Klassen-Namen in bold
int nameHeight = getStringHeight(g);
int curY = pos.y + nameHeight + sepSize + 1;
g.drawString(c.getName(), curX, curY);
maxX = Math.max(maxX, getStringWidth(c.getName(), g));
g.setFont(standardFont);
int yPosLine1 = curY + sepSize; // Position der 1. Trennlinie merken
curY += 2*sepSize + 1; // unter die erste Linie gehen
// nun die Felder
for (int i = 0; i < c.getNFields(); i++) {
FieldView view = new FieldView(c.getField(i), new Point(curX, curY));
view.draw(g);
Dimension d = view.getSize();
maxX = Math.max(maxX, d.width);
curY += d.height + sepSize;
}
int yPosLine2 = curY; // Position der 2. Trennlinie merken
curY += sepSize + 1; // unter die zweite Linie gehen
// dann die Methoden
for (int i = 0; i < c.getNMethods(); i++) {
MethodView view = new MethodView(c.getMethod(i), new Point(curX, curY));
view.draw(g);
Dimension d = view.getSize();
maxX = Math.max(maxX, d.width);
curY += d.height + sepSize;
}
// schließlich das Rechteck und die Linien
size.width = maxX + 2*sepSize + 2;
size.height = curY + 1 - pos.y;
g.drawRect(pos.x, pos.y, size.width, size.height);
g.drawLine(pos.x, yPosLine1, pos.x + size.width, yPosLine1);
g.drawLine(pos.x, yPosLine2, pos.x + size.width, yPosLine2);
}
public Editor createEditor(UmlElement m, Frame p) {
return new ClassEditor((Class) m, p);
}
public Editor createEditor(UmlElement m, Dialog p) {
return new ClassEditor((Class) m, p);
}
public UmlElement createStandardObject() {
return new Class();
}
}