import java.awt.*;
import java.applet.*;
import java.util.*;

public class color1 extends Applet implements Runnable {
/************************************************************************/
/*									*/
/*		Class color1: Map Coloring Sample Applet		*/
/*									*/
/*		Copyright (C) 1996 by Yasusi Kanada			*/
/*									*/
/************************************************************************/

   final int n_areas  = 4;

   protected Color[] area_color =
      {Color.yellow, Color.yellow, Color.yellow, Color.yellow};

   final Color[] id2color =
      {Color.yellow, Color.blue, Color.red, Color.green};


   private Random selector = new Random();

   private int random(int max) {
      return (selector.nextInt() & 0x7FFFFFFF) % max;
   }


   private Thread painter;


/*======================================================================*/
/*	Widget handler							*/
/*======================================================================*/

   private void init_widgets() {
      setLayout(new FlowLayout());
      add(new Button("Apply rule"));
   }

   public boolean action(Event e, Object arg) {
      if ("Apply rule".equals(arg)) {
         painter = new Thread(this);
         painter.start();
         return true;
      } else {
         return false;
      };
   }

   public void run() {
      int area = random(4);
      area_color[area] = Color.white;
      repaint();
      try {painter.sleep(100);}		/* sleep 200 ms	*/
      catch (InterruptedException e) {};
      area_color[area] = id2color[random(4)];
      repaint();
   }


/*======================================================================*/
/*	Map viewer							*/
/*======================================================================*/
   protected int size_factor;
			/* Actual drawing size = size_factor * coord.	*/
   private Polygon[] polygons = new Polygon[n_areas];
					/* Border polygons.		*/

   private Polygon create_polygon(int[] indices, int[] X, int[] Y) {
      int[] x_coords = new int[indices.length];
      int[] y_coords = new int[indices.length];
      for (int i = 0; i < indices.length; i++) {
         x_coords[i] = size_factor * X[indices[i]];
         y_coords[i] = size_factor * Y[indices[i]];
      };
      return new Polygon(x_coords, y_coords, indices.length);
   }

   private void init_view() {
      int[] X =			/* X coordinate indices for polygons	*/
	 {0, 2, 4, 2, 0, 1, 3, 4, 0, 4};
      int[] Y =			/* Y coordinate indices for polygons	*/
	 {0, 0, 0, 1, 3, 3, 3, 3, 4, 4};
      int[][] border_points =	/* Border point coordinates of polygons */
         {{0, 1, 3, 5, 4}, {1, 2, 7, 6, 3},
          {3, 5, 6}, {4, 5, 6, 7, 9, 8}};

      size_factor = size().width / 4;
      for (int i = 0; i < border_points.length; i++) {
         polygons[i] = create_polygon(border_points[i], X, Y);
      };
   }

   private void paint_area(int area_id, Graphics g) {
      g.setColor(area_color[area_id]);
      g.fillPolygon(polygons[area_id]);
      g.setColor(Color.black);
      g.drawPolygon(polygons[area_id]);
   }

   public void paint(Graphics g) {
      for (int i = 0; i < n_areas; i++) {
         paint_area(i, g);
      };
   }

   public void update(Graphics g) {
      paint(g);
   }


/*======================================================================*/
/*	Dispatchers							*/
/*======================================================================*/
   public void init() {
      init_widgets();
      init_view();
   }

   public void start() {
   }

   public void stop() {
      painter.stop();
   }
}
