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();
  }
}