/***************************************************************/
/* Prof. Dr. Carsten Vogt                                      */
/* FH Koeln, Fak. 07 / Nachrichtentechnik                      */
/* http://www.nt.fh-koeln.de/vogt                              */
/*                                                             */
/* Das Programm zeigt am Beispiel von Bankkonten die Benutzung */
/* des Klassenkonzepts, insbesondere                           */
/* - Definition von Klassen mit klassen- und objektbezogenen   */
/*   Attributen / Methoden sowie oeffentlichen und privaten    */
/*   Attributen,                                               */
/* - Erzeugung und Loeschung von Objekten und                  */
/* - Vererbung mit Nutzung und Ueberschreiben von Methoden der */
/*   Superklasse.                                              */
/* Diese Datei enthaelt ein fensterorientiertes Testprogramm;  */
/* die Klassendefinitionen stehen in den Dateien Konto.java    */
/* und GeschuetztesKonto.java.                                 */
/* Alle drei Dateien muessen zusammen uebersetzt werden.       */
/***************************************************************/

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

/**********************************************************

   Die Klasse 'KontoOberflaeche' definiert eine grafische
   Oberflaeche zur Arbeit mit den Klassen 'Konto' und
   'GeschuetztesKonto'.
      
***********************************************************/

class KontoOberflaeche extends JFrame {

  Konto konto1ungesch = new Konto(0);

  GeschuetztesKonto konto2gesch = new GeschuetztesKonto(0,4711);

  /* Radiobuttons zur Auswahl eines Kontos */  

  private JRadioButton[] kontoWahl = {
    new JRadioButton("Konto 1 (ungeschuetzt = ohne PIN)"),
    new JRadioButton("Konto 2 (geschuetzt = mit PIN 4711)")
  };

  private ButtonGroup kontoWahlGruppe = new ButtonGroup();;

  /* Buttons fuer das Einzahlen und Abheben */

  private JButton einzahlen, abheben;

  /* Textfelder, die die gewuenschte Aktion bzw. die Kontostaende anzeigen */

  private JTextField aktionFeld, stand1Feld, stand2Feld;

  /* Textfelder, in denen der gewuenschte Betrag bzw. die PIN eingegeben werden koennen
     und zugehoerige numerische Variablen */

  private JTextField betragFeld;
  private JPasswordField pinFeld;

  /* Konstruktor: Aktionen bei Erzeugung der Grafik-Oberflaeche */

  KontoOberflaeche(String s) {

   /* Erzeugen des Fensterrahmens */
   super(s); 

   JLabel lab; /* Hilfsvariable fuer Texte */

   /* Container fuer Buttons und Textfelder */
   Container c = getContentPane();

   /* Erzeugen des Layouts und Setzen der Farbe */
   c.setLayout(new GridLayout(15,1));
   c.setForeground(Color.black);

   /* Einfügen der Radiobuttons zur Auswahl des Kontos:
      in den Container und in eine Gruppe, die sicherstellt,
      dass nur ein Button gleichzeitig ausgewaehlt ist. 
      Vorauswahl des ersten Buttons. */
   lab = new JLabel("Auswahl des Kontos:");
   lab.setForeground(Color.black);
   c.add(lab);
   c.add(kontoWahl[0]);
   kontoWahlGruppe.add(kontoWahl[0]);
   kontoWahl[0].setSelected(true);
   c.add(kontoWahl[1]);
   kontoWahlGruppe.add(kontoWahl[1]);

   /* Erzeugen der Buttons zum Einzahlen und Abheben */
   lab = new JLabel("gewuenschte Aktion:");
   lab.setForeground(Color.black);
   c.add(lab);
   einzahlen = new JButton("Einzahlen");
   c.add(einzahlen);
   abheben = new JButton("Abheben");
   c.add(abheben);

   /* Listener fuer Buttons */
   ButtonListener lis = new ButtonListener();
   einzahlen.addActionListener(lis);
   abheben.addActionListener(lis);

   /* Erzeugen der Textfelder */
   lab = new JLabel("gewuenschter Betrag (Eingabefeld):");
   lab.setForeground(Color.black);
   c.add(lab);
   betragFeld = new JTextField(9);
   c.add(betragFeld);
   lab = new JLabel("PIN (Eingabefeld):");
   lab.setForeground(Color.black);
   c.add(lab);
   pinFeld = new JPasswordField(9);
   c.add(pinFeld);
   lab = new JLabel("gewaehlte Aktion (Ausgabefeld):");
   lab.setForeground(Color.black);
   c.add(lab);
   aktionFeld = new JTextField(25);
   c.add(aktionFeld);
   stand1Feld = new JTextField(9);
   lab = new JLabel("Staende Konto 1 / Konto 2 (Ausgabefeld):");
   lab.setForeground(Color.black);
   c.add(lab);
   c.add(stand1Feld);
   stand1Feld.setText(String.valueOf(konto1ungesch.abfragen()));
   stand2Feld = new JTextField(9);
   c.add(stand2Feld);
   stand2Feld.setText(String.valueOf(konto2gesch.abfragen()));

   /* Komponenten anordnen ... */
   pack();

   /* ... und sichtbar machen */
   setVisible(true);

  }

  /* Aktionen beim Druecken eines Buttons */

  class ButtonListener implements ActionListener {
   public void actionPerformed(ActionEvent e) {
    double betrag;
    int pin;
    /* gewuenschten Betrag und PIN ermitteln */
    if (betragFeld.getText().length()>0)
      betrag = Double.parseDouble(betragFeld.getText());
     else betrag = 0;
    if (pinFeld.getPassword().length>0)
      pin = Integer.parseInt(new String(pinFeld.getPassword()));
     else pin = 0;
    /* Ausgabefeld fuer Aktion standardmaessig
       auf schwarze Buchstabenfarbe setzen */
    aktionFeld.setForeground(Color.black);
    /* Aktion fuer Konto 1 (ungeschuetzt) */
    if (kontoWahl[0].isSelected()) {
     if (e.getActionCommand().equals("Einzahlen")) {
      konto1ungesch.einzahlen(betrag);
      aktionFeld.setText("Einzahlen Konto 1 - OK");
     }
     else {
      if (konto1ungesch.abheben(betrag)>0)
        aktionFeld.setText("Abheben Konto 1 - OK");
       else { aktionFeld.setForeground(Color.red);
              aktionFeld.setText("Abheben Konto 1 - FEHLER"); 
            }
     }
    }
    /* Aktion fuer Konto 2 (geschuetzt) */
    if (kontoWahl[1].isSelected()) {
     if (e.getActionCommand().equals("Einzahlen")) {
      konto2gesch.einzahlen(betrag);
      aktionFeld.setText("Einzahlen Konto 2 - OK");
     }
     else {
      if (konto2gesch.abheben(betrag,pin)>0)
        aktionFeld.setText("Abheben Konto 2 - OK");
       else { aktionFeld.setForeground(Color.red);
              aktionFeld.setText("Abheben Konto 2 - FEHLER"); 
            }
     }
    }
   stand1Feld.setText(String.valueOf(konto1ungesch.abfragen()));
   stand2Feld.setText(String.valueOf(konto2gesch.abfragen()));
   }
  }

  public static void main(String args[]) {

   /* Erzeugung der Oberflaeche */

   new KontoOberflaeche("Bankkontotest");  

  }

}

public class KontoTestGraf {

  public static void main(String args[]) {

   /* Erzeugung der Oberflaeche */

   new KontoOberflaeche("Bankkontotest");  

  }

}

