/*******************************************************************************
 * Třída Strom obsahuje definice metod z třetí kapitoly učebnice
 * vytvořené před přidáním komentářů.
 * 
 * Oproti třídě Strom_3a
 *  * chodí všechny posunové metody
 *  * přibyly statické metody vracející a nastavující hodnotu
 *    statického parametru krok 
 *  * bezparametrické metody volají své parametrické verze a posouvají
 *    se o hodnotu uloženou ve statickém atributu krok
 *  * přibyl konstruktor s definovaným podílem výšky koruny a stromu 
 *    a podílem šířky stromu a kmene
 *  * přibyla metoda zarámuj() 
 *  * přibyly statické metody zarámuj(int,int)  a alej()
 *
 * @author     Rudolf Pecinovský
 * @version    2.01, duben 2004
 */
public class Strom_3b 
{
    public static final int IMPLICITNÍ_POMĚR_ŠÍŘKY = 10;
    public static final int IMPLICITNÍ_POMĚR_VÝŠKY =  3;
    
    private static int krok = 50;
    
    private final Elipsa   koruna;
    private final Obdélník kmen;
  
  
    public Strom_3b()
    {
        this( 0, 0 );
    }

    public Strom_3b( int x, int y )
    {
        this( x, y, 100, 150 );
    }

    public Strom_3b( int x, int y, int šířka, int výška )
    {
        this( x, y, šířka, výška, 
            IMPLICITNÍ_POMĚR_ŠÍŘKY, IMPLICITNÍ_POMĚR_VÝŠKY );
    }

//
//    public Strom_3b( int x, int y, int šířka, int výška )
//    {
//        int v3 = výška / 3;
//        koruna = new Elipsa  ( x, y, šířka, 2*v3, Barva.ZELENÁ  );
//        kmen   = new Obdélník( x+9*šířka/20, y+2*v3, 
//                               šířka/10, v3, Barva.HNĚDÁ );
//    }
//

    public Strom_3b( int x, int y, int šířka, int výška, 
                  int podílŠířkyKmene, int podílVýškyKmene )
    {
        int výškaKmene  = výška / podílVýškyKmene;
        int výškaKoruny = výška - výškaKmene;
        int šířkaKmene  = šířka / podílŠířkyKmene;
        int posunKmene  = ( šířka - šířkaKmene) / 2;
        koruna = new Elipsa  ( x, y, šířka, výškaKoruny, Barva.ZELENÁ  );
        kmen   = new Obdélník( x+posunKmene, y+výškaKoruny, 
                               šířkaKmene, výškaKmene, Barva.HNĚDÁ );
    }

    public void nakresli()
    {
        koruna.nakresli();
        kmen  .nakresli();
    }

    public void smaž()
    {
        koruna.smaž();
        kmen  .smaž();
    }
    
    
    public void posunVpravo(int n)
    {
        koruna.posunVpravo( n );
        kmen  .posunVpravo( n );
    }

    public void posunDolů( int n )
    {
        koruna.posunDolů( n );
        kmen  .posunDolů( n );
        koruna.nakresli();
    }

    public void setPozice( int x, int y )
    {
        koruna.setPozice( x, y );
        kmen  .setPozice( x  +  (koruna.getŠířka() - kmen.getŠířka()) / 2,                       
                          y  +  koruna.getVýška()     ); 
        koruna.nakresli();
    }

    public void posunVpravo()
    {
        posunVpravo( krok );
    }

    public void posunVlevo()
    {
        posunVpravo( -krok );
    }
    
    public void posunVzhůru()
    {
        posunDolů( -krok );
    }
    
    public void posunDolů()
    {
        posunDolů( krok );
    }
    
    public int getX()
    {
        return koruna.getX();
    }

    public int getŠířka()
    {
        return koruna.getŠířka();
    }
    
    public int getVýška()
    {
        return koruna.getVýška() + kmen.getVýška();
    }

    public Barva getBarvaKoruny()
    {
        return koruna.getBarva();
    }
    
    public void setBarvaKoruny( Barva nová )
    {
        koruna.setBarva( nová );
    }

    public void zarámuj()
    {
        Plátno.getPlátno().setRozměr( getŠířka(), getVýška() );
        setPozice( 0, 0 );
    }

    public static int getKrok()
    {
        return krok;
    }
    
    public static void setKrok( int krok )
    {
        Strom_3b.krok = krok;
    }
    
    public static void setKrok()
    {
        krok = P.zadej( "Zadejte novou velikost kroku:", krok );
    }

    public static void zarámuj( int šířka, int výška )
    {
        Plátno.getPlátno().setRozměr( šířka, výška );
        new Strom_3b( 0, 0, šířka, výška );
    }

    public static void alej()
    {
        Plátno.getPlátno().setRozměr( 400, 350 );
        new Strom_3b( 100,   0 );      new Strom_3b( 300,   0 );
        new Strom_3b(  50, 100 );      new Strom_3b( 250, 100 );
        new Strom_3b(   0, 200 );      new Strom_3b( 200, 200 );
    }
} 

