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 extends APosuvný
{
//== 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Á;



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

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



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

    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 )
    {
        super( x, y );
        this.název = text;
        this.barva = barva;
        this.font = new Font( "Dialog", Font.BOLD, 12 );
    }



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

    /***************************************************************************
     * 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( getNázev(), getX(), getY() + font.getSize(), 
                              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 název;
    }



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

