package rup.česky.tvary_5;

/*******************************************************************************
 * Třída pro prací s čárou komunikující s aktivním plátnem.
 * Čára je určena svými krajními body, přičemž souřadnice počátečního bodu
 * je současně považována za pozici celé instance.
 *
 * Jedná se o výchozí podobu třídy v souboru projektů.
 *    
 * @author     Rudolf Pecinovský
 * @version    2.01, duben 2004
 */
public class Čára extends APosuvný
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

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



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

    private int    kx;      //xBodová -ová souřadnice konce 
    private int    ky;      //Bodová y-ová souřadnice konce
    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, 
     * Končit bude ve středu plátna.
     */
    public Čára()
    {
        this( 0, 0, AP.getKrok()*AP.getŠířka()/2, 
                    AP.getKrok()*AP.getVýška()/2 );
    }


    /***************************************************************************
     * Vytvoří novou instanci se zadanou polohou a rozměry 
     * a implicitní barvou.
     *
     * @param x   x-ová souřadnice počátku, x>=0, x=0 má levý okraj plátna
     * @param y   y-ová souřadnice počátku, y>=0, y=0 má horní okraj plátna
     * @param kx  x-ová souřadnice koncového bodu instance
     * @param ky  y-ová souřadnice koncového bodu instance
     */
    public Čára(int x, int y, int kx, int ky)
    {
        this( x, y, kx, ky, IMPLICITNÍ_BARVA );
    }


    /***************************************************************************
     * Vytvoří novou instanci se zadanou polohou a rozměry 
     * a implicitní barvou.
     *
     * @param počátek   Pozice počátku instance
     * @param konec     Pozice koncového bodu instance
     */
    public Čára(Pozice počátek, Pozice konec)
    {
        this( počátek.x, počátek.y, konec.x, konec.y, IMPLICITNÍ_BARVA );
    }


    /***************************************************************************
     * Vytvoří novou instanci se zadanou polohou a rozměry 
     * a implicitní barvou.
     *
     * @param počátek   Pozice počátku instance
     * @param konec     Pozice koncového bodu instance
     * @param barva     Barva vytvářené instance
     */
    public Čára(Pozice počátek, Pozice konec, Barva barva)
    {
        this( počátek.x, počátek.y, konec.x, konec.y, barva );
    }


    /***************************************************************************
     * Vytvoří novou instanci se zadanými rozměry, polohou a barvou.
     *
     * @param x       x-ová souřadnice počátku, x>=0, x=0 má levý okraj plátna
     * @param y       y-ová souřadnice počátku, y>=0, y=0 má horní okraj plátna
     * @param kx      x-ová souřadnice koncového bodu instance
     * @param ky      y-ová souřadnice koncového bodu instance
     * @param barva   Barva vytvářené instance
     */
    public Čára(int x, int y, int kx, int ky, Barva barva)
    {
        super( x, y );
        this.kx = kx;
        this.ky = ky;
        this.barva = barva;
    }



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

    /***************************************************************************
     * Nastaví novou pozici instance.
     * Koncový bod se přitom přesune tak, 
     * aby zůstala zachována velikost a směr instance.
     *       
     * @param x   Nová x-ová pozice instance
     * @param y   Nová y-ová pozice instance
     */
    public void setPozice( int x, int y )
    {
        kx  += x - super.getX();
        ky  += y - super.getY();
        super.setPozice( x, y );
        AP.překresli();
    }


    /***************************************************************************
     * Vrátí x-ovou souřadnici koncového bodu instance.
     *
     * @return  x-ová souřadnice koncového bodu.
     */
    public int getKX()
    {
        return kx;
    }


    /***************************************************************************
     * Vrátí y-ovou souřadnici koncového bodu instance.
     *
     * @return  y-ová souřadnice koncového bodu.
     */
     public int getKY()
     {
         return ky;
     }


    /***************************************************************************
     * Vrátí pozici koncového bodu instance.
     *
     * @return  Pozice koncového bodu.
     */
     public Pozice getKPozice()
     {
         return new Pozice( getKX(), getKY() );
     }


    /***************************************************************************
     * Nastaví pozici koncového bodu instance.
     *
     * @param kpozice  Pozice koncového bodu.
     */
     public void setKPozice( int kx, int ky )
     {
         this.kx = kx;
         this.ky = ky;
         AP.překresli();
     }


    /***************************************************************************
     * Nastaví pozici koncového bodu instance.
     *
     * @param kpozice  Pozice koncového bodu.
     */
     public void setKPozice( Pozice kpozice )
     {
         setPozice( kpozice.x, kpozice.y );
     }


    /***************************************************************************
     * 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 )
    {
        kreslítko.kresliČáru( getX(), getY(), kx, ky, getBarva() );
    }



//== 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() + ", kx=" + kx + ", ky=" + ky +
               ", barva=" + barva;
    }



//== NOVĚ ZAVEDENÉ METODY INSTANCÍ =============================================

    /***************************************************************************
     * Spojí čárou zadané body.
     *
     * @param x1      x-ová souřadnice počátku, x>=0, x=0 má levý okraj plátna
     * @param y1      y-ová souřadnice počátku, y>=0, y=0 má horní okraj plátna
     * @param kx      x-ová souřadnice koncového bodu instance
     * @param ky      y-ová souřadnice koncového bodu instance
     */
    public void spoj( int x1, int y1, int kx, int ky )
    {
        setPozice( x1, y1 );
        this.kx   = kx;
        this.ky   = ky;
        AP.překresli();
    }


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

