package rup.česky.tvary;

import java.awt.Font;


/*******************************************************************************
 * Třída pro Zobrazení textu na aktivním plátně.
 *
 * Jedná se o výchozí podobu třídy v souboru projektů.
 *    
 * @author     Rudolf Pecinovský
 * @version    2.01, duben 2004
 */
public class Text  implements  IPosuvný
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /** Konstanta označující text vysazený netučným, nekurzivním písmem. */
    public static final int OBYČEJNÝ = Font.PLAIN;

    /** Konstanta označující text vysazený tučným, nekurzivním písmem. */
    public static final int TUČNÝ    = Font.BOLD;

    /** Konstanta označující text vysazený netučným, kurzivním písmem. */
    public static final int KURZIVA  = Font.ITALIC;
    
    /** Počáteční barva nakreslené instance v případě,
     *  kdy uživatel žádnou požadovanou barvu nezadá -
     *  pro text Barva.ČERNÁ. */
    public static final Barva IMPLICITNÍ_BARVA = Barva.ČERNÁ;

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



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

    /** Počet vytvořených instancí */
    private static int počet = 0;



//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** Text uchovávaný a zobrazovaný instancí. */
    private final String název;



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    private int    xPos;    //Bodová x-ová souřadnice počátku
    private int    yPos;    //Bodová y-ová souřadnice počátku
    private Barva  barva;   //Barva instance
    private Font   font;    //Písmo, kterým se text sází
    private Font   kfont;   //Písmo nastavené pro kreslítko



//== 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, 
     * a vysazena implicitním písmem (tučným 12bodovým písmem Dialog).    
     *
     * @param text  Vypisovaný text
     */
    public Text( String text )
    {
        this( text, 0, 0 );
    }


    /***************************************************************************
     * Vytvoří novou instanci se zadanou polohou a rozměry 
     * a implicitní barvou
     * a vysazena implicitním písmem (tučným 12bodovým písmem Dialog).    
     *
     * @param text  Vypisovaný text
     * @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 Text( String text, int x, int y )
    {
        this( text, x, y, IMPLICITNÍ_BARVA );
    }


    /***************************************************************************
     * Vytvoří novou instanci se zadanou polohou a rozměry 
     * a implicitní barvou
     * a implicitním písmem (bude vysazen tučným 12bodovým písmem Dialog).    
     *
     * @param text  Vypisovaný text
     * @param počátek   Pozice počátku instance
     */
    public Text( String text, Pozice počátek )
    {
        this( text, počátek.x, počátek.y );
    }


    /***************************************************************************
     * Vytvoří novou instanci se zadanou polohou, rozměry a barvou.
     *
     * @param text      Vypisovaný text
     * @param počátek   Pozice počátku instance
     * @param barva     Barva vytvářené instance
     */
    public Text(String text, Pozice počátek, Barva barva)
    {
        this( text, počátek.x, počátek.y, barva );
    }


    /***************************************************************************
     * Vytvoří novou instanci se zadanou polohou, rozměry a barvou.
     *
     * @param text    Vypisovaný text
     * @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 barva   Barva vytvářené instance
     */
    public Text( String text, int x, int y, Barva barva )
    {
        this.název = text;
        this.xPos  = x;
        this.yPos  = y;
        this.barva = barva;
        this.font = new Font( "Dialog", Font.BOLD, 12 );
    }



//== PŘÍSTUPOVÉ METODY ATRIBUTU 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( xPos, yPos );
    }


    /***************************************************************************
     * 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í 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();
    }


    /***************************************************************************
     * Tato metoda je tu jenom proto, aby se text sjednotil s ostatními
     * třídami - jinak text ji samozřejmě nepotřebuje, protože tištěný text
     * je sám názvem instance.               
     *
     * @return  Uložený text.
     */
     public String getNázev()
     {
        return název;
     }


    /***************************************************************************
     * Nastaví font, kterým se bude daný text sázet.
     *
     * @param název     Název fontu - je možno zadat jeden z názvů:
     *                   "Dialog", "DialogInput", "Monospaced",
     *                   "Serif",  "SansSerif".
     * @param řez       Je možno zadat některý z řezů:
     *                   Text.OBYČEJNÝ, Text.TUČNÝ, Text.KURZIVA,
     *                   případně Text.TUČNÝ|Text.KURZIVA
     * @param velikost  Velikost písma v bodech.
     */
    public void setFont( String název, int řez, int velikost )
    {
        font = new Font( název, řez, velikost );
    }



//== 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 )
    {
        if( font != kfont )
        {
            kreslítko.setFont( font );
            kfont = font;
        }
        kreslítko.kresliText( název, xPos, yPos + font.getSize(), 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 název;
    }



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

    /***************************************************************************
     * 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( xPos+vzdálenost, yPos );
    }


    /***************************************************************************
     * 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( xPos, yPos+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 =======================================================
}

