// =========================================================
// Рисование круговой диаграммы, данные для которой
// получены от сервера Web через сеть
//
// (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.*;
import java.net.*;
import java.io.*;
import java.util.*;

public class ShowChart extends Applet
{
  // Адрес URL файла с данными для круговой диаграммы
  URL SrcURL;

  // Содержимое этого файла
  Object URLContent;

  // Код ошибки
  int errno = 0;

	// -------------------------------------------------------
  // getAppletInfo
  // Метод, возвращающей строку информации об аплете
  // -------------------------------------------------------
	public String getAppletInfo()
	{
		return "Name: ShowChart\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()
	{
    try
    {
      // Создаем объект класса URL для файла с данными
      // для круговой диаграммы
      SrcURL = new URL("http://frolov/chart.txt");

      try
      {
        // Получаем содержимое этого файла
        URLContent = SrcURL.openConnection().getContent();
      }
      catch (IOException ioe)
      {
        showStatus("getContent exception");

        // При возникновении исключения во время получения
        // содержимого устанавливаем код ошибки, равный 1
        errno = 1;
      }
    }
    catch (MalformedURLException uex)
    {
      showStatus("MalformedURLException exception");

      // При возникновении ошибки в процессе создания
      // объекта класса URL устанавливаем код ошибки,
      // равный 2
      errno = 2;
    }
	}

  // -------------------------------------------------------
  // paint
  // Метод paint, выполняющий рисование в окне аплета
  // -------------------------------------------------------
	public void paint(Graphics g)
	{
    // Строка, в которую будет записано содержимое
    // файла данных для круговой диаграммы
    String sChart = "<error>";
    
    // Начальный угол сектора диаграммы
    Integer AngleFromChart = new Integer(0);
    
    // Угол предыдущего сектора диаграммы
    int PrevAngle = 0;

    // Случайные компоненты цвета сектора
    int rColor, gColor, bColor;

    // Определяем текущие размеры окна аплета
    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);

    // Проверяем, является ли полученное содержимое
    // текстовой строкой
    if(URLContent instanceof String)
    {
      sChart = (String)URLContent;
    }
    
    // Если нет, устанавливаем код ошибки, равный 3
    else
      errno = 3;

    // Если произошла ошибка, отображаем ее код
    // и полученные данные
    if(errno != 0)
      showStatus("errno: " + errno + ", sChart: " + sChart);
    
    // Если ошибки нет, отображаем полученные данные
    else
      showStatus(sChart);

    // Создаем разборщик текстовой строки для
    // выделения значений углов в принятом файле данных
    StringTokenizer st = new StringTokenizer(sChart, ",\r\n");

    // Цикл по всем значениям
    while(st.hasMoreElements())
    {
      // Выбираем случайный цвет для рисования
      rColor = (int)(255 * Math.random());
      gColor = (int)(255 * Math.random());
      bColor = (int)(255 * Math.random());

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

      // Получаем значение угла
      String angle = (String)st.nextElement();

      // Преобразуем его в численное значение
      AngleFromChart = new Integer(angle) ;
      
      // Рисуем сектор диаграммы
      g.fillArc(0, 0, 200, 200, 
        PrevAngle, AngleFromChart.intValue());

      // Увеличиваем текущее значение угла
      PrevAngle += AngleFromChart.intValue();
    }
	}
}
