package osa;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
/**
 * Класс предназначен для вывода на экран диалогового окна с информацией о
 * разработчиках программы. В этом же окне после ввода специального ключевого
 * слова можно получить доступ к настройкам программы, хранимым в файле
 * "osa.cfg". Для этого класс реализует интерфейс KeyListener. Понятно, что
 * доступ к настройкам должен иметь только преподаватель.
*/
public class AboutFrame extends JDialog implements KeyListener
{ private MainFrame aFrame;
  private JPanel contentPane;
  private JEditorPane jEditorPane = new JEditorPane();
  private JScrollPane jScrollPane = new JScrollPane();
  private JPanel jPanel = new JPanel();
  private String title = null;
  private URL html = null;
  private StringBuffer sb = new StringBuffer();
  private boolean pt = false;
  /**
   * Конструктор класса.
   * @param pFrame указатель на родительское окно. Из родительского окна
   * используется иконка приложения, указатель нужен также и потому
   * что окно - модальное.
   * @param pTitle строка с названием программы.
  */
  public AboutFrame(MainFrame pFrame,String pTitle)
  { super(pFrame);
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    aFrame = pFrame;
    title = pTitle;
    try
    { Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
      setLocation((screenSize.width*3)>>>4,(screenSize.height*3)>>>4);
      setSize((screenSize.width*10)>>>4,(screenSize.height*10)>>>4);
      setTitle("About "+title);
      contentPane = (JPanel)getContentPane();
      contentPane.setLayout(new BorderLayout());
      jEditorPane.setFont(aFrame.mFont);
      jEditorPane.setCaretColor(Color.lightGray);
      jEditorPane.getCaret().setSelectionVisible(false);
      jEditorPane.getCaret().setVisible(false);
      jEditorPane.setEditable(false);
      jScrollPane.setViewportView(jEditorPane);
      jEditorPane.addKeyListener(this);
      contentPane.add(jScrollPane,BorderLayout.CENTER);
      setModal(true);
      html = AboutFrame.class.getResource("about.html");
      if(html!=null) jEditorPane.setPage(html);
      validate();
      setVisible(true);
    }
    catch(Exception e) { }
  }
  /**
   * Функция обрабатывает события, происходящие с окном. Точнее интерес
   * представляет только закрытие окна, когда освобождаются некоторые ресурсы с
   * проверяется корректность введенного ключевого слова.
   * @param e объект, в котором хранятся данные о событии.
  */
  protected void processWindowEvent(WindowEvent e)
  { if(e.getID()==WindowEvent.WINDOW_CLOSING)
    { html = AboutFrame.class.getResource("blank.html");
      if(html!=null) try { jEditorPane.setPage(html); } catch (Exception ex) { }
    }
    super.processWindowEvent(e);
  }
  /**
   * Эта функция вызывается при каждом нажатии на клавишу, именно в ней
   * происходит проверка ключевого слова и переключение в режим настроек.
   * @param e объект, в котором хранятся данные о событии.
  */
  public void keyPressed(KeyEvent e)
  { if((!pt)&&(sb.length()<0x20)) sb.append(e.getKeyChar());
    if((!pt)&&(sb.toString().toLowerCase().equals(aFrame.ps)))
    { pt = true;
      setTitle(title+" - Options");
      contentPane.removeAll();
      contentPane.add(jPanel,BorderLayout.CENTER);
      validate();
    }
  }
  /**
   * Функция пустая и нужна для реализации интерфейса.
   * @param e объект, в котором хранятся данные о событии.
  */
  public void keyReleased(KeyEvent e) { }
  /**
   * Функция пустая и нужна для реализации интерфейса.
   * @param e объект, в котором хранятся данные о событии.
  */
  public void keyTyped(KeyEvent e) { }
}
