
import java.awt.*;

/** Beinhaltet einen Text in einer Box */
public class TTextbox extends TShapeGraphic implements java.io.Serializable {

  /** Erzeugt eine Textbox
  @param text Der Text
  @param x Horizontale Koordinate der linken, oberen Ecke der Textbox
  @param y Vertikale Koordinate der linken, oberen Ecke der Textbox
  @param FPaintSettings übergeordnete Instanz von TPaintSettings (Kontext)
  */
  public TTextbox( String text, int x, int y, TPaintSettings PaintSettings ) {
    // vererbten Konstruktor aufrufen
    super( PaintSettings );

    // Die Felder setzen
    this.text = text;
    setLeft( PaintSettings().pix2doubleX (x) ); 
    setTop( PaintSettings().pix2doubleY (y) );
  }

  /** Zweiter Konstruktor, erzeugt Textbox aus Dateieintrag heraus
    * @param String Eintrag in Datei
    * @param FPaintSettings übergeordnete Instanz von TPaintSettings (Kontext)
    */
  public TTextbox( String data, TPaintSettings PaintSettings ) {
    // vererbten Konstruktor aufrufen
    super( PaintSettings );

    if (data.indexOf("TEXTBOX{")!=0) { return; }

    int first = 0;  String ts;  Double d;
    first = data.indexOf ("{") +1;

    ts = data.substring(first, data.indexOf ("|", first));
    first = data.indexOf ("|", first) +1;  
    setLeft ( (new Double (ts)).doubleValue() );

    ts = data.substring(first, data.indexOf ("|", first));
    first = data.indexOf ("|", first) +1;  
    setTop ( (new Double (ts)).doubleValue() );

    ts = data.substring(first, data.indexOf ("|", first));
    first = data.indexOf ("|", first) +1;  
    text = ts;
    
    ts = data.substring(first,data.length()-1);
    Pen().color = new Color ( (new Integer (ts)).intValue() );
  }

  /** Zeichnet das Rechteck auf Graphics g neu 
    * @param Graphics Der zu verwendende Kontext
    */
  public void paint (Graphics g) {
   // Ohne Kontext kein zeichnen!
    if (PaintSettings() == null) { return; }

    double x = getLeft();
    double y = getTop();

    // Die Größeninformationen merken
    setHeight( PaintSettings().pix2doubleHeight( g.getFontMetrics().getHeight() +6 ) );
    setWidth( PaintSettings().pix2doubleWidth( g.getFontMetrics().stringWidth(text) +15 ) );

    // Die Füllung der Box ausgeben
    g.setColor(Pen().color);
    g.fillRect ( PaintSettings().double2pixX(x)+1, PaintSettings().double2pixY(y)+1, g.getFontMetrics().stringWidth (text) +14, g.getFontMetrics().getHeight() +5 );

    // Und den Text mit Rand ausgeben
    if ((Pen().color.getBlue() < 129) && (Pen().color.getRed() < 129) && (Pen().color.getGreen() < 129)) {
       g.setColor(Color.white);
    } else {
       g.setColor(Color.black);
    }

    g.drawRect ( PaintSettings().double2pixX(x), PaintSettings().double2pixY(y), g.getFontMetrics().stringWidth (text) +15, g.getFontMetrics().getHeight() +6 );
    g.drawString( text, PaintSettings().double2pixX(x)+7, PaintSettings().double2pixY(y) + g.getFontMetrics().getHeight() - 3 + g.getFontMetrics().getDescent());

    // Auswahlkästchen zeichnen, wenn benötigt
    paintSelected (g);
    paintHighlighted(g);
  }

  /** Ermittelt die Abmessungen der Textbox innerhalb eines
    * Paint-laufs (mit g-Variable), da nur hier die Größeninformationen
      abgefragt werden können? echt... scjrottsdvdsvlds */
  public void examineSpace( Graphics g ) {

    // Die Größeninformationen merken
     setHeight( PaintSettings().pix2doubleHeight( g.getFontMetrics().getHeight() +6 ) );
     setWidth( PaintSettings().pix2doubleWidth( g.getFontMetrics().stringWidth(text) +15 ) );

     return;
  } 

  /** getSaveString() liefert die Werte des Objekts zusammengepackt in einem String
    * @return String Gepackte Information
    */
  public String getSaveString() {
     String ts = new String();
     ts = "TEXTBOX{";
 
    // Hier Werte in ts einfügen 
     ts += (new Double (getLeft())).toString();
     ts += "|";
     ts += (new Double (getTop())).toString();
     ts += "|";     
     ts += textWithoutSeperator (text);
     ts += "|";
     ts += (new Long (Pen().color.getRGB())).toString();

     ts += "}";
     return (ts);
  }

  /** Entfernt Seperatoren | aus String
    * @param String Der u. U. mit | besetzte String
    * @return String Der von | befreite String
    */
  private String textWithoutSeperator ( String ts ) {

     if ( ts.indexOf ("|") == -1 ) { return (ts); }

     String os = new String();
     for (int i = 0; i < ts.length(); i++) {
        if (ts.charAt(i) != '|') { os += ts.charAt(i); }
        else { os += " "; }
     }

     return (os);
  }

  /** Liefert TRUE wenn die übergebene Koordinate innerhalb des gezeichneten Bereiches liegt */
  public boolean isInside( int sx, int sy ) {
    double tolerance = PaintSettings().getToleranz();
    double x = PaintSettings().pix2doubleX(sx); 
    double y = PaintSettings().pix2doubleY(sy); 

    boolean result = false;

    result = isHigher(x,getLeft(),tolerance) && isLower(x, getLeft()+getWidth(),tolerance) && isHigher(y,getTop(),tolerance) && isLower(y, getTop()+getHeight(),tolerance);
  
    return result;
  }

  /** Vergleicht zwei Grafikelemente miteinander. Liefert TRUE, wenn der Element "höher" als das übergebene
      Element ist
      @param item Das zu vergleichende Grafikelement 
    */
  public boolean isHigherThen( TGraphic item ) {
    boolean result = false;

    if (item instanceof TTextbox) {
      // TTextbox
      result = (text.toUpperCase().compareTo( ((TTextbox) item).text.toUpperCase() ) > 0);
    } else {
      // keine TTextbox
      result = true;
    }

    return result;
  }

  /** Vergleicht zwei Grafikelemente miteinander. Liefert TRUE, wenn der Element "niedriger" als das übergebene
      Element ist
      @param item Das zu vergleichende Grafikelement 
    */
  public boolean isLowerThen( TGraphic item ) {
    boolean result = false;

    if (item instanceof TTextbox) {
      // TTextbox
      result = (text.toUpperCase().compareTo( ((TTextbox) item).text.toUpperCase() ) < 0);
    } else {
      // keine TTextbox
      result = false;
    }

    return result;
  }

  /** Vergleicht zwei Grafikelemente miteinander. Liefert TRUE, wenn der Element "gleich" dem übergebenen
      Element ist
      @param item Das zu vergleichende Grafikelement 
    */
  public boolean isEqualTo( TGraphic item ) {
    boolean result = false;

    if (item instanceof TTextbox) {
      // TTextbox
      result = (text.toUpperCase().compareTo( ((TTextbox) item).text.toUpperCase() ) == 0);
    } else {
      // keine TTextbox
      result = false;
    }

    return result;
  }


  /** Der Text 
      @serial 
  */
  public String text;

  /** Gefüllt oder nicht gefüllt 
      @serial 
  */
  public boolean filled;
}
