import theater.*;

import java.util.List;


/**
 * Repraesentation von Mauern im Java-Hamster-Modell
 *
 * @author Dietrich Boles (Universitaet Oldenburg)
 * @version 1.0 (17.07.2009)
 *
 */
public class Mauer extends Prop {
    // Default-Konstruktor. Wird aufgerufen, wenn eine Mauer erzeugt wird.
    public Mauer() {
        // festlegen des Ikons für eine Mauer
        this.setImage("mauer.png");
    }

    // Wird aufgerufen, nachdem eine Mauer auf der Bühne platziert wurde.
    @Invisible // soll nicht im Popup-Menü erscheinen

    public void addedToStage(Stage stage) {
        Performance.getPerformance().lock();

        try {
            // löscht alle Komponenten, die sich auf derselben Zelle der Bühne 
            // befinden
            this.removeComponentsOnCell(this.getColumn(), this.getRow());
        } finally {
            Performance.getPerformance().unlock();
        }
    }

    // Platziert die Mauer auf der Bühne um. Übergeben werden die neue Spalte und Reihe.
    // Die Methode wird auch aufgerufen,
    // wenn eine Mauer per Mausklick auf der Bühne verschoben wird.
    // Überschreibt die entsprechende Component-Methode.
    @Invisible // soll nicht im Popup-Menü erscheinen

    public void setLocation(int col, int row) {
        Performance.getPerformance().lock();

        try {
            if ((this.getColumn() == col) && (this.getRow() == row)) {
                // Mauer befindet sich bereits auf dieser Zelle
                return;
            }

            if ((col < 0) || (row < 0) ||
                    (col >= this.getStage().getNumberOfColumns()) ||
                    (row >= this.getStage().getNumberOfRows())) {
                // nur innerhalb der sichtbaren Bühne 
                return;
            }

            Actor solist = getStage().getSolist();

            if ((col == solist.getColumn()) && (row == solist.getRow())) {
                // Mauer kann nicht auf die Zelle umplatziert werden, auf der
                // sich der Solist befindet
                return;
            }

            // Mauer auf Kachel?
            if (this.getStage().getComponentsAt(col, row, Mauer.class).size() > 0) {
                // eine Mauer kann nicht auf eine Kachel platziert werden, auf der sich
                // bereits eine Mauer befindet
                return;
            }

            // löscht alle Komponenten, die sich auf derselben Zelle der Bühne 
            // befinden
            this.removeComponentsOnCell(col, row);

            // ruft die geerbte Methode auf, die die tatsächliche Umplatzierung
            // vornimmt
            super.setLocation(col, row);
        } finally {
            Performance.getPerformance().unlock();
        }
    }

    // entfernt die Komponenten der übergebenen Zelle von der Bühne
    @Invisible // soll nicht im Popup-Menü erscheinen

    private void removeComponentsOnCell(int col, int row) {
        // ermittelt alle Komponenten der Zelle
        List<Component> comps = this.getStage().getComponentsAt(col, row);

        for (Component comp : comps) {
            if (comp != this) {
                // die Mauer selbst wird (natürlich) nicht entfernt
                this.getStage().remove(comp);
            }
        }
    }
}
