import java.awt.*;


/**
 * Trida pro praci s trojuhelnikem na virtualnim platne.
 * Je soucasti projektu Tvary, ktery slouzi k demonstraci moznosti 
 * vyuky objektove orientovaneho programovani.
 *
 * @author     Rudolf Pecinovsky
 * @version    1.0, prosinec 2002
 */

public class Trojuhelnik implements IKresleny
{
//== ATRIBUTY TRIDY ============================================================

    private static int    krok   = 50;
    private static int    pocet  = 0;
    private static String ibarva = "zelena";


//== ATRIBUTY INSTANCI =========================================================

    private int xPos;
    private int yPos;
    private int sirka;
    private int vyska;
    private Barva barva;
    private int poradi = ++pocet;
    private String nazev;


//== PRISTUPOVE METODY ATRIBUTU TRIDY ==========================================

    /**
     * Vrati velikost implicitniho kroku, o ktery se trojuhelnik presune
     * pri volani bezparametrickych metod presunu.
     *
     * @return velikost implicitniho kroku v bodech
     */
     public static int getKrok()
     {
         return krok;
     }//public static int getKrok()


    /**
     * Nastavi velikost implicitniho kroku, o ktery se trojuhelnik presune
     * pri volani bezparametrickych metod presunu.
     *
     * @param velikost  velikost implicitniho kroku v bodech; velikost>=0
     */
    public static void setKrok(int velikost)
    {
        if( velikost < 0 )
            throw new IllegalArgumentException(
                "Krok nesmi byt zaporny: velikost=" + velikost );
        krok = velikost;
    }//public static void setKrok(int velikost)



//== KONSTRUKTORY ==============================================================

    /**
     * Vytvori novy trojuhelnik s implicitnimi rozmery, umistenim a barvou.
     * Trojuhelnik bude umisten v levem hornim rohu a bude mit
     * (na pocatku zelenou) barvu, vysku 40 bodu a sirku 40 bodu.
     */
    public Trojuhelnik()
    {
        this( 0, 0, 40, 40 );
    }//public Trojuhelnik()


    /**
     * Vytvori novy trojuhelnik se zadanou polohou a rozmery
     * a implicitni (na pocatku zelenou) barvou.
     *
     * @param x x-ova souradnice, x>=0, x=0 ma levy okraj platna
     * @param y y-ova souradnice, y>=0, y=0 ma horni okraj platna
     * @param w sirka trojuhelniku,  w > 0
     * @param h vyska trojuhelniku,  h > 0
     */
    public Trojuhelnik( int x, int y, int w, int h )
    {
        this( x, y, w, h, ibarva );
    }//public Trojuhelnik( int x, int y, int w, int h )


    /**
     * Vytvori novy trojuhelnik se zadanymi rozmery, polohou a barvou.
     *
     * @param x   x-ova souradnice, x>=0, x=0 ma levy okraj platna
     * @param y   y-ova souradnice, y>=0, y=0 ma horni okraj platna
     * @param w sirka trojuhelniku,  w > 0
     * @param h vyska trojuhelniku,  h > 0
     * @param c barva trojuhelniku - povolene hodnoty jsou:
     *                    "cerna",  "modra",     "cervena", "fialova",
     *                    "zelena", "azurova", "zluta",   "bila".
     */
    public Trojuhelnik( int x, int y, int w, int h, String c )
    {
        //Test platnosti parametru
        if( (x<0) || (y<0) || (w<=0) || (h<=0) )
            throw new IllegalArgumentException(
                "Parametry nemaji povolene hodnoty: x="
                + x + ", y=" + y + ", w=" + w + ", h=" + h );
        barva = Barva.getBarva( c );

        //Parametry akceptovany --> muzeme tvorit
        sirka = w;
        vyska = h;
        xPos = x;
        yPos = y;
        
        nazev = "Trojuhelnik_" + poradi;
    }//public Trojuhelnik( int x, int y, int w, int h )



//== PRISTUPOVE METODY ATRIBUTU INSTANCI =======================================

    /**
     * Vrati x-ovou souradnici trojuhelniku, tj. souradnici
     * leveho horniho rohu opsaneho obdelniku.
     *
     * @return x-ova souradnice leveho horniho rohu opsaneho obdelniku
     */
     public int getX()
     {
         return xPos;
     }//public int getX()


    /**
     * Vrati y-ovou souradnici trojuhelniku, tj. souradnici
     * leveho horniho rohu opsaneho obdelniku.
     *
     * @return y-ova souradnice leveho horniho rohu opsaneho obdelniku
     */
     public int getY()
     {
         return yPos;
     }//public int getY()


    /**
     * Nastavi novou polohu trojuhelniku, tj. polohu
     * leveho horniho rohu opsaneho obdelniku.
     *
     * @param x   x-ova pozice leveho horniho rohu opsaneho obdelniku
     * @param y   y-ova pozice leveho horniho rohu opsaneho obdelniku
     */
    public void setPozice(int x, int y)
    {
        xPos = x;
        yPos = y;
        AnimPlatno.getPlatno().prekresli();
    }//public void setPozice(int x, int y)


    /**
     * Vrati sirku trojuhelniku.
     *
     * @return  sirka trojuhelniku v bodech
     */
     public int getSirka()
     {
         return sirka;
     }//public int getSirka()


    /**
     * Vrati vysku trojuhelniku.
     *
     * @return  vyska trojuhelniku v bodech
     */
     public int getVyska()
     {
         return vyska;
     }//public int getVyska()


    /**
     * Nastavi novou velikost trojuhelniku -
     * na zadanou velikost se nastavi vyska i sirka.
     *
     * @param velikost  nove nastavovana velikost; velikost>0
     */
    public void setVelikost(int velikost)
    {
        setRozmer( velikost, velikost );
    }//public void setVelikost(int velikost)


    /**
     * Nastavi nove rozmery trojuhelniku.
     *
     * @param w    nove nastavovana sirka; w>0
     * @param h    nove nastavovana vyska; h>0
     */
    public void setRozmer(int w, int h)
    {
        if( (w <= 0) || (h <= 0) )
            throw new IllegalArgumentException(
                "Rozmery musi byt kladne: w=" + w + ", h=" + h );
        sirka = w;
        vyska = h;
        AnimPlatno.getPlatno().prekresli();
    }//public void setRozmer(int rozmer)


    /**
     * Vráti barvu trojuhelniku.
     *
     * @return  retezec definujici nastavenou barvu
     */
    public Barva getBarva()
    {
        return barva;
    }//public Barva getBarva()


    /**
     * Nastavi novou barvu trojuhelniku.
     *
     * @param nova nova barva - povolene hodnoty jsou:
     *                    "cerna",  "modra",     "cervena", "fialova",
     *                    "zelena", "azurova", "zluta",   "bila".
     */
    public void setBarva(String nova)
    {
        //Pri prevodu se zaroven otestuje akceptovatelnost nastavovane barvy
        barva = Barva.getBarva( nova );
        AnimPlatno.getPlatno().prekresli();
    }//public void setBarva(String nova)


    /**
     * Nastavi novou barvu obdelniku.
     *
     * @param nova nastavovana barva - povolene hodnoty jsou:
     *             "cerna",  "modra",     "cervena", "fialova",
     *             "zelena", "azurova", "zluta",   "bila".
     */
    public void setBarva(Barva nova)
    {
        //Pri prevodu se zaroven otestuje akceptovatelnost nastavovane barvy
        barva = nova;
        AnimPlatno.getPlatno().prekresli();
    }//public void setBarva(Barva nova)


    /**
     * Vráti nazev trojuhelniku.
     *
     * @return  aktualni nazev daneho trojuhelniku
     */
    public String getNazev()
    {
        return nazev;
    }//public String getNazev()



//== OSTATNI METODY INSTANCI ===================================================

    /**
     * Nakresli trojuhelnik na platno.
     */
    public void kresli( Graphics2D g )
    {
        g.setColor( barva );
        int[] xpoints = { xPos, xPos + (sirka/2), xPos + sirka };
        int[] ypoints = { yPos + vyska, yPos, yPos + vyska };
        g.fill(new Polygon(xpoints, ypoints, 3));
    }//public void kresli( Graphics2D g )


    /**
     * Presune trojuhelnik o zadany pocet bodu vpravo,
     * pri zaporne hodnote parametru vlevo.
     *
     * @param vzdalenost vzdalenost, o kterou se trojuhelnik presune
     */
    public void posunVpravo(int vzdalenost)
    {
        xPos += vzdalenost;
        AnimPlatno.getPlatno().prekresli();
    }//public void posunVpravo(int vzdalenost)


    /**
     * Presun trojuhelnik o krok bodu vpravo.
     */
    public void posunVpravo()
    {
        posunVpravo(krok);
    }//public void posunVpravo()


    /**
     * MPresun trojuhelnik o krok bodu vlevo.
     */
    public void posunVlevo()
    {
        posunVpravo(-krok);
    }//public void posunVlevo()


    /**
     * Pomalu presun trojuhelnik o zadany pocet bodu vpravo,
     * pri zaporne hodnote parametru vlevo.
     *
     * @param vzdalenost pocet bodu, o ktere se trojuhelnik presune.
     */
    public void pomaluVpravo(int vzdalenost)
    {
        int delta;
        AnimPlatno platno = AnimPlatno.getPlatno();

        if(vzdalenost < 0)
        {
            delta = -1;
            vzdalenost = -vzdalenost;
        }
        else
        {
            delta = 1;
        }

        for(int i = 0; i < vzdalenost; i++)
        {
            posunVpravo( delta );
            platno.cekej(10);
        }
    }//public void pomaluVpravo(int vzdalenost)


    /**
     * Presune trojuhelnik o zadany pocet bodu dolu,
     * pri zaporne hodnote parametru nahoru.
     *
     * @param vzdalenost pocet bodu, o ktere se trojuhelnik presune
     */
    public void posunDolu(int vzdalenost)
    {
        yPos += vzdalenost;
        AnimPlatno.getPlatno().prekresli();
    }//public void posunDolu(int vzdalenost)


    /**
     * Presune trojuhelnik o krok bodu nahoru.
     */
    public void posunVzhuru()
    {
        posunDolu(-krok);
    }//public void posunVzhuru()


    /**
     * Presune trojuhelnik o krok bodu dolu.
     */
    public void posunDolu()
    {
        posunDolu(krok);
    }//public void posunDolu()


    /**
     * Pomalu presune trojuhelnik o zadany pocet bodu dolu,
     * pri zaporne hodnote parametru nahoru.
     *
     * @param vzdalenost pocet bodu, o ktere se trojuhelnik presune
     */
    public void pomaluDolu(int vzdalenost)
    {
        int delta;
        AnimPlatno platno = AnimPlatno.getPlatno();

        if(vzdalenost < 0)
        {
            delta = -1;
            vzdalenost = -vzdalenost;
        }
        else
        {
            delta = 1;
        }

        for(int i = 0; i < vzdalenost; i++)
        {
            posunDolu( delta );
            platno.cekej(10);
        }
    }//public void pomaluDolu(int vzdalenost)

}//public class Trojuhelnik implements IKresleny