package rup.česky.tvary_3;

/*******************************************************************************
 * Třída pro práci s elipsou komunikující s aktivním plátnem.
 *  
 * Oproti stejnojmenné třídě z projektu 
 * 06_Rozhraní se změnilo pouze implementované rozhraní.   
 *   
 * @author     Rudolf Pecinovský
 * @version    2.01, duben 2004
 */
public class Elipsa extends Hýbací implements IHýbací
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /** Počáteční barva nakreslené instance v případě,
     *  kdy uživatel žádnou požadovanou barvu nezadá -
     *  pro elipsu Barva.MODRÁ. */
    public static final Barva IMPLICITNÍ_BARVA = Barva.MODRÁ;



//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    private Barva  barva;   //Barva instance



//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ METODY TŘÍDY ======================================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří novou instanci s implicitními rozměry, umístěním a barvou.
     * Instance bude umístěna v levém horním rohu plátna 
     * a bude mít implicitní barvu, 
     * výšku 1 pole a šířku 2 pole.
     */
    public Elipsa()
    {
        this( 0, 0, 2*AP.getKrok(), AP.getKrok() );
    }


    /***************************************************************************
     * Vytvoří novou instanci se zadanou polohou a rozměry 
     * a implicitní barvou.
     *
     * @param x      x-ová souřadnice instance, x>=0, x=0 má levý okraj plátna
     * @param y      y-ová souřadnice instance, y>=0, y=0 má horní okraj plátna
     * @param šířka  Šířka vytvářené instance,  šířka > 0
     * @param výška  Výška vytvářené instance,  výška > 0
     */
    public Elipsa( int x, int y, int šířka, int výška )
    {
        this( x, y, šířka, výška, IMPLICITNÍ_BARVA );
    }


    /***************************************************************************
     * Vytvoří novou instanci se zadanou polohou, rozměry 
     * a barvou.
     *
     * @param pozice    Pozice vytvářené instance
     * @param rozměr    Rozměr vytvářené instance
     * @param barva     Barva vytvářené instance
     */
    public Elipsa(Pozice pozice, Rozměr rozměr, Barva barva)
    {
        this( pozice.x, pozice.y, rozměr.šířka, rozměr.výška, barva );
    }


    /***************************************************************************
     * Vytvoří novou instanci vyplňující zadanou oblast 
     * a mající zadanou barvu.
     *
     * @param oblast   Oblast definující pozici a rozměr vytvářené instance
     * @param barva    Barva vytvářené instance
     */
    public Elipsa(Oblast oblast, Barva barva)
    {
        this( oblast.x, oblast.y, oblast.šířka, oblast.výška, barva );
    }


    /***************************************************************************
     * Vytvoří novou instanci se zadanými rozměry, polohou a barvou.
     *
     * @param x      x-ová souřadnice instance, x>=0, x=0 má levý okraj plátna
     * @param y      y-ová souřadnice instance, y>=0, y=0 má horní okraj plátna
     * @param šířka  Šířka vytvářené instance,  šířka > 0
     * @param výška  Výška vytvářené instance,  výška > 0
     * @param barva  Barva vytvářené instance
     */
    public Elipsa( int x, int y, int šířka, int výška, Barva barva )
    {
        super( x, y, šířka, výška );
        this.barva = barva;
    }



//== PŘÍSTUPOVÉ METODY ATRIBUTU INSTANCÍ =======================================

    /***************************************************************************
     * Vrátí barvu instance.
     *
     * @return  Instance třídy Barva definující nastavenou barvu.
     */
    public Barva getBarva()
    {
        return barva;
    }


    /***************************************************************************
     * Nastaví novou barvu instance.
     *
     * @param nová   Požadovaná nová barva.
     */
    public void setBarva(Barva nová)
    {
        barva = nová;
        AP.překresli();
    }



//== PŘEKRYTÉ METODY IMPLEMENTOVANÝCH ROZHRANÍ =================================

    /***************************************************************************
     * Za pomoci dodaného kreslítka vykreslí obraz své instance
     * na animační plátno.
     *  
     * @param kreslítko   Kreslítko, kterým se instance nakreslí na plátno.     
     */
    public void nakresli( Kreslítko kreslítko )
    {
        //Volám rodičovskou verzi metody, abych měl jistotu, co se zavolá,
        //a aby se při překrytí některé z použitých metod 
        //nezavolalo něco jiného, co může vráti pro mne nevhodnou hodnotu.
        kreslítko.vyplňOvál( super.getX(),     super.getY(), 
                             super.getŠířka(), super.getVýška(), barva );
    }



//== PŘEKRYTÉ ABSTRAKTNÍ METODY RODIČOVSKÉ TŘÍDY ===============================
//== PŘEKRYTÉ KONKRÉTNÍ METODY RODIČOVSKÉ TŘÍDY ================================

    /***************************************************************************
     * Převede instanci na řetězec. Používá se především při ladění.
     * 
     * @return Řetězcová reprezentace dané instance.      
     */
    public String toString()
    {
        return super.toString() + ", barva=" + barva;
    }



//== NOVĚ ZAVEDENÉ METODY INSTANCÍ =============================================
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== VNOŘENÉ A VNITŘNÍ TŘÍDY ===================================================
//== TESTY A METODA MAIN =======================================================
} 

