package rup.česky.tvary;

/*******************************************************************************
 * Třída Oblast slouží jako přepravka uchovávající informace o pozici 
 * a rozměru dané obdélníkové oblasti.
 * Proto jsou její atributy deklarovány jako veřejné.
 *
 * @author     Rudolf Pecinovský
 * @version    2.01, duben 2004
 */
public class Oblast
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    /** Vodorovná souřadnice dané oblasti, tj. jejího levého horního rohu. */
    public int x;

    /** Svislá souřadnice dané oblasti, tj. jejího levého horního rohu. */
    public int y;

    /** Šířka oblasti. */
    public int šířka;

    /** Výška oblasti. */
    public int výška;


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

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

    /***************************************************************************
     * Bezparametrický konstruktor vytváří prádznou oblast v počátku,
     * tj. oblast o rozměrech (0×0) umístěnou v bodě [0;0].
     */
    public Oblast()
    {
    }


    /***************************************************************************
     * Vytvoří oblast se zadaným umístěním a rozměry.
     *
     * @param x      Vodorovná souřadnice oblasti, tj. jejího levého horního rohu.
     * @param y      Svislá souřadnice oblasti, tj. jejího levého horního rohu.
     * @param šířka  Šířka oblasti.
     * @param výška  Výška oblasti.
     */
    public Oblast( int x, int y, int šířka, int výška )
    {
        this.x     = x;
        this.y     = y;
        this.šířka = šířka;
        this.výška = výška;
    }


    /***************************************************************************
     * Vytvoří oblast, která je kopií zadané instance.
     *
     * @param oblast  Referenční oblast.
     */
    public Oblast( Oblast o )
    {
        this( o.x, o.y, o.šířka, o.výška );
    }


    /***************************************************************************
     * Vytvoří oblast se zadaným umístěním a rozměry.
     *
     * @param Pozice  Pozice oblasti, tj pozice jejího levého horního rohu.
     * @param Rozměr  Rozměr vytvářené oblasti.
     */
    public Oblast( Pozice pozice, Rozměr rozměr )
    {
        this( pozice.x, pozice.y, rozměr.šířka, rozměr.výška );
    }


    /***************************************************************************
     * Vytvoří prázdnou oblast, tj. oblast o rozměrech (0×0),
     * která je umístěna v zadaném bodě.
     *
     * @param pozice  Referenční pozice.
     */
    public Oblast( Pozice pozice )
    {
        this( pozice.x, pozice.y, 0, 0 );
    }


    /***************************************************************************
     * Vytvoří oblast se zadanými rozměry umístěnou v bodě [0;0].
     *
     * @param šířka  Šířka oblasti.
     * @param výška  Výška oblasti.
     */
    public Oblast( int šířka, int výška )
    {
        this( 0, 0, šířka, výška );
    }


    /***************************************************************************
     * Vytvoří oblast se zadanými rozměry umístěnou v bodě [0;0].
     *
     * @param rozměr  Referenční rozměr.
     */
    public Oblast( Rozměr rozměr )
    {
        this( 0, 0, rozměr.šířka, rozměr.výška );
    }



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

    /***************************************************************************
     * Vrátí hodnotu vodorovné souřadnice dané oblasti.
     *
     * @return  Požadovaná souřadnice.
     */
    public int getX()
    {
        return x;
    }


    /***************************************************************************
     * Vrátí hodnotu svislé souřadnice dané oblasti.
     *
     * @return  Požadovaná souřadnice.
     */
    public int getY()
    {
        return y;
    }


    /***************************************************************************
     * Nastaví hodnoty souřadnic dané oblasti.
     *
     * @param x Nastavovaná vodorovná souřadnice.
     * @param y Nastavovaná svislá souřadnice.
     */
    public Pozice getPozice()
    {
        return new Pozice ( x, y );
    }


    /***************************************************************************
     * Nastaví hodnoty souřadnic dané oblasti.
     *
     * @param x Nasvavovaná vodorovná souřadnice.
     * @param y Nasvavovaná svislá souřadnice.
     */
    public void setPozice( int x, int y )
    {
        this.x = x;
        this.y = y;
    }


    /***************************************************************************
     * Nastaví hodnoty souřadnic dané oblasti podle parametru.
     *
     * @param pozice Pozice, jejíž parametry převezmeme.
     */
    public void setPozice( Pozice pozice )
    {
        this.x = pozice.x;
        this.y = pozice.y;
    }


    /***************************************************************************
     * Vrátí velikost šířky oblasti.
     *
     * @return  Šířka oblasti.
     */
    public int getŠířka()
    {
        return šířka;
    }


    /***************************************************************************
     * Vrátí velikost výšky oblasti.
     *
     * @return  Výška oblasti.
     */
    public int getVýška()
    {
        return výška;
    }


    /***************************************************************************
     * Nastaví šířku a výšku oblasti.
     *
     * @param šířka Nastavovaná šířka.
     * @param výška Nastavovaná výška.
     */
    public void setRozměr( int x, int y )
    {
        this.šířka = šířka;
        this.výška = výška;
    }


    /***************************************************************************
     * Nastaví šířku a výšku oblasti podle parametru.
     *
     * @param rozměr Rozměr, jehož parametry převezmeme.
     */
    public void setRozměr( Rozměr rozměr )
    {
        this.šířka = rozměr.šířka;
        this.výška = rozměr.výška;
    }


    /***************************************************************************
     * Nastaví novou pozici a rozměr oblasti.
     *
     * @param x      Vodorovná souřadnice oblasti, tj. jejího levého horního rohu.
     * @param y      Svislá souřadnice oblasti, tj. jejího levého horního rohu.
     * @param šířka  Šířka oblasti.
     * @param výška  Výška oblasti.
     */
    public void setOblast( int x, int y, int šířka, int výška )
    {
        this.x     = x;
        this.y     = y;
        this.šířka = šířka;
        this.výška = výška;
    }


    /***************************************************************************
     * Nastaví novou pozici a rozměr oblasti.
     *
     * @param oblast  Referenční oblast.
     */
    public void setOblast( Oblast o )
    {
        setOblast( o.x, o.y, o.šířka, o.výška );
    }


    /***************************************************************************
     * Nastaví novou pozici a rozměr oblasti.
     *
     * @param Pozice  Pozice oblasti, tj pozice jejího levého horního rohu.
     * @param Rozměr  Rozměr vytvářené oblasti.
     */
    public void setOblast( Pozice pozice, Rozměr rozměr )
    {
        setOblast( pozice.x, pozice.y, rozměr.šířka, rozměr.výška );
    }



//== 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 Požadovaná textová reprezentace.
     */
    public String toString()
    {
        return "Oblast: x=" + x + ",y=" + y + ",šířka=" +
                šířka + ",výška=" + výš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 =======================================================
}

