// =========================================================
// Списки типа List Box
//
// (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 ListBox extends Applet
{
  // Создаем ссылки на объекты класса List
  List chBackgroundColor;
  List chForegroundColor;

  // Строки для хранения названий выбираемого цвета
  String sSelBackground = new String("Yellow");
  String sSelForeground = new String("Black");
  
  // -------------------------------------------------------
  // getAppletInfo
  // Метод, возвращающей строку информации об аплете
  // -------------------------------------------------------
	public String getAppletInfo()
	{
		return "Name: ListBox\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()
	{
    // Создаем списки для выбора цвета фона и
    // цвета изображения
    chBackgroundColor = new List(6, false);
    chForegroundColor = new List(4, false);

    // Добавляем списки в окно аплета
    add(chBackgroundColor);
    add(chForegroundColor);

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

    // Заполняем список цвета изображения
    chForegroundColor.addItem("Black");
    chForegroundColor.addItem("Red");
    chForegroundColor.addItem("Blue");
    chForegroundColor.addItem("Yellow");
    chForegroundColor.addItem("Green");
    chForegroundColor.addItem("White");

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

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

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

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

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

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

        else if(ch.getSelectedIndex() == 3)
          setBackground(Color.black);
        
        else if(ch.getSelectedIndex() == 4)
          setBackground(Color.red);
        
        else if(ch.getSelectedIndex() == 5)
          setBackground(Color.blue);
      }

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

        else if(ch.getSelectedIndex() == 2)
          setForeground(Color.blue);
      
        else if(ch.getSelectedIndex() == 3)
          setForeground(Color.yellow);

        else if(ch.getSelectedIndex() == 4)
          setForeground(Color.green);
      
        else if(ch.getSelectedIndex() == 5)
          setForeground(Color.white);
      }

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

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

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

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

  // -------------------------------------------------------
  // handleEvent
  // Обработка событий
  // -------------------------------------------------------
  public boolean handleEvent(Event evt)
  {
    // Переменная для хранения ссылки на список
    List ls;
  
    // Нас интересуют события, возникающие
    // только при выделении нового элемена списка
    if(evt.id == Event.LIST_SELECT)
    {
      // Получаем ссылку на список
      ls = (List)evt.target;
      
      // Получаем текущий выделенный цвет фона
      if(evt.target.equals(chBackgroundColor))
        sSelBackground = ls.getSelectedItem();

      // Получаем текущий выделенный цвет изображения
      else if(evt.target.equals(chForegroundColor))
        sSelForeground = ls.getSelectedItem();

      // Пишем цвет фона и изображения в строке
      // состояния навигатора
      showStatus("(" + sSelBackground 
        + ", " + sSelForeground + ")");
      
      // Перерисовываем окно
      repaint();

      // Возвращаем признак того, что мы обработали
      // событие самостоятельно
      return true;
    }
    
    // Для тех событий, которые мы не обрабатываем,
    // вызываем метод handleEvent из базового класа
    else
      return super.handleEvent(evt);
  }
  
  // -------------------------------------------------------
  // paint
  // Метод paint, выполняющий рисование в окне аплета
  // -------------------------------------------------------
	public void paint(Graphics g)
	{
    // Определяем текущие размеры окна аплета
    Dimension dimAppWndDimension = size();
    
    // Рисуем рамку вокруг окна аплета
    g.drawRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);

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

    // Отображаем текущий выделенный цвет фона
    // и изображения
    g.drawString("Background:  " + sSelBackground, 10, 160);
    g.drawString("Foreground:  " + sSelForeground, 10, 190);
	}
}
