import java.awt.*;
import javax.swing.*;

/** Diese Klasse ermoeglicht dem Benutzer (in Verbindung
  * mit dem Einstellungs-Dialog) das Setzen des
  * Look and feel.
  **/
public class SetzeLookAndFeel extends JPanel 
  implements Einstellungen.Einstellung
{
  /** Die verschiedenen Namen der Look-and-feels */
  private final static String[] NAMES = {
    "Metal (Standard)",
    "Windows",
    "Motif",
    "GTK (nur Java 1.4.2 oder hoeher)"
  };
  
  /** Instanzen der verschiedenen Look-and-feels */
  private final static String[] CLASSES = {
    "javax.swing.plaf.metal.MetalLookAndFeel",
    "com.sun.java.swing.plaf.windows.WindowsLookAndFeel",
    "com.sun.java.swing.plaf.motif.MotifLookAndFeel",
    "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"
  };
  
  /** Diese Fenster muessen beim Wechsel des Look and feel
    * aktualisiert werden.
    **/
  private Window[] zuAktualisieren = new Window[0];

  /** Jeder RadioButton steht fuer ein Look and feel */
  private JRadioButton[] buttons;
  
  /** Konstruktor - hier wird das Layout gesetzt */
  public SetzeLookAndFeel() {
    // Schachtele mit einem inneren Panel
    setLayout(new FlowLayout(FlowLayout.LEFT));
    JPanel innerPanel = new JPanel();
    add(innerPanel);
    innerPanel.setLayout(new GridLayout(NAMES.length,1));
    // Innerhalb des Panels setze nun 
    // die verschiedenen RadioButtons
    buttons = new JRadioButton[NAMES.length];
    ButtonGroup group = new ButtonGroup();
    for (int i = 0; i < buttons.length; i++) {
      buttons[i] = new JRadioButton(NAMES[i]);
      group.add(buttons[i]);
      innerPanel.add(buttons[i]);
    }
    // Zu Anfang ist der erste Button selektiert
    buttons[0].setSelected(true);
  }
  
  /** Setze die zu aktualisierenden Fenster */
  public void setZuAktualisieren(Window[] zuAktualisieren) {
    if (zuAktualisieren != null)
      this.zuAktualisieren = (Window[])
        zuAktualisieren.clone();
    else
      this.zuAktualisieren = new Window[0];
  }
  
  /** 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 "Look&Feel";
  }
  
  /** Diese Methode wird aufgerufen, wenn die Einstellungen
    * aus dem Dialog uebernommen werden sollen.
    **/
  public void anwenden() {
    for (int i = 0; i < buttons.length; i++)
      if (buttons[i].isSelected()) {        
        // Setze das Look and feel
        try {
          UIManager.setLookAndFeel(CLASSES[i]);
        }
        catch(Exception e) {
          e.printStackTrace();
        }
        // Aktualisiere gezeichnete Komponenten
        for (int j = 0; j < zuAktualisieren.length; j++) {
          SwingUtilities.updateComponentTreeUI(zuAktualisieren[j]);
          zuAktualisieren[j].pack();
        }
        // Somit sind wir fertig
        return;
      }
  }
  
}
