// =========================================================
// Рисование растровых изображений с ожиданием их загрузки
// Для ожидания применяется интерфейс ImageObserver
//
// (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 DrawImageObserver extends Applet
{
  // Фоновое изображение
  Image BkgImg;
  
  boolean fAllLoaded = false;

	// -------------------------------------------------------
  // getAppletInfo
  // Метод, возвращающей строку информации об аплете
  // -------------------------------------------------------
	public String getAppletInfo()
	{
		return "Name: DrawImageObserver\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
  // Метод init, получает управление при инициализации аплета
  // -------------------------------------------------------
	public void init()
	{
    // Загружаем фоновое изображение
    BkgImg = getImage(getCodeBase(), "bkg.gif");
	}

  // -------------------------------------------------------
  // imageUpdate
  // Вызывается, когда появляется информация об изображении
  // -------------------------------------------------------
  public boolean imageUpdate(Image img, int flags,
    int x, int y, int w, int h)
  {
    // Проверяем, все ли биты изображения загружены
    fAllLoaded = ((flags & ALLBITS) != 0);

    // Если все, перерисовываем окно
    if(fAllLoaded)
      repaint();

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

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

    // Рисуем рамку вокруг окна аплета
    g.drawRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);

    if(fAllLoaded == false)
    {
      // Рисуем сообщение о начале загрузки
      g.drawString("Подождите, идет загрузка...",
        20, dimAppWndDimension.height / 2);
    }

    // Рисуем изображение фона
    g.drawImage(BkgImg, 1, 1, 
      dimAppWndDimension.width  - 2, 
      dimAppWndDimension.height - 2, this);
	}
}
