// =========================================================
// Работа с окнами и диалоговыми панелями 
//
// (C) Фролов А.В, 1997
//
// E-mail: frolov@glas.apc.org
// WWW:    http://www.glasnet.ru/~frolov
//            или
//         http://www.dials.ccas.ru/frolov
// =========================================================
import java.applet.*;
import java.awt.*;

// =========================================================
// Класс FrameWnd
// Это наш аплет
// =========================================================
public class FrameWnd extends Applet
{
  // Окно, которое будет возникать из аплета
  MainFrameWnd fMainFrame;
  
  // Кнопка для отображения окна fMainFrame
  Button btnShowFrame;

  // Кнопка для удаления окна fMainFrame
  Button btnHideFrame;

  // -------------------------------------------------------
  // getAppletInfo
  // Метод, возвращающей строку информации об аплете
  // -------------------------------------------------------
	public String getAppletInfo()
	{
		return "Name: FrameWnd\r\n" +
      "Author: Alexandr Frolov\r\n" +
	    "E-mail: frolov@glas.apc.org" +
      "WWW:    http://www.glasnet.ru/~frolov" +
      "Created with Microsoft Visual J++ Version 1.0";
	}

	// -------------------------------------------------------
  // init
  // Метод, получающий управление при инициализации аплета
  // -------------------------------------------------------
	public void init()
	{
    // Создаем новое окно на базе класса MainFrameWnd
    fMainFrame = new MainFrameWnd("Main Frame Window");

    // Создаем кнопку для отображения этого окна
    btnShowFrame = new Button("Show Frame Window");
    
    // Добавляем кнопку в окно аплета
    add(btnShowFrame);
    
    // Создаем кнопку для удаления окна fMainFrame 
    btnHideFrame = new Button("Hide Frame Window");

    // Добавляем кнопку в окно аплета
    add(btnHideFrame);
	}

	// -------------------------------------------------------
  // destroy
  // Метод, получающий управление при завершении
  // работы аплета
  // -------------------------------------------------------
	public void destroy()
	{
    // Удаляем окно fMainFrame и освобождаем все связанные
    // с ним ресурсы
    fMainFrame.dispose();
	}

  // -------------------------------------------------------
  // action
  // Метод вызывается, когда пользователь выполняет
  // действие над компонентами
  // -------------------------------------------------------
  public boolean action(Event evt, Object obj)
  {
    // Ссылка на кнопку, от которой пришло сообщение
    Button btn;

    // Проверяем, что событие вызвано кнопкой, а не
    // другим компонентом
    if(evt.target instanceof Button)
    {
      // Получам ссылку на кнопку, вызвавшую событие
      btn = (Button)evt.target;

      // Если нажата кнопка отображения окна fMainFrame,
      // показываем его с помощью метода show
      if(evt.target.equals(btnShowFrame))
      {
        fMainFrame.show();
      }

      // Если нажата кнопка удаления окна fMainFrame,
      // удаляем его с помощью метода hide
      else if(evt.target.equals(btnHideFrame))
      {
        fMainFrame.hide();
      }
      // Если событие возникло от неизвестной кнопки,
      // мы его не обрабатываем
      else
        return false;

      return true;
    }

    // Если событие вызвано не кнопкой, 
    // мы его не обрабатываем
    return false;
  }
}

// =========================================================
// Класс MainFrameWnd
// На базе этого класса создается окно с меню
// =========================================================
class MainFrameWnd extends Frame
{
  // Кнопка, с помощью которой можно закрыть окно
  Button btnOK;

  // Главное меню окна
  MenuBar mbMainMenuBar;
  
  // Меню File
  Menu mnFile;

  // Меню Help
  Menu mnHelp;

  // -------------------------------------------------------
  // MainFrameWnd
  // Конструктор класса
  // -------------------------------------------------------
  public MainFrameWnd(String sTitle)
  {
    // Создаем окно, вызывая конструктор из базового класса
    super(sTitle);
    
    // Устанавливаем размеры окна
    resize(400, 200);

    // Устанавливаем цвет фона и изображения для окна
    setBackground(Color.yellow);
    setForeground(Color.black);

    // Устанавливаем режим добавления компонент FlowLayout
    setLayout(new FlowLayout());
    
    // Создаем и добавляем в окно кнопку OK
    btnOK = new Button("OK");
    add(btnOK);

    // Создаем главное меню
    mbMainMenuBar = new MenuBar();
    
    // Создаем меню File
    mnFile = new Menu("File");
    
    // Заполняем меню File
    mnFile.add("New");       // строка New
    mnFile.add("-");         // разделитель
    mnFile.add("Exit");      // строка Exit
  
    // Создаем меню Help
    mnHelp = new Menu("Help"); 

    // Заполняем меню Help
    mnHelp.add("Content");   // строка Content
    mnHelp.add("-");         // разделитель
    mnHelp.add("About");     // строка About

    // Добавляем меню File и Help в главное 
    // меню нашего окна
    mbMainMenuBar.add(mnFile);
    mbMainMenuBar.add(mnHelp);
    
    // Устанавливаем для окна главное меню
    setMenuBar(mbMainMenuBar);
  }

  // -------------------------------------------------------
  // paint
  // Метод paint, выполняющий рисование 
  // в созданном нами окне 
  // -------------------------------------------------------
	public void paint(Graphics g)
	{
    // Устанавливаем шрифт
    g.setFont(new Font("Helvetica", Font.PLAIN, 12));

    // Рисуем строку
    g.drawString("Окно класса Frame", 10, 50);

    // Вызываем метод paint родительского класса
    super.paint(g);
	}

  // -------------------------------------------------------
  // handleEvent
  // Обработка событий для окна
  // -------------------------------------------------------
  public boolean handleEvent(Event evt)
  {
    // Если пользователь закрывает окно,
    // скрываем его с помощью метода hide
    if(evt.id == Event.WINDOW_DESTROY)
    {
      hide();
      return true;
    }
      
    else
      return super.handleEvent(evt);
  }
  
  // -------------------------------------------------------
  // action
  // Метод вызывается, когда пользователь выполняет
  // действие над компонентами в нашем окне
  // -------------------------------------------------------
  public boolean action(Event evt, Object obj)
  {
    // Ссылка на кнопку, от которой пришло сообщение
    Button btn;
  
    // Ссылка на элемент меню
    MenuItem mnItem;

    // Проверяем, что событие вызвано кнопкой, а не
    // другим компонентом
    if(evt.target instanceof Button)
    {
      // Получам ссылку на кнопку, вызвавшую событие
      btn = (Button)evt.target;

      // Если пользователь нажал кнопку OK, скрываем окно
      if(evt.target.equals(btnOK))
      {
        hide();
      }
      // Если событие возникло от неизвестной кнопки,
      // мы его не обрабатываем
      else
        return false;

      return true;
    }

    // Обработка событий от меню
    else if(evt.target instanceof MenuItem)
    {
      // Получам ссылку на элемент меню
      mnItem = (MenuItem)evt.target;

      // Если из меню File выбрана строка Exit,
      // завершаем работу виртуальной машины Java.
      // Это приводит к завершению работы навигатора
      if(obj.equals("Exit"))
      {
        System.exit(0);
      }

      // Если из меню File выбрана строка New,
      // отображаем название строки в диалоговой панели
      else if(obj.equals("New"))
      {
        // Ссылка на диалоговую панель
        MessageBox mbox;

        // Создаем новую диалоговую панель
        mbox = new MessageBox("Item New selected",
          this, "Dialog from Frame", true);
        
        // Отображаем диалоговую панель
        mbox.show();
      }

      // Если из меню File выбрана строка Content,
      // отображаем название строки в диалоговой панели
      else if(obj.equals("Content"))
      {
        MessageBox mbox;

        mbox = new MessageBox("Item Content selected",
          this, "Dialog from Frame", true);
        
        mbox.show();
      }
      
      // Если из меню File выбрана строка About,
      // отображаем название строки в диалоговой панели
      else if(obj.equals("About"))
      {
        MessageBox mbox;
        mbox = new MessageBox("Item About selected",
          this, "Dialog from Frame", true);
        
        mbox.show();
      }

      else
        return false;

      return true;
    }
    return false;
  }
}

// =========================================================
// Класс MessageBox
// На базе этого класса мы создаем диалоговые панели
// =========================================================
class MessageBox extends Dialog
{
  // Поле для отображения текста сообщения
  Label lbMsg;

  // Кнопка для удаления диалоговой панели
  Button btnOK;

  // -------------------------------------------------------
  // MessageBox
  // Конструктор класса
  // -------------------------------------------------------
  public MessageBox(String sMsg, 
    Frame  parent, String  sTitle, boolean  modal)
  {
    // Создаем диалогвоую панель, вызывая конструктор
    // базового класса Dialog
    super(parent, sTitle, modal);

    // Устанавливаем размеры окна диалоговой панели
    resize(200, 100);

    // Устанавливаем режим размещения компонент GridLayout
    setLayout(new GridLayout(2, 1));
    
    // Создаем и добалвяем поле для отображения сообщения
    lbMsg = new Label(sMsg, Label.CENTER);
    add(lbMsg);

    // Создаем и добавляем кнопку для завершения работы
    // диалоговой панели
    btnOK = new Button("OK");
    add(btnOK);
  }

  // -------------------------------------------------------
  // handleEvent
  // Обработка событий для диалоговой панели
  // -------------------------------------------------------
  public boolean handleEvent(Event evt)
  {
    // Если пользователь закрывает окно диалоговой панели,
    // скрываем его с помощью метода hide
    if(evt.id == Event.WINDOW_DESTROY)
    {
      dispose();
      return true;
    }
      
    else
      return super.handleEvent(evt);
  }

  // -------------------------------------------------------
  // action
  // Метод вызывается, когда пользователь выполняет
  // действие над компонентами в диалоговой панели
  // -------------------------------------------------------
  public boolean action(Event evt, Object obj)
  {
    // Ссылка на кнопку, от которой пришло сообщение
    Button btn;
  
    // Проверяем, что событие вызвано кнопкой, а не
    // другим компонентом
    if(evt.target instanceof Button)
    {
      // Получам ссылку на кнопку, вызвавшую событие
      btn = (Button)evt.target;

      // Если нажата кнопка OK, удаляем диалоговую панель
      // и освобождаем все связанные с ней ресурсы
      if(evt.target.equals(btnOK))
      {
        dispose();
      }
      
      // Если событие возникло от неизвестной кнопки,
      // мы его не обрабатываем
      else
        return false;

      return true;
    }
    return false;
  }
}

