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

public class AnimCircle extends Applet implements Runnable {
    Thread threadDeApplet = null;
    Vector listeCercles = new Vector();

    public void init() {
        System.out.println("init");
        // Creation d'un cercle, chaque instance crée son propre thread
        listeCercles.addElement(new Cercle(100, 100, 10, 200, 200));
        listeCercles.addElement(new Cercle(100, 100, 20, 200, 200));
        listeCercles.addElement(new Cercle(100, 100, 30, 200, 200));
    }

    public void start(){
        System.out.println("Je starte");
       // Si le thread de l'applet vaut null, 
       // on le crée d'un Thread à partir de l'applet et on le lance
        if(threadDeApplet == null) {
             threadDeApplet = new Thread(this);
             threadDeApplet.start();
        } 
        else {
            // Le thread existe déjà, on le réveille (il était forcément endormi)
            System.out.println("Je reveille le thread applet");
            threadDeApplet.resume();
        }

        // maintenant pour les cercles... c'est lourd hein ?
        Enumeration liste = listeCercles.elements();
        Cercle cercle;

        while(liste.hasMoreElements()) {
            System.out.println("Je reveille un cercle");
            cercle = (Cercle) liste.nextElement();

            cercle.resume();
        }
    }

    public void stop() {
        // On suspend tous les threads : celui de l'applet et les cercles
        System.out.println("Je stoppe");
        threadDeApplet.suspend();

        // maintenant pour les cercles... eh oui, c'est lourd !
        Enumeration liste = listeCercles.elements();
        Cercle cercle;

        while(liste.hasMoreElements()) {
            System.out.println("Je suspend un cercle");
            cercle = (Cercle) liste.nextElement();

            cercle.suspend();
        }
    }


    /** Tache de fond executee par le Thread. Effectue l'animation du cercle en
        modifiant ses coordonnees et en invoquant repaint(), ce qui provoque l'execution
        de paint(). Notez que run() doit impérativement contenir une boucle afin de ne pas
        rendre la main tout de suite.
    */
    public void run() {

        while(true) {
            // On demande à redessiner le cercle
            repaint();

            // On "dort" 10 millisecondes
            try {
                threadDeApplet.sleep(10);
            } catch(InterruptedException e) {
                System.out.println("Erreur dans le sleep(1000 * Math.random());");
                e.printStackTrace();
            }
        }
    }

    public void paint(Graphics gc) {
        // appelé automatiquement par l'AWT, ou sur demande par repaint()
        Enumeration liste = listeCercles.elements();
        Cercle cercle;

        while(liste.hasMoreElements()) {
            cercle = (Cercle) liste.nextElement();

            gc.drawOval(cercle.getX() - cercle.getRayon(),
                    cercle.getY() - cercle.getRayon(),
                    2 * cercle.getRayon(),
                    2 * cercle.getRayon());
        }
    }
}
