/**
 * Dies ist die Hauptklasse eines Zeichenprogramms
 * 
 * @author Dr.-Ing. U. Kiesmüller
 * @version lauffähige erste Version mit GUI
 */

import javax.swing.*;
import java.awt.event.*;

public class Zeichenblatt
{
    // Variablendeklaration
    private ZEICHENFENSTER hintergrund;
    private Haus haus1;
    private Baum baum1;
    private Halm[] rasen;
    private int farbe;
    private boolean hausSteht;
    private boolean baumSteht;
    private boolean programmlauf;
    private boolean regenguss;
    private JButton hausknopf;
    private JButton rasenknopf;
    private JButton baumknopf;
    private JButton regenknopf;
    private JButton programmende;
    private JLabel anzeige1;
    private JLabel anzeige2;
    private Tropfen[] regen;
    
    /**
     * Konstruktor für ein Zeichenblatt "Malerei" mit fester Größe
     */
    public Zeichenblatt()
    {
        // Variableninitialisierung
        hintergrund = new ZEICHENFENSTER("Malerei",800,500);
        haus1 = new Haus(55,200,80,3);
        baum1 = new Baum(200,280,30,90);
        hausSteht = false;
        baumSteht = false;
        programmlauf = true;
        regenguss = false;
        rasen = new Halm[50];
        regen = new Tropfen[25];
        for (int i = 0; i < 50 ; i = i + 1){
            int zufall = (int) (Math.random()*10); 
            if (zufall >= 8){
                farbe = 6; //gelber Halm
            }
            else {
                farbe = 2; //grüner Halm
            }
            rasen[i] = new Halm(20+zufall, haus1.gibXStartFassade()+i*5, haus1.gibYStartFassade()+haus1.gibHoeheFassade(), farbe);       
        }
              
        for (int i = 0; i < 25 ; i = i + 1){
           regen[i] = new Tropfen(haus1.gibXStartFassade()+i*15,0);
        }
     
        hausknopf = new JButton("Neues Haus");
        rasenknopf = new JButton("Neuer Rasen");
        baumknopf = new JButton("Neuer Baum");
        regenknopf = new JButton("Regenguss");
        programmende = new JButton("ENDE");
        hintergrund.komponenteHinzufuegen(hausknopf, "rechts");
        hintergrund.komponenteHinzufuegen(rasenknopf, "rechts");
        hintergrund.komponenteHinzufuegen(baumknopf, "rechts");
        hintergrund.komponenteHinzufuegen(regenknopf, "rechts");
        hintergrund.komponenteHinzufuegen(programmende, "rechts");
        anzeige1 = new JLabel(" ");
        hintergrund.komponenteHinzufuegen(anzeige1, "unten");
        anzeige1.setText("Drücke einen der Buttons rechts am Rand!     ");
        anzeige2 = new JLabel(" ");
        hintergrund.komponenteHinzufuegen(anzeige2, "unten");
        
        rasenknopf.addActionListener(new ActionListener()
            { 
                public void actionPerformed(ActionEvent e)
                {
                    for (int i = 0; i <50 ; i = i + 1){
                       if (rasen[i].gibX1Halm() >= haus1.gibXStartFassade() && rasen[i].gibX1Halm() <= haus1.gibXStartFassade()+haus1.gibBreiteFassade() && hausSteht)
                       {
                            hintergrund.fuelleDreieck(rasen[i].gibX1Halm(),rasen[i].gibY1Halm(),rasen[i].gibX2Halm(),rasen[i].gibY2Halm(),rasen[i].gibX3Halm(),rasen[i].gibY3Halm(),haus1.gibFarbnrFassade());
                       }
                       else if ((rasen[i].gibX1Halm() >= baum1.gibXStartStamm()) && (rasen[i].gibX1Halm() <= (baum1.gibXStartStamm()+baum1.gibBreiteStamm())) && baumSteht)
                       {
                            hintergrund.fuelleDreieck(rasen[i].gibX1Halm(),rasen[i].gibY1Halm(),rasen[i].gibX2Halm(),rasen[i].gibY2Halm(),rasen[i].gibX3Halm(),rasen[i].gibY3Halm(),baum1.gibFarbnrStamm());
                       }
                       else
                       {   
                            hintergrund.fuelleDreieck(rasen[i].gibX1Halm(),rasen[i].gibY1Halm(),rasen[i].gibX2Halm(),rasen[i].gibY2Halm(),rasen[i].gibX3Halm(),rasen[i].gibY3Halm(),8);
                       }
                    }
                  
                    for (int i = 0; i < 50 ; i= i + 1){
                        int zufall = (int) (Math.random()*10); 
                        if (zufall >= 8){
                            farbe = 6; //gelber Halm
                        }
                        else {
                            farbe = 2; //grüner Halm
                        }
                        rasen[i] = new Halm(20+zufall, haus1.gibXStartFassade()+i*5, haus1.gibYStartFassade()+haus1.gibHoeheFassade(), farbe);       
                    }
                    wachsen(); 
                }
            }                         );   
            
        hausknopf.addActionListener(new ActionListener()
            { 
                public void actionPerformed(ActionEvent e)
                {
                    hintergrund.fuelleRechteck(haus1.gibXStartFassade(),haus1.gibYStartFassade(),haus1.gibBreiteFassade(),haus1.gibHoeheFassade(),haus1.gibFarbnrFassade());
                    hintergrund.fuelleDreieck(haus1.gibX1Dach(),haus1.gibY1Dach(),haus1.gibX2Dach(),haus1.gibY2Dach(),haus1.gibX3Dach(),haus1.gibY3Dach(),haus1.gibFarbnrDach());
                    schreibeStatus("Haus gebaut!");
                    hausSteht = true;
                }
            }                         );
            
        baumknopf.addActionListener(new ActionListener()
            { 
                public void actionPerformed(ActionEvent e)
                {
                    hintergrund.fuelleRechteck(baum1.gibXStartStamm(),baum1.gibYStartStamm()-baum1.gibHoeheStamm(),baum1.gibBreiteStamm(),baum1.gibHoeheStamm(),baum1.gibFarbnrStamm());
                    hintergrund.fuelleKreis(baum1.gibXMitteKrone(),baum1.gibYMitteKrone(),baum1.gibRadiusKrone(),baum1.gibFarbnrKrone());
                    schreibeStatus("Baum steht!");
                    baumSteht = true;
                }
            }                         );
            
        regenknopf.addActionListener(new ActionListener()
            { 
                public void actionPerformed(ActionEvent e)
                {
                       regenguss = true;
                }
            }                         );
            
        programmende.addActionListener(new ActionListener()
            { 
                public void actionPerformed(ActionEvent e)
                {
                    programmlauf = false;
                }
            }                         );
        }
    
    /**
     * Methode zum Wachsen des Rasens (50 grüne bzw. gelbe Halme unterschiedlicher Größe)
     * Halme werden im Feld rasen[] verwaltet, sie bestehen jeweils aus einem Dreieck, dessen eine Seite die Länge 1 besitzt
     * 
     * @param  i Halmnummer (int)
     * @return  Rasen wird gezeichnet
     */
    public void wachsen()
    {
        for (int i = 0; i <50 ; i = i + 1){
            hintergrund.fuelleDreieck(rasen[i].gibX1Halm(),rasen[i].gibY1Halm(),rasen[i].gibX2Halm(),rasen[i].gibY2Halm(),rasen[i].gibX3Halm(),rasen[i].gibY3Halm(),rasen[i].gibFarbnrHalm());
            schreibeStatus("Rasen wächst!");
        }
    }

    /**
     * Methode zur Textausgabe in einem JLabel
     * 
     * @param  text Text (String), der angezeigt werden soll
     */
    public void schreibeStatus(String text)
    {
        anzeige2.setText(text);
    }

    /**
     * Methode zur Erzeugung einer neuen "Wolke" aus 25 Regentropfen am oberen Ende des Zeichenblattes
     * Tropfen werden im Feld regen[] verwaltet, sie bestehen jeweils aus einem übereinander gezeichneten Dreieck und einem Kreis
     * 
     * @param  i Tropfennummer (int)
     */
    public void regenStart()
    {
        for (int i = 0; i < 25 ; i = i + 1){
                regen[i].setzeYSpitze(0);
            }
        
        for (int i = 0; i < 25 ; i = i + 1){
            hintergrund.fuelleDreieck(regen[i].gibXSpitze(),regen[i].gibYSpitze(),regen[i].gibXSpitze()-5,regen[i].gibYSpitze()+20,regen[i].gibXSpitze()+5,regen[i].gibYSpitze()+20,1);
            hintergrund.fuelleKreis(regen[i].gibXRundung(),regen[i].gibYRundung(),4,1);
        }
    }

    /**
     * Methode, welche die "Wolke" aus 25 Regentropfen gleichmäßig nach unten fallen lässt
     * Tropfen werden im Feld regen[] verwaltet, sie bestehen jeweils aus einem übereinander gezeichneten Dreieck und einem Kreis
     * "Wolke" wird an ihrer aktuellen Position gelöscht, dann wird alles neu gezeichnet, "Es regnet!" ausgegeben und schließlich
     * die "Wolke" nach unten verschoben und neu gezeichnet
     * 
     * @param  j Schritt auf dem Weg nach unten (int)
     * @param  i Tropfennummer (int)
     */
    public void regenFaellt()
    {
        for (int j = 0; j < 100 ; j = j + 1){
            hintergrund.warte(100);
            for (int i = 0; i < 25 ; i = i + 1){
                hintergrund.fuelleDreieck(regen[i].gibXSpitze(),regen[i].gibYSpitze(),regen[i].gibXSpitze()-5,regen[i].gibYSpitze()+20,regen[i].gibXSpitze()+5,regen[i].gibYSpitze()+20,8);
                hintergrund.fuelleKreis(regen[i].gibXRundung(),regen[i].gibYRundung(),4,8);
            }
            hintergrund.fuelleRechteck(haus1.gibXStartFassade(),haus1.gibYStartFassade(),haus1.gibBreiteFassade(),haus1.gibHoeheFassade(),haus1.gibFarbnrFassade());
            hintergrund.fuelleDreieck(haus1.gibX1Dach(),haus1.gibY1Dach(),haus1.gibX2Dach(),haus1.gibY2Dach(),haus1.gibX3Dach(),haus1.gibY3Dach(),haus1.gibFarbnrDach());
            hintergrund.fuelleRechteck(baum1.gibXStartStamm(),baum1.gibYStartStamm()-baum1.gibHoeheStamm(),baum1.gibBreiteStamm(),baum1.gibHoeheStamm(),baum1.gibFarbnrStamm());
            hintergrund.fuelleKreis(baum1.gibXMitteKrone(),baum1.gibYMitteKrone(),baum1.gibRadiusKrone(),baum1.gibFarbnrKrone());
            wachsen();
            schreibeStatus("Es regnet!");
            for (int i = 0; i < 25 ; i = i + 1){
                regen[i].setzeYSpitze(regen[i].gibYSpitze()+3);
                hintergrund.fuelleDreieck(regen[i].gibXSpitze(),regen[i].gibYSpitze(),regen[i].gibXSpitze()-5,regen[i].gibYSpitze()+20,regen[i].gibXSpitze()+5,regen[i].gibYSpitze()+20,1);
                hintergrund.fuelleKreis(regen[i].gibXRundung(),regen[i].gibYRundung(),4,1);
            }
        }
        for (int i = 0; i < 25 ; i = i + 1){
                hintergrund.fuelleDreieck(regen[i].gibXSpitze(),regen[i].gibYSpitze(),regen[i].gibXSpitze()-5,regen[i].gibYSpitze()+20,regen[i].gibXSpitze()+5,regen[i].gibYSpitze()+20,8);
                hintergrund.fuelleKreis(regen[i].gibXRundung(),regen[i].gibYRundung(),4,8);
            }
    }

    /**
     * Hauptmethode - diese muss zuerst aufgerufen werden, bevor das Programm in seiner gewünschten Form mit den Buttons gesteuert werden kann
     * 
     * @param  programmlauf solange der Wert TRUE ist, läuft das Programm in einer Dauerschleife (boolean) - wird durch Drücken des ENDE-Buttons auf FALSE gesetzt
     * @param  regenguss löst mit Wert TRUE, der über den Regen-Button gesetzt wird einen Regenguss aus - wird anschließend auf FALSE zurückgesetzt (boolean)
     */
    public void main()
    {           
        while (programmlauf)
        {
             if (regenguss) {
                 regenStart();
                 regenFaellt();
                 schreibeStatus("Es regnet!");
                 regenguss = false;
             }
        }
    }
}
