// ---------------------------------------------------------
// Dieses Applet dient lediglich als Demonstration zum
// Referat "Einfuehrung in die Applet-Entwicklung"
// ---------------------------------------------------------
// Das Applet erhaelt einen Rahmen mit der Farbe, die
// als Parameter von der HTML Seite uebergeben werden.
// Fehlt der Parameter oder ist dieser ungueltig, wird eine
// Statusmeldung ausgegeben.
// In eine Eingabezeile kann ein Text eingegeben werden,
// der, je nach Stellung der Auswahlboxen entweder
// identisch oder umgekehrt in einer Ausgabezeile erscheint.
// Durch Druecken eines "Loeschen" Buttons kann man beide
// Fenster leeren.
// ---------------------------------------------------------
// Andre Maier, Mathematik Sondergebiete, SS 2000
// ---------------------------------------------------------

import java.applet.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;

public class applet1 extends Applet implements
             ActionListener, TextListener, ItemListener
{
   // -------------
   // Deklarationen
   // -------------

   TextArea EingabeFeld, AusgabeFeld;    // Ein- und Ausgabezeile
   Font font;                            // Font fuer Ueberschrift
   Color Rahmenfarbe;                    // verwendete Rahmenfarbe
   msgLabel message;                     // Statuszeile
   Button ClearTaste;                    // "Loeschen"-Button
   CheckboxGroup Boxengruppe;            // Auswahlboxen (Gruppe)
   Checkbox GruppenBox1, GruppenBox2;    // Auswahlboxen
   boolean umgekehrt;                    // Flag fuer Textumkehrung
   StringBuffer s;                       // Hilfsbuffer fuer Umkehrung
   yellowLabel EFeld, AFeld;             // Beschriftung der Felder

   static int m_x=20,   // Position und Groesse des
              m_y=200,  // message - Feldes
              m_w=250,
              m_h=20;

   // ------------------------------------------------------
   // Eine neue Klasse fuer einen gelben Label wird erstellt
   // ------------------------------------------------------
  
   class yellowLabel extends Label
   {
      public yellowLabel(String label,int x, int y, int width, int height)
      {
         super(label);
         super.setForeground(new Color(255,255,0));
         super.setBounds(new Rectangle(x,y,width,height));
      }
   }

   // -----------------------------------------------------
   // Eine neue Klasse fuer die Statusmeldung wird erstellt
   // -----------------------------------------------------

   class msgLabel extends Label
   {
      public msgLabel(String label)
      {
         super(label);
         super.setForeground(new Color(255,100,100));
         super.setBackground(new Color(0,0,0));
         super.setBounds(new Rectangle(m_x,m_y,m_w,m_h));
      }
   }

   // -----------------------------------------------------------
   // init() wird bei der Initialisierung des Applets ausgefuehrt
   // -----------------------------------------------------------

   public void init()
   {
      // ---------------------------------------
      // Label fuer Statusmeldung initialisieren
      // ---------------------------------------

      message = new msgLabel("");
      this.add(message);

      // -----------------------------------
      // Hintergrund / Layout initialisieren
      // -----------------------------------

      this.setBackground(new Color(0,0,0));
      this.setLayout(null);

      // -----------------------------------
      // Rahmenfarbe von HTML Seite einlesen
      // -----------------------------------

      Rahmenfarbe = getHTMLParameter("Rahmenfarbe");

      // ---------------------
      // Eingabefeld fuer Text
      // ---------------------

      EingabeFeld  = new TextArea("",1,1,TextArea.SCROLLBARS_NONE);
      EingabeFeld.setBackground(Color.white);
      EingabeFeld.setForeground(Color.red);
      EingabeFeld.setBounds(new Rectangle(20,100,200,20));
      this.add(EingabeFeld);
      EingabeFeld.addTextListener(this);

      // ----------------------
      // Label fuer Eingabefeld
      // ----------------------

      EFeld = new yellowLabel("Eingabefeld",20,80,100,20);
      this.add(EFeld);

      // -------------------
      // "Loeschen" - Button
      // -------------------

      ClearTaste = new Button("Loeschen");
      ClearTaste.setBounds(new Rectangle(240,100,80,20));
      this.add(ClearTaste);      
      ClearTaste.addActionListener(this);

      // --------------------------------
      // Auswahlboxen der Textoperationen
      // --------------------------------

      Boxengruppe = new CheckboxGroup();
      GruppenBox1 = new Checkbox("Normal",Boxengruppe,true);
      GruppenBox2 = new Checkbox("Umgekehrt",Boxengruppe,false);
      GruppenBox1.setBounds(new Rectangle(240,150,100,20));
      GruppenBox2.setBounds(new Rectangle(240,170,100,20));
      GruppenBox1.setForeground(new Color(255,255,0));
      GruppenBox2.setForeground(new Color(255,255,0));
      GruppenBox1.setBackground(new Color(70,70,70));
      GruppenBox2.setBackground(new Color(70,70,70));
      add(GruppenBox1);
      add(GruppenBox2);
      GruppenBox1.addItemListener(this);
      GruppenBox2.addItemListener(this);

      // --------------------
      // Ausgabefeld erzeugen
      // --------------------

      AusgabeFeld  = new TextArea("",1,1,TextArea.SCROLLBARS_NONE);
      AusgabeFeld.setBackground(new Color(0,100,0));
      AusgabeFeld.setForeground(new Color(255,255,0));
      AusgabeFeld.setBounds(new Rectangle(20,150,200,20));
      AusgabeFeld.setEditable(false);
      this.add(AusgabeFeld);

      // ----------------------
      // Label fuer Ausgabefeld
      // ----------------------

      AFeld = new yellowLabel("Ausgabefeld",20,130,100,20);
      this.add(AFeld);
   }

   // ------------------------------------------------------------
   // In Paint wird das "Drumherum" auf den Hintergrund gezeichnet
   // ------------------------------------------------------------

   public void paint(Graphics g)
   {
      font = new Font("Helvetica",Font.ITALIC,40);
      g.setColor(Color.orange);
      g.setFont(font);
      g.drawString("Applet Demonstration",20,50);
      g.setColor(this.Rahmenfarbe);
      int i;
      for(i=0;i<4;i++)
         {
            g.drawRect(0+i,0+i,499-(2*i),239-(2*i));
         }
   }

   // ------------------------------------
   // Methode zum Einlesen der Rahmenfarbe
   // ------------------------------------

   protected Color getHTMLParameter(String name)
   {
      int r = 0, // Rotanteil
          g = 0, // Gruenanteil
          b = 0; // Blauanteil

      String value = this.getParameter(name); // Einlesen des Parameters

      try
      {
         // Aufteilen der durch Komma getrennten Integerzahlen
         // in einzelne Variablen

         StringTokenizer st = new StringTokenizer(value,",");
         r = Integer.parseInt(st.nextToken());
         g = Integer.parseInt(st.nextToken());
         b = Integer.parseInt(st.nextToken());
      }
      catch (NumberFormatException e)  {fehler_im_parameter(2);}
      catch (NullPointerException e)   {fehler_im_parameter(1);}

      return new Color(r,g,b);
   }

   // -------------------------------------
   // Methode zur Ausgabe der Statusmeldung
   // -------------------------------------

   public void fehler_im_parameter(int fehler_id)
   {
      switch(fehler_id)
      {
         case 1:
            message.setText("Status : Parameter fehlt !");
            break;

         case 2:
            message.setText("Status : Ungueltiger Wert uebergeben !");
            break;
      }     
   }

   // ----------------------------------------------------
   // Methode wird ausgefuehrt, wenn Button betaetigt wird
   // ----------------------------------------------------

   public void actionPerformed(ActionEvent e)
   {       
       EingabeFeld.setText("");   // Ein- und Ausgabefeld
       AusgabeFeld.setText("");   // loeschen
   }

   // -----------------------------------------------------
   // Methode wird ausgefuehrt, wenn sich der Inhalt des
   // Eingabefensters aendert. (oder wenn die Auswahl der
   // Textoperation veraendert wird.
   // -----------------------------------------------------

   public void textValueChanged(TextEvent e)
   {
       String value;
       value = EingabeFeld.getText();
       s = new StringBuffer(value);
       if(umgekehrt==true) { s = s.reverse(); }
       value = s.toString();
       AusgabeFeld.setText(value);
   }

   // ---------------------------------------------
   // Methode wird ausgefuehrt, wenn die Auswahlbox
   // betaetigt wird.
   // ---------------------------------------------

   public void itemStateChanged(ItemEvent e)
   {
       if(e.getItem()=="Umgekehrt")
       {
          umgekehrt = true;
          textValueChanged(null);
       }
       else
       {
          umgekehrt = false;
          textValueChanged(null);
       }
   }  
}
