package rup.česky.tvary;

/*******************************************************************************
 * Třída AHýbací je společnou rodičovskou třídou tříd implementujících
 * rozhraní IHýbací. 
 *
 * @author     Rudolf Pecinovský
 * @version    2.01, duben 2004
 */
public abstract class AHýbací extends APosuvný implements IPřizpůsobivý
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    protected int šířka;   //šířka v bodech
    protected int výška;   //Výška v bodech



//== 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 AHýbací( int x, int y, int šířka, int výška )
    {
        super( x, y );
        this.šířka = šířka;
        this.výška = výška;
    }



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

    /***************************************************************************
     * Vrátí šířku instance.
     *
     * @return  šířka instance v bodech
     */
     public int getŠířka()
     {
         return šířka;
     }


    /***************************************************************************
     * Vrátí výšku instance.
     *
     * @return  výška instance v bodech
     */
     public int getVýška()
     {
         return výška;
     }


    /***************************************************************************
     * Vrátí instanci třídy Rozměr s rozměry instance.
     *
     * @return   Rozměr s rozměry instance.
     */
    public Rozměr getRozměr()
    {
        return new Rozměr( getŠířka(), getVýška() );
    }


    /***************************************************************************
     * Nastaví nový "čtvercový" rozměr instance -
     * na zadaný rozměr se nastaví výška i šířka.
     *
     * @param rozměr  Nově nastavovaný rozměr v obou směrech; rozměr>0
     */
    public void setRozměr(int rozměr)
    {
        setRozměr( rozměr, rozměr );
    }


    /***************************************************************************
     * Nastaví nové rozměry instance.
     *
     * @param šířka    Nově nastavovaná šířka; šířka>0
     * @param výška    Nově nastavovaná výška; výška>0
     */
    public void setRozměr(int šířka, int výška)
    {
        this.šířka = šířka;
        this.výška = výška;
        AP.překresli();
    }


    /***************************************************************************
     * Nastaví nové rozměry instance.
     *
     * @param rozměr    Nově nastavovaný rozměr.
     */
    public void setRozměr(Rozměr rozměr)
    {
        setRozměr( rozměr.šířka, rozměr.výška );
    }


    /***************************************************************************
     * Vrátí instanci třídy Oblast s informacemi o pozici a rozměrech instance.
     *
     * @return   Oblast s informacemi o pozici a rozměre instance.
     */
    public Oblast getOblast()
    {
        return new Oblast( getX(), getY(), getŠířka(), getVýška() );
    }


    /***************************************************************************
     * Nastaví novou polohu a rozměry instance.
     *
     * @param o    Nově nastavovaná oblast zaujímaná instancí.
     */
    public void setOblast(Oblast o)
    {
        AP.nekresli();
            setPozice( o.x,     o.y     );
            setRozměr( o.šířka, o.výška );
        AP.vraťKresli();
    }




//== PŘEKRYTÉ METODY IMPLEMENTOVANÝCH ROZHRANÍ =================================
    
    public void krokZměněn( int starý, int nový )
    {
        double poměr = (double)nový / starý;
        AP.nekresli();
            setPozice( (int)Math.round(poměr*getX()), 
                       (int)Math.round(poměr*getY()) );
            setRozměr( (int)Math.round(poměr*getŠířka()), 
                       (int)Math.round(poměr*getVýška()) );
        AP.vraťKresli();
    }

    
    
//== 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 super.toString() + 
               ", šířka=" + getŠířka() + ", výška=" + getVýška();
    }


//== 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 =======================================================
}


