package rup.česky.tvary;

import rup.česky.společně.P;


/*******************************************************************************
 * Třída APosuvný je společnou rodičovskou třídou tříd implementujících
 * rozhraní IPosuvný. 
 *
 * @author     Rudolf Pecinovský
 * @version    2.01, duben 2004
 */
public abstract class APosuvný implements IPosuvný
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /** Aktivní plátno, které dohlíží na správné vykreslení instance. */
    protected static final AktivníPlátno AP = AktivníPlátno.getPlátno();



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

    /** Celkový počet vytvořených instancí. */
    private static int počet = 0;
    
    
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** Rodné číslo instance = jako kolikátá byla vytvořena. */
    protected final int pořadí = ++počet;
  
  
    
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    /** Název sestávající z názvu třídy a pořadí instance */
    protected String název;

    protected int    xPos;    //Bodová x-ová souřadnice počátku
    protected int    yPos;    //Bodová y-ová souřadnice počátku



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

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

    /***************************************************************************
     * Vytvoří na zadaných souřadnicích
     * instanci širokou 100 bodů, vysokou 150 bodů
     * s kmenem zabírajícím 1/3 výška a 1/10 šířky stromu.
     *
     * @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
     */
    public APosuvný( int x, int y )
    {
        xPos  = x;
        yPos  = y;
        název = P.názevTřídy(this) + "_" + ++počet;
    }



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

    /***************************************************************************
     * Vrátí x-ovou souřadnici pozice instance.
     *
     * @return  x-ová souřadnice.
     */
    public int getX()
    {
        return xPos;
    }


    /***************************************************************************
     * Vrátí y-ovou souřadnici pozice instance.
     *
     * @return  y-ová souřadnice.
     */
    public int getY()
    {
        return yPos;
    }


    /***************************************************************************
     * Vrátí instanci třídy Pozice s pozicí instance.
     *
     * @return   Pozice s pozicí instance.
     */
    public Pozice getPozice()
    {
        return new Pozice( getX(), getY() );
    }


    /***************************************************************************
     * Nastaví novou pozici instance.
     *
     * @param x   Nová x-ová pozice instance
     * @param y   Nová y-ová pozice instance
     */
    public void setPozice(int x, int y)
    {
        xPos = x;
        yPos = y;
        AP.překresli();
    }


    /***************************************************************************
     * Nastaví novou pozici instance.
     *
     * @param pozice   Nová pozice instance
     */
    public void setPozice(Pozice pozice)
    {
        setPozice( pozice.x, pozice.y );
    }


    /***************************************************************************
     * Vrátí název instance, tj. název její třídy následovaný pořadím.
     *
     * @return  Řetězec s názvem instance.
     */
     public String getNázev()
     {
        return název;
     }



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

    /***************************************************************************
     * Vrací textovou reprezentaci dané instance
     * používanou především k ladícím účelům.
     *      
     * @return Název instance následovnaý jejími souřadnicemi.
     */
    public String toString()
    {
        return název + ": x=" + getX()  + ", y=" + getY();
    }


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

    /***************************************************************************
     * Přihlási instanci u aktivního plátna do jeho správy.
     */
    public void nakresli()
    {
        AP.přidej( this );
    }


    /***************************************************************************
     * Odstraní obraz své instance z plátna.
     */
    public void smaž()
    {
        AP.odstraň( this );
    }


    /***************************************************************************
     * Přesune instanci o zadaný počet bodů vpravo,
     * při záporné hodnotě parametru vlevo.
     *
     * @param vzdálenost Vzdálenost, o kterou se instance přesune.
     */
    public void posunVpravo(int vzdálenost)
    {
        setPozice( getX()+vzdálenost, getY() );
    }


    /***************************************************************************
     * Přesune instanci o krok bodů vpravo.
     */
    public void posunVpravo()
    {
        posunVpravo( AP.getKrok() );
    }


    /***************************************************************************
     * Přesune instanci o krok bodů vlevo.
     */
    public void posunVlevo()
    {
        posunVpravo( -AP.getKrok() );
    }


    /***************************************************************************
     * Přesune instanci o zadaný počet bodů dolů,
     * při záporné hodnotě parametru nahoru.
     *
     * @param vzdálenost    Počet bodů, o které se instance přesune.
     */
    public void posunDolů(int vzdálenost)
    {
        setPozice( getX(), getY()+vzdálenost );
    }


    /***************************************************************************
     * Přesune instanci o krok bodů dolů.
     */
    public void posunDolů()
    {
        posunDolů( AP.getKrok() );
    }


    /***************************************************************************
     * Přesune instanci o krok bodů nahoru.
     */
    public void posunVzhůru()
    {
        posunDolů( -AP.getKrok() );
    }



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


