/*
 * MinDialog.java  E.L. 2000-01-21
 *
 * Dialog med OK- og avbryt-knapp.
 */

package mittBibliotek;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MinDialog extends JDialog {
  private boolean ok = false; // har brukeren trykket ok-knappen?
  private KnappePanel knappepanelet = new KnappePanel();

  protected MinDialog(JFrame foreldre, String tittel) {
    super(foreldre, tittel, true);
    addWindowListener(new Vinduslytter());
    /* Vi vil programmere lukking av vinduet selv: */
    setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
  }

  protected boolean erOk() {
    return ok;
  }

  protected void settOk(boolean verdi) {
    ok = verdi;
  }

  /*
   * Returtypen fra finnKnappepanel() kan ikke være KnappePanel pga at denne klassen
   * er privat. Vi kan i stedet bruke JPanel som returtype, ettersom KnappePanel er
   * subklasse til JPanel.
   */
  protected JPanel finnKnappepanel() {  // subklassen plasserer dette riktig
    return knappepanelet;
  }

  /*
   * Subklasser får sin egen utgave av metoden okData() dersom det er ønskelig
   * at dataene skal kontrolleres før de eventuelt godtas.
   */
  protected boolean okData() {
    return true;
  }

  private class KnappePanel extends JPanel {
    public KnappePanel() {
      Kommandolytter knappelytter = new Kommandolytter();

      JButton okKnapp  = new JButton("OK");
      JButton avbrytKnapp = new JButton("Avbryt");
      add(okKnapp);
      add(avbrytKnapp);
      okKnapp.addActionListener(knappelytter);
      avbrytKnapp.addActionListener(knappelytter);

      /* Vi definerer akselerasjonstaster til begge knappene: */
      KeyStroke enterTasten = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
      okKnapp.registerKeyboardAction(knappelytter, "OK", enterTasten,
          JComponent.WHEN_FOCUSED);
      KeyStroke escapeTasten = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
      avbrytKnapp.registerKeyboardAction(knappelytter, "Avbryt", escapeTasten,
          JComponent.WHEN_IN_FOCUSED_WINDOW);
    }
  }

  private class Kommandolytter implements ActionListener {
    public void actionPerformed(ActionEvent hendelse) {
       String kommando = hendelse.getActionCommand();
      if (kommando.equals("OK")){
        if (okData()) {  // skal bare lukke vinduet dersom ok data
          ok = true;
          setVisible(false);
        }
      } else {  // brukeren har trykket på avbryt, lukker vinduet
        ok = false;
        setVisible(false);
      }
    }
  }

  private class Vinduslytter extends WindowAdapter {
    public void windowClosing(WindowEvent hendelse) {
      int svar = JOptionPane.showConfirmDialog(null,
        "Skal eventuelle registrerte data lagres? ", "Lukking av dialogvindu",
        JOptionPane.YES_NO_OPTION);
      if (svar == JOptionPane.YES_OPTION) {
        if (okData()) {  // skal bare lukke vinduet dersom ok data
          ok = true;
          setVisible(false);
        }
      } else {  // data skal ikke lagres, lukker vinduet
        ok = false;
        setVisible(false);
      }
    }
  }
}