
import java.awt.*;
import java.util.Vector;

/**
 * Eine Klasse, die Bilder in einer Komponente anzeigt. Die Bilder werden als
 * Vector übergeben. 
 */
public class ImageCanvas extends Canvas {
    Image current;
    Vector images;
    int index = 0;
    MediaTracker tracker;
    
    ImageCanvas(Vector images) {
        // Die Daten werden an einen MediaTracker übergeben. Jedes Bild bekommt
        // eine eigene ID, die mit dem Index im Vector übereinstimmt.
        tracker = new MediaTracker(this);
        for (int i=0; i < images.size(); i++) {
            tracker.addImage((Image)images.elementAt(i), i);
        }
        
        // Der MediaTracker startet nun mit dem Laden der Bilder. 
        // Der Ladevorgang erfolgt im Hintergrund. Wir warten nicht darauf,
        // dass die Bilder fertig geladen sind.
        try {
            tracker.waitForAll(0);
        }
        catch (Exception e) {}
        
        // Das erste Bild wird angezeigt.
        this.images = images;
        showImage(0);
    }
    
    /**
     * Das nächste Bild soll angezeigt werden. Ist das aktuelle Bild das 
     * letzte in der Liste, wird das erste Bild angezeigt.
     */
    public void nextImage() {
        index++;
        if (index >= images.size())
            index = 0;
        showImage(index);
    }
    
    /**
     * Das vorhergehende Bild soll angezeigt werden. Ist das aktuelle Bild
     * das erste in der Liste, wird das letzte Bild angezeigt.
     */
    public void previousImage() {
        index--;
        if (index < 0)
            index = images.size()-1;
        showImage(index);
    }

    /**
     * Ein neues Bild soll angezeigt werden. 
     */
    public void showImage(int index) {
        // Zunächst das Bild aus der Liste der Bilder holen
        current = (Image)images.elementAt(index);
        try {
            // Evtl. ist das Bild noch nicht komplett geladen. Dann so lange
            // warten, bis das Bild komplett geladen ist.
            tracker.waitForID(index);
            // Der Anzeigebereich wird der Bildgrösse angepasst
            setSize(current.getWidth(this), current.getHeight(this));
            // Das neue Bild darstellen und dem Parent benachrichtigen, dass sich 
            // die Grösse der Komponente verändert hat.
            repaint();
            getParent().validate();
        }
        catch (Exception e) {}
    }
    
    /**
     * Die Komponente - und damit das Bild - werden gezeichnet.
     */
    public void paint(Graphics g) {
        // Das Bild zeichnen.
        g.drawImage(current, 0, 0, this);
    }
}