package howto;

import java.awt.*;

class ColorGenerator
{
   private int i = 0;

   private Color [] rgc =
   {
      Color.yellow,
      Color.red,
      Color.pink,
      Color.orange,
      Color.magenta,
      Color.green,
      Color.cyan,
      Color.blue
   };

   public Color generateColor()
   {
      i = i < rgc.length ? i : 0;

      return rgc[i++];
   }
}

class NewPanel extends Panel
{
   private String str;
   private TextArea ta;
   private ColorGenerator cg;

   public NewPanel(String str, TextArea ta)
   {
      super();
      this.str = str;
      this.ta = ta;
      cg = new ColorGenerator();
   }

   public Insets insets()
   {
      return new Insets(5, 5, 5, 5);
   }

   public void paint(Graphics g)
   {
      ta.appendText("Panel \"" + str + "\" saw paint...\n");

      g.setColor(cg.generateColor());
      g.fillRect(0, 0, size().width - 1, size().height - 1);

      g.setColor(Color.black);
      g.drawRect(0, 0, size().width - 1, size().height - 1);
   }
}

public class Example extends java.applet.Applet
{
   private TextArea ta;
   private ColorGenerator cg;

   public void init()
   {
      ta = new TextArea();
      cg = new ColorGenerator();

      setLayout(new BorderLayout());

      add("North", new Button("Redraw Applet Panel Only"));

      add("Center", ta);

      NewPanel p1 = new NewPanel("1", ta);
      NewPanel p2 = new NewPanel("2", ta);

      p2.add(new NewPanel("2A", ta));
      p2.add(new NewPanel("2B", ta));

      p1.add(p2);

      add("South", p1);
   }

   public Dimension preferredSize()
   {
      return new Dimension(400, 230);
   }

   public Insets insets()
   {
      return new Insets(5, 5, 5, 5);
   }

   public boolean action(Event e, Object o)
   {
      repaint();

      return true;
   }

   public void paint(Graphics g)
   {
      ta.appendText("Applet saw paint...\n");

      g.setColor(cg.generateColor());
      g.fillRect(0, 0, size().width - 1, size().height - 1);

      g.setColor(Color.black);
      g.drawRect(0, 0, size().width - 1, size().height - 1);
   }

   public static void main(String [] args)
   {
      Frame f = new Frame("Example 1");

      Example ex = new Example();

      ex.init();

      f.add("Center", ex);

      f.pack();
      f.show();
   }
}
