import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/** Diese Klasse stellt einen Dialog mit verschiedenen
  * Einstellungen fuer die Uhr dar. Wir die Menge der
  * Optionen im Laufe der Zeit erweitern.
  **/
public class Einstellungen extends JDialog {
  
  /** Inneres interface, muss von Klassen implementiert
    * werden, um Bestandteil dieses Dialogs zu werden.
    **/
  public static interface Einstellung {
    
    /** Gibt die grafische Komponente zurueck, die im
      * Dialog dargestellt werden soll.
      **/
    public Component getComponent();
    
    /** Gibt den Titel zurueck, unter dem die Komponente
      * dargestellt werden soll.
      **/
    public String getLabel();
    
    /** Diese Methode wird aufgerufen, wenn die Einstellungen
      * aus dem Dialog uebernommen werden sollen.
      **/
    public void anwenden();
  }


  /** Diese Bestandteile werden vom Dialog verwaltet */
  private Einstellung[] bestandteile;
  
  /** Konstruktor.
    * @param frame das Fenster, zu dem der Dialog gehoert
    *  (Wert kann auch null sein)
    * @param modal besagt, ob der Dialog modal ist
    * @param bestandteile jene Einstellungen, die in diesem
    *  Dialog gesetzt werden koennen.
    **/
  public Einstellungen(Frame frame,boolean modal,
    Einstellung[] bestandteile) {
    
    // SCHRITT 1: GRUNDLEGENDES LAYOUT
    // ===============================
    super(frame,modal);
    setTitle("Einstellungen");
    Container content = getContentPane();
    content.setLayout(new BorderLayout());
    // Unser Dialog verwendet ein JTabbedPane fuer
    // die verschiedenen Einstellungsarten
    JTabbedPane optionen = new JTabbedPane();
    content.add(optionen,BorderLayout.CENTER);
    // Fuer die OK/ANWENDEN/ABBRECHEN - Buttons
    // setzen wir ein weiteres Panel
    JPanel buttons = new JPanel();
    content.add(buttons,BorderLayout.SOUTH);
    
    // SCHRITT 2: SETZE DIE BUTTON-LEISTE,
    // INKLUSIVE DER ACTION-LISTENER
    // ==================================
    buttons.setLayout(new FlowLayout(FlowLayout.RIGHT));
    JButton ok = new JButton("Ok");
    JButton anwenden = new JButton("Anwenden");
    JButton abbrechen = new JButton("Abbrechen");
    buttons.add(ok);
    buttons.add(anwenden);
    buttons.add(abbrechen);
    ok.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        setzeEinstellungen();
        setVisible(false);
      }
    });
    anwenden.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        setzeEinstellungen();
      }
    });
    abbrechen.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        setVisible(false);
      }
    });
    // SCHRITT 3: FUEGE DIE VERSCHIEDENEN TABS
    // IN DAS PANEL EIN
    // =======================================
    this.bestandteile = (Einstellung[]) bestandteile.clone();
    for (int i = 0; i < bestandteile.length; i++)
      optionen.addTab(bestandteile[i].getLabel(),
        bestandteile[i].getComponent());
  }  
  
  /** Diese Methode wird aufgerufen, wenn der Ok- oder 
    * Anwende-Button gedrueckt wird.
    **/
  private void setzeEinstellungen() {
    for (int i = 0; i < bestandteile.length; i++)
      bestandteile[i].anwenden();
  }

}
