import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.lang.*;
import java.util.*;

class MyCanvas extends Canvas implements Runnable {
  Thread t = null;
  Dimension prefSize;
  Font myFont;
  final int SIZE = 1021;
  int[] red = new int[SIZE];
  int[] green = new int[SIZE];
  int[] blue = new int[SIZE];
  boolean use_red = false;
  boolean use_green = false;
  boolean use_blue = true;
  int kind = 0;
  final int maxkind = 2;
  boolean paramChanged = true;
  Image image;
  Random rand = new Random();

  public MyCanvas(Dimension prefSize,Image image) {
    this.prefSize = prefSize;
    this.image = image;
    init();
  }
  private void init() {
    myFont = new Font("SansSerif",Font.PLAIN,20);
    initColor(red,0);
    initColor(blue,127);
    initColor(green,255);
  }
  private void initColor(int[] c,int offset) {
    int i,j;
    i = offset;
    boolean up = true;
    for (j = 0; j < SIZE;  j++) {
      c[j] = i;
      if (up) {
        if (++i == 256) { i-=2; up = !up; }
      }
      else if (!up) {
        if (--i < 0) { i+=2; up = !up; }
      }
    }
  }
  public Dimension getPreferredSize() {
    return prefSize;
  }
  public Dimension getMinimumSize() {
    return prefSize;
  }

  public void paint(Graphics g) {
    g.drawImage(image,0,0,this);
  }

  public void run() {
    Graphics g = this.getGraphics();
    int i,j,k,x,dx,dy;
    int w = prefSize.width-6;
    int h = prefSize.height-6;
    k = 510;
    i = 0;
    while (t != null && i < 1) {
      try {
        t.sleep(10);
      }
      catch (Exception e) {}
      for (j = 0; j < w && t != null; j++) {
        if (paramChanged) {
          paramChanged = false;
          g.drawImage(image,0,0,this);
        }
        g.setColor(new Color((use_red)   ? red[(j*2+k) % 512] : 0,
                             (use_green) ? green[(j*2+k) % 512] : 0,
                             (use_blue)  ? blue[(j*2+k) % 512] : 0));
        //kind = 1;
        switch (kind) {
          case 0:
                  dy = j;
                  x = (w-dy)/2;
                  g.drawArc(x+3,0+3,dy,h,0,360);
                  break;
          case 1: dx = j;
                  x = (w-dx)/2;
                  dy = (h*j)/w;
                  g.drawRect(x,0,dx,dy);
                  break;
          case 2:
                  g.drawLine(j,0,j,h);
                  break;
        }
      }
      if (--k < 0) k = 510;
    }
  }

  public void setThread(Thread t) {
    this.t = t;
  }

  public void newParam(boolean firstTime) {
    use_red = (rand.nextInt()>0);
    use_green = (rand.nextInt()>0);
    use_blue = (rand.nextInt()>0);
    if (!(use_red || use_green || use_blue)) use_red = true;
    kind = (rand.nextInt() % (maxkind+1) + maxkind)/2;
    if (firstTime && kind == 0) kind = 1;
    paramChanged = true;
  }

}

public class Applet1 extends Applet {

  MyCanvas canvas1;
  Thread t = null;
  Image image;

  public Applet1() {
  }

  public void init() {
    MediaTracker tracker = new MediaTracker(this);
    image = getImage(getCodeBase(),"images/appletbg.gif");
    tracker.addImage(image,0);
    try {
      tracker.waitForID(0);
    }
    catch (InterruptedException e) {
      e.printStackTrace();
    }
    if ((checkImage(image,this) & ERROR) == ERROR) {
      System.out.println("Image load error.");
    }
    setLayout(new BorderLayout(0,0));
    canvas1 = new MyCanvas(getSize(),image);
    add(canvas1,BorderLayout.CENTER);
    canvas1.addMouseListener(new MouseAdapter() {
      public void mouseEntered(MouseEvent e) {
        showStatus("Klicken Sie auf die Grafik für das nächste Demo...");
        canvas1.setCursor(new Cursor(Cursor.HAND_CURSOR));
      }
      public void mouseExited(MouseEvent e) {
        showStatus(" ");
        canvas1.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
      }
      public void mouseClicked(MouseEvent e) {
        canvas1.newParam(false);
      }
    });
  }

  public void start() {
    t = new Thread(canvas1);
    canvas1.setThread(t);
    canvas1.newParam(true);
    t.start();
  }

  public void stop() {
    canvas1.setThread(null);
  }

  public String getAppletInfo() {
    return "Graphics-Demo by Bernd Schmidt, Bonn, bernd@schmidt-leben.de";
  }

  public String[][] getParameterInfo() {
    return null;
  }

}

