import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
/** Diese Klasse ermoeglicht in Verbindung mit dem Einstellungs-Dialog
  * das Setzen der Darstellung (analog/digital + Farben).
  **/
public class SetzeZeitserver extends JPanel 
  implements Einstellungen.Einstellung {
  /** Diese SwingUhr wird mit den Einstellungen beeinflusst */
  private SwingUhr uhr;
  /** Dieses Objekt synchronisiert die Uhrzeiten */
  private Synchronisierer sync;
  /** Dieses Fenster ist der Dialog, in dem die Einstellungen
    * durchgefuehrt werden
    **/
  private Window dialog;
  /** RadioButtons: Systemzeit */
  private JRadioButton system;
  /** RadioButton: Zeitserver */
  private JRadioButton server;
  /** Textfeld: ServerName */
  private JTextField serverName;
  /** Textfeld: Port */
  private JTextField port;
  /** Textfeld: Taktrate fuer die Aktualisierung */
  private JTextField takt;
  /** Konstruktor - hier wird das Layout gesetzt */
  public SetzeZeitserver(SwingUhr uhr,
    Synchronisierer sync) {
    // Initialisiere die Instanzvariablen.
    this.uhr = uhr;
    this.sync = sync;
    system = new JRadioButton("Systemzeit");
    server = new JRadioButton("Zeitserver");
    // Erzeuge ein inneres Panel fuer die RadioButtons
    JPanel buttons = new JPanel();
    buttons.setLayout(new GridLayout(1,2));
    buttons.add(system);
    buttons.add(server);
    ButtonGroup group = new ButtonGroup();
    group.add(system);
    group.add(server);
    system.setSelected(true);
    // Erzeuge ein weiteres Panel fuer die Servereinstellungen
    JPanel fragen = new JPanel();
    fragen.setLayout(new GridLayout(4,2));
    fragen.add(new JLabel("Servername:"));
    fragen.add(serverName = new JTextField("localhost"));
    fragen.add(new JLabel("Serverport:"));
    fragen.add(port = new JTextField("1099"));
    fragen.add(new JLabel("Aktualisiere alle..."));
    fragen.add(takt = new JTextField("60"));
    fragen.add(new JLabel(""));
    fragen.add(new JLabel("... Sekunden"));
    // Bette das Fragen-Panel in ein zweites Panel ein, damit die
    // Textfelder nicht gestreckt werden
    JPanel einstellung = new JPanel();
    einstellung.setLayout(new BorderLayout());
    einstellung.add(fragen,BorderLayout.NORTH);
    // Fuege Rahmen um die inneren Panels ein
    buttons.setBorder(new TitledBorder("Uhrwerk"));
    fragen.setBorder(new TitledBorder("Verbindung"));
    // Fuege beide Panels in dieses Panel ein
    setLayout(new BorderLayout());
    add(buttons,BorderLayout.NORTH);
    add(einstellung,BorderLayout.CENTER);
  }
  
  /** Setze das Dialogfenster, zu dem dieses Panel gehoert */
  public void setzeDialog(Window dialog) {
    this.dialog = dialog;
  }
  
  /** Gibt die grafische Komponente zurueck, die im
    * Dialog dargestellt werden soll.
    **/
  public Component getComponent() {
    return this;
  }
  
  /** Gibt den Titel zurueck, unter dem die Komponente
    * dargestellt werden soll.
    **/
  public String getLabel() {
    return "Zeitserver";
  }
  
  /** Hilfsmethode: zeigt auftretende Probleme als Hilfsdialog an */
  private void zeigeProblem(String nachricht) {
    JOptionPane.showMessageDialog(dialog,nachricht,getLabel(),
      JOptionPane.WARNING_MESSAGE);
  }
  
  /** Diese Methode wird aufgerufen, wenn die Einstellungen
    * aus dem Dialog uebernommen werden sollen.
    **/
  public void anwenden() {
    // Verwende Systemzeit
    if (system.isSelected()) {
      uhr.setzeSystemzeit();
      sync.setQuelle(null);
      return;
    }
    // Andernfalls lies die aktuellen Einstellungen
    String serverName = this.serverName.getText();
    int port = 0, takt = 0;
    try {
      port = Integer.parseInt(this.port.getText());
    }
    catch(NumberFormatException e) {
      zeigeProblem("Ungueltige Eingabe fuer ServerPort");
      return;
    }
    try {
      takt = Integer.parseInt(this.takt.getText());
    }
    catch(NumberFormatException e) {
      zeigeProblem("Ungueltige Eingabe fuer Zeittakt");
      return;
    }
    // Erzeuge ein neues Uhrwerk und teste die Verbindung
    System.out.println("Teste Verbindung zu " +serverName +':' +takt);
    Serverzeit verbindung = new Serverzeit(serverName,port);
    String test = verbindung.testString();
    if (test != null)
      System.out.println(test);
    else {
      zeigeProblem("Kann Verbindung zu " + serverName + ':' +
        port + " nicht herstellen.");
      return;
    }
    // Ist die Verbindung erfolgreich, uebernimm die Einstellungen
    sync.setTakt(takt * 1000);
    sync.setQuelle(verbindung);
    uhr.setzeUhrwerk(sync.getZiel());
  }
  
}
