/*******************************************************************************
 * Instance třídy představují jednotlivé pozice na displeji.
 * Číslice ví, kde se na displeji nachází a které segmenty k ní patří.
 * Při svém vzniku své segmenty ihned přihlásí do správy animačního plátna.
 * Při žádosti o zobrazení číslice se pak již jen podívá (do vektoru,
 * který je statickým atributem třídy), ze kterých segmentů se skládá
 * a nechá je rozsvítit či zhansnout.
 *
 * @author Rudolf Pecinovský
 */
public class Číslice
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
    
    public static final int SEGMENTŮ = 7;

    /***************************************************************************
     * Množina segmentů, z nichž je číslice složena. Informace je uložena
     * prostřednctvím nahození příslušných bitů v celočíselném příznaku.
     * Váhy jednotlivých segmentů jsou následující:
     * . 0 .  == 1
     * 1   2  == 2, 4
     * . 3 .  == 8
     * 4   5  == 0x10, 0x20
     * . 6 .  == 0x40
     */
    private static final boolean[][] rozsvítit = 
        //    0      1      2      3      4      5      6
        { { true,  true,  true,  false, true,  true,  true  },   //0
          { false, false, true,  false, false, true,  false },   //1
          { true,  false, true,  true,  true,  false, true  },   //2
          { true,  false, true,  true,  false, true,  true  },   //3
          { false, true,  true,  true,  false, true,  false },   //4
          { true,  true,  false, true,  false, true,  true  },   //5
          { true,  true,  false, true,  true,  true,  true  },   //6
          { true,  false, true,  false, false, true,  false },   //7
          { true,  true,  true,  true,  true,  true,  true  },   //8
          { true,  true,  true,  true,  false, true,  true  } }; //9 

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

    /** Vektor segmentů tvořících danou pozici displeje. */
    private final Segment[] segment;



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ METODY TŘÍDY ======================================================

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

    /***************************************************************************
     * Vtvoří instanci číslice, která bude na disleji začínat <code>posun</code>
     * polí od levého okraje displeje. Nechá vytvořit všechny své segmenty
     * pro začátek v barvě pozadí plátna a hned je přihlásí do správy
     * animačního plátna.
     */
    public Číslice( int posunX, int posunY )
    {
        segment = Segment.getSedmička( posunX, posunY );
    }



//== PŘÍSTUPOVÉ METODY ATRIBUTU INSTANCÍ =======================================
//== PŘEKRYTÉ METODY IMPLEMENTOVANÝCH ROZHRANÍ =================================
//== PŘEKRYTÉ ABSTRAKTNÍ METODY RODIČOVSKÉ TŘÍDY ===============================
//== OSTATNÍ PŘEKRYTÉ METODY RODIČOVSKÉ TŘÍDY ==================================
//== OSTATNÍ METODY INSTANCÍ ===================================================

    /***************************************************************************
     * Zobrazí příslušnou číslici na zadané políčkové pozici displeje.
     * Na základě informace o svítících segmentech při zobrazení dané číslice,
     * kterou získá z příslušné složky pole <code>rozsvítit</code>,
     * proběhně všechny své segmenty a přiřadí jim potřebnou barvu,
     * tj. rozsvítí je nebo zhasne.
     *
     * @param hodnota  Hodnota (číslice), kterou je třeba zobrazit
     */
    public void zobraz( int hodnota )
    {
        boolean[] svítit = rozsvítit[ hodnota ];
        for( int i=0;   i < SEGMENTŮ;   i++ )      
        {
            segment[i].setBarva( svítit[i] ); 
        }
    }


    /***************************************************************************
     * Zhanse číslici na dispoleji.
     */
    public void zhasni()
    {
        for( Segment s : segment )      
        {
            s.setBarva( false );
        }
    }


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

