/*
 * AnzeigeZelle.java	01.07.99
 *
 *
 * Beilage zum Buch "Software-Entwurf mit UML"
 * von J.Seemann & J. Wolff von Gudenberg,
 * Springer-Verlag, 1999
 * 
 */
 
import java.awt.*;

/** <i>Anzeigeobjekte f&uuml;r eine Zelle</i> */

public class AnzeigeZelle extends Component 
{

	// Attribute
  boolean Markierung = false;
	int width;
  int height;
  int x;
  int y;

	// Objektreferenzen
  Zelle zelle;
  String name;

	// Konstruktor
  //
  public AnzeigeZelle(Zelle zelle) 
  {
     this.zelle = zelle;
     computeSize();
     setBackground(Tabkalk.normBackground);
     setForeground(Tabkalk.normForeground);
  }

	/** Zuweisung einer Zelle zur Anzeige*/
  public void setZelle(Zelle zelle)
  {
     this.zelle = zelle;
     computeSize();
     repaint();
  }

	/** Zurückliefern der Zelle */
  public Zelle getZelle()
  {
     return zelle;
  }

	/** Umschalten der Markierung der Zelle */
  public void schalteMarkierung(boolean markiere)
  {
     if (markiere)  Markierung = !Markierung;
  }

	/** Setzen der Markierung der Zelle */
  public void setMarkierung(boolean m)
  {
     Markierung = m;
  }

	/** liefert, ob eine Zelle markiert ist */
  public boolean isMarkiert()
  {
     return Markierung;
  }
  
  /** liefert den Anzeigestring der Zelle */
  public String getLabel() 
  {
    return zelle.getAnzeige();
  }

  /** setzt den symbolischen Namen der Zelle (hier nur Adresse) */
  public void setSymName(String name) 
  {
    this.name = name;
  }

	/** liefert den symbolischen Namen der Zelle (hier nur Adresse) */
  public String getSymName() 
  {
    return name;
  }
  
  /** limitiert die Breite der Zelle */ 
  public Dimension getPreferredSize() 
  {
    return new Dimension(width>100 ? width : 100, height);
  }

  /** limitiert die Breite der Zelle */ 
  public Dimension getMinimumSize() 
  {
    return getPreferredSize();
  }

  /** Neuzeichnen einer Zelle */
	public void update(Graphics g) 
  {
    Dimension d = getSize();
    g.setColor(getBackground());
    g.fillRect(0,0,d.width-1,d.height-1);
    g.setColor(getForeground());
    g.drawRect(0,0,d.width-1,d.height-1);
    g.setFont(Tabkalk.normFont);
    g.drawString(zelle.getAnzeige(), x, y);
  }
	
  /** Neuzeichnen einer Zelle */
  public void paint(Graphics g) 
  {
    update(g); 
  }

	/* Berechnen der H&ouml;he und Breite der Zelle */
  public void computeSize() 
  {
    FontMetrics fm = getFontMetrics(Tabkalk.normFont);
    width = fm.stringWidth(zelle.getAnzeige()) + 10;
    height = fm.getMaxDescent() + fm.getMaxAscent() + 10;
    
    y = 5 + fm.getMaxAscent(); 
    switch (zelle.getAusrichtung())
    {
       case Zelle.LINKS:  x = 5;
                          break;
       case Zelle.MITTE:  x = 5 + (getSize().width - width)/2 ;
                          break;
       case Zelle.RECHTS: x = (getSize().width - 5 - width) ;
                          break;
    }
  	
  	// Gridbag-Objekte koennten sich mittlerweile in der Breite veraendert haben
  	if (getSize().width > width)  width = getSize().width;

  	width = (width>100?width:100);
    setSize(width, height);
  }
}