// =========================================================
// Набор диалоговых панелей
//
// (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.*;

public class Notebook extends Applet
{
  // Панель для размещения блокнота
  Panel pCardPanel;

  // Панель для размещения кнопок управления блокнотом
  Panel pButtonPanel;

  // Панель для рисования
  Panel pDraw;

  // Панели отдельных страниц
  Panel pBackgroundColor;    // страница выбора цвета фона
  Panel pForegroundColor;    // страница выбора цвета изображения
  Panel pFont;               // страница выбора шрифта
  
  // Кнопки выбора сраниц блокнота
  Button btnNext;            // следующая
  Button btnPrev;            // предыдущая
  Button btnBackgroundColor; // фон
  Button btnForegroundColor; // изображение
  Button btnFont;            // шрифт

  // Создаем ссылки на объекты класса Choice
  Choice chBackgroundColor;  // список цветов фона
  Choice chForegroundColor;  // список цветов изображения
  Choice chFont;             // список шрифтов

  // Текстовые метки списков
  Label tBackgroundColor;    // метка списка цветов фона
  Label tForegroundColor;    // метка списка цветов изображения
  Label tFont;               // метка списка шрифтов

  // Строка для хранения название выбранного шрифта
  String sFontName;

  // -------------------------------------------------------
  // getAppletInfo
  // Метод, возвращающей строку информации об аплете
  // -------------------------------------------------------
  public String getAppletInfo()
	{
		return "Name: Grid\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.1";
	}

	// -------------------------------------------------------
  // init
  // Метод, получающий управление при инициализации аплета
  // -------------------------------------------------------
	public void init()
	{
    // Устанавливаем желтый цвет фона
    setBackground(Color.yellow);

    // ----------------------------------------------------
    // Создаем в окне аплета две панели, разделяющие
    // окно по горизонтали. В верхней панели будет находиться
    // блокнот, в нижней - кнопки управления блокнотом
    // ----------------------------------------------------
    setLayout(new GridLayout(3, 1));
       
    // Создаем панель блокнота
    pCardPanel = new Panel();

    // ----------------------------------------------------
    // Создаем панели страниц блокнота
    // ----------------------------------------------------
  
    // Панель для выбора цвета фона
    pBackgroundColor = new Panel();

    // Панель для выбора цвета изображения
    pForegroundColor = new Panel();

    // Панель для выбора шрифта
    pFont = new Panel();
    
    // ----------------------------------------------------
    // Создаем списки для выбора цвета фона и
    // цвета изображения
    // ----------------------------------------------------

    // Список для выбора цвета фона
    chBackgroundColor = new Choice();

    // Список для выбора цвета изображения
    chForegroundColor = new Choice();

    // Список для выбора шрифта
    chFont = new Choice();

    // ----------------------------------------------------
    // Создаем метки для списков
    // ----------------------------------------------------
    
    // Метка для списка цвета фона
    tBackgroundColor = new Label("Chose Background Color:");

    // Метка для списка цвета изображения
    tForegroundColor = new Label("Chose Foreground Color:");

    // Метка для списка шрифтов
    tFont = new Label("Chose Font:");


    // ----------------------------------------------------
    // Добавляем списки и метки в панели
    // ----------------------------------------------------
    
    // Список цвета фона и метка 
    pBackgroundColor.add(tBackgroundColor);
    pBackgroundColor.add(chBackgroundColor);

    // Список цвета изображения и метка 
    pForegroundColor.add(tForegroundColor);
    pForegroundColor.add(chForegroundColor);

    // Список шрифтов и метка 
    pFont.add(tFont);
    pFont.add(chFont);

    // ----------------------------------------------------
    // Заполняем списки
    // ----------------------------------------------------

    // Заполняем список цвета фона
    chBackgroundColor.addItem("Yellow");
    chBackgroundColor.addItem("Green");
    chBackgroundColor.addItem("White");

    // Заполняем список цвета изображения
    chForegroundColor.addItem("Black");
    chForegroundColor.addItem("Red");
    chForegroundColor.addItem("Blue");
    
    // Заполняем список шрифтов
    chFont.addItem("Helvetica");
    chFont.addItem("Courier");
    chFont.addItem("TimesRoman");

    
    // Устанавливаем цвет фона
    setBackground(Color.yellow);

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

    // Создаем панель для рисования
    pDraw = new Panel();

    // Устанавливаем режим размещения для блокнота
    pCardPanel.setLayout(new CardLayout(5, 5));
   
    // ----------------------------------------------------
    // Добавляем панели страниц в блокнот
    // ----------------------------------------------------
    
    // Панель выбора цвета фона
    pCardPanel.add("BackgroundColor", pBackgroundColor);

    // Панель выбора цвета изображения
    pCardPanel.add("ForegroundColor", pForegroundColor);

    // Панель выбора шрифта
    pCardPanel.add("Font", pFont);

    // Добавляем панель для рисования в окно аплета
    add(pDraw);

    // Добавляем панель блокнота в окно аплета
    add(pCardPanel);

    // ----------------------------------------------------
    // Создаем кнопки управления блокнотом
    // ----------------------------------------------------

    // Кнопка просмотра следующей страницы блокнота
    btnNext = new Button("Next");

    // Кнопка просмотра предыдущей страницы блокнота
    btnPrev = new Button("Prev");

    // Выбор панели цвета фона
    btnBackgroundColor = new Button("Background Color");

    // Выбор панели цвета изображения
    btnForegroundColor = new Button("Foreground Color");

    // Выбор панели шрифтов
    btnFont = new Button("Set Text Font");

    // Создаем панель кнопок управления блокнотом
    pButtonPanel = new Panel();

    // Устанавливаем режим размещения для панели кнопок
    pButtonPanel.setLayout(new FlowLayout());

    // Добавляем кнопки в панель кнопок
    pButtonPanel.add(btnBackgroundColor);
    pButtonPanel.add(btnForegroundColor);
    pButtonPanel.add(btnFont);
    pButtonPanel.add(btnNext);
    pButtonPanel.add(btnPrev);

    // Добавляем панель кнопок
    add(pButtonPanel);

    // Выбираем шрифт по умолчанию
    sFontName = new String("Helvetica");
 
    // Отображаем окно аплета
    show();
	}

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

      // Получам ссылку на кнопку, вызвавшую событие
      btn = (Button)evt.target;

      // Выполняем ветвление по кнопкам. Для каждой кнопки
      // записываем ее название в строку состояния навигатора
      if(evt.target.equals(btnNext))

        // Выбираем следующую страницу в блокноте
        ((CardLayout)pCardPanel.getLayout()).next(pCardPanel);

      else if(evt.target.equals(btnPrev))

        // Выбираем предыдущую страницу в блокноте
        ((CardLayout)pCardPanel.getLayout()).previous(pCardPanel);

      else if(evt.target.equals(btnBackgroundColor))
        
        // Выбираем страницу цвета фона
        ((CardLayout)pCardPanel.getLayout()).show(pCardPanel, "BackgroundColor");

      else if(evt.target.equals(btnForegroundColor))
        
        // Выбираем страницу цвета изображения
        ((CardLayout)pCardPanel.getLayout()).show(pCardPanel, "ForegroundColor");

      else if(evt.target.equals(btnFont))

        // Выбираем страницу шрифтов
        ((CardLayout)pCardPanel.getLayout()).show(pCardPanel, "Font");

      // Если событие возникло от неизвестной кнопки,
      // мы его не обрабатываем, передавая методу action
      // родительского класса
      else
        return super.action(evt, obj);

      // Перерисовываем окно аплета
      pDraw.repaint();
      repaint();

      // Возвращаем признак того, что мы обработали событие
      return true;
    }

    // Обработка событий от списков
    else if(evt.target instanceof Choice)
    {
      // Переменная для хранения ссылки на список,
      // вызвавший событие
      Choice ch;

      // Получаем ссылку на список
      ch = (Choice)evt.target;

      // Выполняем ветвление по спискам
      
      // Список цвета фона
      if(evt.target.equals(chBackgroundColor))
      {
        // Получаем номер текущего элемента списка
        // и устанавливаем соответствующий
        // цвет фона
        if(ch.getSelectedIndex() == 0)
          pDraw.setBackground(Color.yellow);
        
        else if(ch.getSelectedIndex() == 1)
          pDraw.setBackground(Color.green);

        else if(ch.getSelectedIndex() == 2)
          pDraw.setBackground(Color.white);
      }

      // Список цвета изображения
      else if(evt.target.equals(chForegroundColor))
      {
        // Получаем номер текущего элемента списка
        // и устанавливаем соответствующий
        // цвет изображения
        if(ch.getSelectedIndex() == 0)
          pDraw.setForeground(Color.black);
        
        else if(ch.getSelectedIndex() == 1)
          pDraw.setForeground(Color.red);

        else if(ch.getSelectedIndex() == 2)
          pDraw.setForeground(Color.blue);
      }

      // Список шрифтов
      else if(evt.target.equals(chFont))
      {
        Graphics gpDraw;

        // Получаем контекст отображения для 
        // панели рисования
        gpDraw = pDraw.getGraphics();

        // Получаем номер текущего элемента списка
        // и записываем имя соответствующего шрифта
        // в строку sFontName
        if(ch.getSelectedIndex() == 0)
          sFontName = "Helvetica";

        else if(ch.getSelectedIndex() == 1)
          sFontName = "Courier";

        else if(ch.getSelectedIndex() == 2)
          sFontName = "TimesRoman";
      }

      // Если событие возникло от неизвестного списка,
      // мы его не обрабатываем, передавая методу action
      // родительского класса
      else
        return super.action(evt, obj);
     
      // Перерисовываем панель pDraw
      pDraw.repaint();

      // Перерисовываем окно аплета
      repaint();

      // Возвращаем признак того, что мы обработали событие
      return true;
    }

    // Вызываем метод action родительского класса
    return super.action(evt, obj);
  }

  // -------------------------------------------------------
  // paint
  // Метод paint, выполняющий рисование в окне аплета
  // -------------------------------------------------------
	public void paint(Graphics g)
	{
    Graphics gpDraw;
    
    // Получаем контекст отображения для панели рисования
    gpDraw = pDraw.getGraphics();

    // Определяем текущие размеры 
    Dimension dimAppWndDimension = pDraw.size();
    
    // Рисуем рамку вокруг окна аплета
    gpDraw.drawRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);

    // Устанавливаем шрифт
    gpDraw.setFont(new Font(sFontName, Font.PLAIN, 12));

    // Рисуем строку
    gpDraw.drawString("Смотри на шрифт, цвет фона и текста!", 
      10, 50);

    // Получаем контекст отображения для панели блокнота
    gpDraw = pCardPanel.getGraphics();

    // Определяем размеры панели блокнота
    dimAppWndDimension = pCardPanel.size();
    
    // Обводим блокнот рамкой
    gpDraw.drawRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);
	}
}
