import java.applet.*;
import java.awt.*;
import java.net.*;

class MyCanvas extends Canvas {
    Image iImageCanvas;
    int nNumeroCanvas;
    int nLong;
    int nLarg;

    public MyCanvas(Image i, int n, int nlong, int nlarg) {
        iImageCanvas = i;
	nNumeroCanvas = n;
	nLong = nlong;
	nLarg = nlarg;
    }

    public MyCanvas(int longueur, int larg) {
	nLong = longueur;
	nLarg = larg;
    }

    public void paint(Graphics g) {
        g.drawImage(iImageCanvas, 0, 0, nLong, nLarg, this);
    }

    public Dimension minimumSize() {
        return new Dimension(nLong,nLarg);
    }

    public Dimension preferredSize() {
        return minimumSize();
    }
}

class MyPanel extends Panel {
    Checkbox cbPanel;
    MyCanvas mcPanel;
    int nPanel;
    MyCanvas mcTracker;

    public MyPanel(Image i, int n, String s, MyCanvas mc, int nlong, int nlarg) {
	setLayout(new GridLayout(2,1));
	nPanel = n;
        mcPanel = new MyCanvas(i, n, nlong, nlarg);
	cbPanel = new Checkbox(s);
	mcTracker = mc;
	add(mcPanel);
        add(cbPanel);
    }

    public boolean action(Event event, Object what) {
        if (event.target instanceof Checkbox) 
        {
	        System.out.println("CheckBox " + nPanel + " appuye : " +
		cbPanel.getState());
		mcTracker.iImageCanvas = mcPanel.iImageCanvas;
		mcTracker.repaint();
        } 
        return false;
    } 
}

public class tracker extends Applet
{
    MediaTracker MT;

    public void init() {
        Image iImage[] = new Image[5];  // Tableau de 5 images
        MyCanvas mcTracker = new MyCanvas(300, 300);
	String sImage = getParameter("IMAGE"); 
	int nNbImage = Integer.parseInt(getParameter("NBIMAGE"));

        addItem("Nom: "+sImage+"\n"+"Nombre: "+nNbImage);
	
        // On declare un nouveau MediaTracker. A priori on en a besoin que
        // d'un seul. Le component utilise est ici l'applet (qui est une
        // classe derivée de component) donc on met this.
        MT = new MediaTracker(this); 
        for (int i = 0; i < nNbImage; i++) 
        {
            // On declare une nouvelle image. getImage ne lance pas le
            // chargement de l'image à partir de l'URL. Il associe
            // simplement l'image et l'URL.
            try {
                iImage[i] = getImage(getDocumentBase(), sImage + i + ".gif");
		if(iImage[i] != null)
		     addItem("getImage de "+ sImage + i + ".gif");
            }

            catch (Exception e) {
                addItem("Echec de getImage, " + getDocumentBase() + sImage + i + ".gif");
            }
            // On ajoute cette image au MediaTracker. On lui donne l'index
            // i, ce qui va permettre de l'identifier de maniere
            // unique. Note: on peut mettre plusieurs images à un même
            // index. Cela signifie seulement que les images sont
            // indissociables. Ici, nous voulons que les images soient
            // toutes indépendantes les unes des autres.
            MT.addImage(iImage[i], i);

 	    add(new MyPanel(iImage[i], i, "Image" + i + ".gif", mcTracker, 75, 75));
        }
        // Maintenant, nous pouvons commencer à charger les images. Le
        // true indique que les images doivent se charger.
        MT.checkAll(true);
 
	add(mcTracker);
        show();
        addItem("initializing...");
    }

    public void start() {
        addItem("starting...");
    }

    public void stop() {
        addItem("stopping...");
    }

    public void destroy() {
        addItem("preparing for unloading...");
    }
    
    public void addItem(String newWord) {
        System.out.println(newWord);
    }
}

