// =========================================================
// Рисование прямых линий
//
// (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.*;

// Добавляем для класса Vector
import java.util.*;

public class LineDraw extends Applet
{
  // Координаты курсора при нажатии кнопки мыши
  Dimension dmDown;

  // Координаты курсора при отжатии кнопки мыши
  Dimension dmUp;

  // Предыдущие координаты конца линии
  Dimension dmPrev;
  
  // Признак включения режима рисования
  boolean bDrawing;

  // Массив координат линий
  Vector lines;

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

	// -------------------------------------------------------
  // init
  // Метод, получающий управление при инициализации аплета
  // -------------------------------------------------------
	public void init()
  {
    // Сброс признака рисования
    bDrawing = false;

    // Создание массива для хранения координат линий
    lines = new Vector();
  }

  // -------------------------------------------------------
  // paint
  // Метод paint, выполняющий рисование в окне аплета
  // -------------------------------------------------------
  public void paint(Graphics g)
	{
    // Определяем текущие размеры окна аплета
    Dimension dimAppWndDimension = size();
    
    // Выбираем в контекст отображения желтый цвет
    g.setColor(Color.yellow);
    
    // Закрашиваем внутреннюю область окна аплета
    g.fillRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);

    // Выбираем в контекст отображения черный цвет
    g.setColor(Color.black);

    // Рисуем рамку вокруг окна аплета
    g.drawRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);
    
    // Рисуем в цикле линии, координаты которых 
    // хранятся в массиве lines
    for (int i=0; i < lines.size(); i++) 
    {
	    // Получаем координаты очередной линии
      Rectangle p = (Rectangle)lines.elementAt(i);

      // Рисуем линию
      g.drawLine( p.width, p.height, p.x, p.y);
    }
   
    // Сбрасываем режим рисования
    bDrawing = false;
	}

  // -------------------------------------------------------
  // mouseDown
  // Обработка щелчка кнопкой мыши
  // -------------------------------------------------------
	public boolean mouseDown(Event evt, int x, int y)
	{
    // Если количествао щелчков больше 1, считаем что
    // сделан двойной щелчок
    if(evt.clickCount > 1)
    {
      // Удаляем все строки из массива lines
      lines.removeAllElements();

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

      return true;
    }

    // Сохраняем текущие координаты начала линии
    dmDown = new Dimension(x, y);

    // В начале процесса рисования линии устанавливаем
    // предыдущие координаты конца линии равными
    // координатам начала линии
    dmPrev = new Dimension(x, y);

    // Отключаем режим рисования
    bDrawing = false;
		return true;
	}

  // -------------------------------------------------------
  // mouseUp
  // Отпускание клавиши мыши
  // -------------------------------------------------------
  public boolean mouseUp(Event evt, int x, int y)
	{
    // Проверяем, включен ли режим рисования
    if(bDrawing)
    {
      // Если режим рисования включен, добавляем
      // новый элемент в массив lines
      
      // Сохраняем координаты конца линии
      dmUp = new Dimension(x, y);
      
      // Добавляем линию в массив
      lines.addElement(
        new Rectangle(dmDown.width, dmDown.height, x, y));
      
      // Перерисовываем окно аплета
      repaint();

      // Отключаем режим рисования
      bDrawing = false;
    }
    return true;
	}

  // -------------------------------------------------------
  // mouseDrag
  // Перемещение курсора мыши при нажатой клавише
  // -------------------------------------------------------
	public boolean mouseDrag(Event evt, int x, int y)
	{
    // Получаем контекст отображения для окна аплета
    Graphics g = getGraphics();

    // Включаем режим рисования
    bDrawing = true;

    // Закрашиваем предыдущую линию цветом фона
    // (то есть стираем ее)
    g.setColor(Color.yellow);

    g.drawLine(dmDown.width, dmDown.height, 
      dmPrev.width, dmPrev.height);

    // Рисуем новую линию черным цветом
    g.setColor(Color.black);
    g.drawLine(dmDown.width, dmDown.height, x, y);

    // Сохраняем координаты предыдущей линии,
    // чтобы стереть ее в следующий раз
    dmPrev = new Dimension(x, y);
		return true;
	}

  // -------------------------------------------------------
  // mouseMove
  // Перемещение курсора мыши при отжатой клавише
  // -------------------------------------------------------
	public boolean mouseMove(Event evt, int x, int y)
	{
    // Отключаем режим рисования
    bDrawing = false;
		return true;
	}
}
