MethodView.java

package algorithmen.umleditor;

import java.awt.*;
import javax.swing.*;
import java.util.*;

/**
 * View einer Methode.
 * Zuständig für die graphische Darstellung der Methodendaten.
 */
public class MethodView extends View {
  
  /**
   * Erzeugt einen View für die Methode model an der Position p.
   */
  public MethodView(Method model, Point p) {
    super(model, p);
  }
  
  /**
   * Erzeugt einen Standard-View.
   */
  public MethodView() {
    this(new Method(), new Point(10, 10));
  }
  
  /**
   * Zeichnet das Datenfeld als einfachen String in UML-Notation.
   * Mögliche Weiterentwicklung: Zeilenumbrüche im String.
   */
  public void draw(Graphics g) {
    Method m = (Method) model;
 
    // abstrakte Methoden werden in italics dargestellt
    Font standardFont = g.getFont();
    if (m.isAbstract()) {
      if (cursiveFont == null) {  // lazy Intialisierung
        cursiveFont = standardFont.deriveFont(Font.ITALIC);
      }
      g.setFont(cursiveFont);
    }
    
    String s = toUmlString();
    size.width = getStringWidth(s, g);
    size.height = getStringHeight(g);
    g.drawString(s, pos.x, pos.y + size.height);

    // statische Methoden unterstreichen
    if (((Method) model).isStatic()) {
      int yLine = pos.y + size.height + 1;
      g.drawLine(pos.x, yLine, pos.x + size.width, yLine);
    }
    
    // ggf. Font zurücksetzen
    if (m.isAbstract()) {
      g.setFont(standardFont);
    }    
  }
  
  /**
   * Liefert eine String-Darstellung eines Method-Objekts in UML-Form.
   * Typische Beispiele:
   *    "+add(d1: double, d2: double): double"
   */
  public String toUmlString() {
    Method m = (Method) model;
    String s = m.getVisibility().getUmlSymbol() + m.getName() + "(";
    
    // laufe durch die Parameterliste
    // verwendet nicht die draw-Methode, sondern nur den UMLString der Felder
    Iterator i = m.getParameter().iterator();
    // erstes Feld ohne Komma am Anfang
    if (i.hasNext()) {   // Liste ist nicht leer
      FieldView view = new FieldView((Field) i.next(), new Point());
      s += view.toUmlString();
    }
    // übrige Elemente, mit Komma getrennt
    while (i.hasNext()) {
      FieldView view = new FieldView((Field) i.next(), new Point());
      s += ", " + view.toUmlString();
    }
    
    s += "): " + m.getType();
    return s;
  }
  
  /**
   * Erzeugt einen Editor für das UmlObjekt m, modal bzgl. dem Dialog p.
   */
  public Editor createEditor(UmlElement m, Dialog p) {
    return new MethodEditor((Method) m, p);
  }
  
  /**
   * Erzeugt einen Editor für das UmlObjekt m, modal bzgl. dem Frame p.
   */
  public Editor createEditor(UmlElement m, Frame p) {
    return new MethodEditor((Method) m, p);
  }
  
  public UmlElement createStandardObject() {
    return new Method();
  }  
}