import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


/** Diese Klasse ist unser neues Hauptprogramm.
  * Sie ermoeglicht uns, die SwingAnzeige in einen Frame
  * einzupacken und grafisch darzustellen.
  **/
public class JavaUhr extends JFrame {

  /** Die von uns verwendete SwingAnzeige */
  private SwingUhr anzeige;

  /** Der verwendete Einstellungs-Dialog */
  private Einstellungen einstellungen;
  
  /** Konstruktor */
  public JavaUhr()
  {
    // Erzeuge und verwende ein SwingUhr-Objekt
    anzeige = new SwingUhr();
    setContentPane(anzeige);
    // Erzeuge ein Menue mit den verschiedenen Optionen
    JMenuBar bar = new JMenuBar();
    JMenu system = new JMenu("System");
    JMenuItem einstellungen = new JMenuItem("Einstellungen");
    JMenuItem beenden = new JMenuItem("Beenden");
    bar.add(system);
    system.add(einstellungen);
    system.add(beenden);
    setJMenuBar(bar);
    // Erzeuge einen Listener fuer das Einstellungs--Menue    
    einstellungen.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        zeigeEinstellungen();
      }
    });    
    // Erzeuge einen Listener fuer das Beenden-Menue    
    beenden.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        beenden();
      }
    });
    // Verwende dieselbe Aktion auch, wenn wir das Fenster
    // schliessen wollen
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        beenden();
      }
    });
  }

  /** Diese Methode wird aufgerufen, 
    * um den Einstellungs-Dialog anzuzeigen. 
    **/
  private void zeigeEinstellungen() {
    // Erzeuge nur neue Objekte, wenn der Dialog noch nicht existiert
    if (einstellungen == null) {
      // Initialisiere die Look-and-feel-Einstellung
      SetzeLookAndFeel lookAndFeel=new SetzeLookAndFeel();
      // Initialisiere die Darstellungs-Einstellungen
      SetzeDarstellung darstellung=new SetzeDarstellung(anzeige,this);
      // Initialisiere den Dialog
      einstellungen = 
      new Einstellungen(this,true,new Einstellungen.Einstellung[]{
        lookAndFeel,darstellung
      });
      // Gegen Ende noch einige letzte Einstellungen
      lookAndFeel.setZuAktualisieren(new Window[] {
        this,einstellungen
      });
    }
    // Mache den Dialog sichtbar      
    einstellungen.pack();
    einstellungen.setVisible(true);
  }
  
  /** Ueberschreibt die setVisible-Methode, um unsere Uhr zu aktivieren
    * oder zu deaktivieren.
    **/
  public void setVisible(boolean value) {
    if (value != isVisible()) {
      super.setVisible(value);
      if (value) 
        anzeige.aktivieren();
      else
        anzeige.beenden();
    }
  }
  
  /** Diese Methode wird aufgerufen, wenn das Programm beendet
    * werden soll.
    **/
  private void beenden() {
    // Frage den Benutzer, ob er das Ernst meint!
    int bistDuSicher = JOptionPane.showConfirmDialog(this,
      "Programm wirklich beenden?");
    // Falls ja, beende das Programm
    if (bistDuSicher == JOptionPane.YES_OPTION) {
      setVisible(false);
      System.exit(0);
    }
  }
  
  /** Main-Methode */
  public static void main(String[] args) {
    // Erzeuge unseren JavaUhr-Frame
    JavaUhr uhr = new JavaUhr();
    uhr.setTitle("Java Uhr");
    uhr.pack();
    uhr.setVisible(true);
  }
 
}
