// =========================================================
// Просмотр текста в режиме динамической свертки 
// по вертикали
//
// (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 Scroller extends Applet implements Runnable
{
  // Ссылка на задачу, выполняющую свертку
  Thread	 m_Scroller = null;

	// Отображаемые строки
  private String m_String1 = "Мы представляем наши новые книги";
	private String m_String2 = 
    "Том 29. Сервер Web своими руками";
	private String m_String3 = 
    "Том 30. Microsoft Visual J++. Создание приложений на языке Java. Часть 1";
	private String m_String4 = 
    "Том 31. Разработка приложений для Internet с Visual C++ и MFC";
	private String m_String5 = 
    "Том 32. Microsoft Visual J++. Создание приложений на языке Java. Часть 2";
	private String m_String6 = "";

  // Имена параметров
  private final String PARAM_String1 = "String1";
	private final String PARAM_String2 = "String2";
	private final String PARAM_String3 = "String3";
	private final String PARAM_String4 = "String4";
	private final String PARAM_String5 = "String5";
	private final String PARAM_String6 = "String6";

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

	// -------------------------------------------------------
  // getParameterInfo
  // Иинформация о параметрах
  // -------------------------------------------------------
	public String[][] getParameterInfo()
	{
		String[][] info =
		{
			{ PARAM_String1, "String", "Parameter description" },
			{ PARAM_String2, "String", "Parameter description" },
			{ PARAM_String3, "String", "Parameter description" },
			{ PARAM_String4, "String", "Parameter description" },
			{ PARAM_String5, "String", "Parameter description" },
			{ PARAM_String6, "String", "Parameter description" },
		};
		return info;		
	}

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

		// Получение параметров
    param = getParameter(PARAM_String1);
		if (param != null)
			m_String1 = param;

		param = getParameter(PARAM_String2);
		if (param != null)
			m_String2 = param;

		param = getParameter(PARAM_String3);
		if (param != null)
			m_String3 = param;

		param = getParameter(PARAM_String4);
		if (param != null)
			m_String4 = param;

		param = getParameter(PARAM_String5);
		if (param != null)
			m_String5 = param;

		param = getParameter(PARAM_String6);
		if (param != null)
			m_String6 = param;
	}

  // -------------------------------------------------------
  // paint
  // Метод paint, выполняющий рисование в окне аплета
  // -------------------------------------------------------
	public void paint(Graphics g)
	{
    // Определяем текущие размеры окна аплета
    Dimension dimAppWndDimension = size();

    // Определяем текущие размеры окна аплета
    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_Scroller == null)
		{
			m_Scroller = new Thread(this);
			m_Scroller.start();
		}
	}
	
  // -------------------------------------------------------
  // stop
  // Метод вызывается, когда окно аплета исчезает с экрана
  // -------------------------------------------------------
	public void stop()
	{
		if (m_Scroller != null)
		{
			m_Scroller.stop();
			m_Scroller = null;
		}
	}

	// -------------------------------------------------------
  // run
  // Метод, который работает в рамках отдельной задачи
  // Он выполняет динамическую свертку строк текста 
  // -------------------------------------------------------
	public void run()
	{
    // Счетчик сдвинутых строк
    int ShiftsCounter = 0;

    // Размер сдвига по вертикали
    int yShift;
    
    // Высота символов текста
    int yChar;

    // Номер текущей рисуемой строки
    int CurrentStr = 0;
    
    // Масси рисуемых строк
    String s[] = new String[6];

    // Инициализация массива строк
    s[0] = m_String1;
    s[1] = m_String2;
    s[2] = m_String3;
    s[3] = m_String4;
    s[4] = m_String5;
    s[5] = m_String6;

    // Получаем контекст отображения
    Graphics g = getGraphics();
    Dimension dimAppWndDimension = size();

    // Определяем метрики текущего шрифта
    FontMetrics fm = g.getFontMetrics();

    // Сохраняем полную высоту символов шрифта
    yChar = fm.getHeight();

    // Бесконечный цикл сдвига строк
    while (true)
		{
			try
			{
        // Увеличиваем содержимое счетчика сдвигов        
        ShiftsCounter++;

        // Если сдвинута полная строка, рисуем
        // следующую строку в нижней части окна
        if(ShiftsCounter == yChar + 5)
        {
          // Сбрасываем счетчик сдвигов
          ShiftsCounter = 0;
          
          // Первую строку отображаем красным цветом,
          // остальные - черным
          if(CurrentStr == 0)
            g.setColor(Color.red);
          else
            g.setColor(Color.black);

          // Рисуем строку
          g.drawString(s[CurrentStr], 
            10, dimAppWndDimension.height - 10);
          
          // Увеличиваем счетчик строк
          CurrentStr++;

          // Если уже нарисовали шесть строк, сбрасываем
          // счетчик строк
          if(CurrentStr > 5)
            CurrentStr = 0;
        }

        // Устанавливаем шаг сдвига равным одному пикселу
        yShift = 1;

        // Выполняем свертку 
        g.copyArea(0, yShift + 1, 
          dimAppWndDimension.width  - 1, 
          dimAppWndDimension.height - 1,
          0, -yShift);

        // Закрашиваем область ввода желтым цветом
        g.setColor(Color.yellow);

        g.fillRect(1, dimAppWndDimension.height - yShift - 1, 
          dimAppWndDimension.width  - 2, 
          dimAppWndDimension.height - 1);
        
        // Выполняем задержку в 50 миллисекунд
        Thread.sleep(50);
			}
			catch (InterruptedException e)
			{
				stop();
			}
		}
	}
}
