// =========================================================
// Рисование прямоугольников и эллипсов
// в разных задачах
//
// (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 MultiTask2 extends Applet
{
  // Ссылка на задачу рисования прямоугольников
  DrawRectangles m_DrawRectThread = null;

  // Ссылка на задачу рисования эллипсов
  DrawEllipse m_DrawEllipseThread = null;

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

  // -------------------------------------------------------
  // 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);
	}

  // -------------------------------------------------------
  // start
  // Метод вызывается при первом отображении окна аплета
  // -------------------------------------------------------
	public void start()
	{
    if (m_DrawRectThread == null)
		{
      m_DrawRectThread = new DrawRectangles(this);
      m_DrawRectThread.start();
		}

    if (m_DrawEllipseThread == null)
		{
      m_DrawEllipseThread = new DrawEllipse(this);
      m_DrawEllipseThread.start();
		}
	}
	
  // -------------------------------------------------------
  // stop
  // Метод вызывается, когда окно аплета исчезает с экрана
  // -------------------------------------------------------
	public void stop()
	{
		if (m_DrawRectThread != null)
		{
			m_DrawRectThread.stop();
			m_DrawRectThread = null;
		}

    if (m_DrawEllipseThread == null)
		{
      m_DrawEllipseThread.stop();
			m_DrawEllipseThread = null;
		}
	}

}

// =========================================================
// Класс задачи для рисования прямоугольников
// =========================================================
class DrawRectangles extends Thread
{
  // Контекст отображения окна аплета
  Graphics g;

  // Размеры окна аплета
  Dimension dimAppWndDimension;

  // -------------------------------------------------------
  // DrawRectangles
  // Конструктор класса DrawRectangles
  // -------------------------------------------------------
  public DrawRectangles(Applet Appl)
  {
    // Получаем и сохраняем контекст отображения
    g = Appl.getGraphics();

    // Определяем текущие размеры окна аплета
    dimAppWndDimension = Appl.size();
  }

	// -------------------------------------------------------
  // run
  // Метод, который работает в рамках отдельной задачи
  // Он рисует в окне аплета прямоугольники случайного
  // цвета, размера и расположения
  // -------------------------------------------------------
	public void run()
	{
    while (true)
		{
      int x, y, width, height;
      int rColor, gColor, bColor;
      
      // Выбираем случайным образом размеры
      // и расположение рисуемого прямоугольника
      x =      (int)(dimAppWndDimension.width * Math.random());
      y =      (int)(dimAppWndDimension.height * Math.random());
      width  = (int)(dimAppWndDimension.width * Math.random()) / 2;
      height = (int)(dimAppWndDimension.height * Math.random()) / 2;
      
      // Выбираем случайный цвет для рисования прямоугольника
      rColor = (int)(255 * Math.random());
      gColor = (int)(255 * Math.random());
      bColor = (int)(255 * Math.random());

      // Устанавливаем выбранный цвет в контексте отображения
      g.setColor(new Color(rColor, gColor, bColor));

      // Рисуем прямоугольник
      g.fillRect(x, y, width, height);

      // Выполняем задержку на 50 миллисекунд
      try
			{
				Thread.sleep(50);
			}
			catch (InterruptedException e)
			{
				stop();
			}
		}
	}
}

// =========================================================
// Класс задачи для рисования эллипсов
// =========================================================
class DrawEllipse extends Thread
{
  // Контекст отображения окна аплета
  Graphics g;

  // Размеры окна аплета
  Dimension dimAppWndDimension;

  // -------------------------------------------------------
  // DrawEllipse
  // Конструктор класса DrawEllipse
  // -------------------------------------------------------
  public DrawEllipse(Applet Appl)
  {
    g = Appl.getGraphics();

    // Определяем текущие размеры окна аплета
    dimAppWndDimension = Appl.size();

  }

	// -------------------------------------------------------
  // run
  // Метод, который работает в рамках отдельной задачи
  // Он рисует в окне аплета эллипсы случайного
  // цвета, размера и расположения
  // -------------------------------------------------------
	public void run()
	{
    while (true)
		{
      int x, y, width, height;
      int rColor, gColor, bColor;
      
      // Выбираем случайным образом размеры
      // и расположение рисуемого эллипса
      x =      (int)(dimAppWndDimension.width * Math.random());
      y =      (int)(dimAppWndDimension.height * Math.random());
      width  = (int)(dimAppWndDimension.width * Math.random()) / 2;
      height = (int)(dimAppWndDimension.height * Math.random()) / 2;
      
      // Выбираем случайный цвет для рисования эллипса
      rColor = (int)(255 * Math.random());
      gColor = (int)(255 * Math.random());
      bColor = (int)(255 * Math.random());

      // Устанавливаем выбранный цвет в контексте отображения
      g.setColor(new Color(rColor, gColor, bColor));

      // Рисуем эллипс
      g.fillOval(x, y, width, height);

      // Выполняем задержку на 50 миллисекунд
      try
			{
				Thread.sleep(50);
			}
			catch (InterruptedException e)
			{
				stop();
			}
		}
	}
}