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

import java.awt.*;
import java.awt.event.*;
import java.io.*;

/** <i>Objekt zur Bearbeitung des Inhalts einer Zelle</i> */

public class ZellenEditor implements ActionListener
{
   AnzeigeZelle aktuelleZelle;
   TextField EditFeld;
   Tabkalk tabkalk;
   Position aktuellePosition = new Position();

   protected int farbStatus = 0;

	 /** liefert Objektreferenz auf die momentan selektierte Zelle */
   public Zelle aktuelleZelle()
   {
      return aktuelleZelle.getZelle();
   }

   /** setzt die Farben, wenn ein Syntaxfehler angezeigt werden soll */
   protected void farbenSyntaxFehler()
   {
       farbStatus = 1;
       EditFeld.setBackground(Color.red);
       EditFeld.setForeground(Color.white);
   }
 
   /** setzt die Farben f&uuml;r den Normalzustand */
   protected void farbenNormal()
   {
       if (farbStatus == 1)
       {
          farbStatus = 0;
          EditFeld.setBackground(Color.white);
          EditFeld.setForeground(Color.black);
       }
   }

   /** ActionListener-Methode */
   public void actionPerformed(ActionEvent e)
   {
        farbenNormal();
        if (e.getSource() == tabkalk.OK || e.getSource() == EditFeld)
        {
           Zelle Neu = getZellTyp(EditFeld.getText());
           tabkalk.AnzeigeTabelle.cursor.getPosition(aktuellePosition);
           tabkalk.AnzeigeTabelle.aktualisiere(aktuellePosition,Neu);
           aktuelleZelle.invalidate();
           tabkalk.spane.validate();
        	tabkalk.AnzeigeTabelle.refresh();
        }
        else if (e.getSource() == tabkalk.Cancel)
        {
           EditFeld.setText(aktuelleZelle.getZelle().getInhalt()); 
        }
        tabkalk.AnzeigeTabelle.requestFocus();
   }

   /** setzt eine Objektreferenz auf eine Zelle, deren Inhalt bearbeitet werden soll */
   void setZelle(AnzeigeZelle c)
   {
      aktuelleZelle = c;
      EditFeld.setText(c.getZelle().getInhalt());
      farbenNormal();
   }

	 /** Konstruktor */
   ZellenEditor (TextField t, Tabkalk k)
   {
      EditFeld = t;
      tabkalk = k;
   }

	 /** untersucht den Inhalt den angegebenen Strings, 
	     erzeugt ein entsprechendes Zellenobjekt und liefert es zur&uuml;ck */
   protected Zelle getZellTyp(String input) 
   {
      String s = input.trim();

      if (s.length() == 0)
      {
         return tabkalk.AnzeigeTabelle.leerzelle;
      }

      if (s.startsWith("="))
      {
          String s2 = s.substring(1);
          FormelParser parser = new FormelParser(s2);
          Knoten Wurzel = parser.getParseBaum();
          if (Wurzel != null) 
             return new FormelZelle(aktuelleZelle,Wurzel,s); 
            else
            {
               farbenSyntaxFehler();
               // SyntaxFehler aufgetreten
               return new TextZelle(aktuelleZelle,s);          
            }
      }
      else
      {
         s = s.replace(',','.');
         StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(s));

         // don't parse any comments
         tokenizer.slashSlashComments(false);
         tokenizer.slashStarComments(false);
         tokenizer.ordinaryChar('/');
         tokenizer.eolIsSignificant(true);
         tokenizer.ordinaryChar('-');

         try
         {

         int typ = tokenizer.nextToken();
         
         switch (typ)
         {
            case StreamTokenizer.TT_NUMBER:   
                    int typ2 = tokenizer.nextToken();
                    if (typ2 == StreamTokenizer.TT_EOF)
                    {
                       return new WertZelle(aktuelleZelle,tokenizer.nval); 
                    }
         }
         }
         catch(IOException e)
         {
            return null;
         }
      }
      return new TextZelle(aktuelleZelle,input);  
      }
}