package doprava;

import rup.česky.společně.P;
import rup.česky.tvary.Barva;
import rup.česky.tvary.AktivníPlátno;
import rup.česky.tvary.IPosuvný;
import rup.česky.tvary.IMultiposuvný;
import rup.česky.tvary.Kreslítko;
import rup.česky.tvary.Multipřesouvač;
import rup.česky.tvary.Pozice;
import rup.česky.tvary.Elipsa;
import rup.česky.tvary.Text;
import rup.česky.tvary.Čtverec;


/*******************************************************************************
 * Instance třídy ObousměrnáKabina představují kabinky pohybující se po linkách.
 *
 * Změny oproti třídě ZpětnáKabina_9c:
 * - Třída nyní dědí od třídy Kabina_9c
 * - Konstruktor volá rodičovský konstuktor čistě, protože všechny nebezpečné 
 *   operace provádí tovární meotda v okamžiku, kdy se provádět smí. 
 *
 * @author  Rudolf Pecinovský
 * @version 1.00,  29.02.2004
 */
public class ZpětnáKabina_9d extends Kabina_9c
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
    
    Čtverec čtverec;
    
    
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ METODY TŘÍDY ======================================================

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

    /***************************************************************************
     * Vytvoří kruhovou kabinu, která se bude pohybovat zadanou rychlostí
     * po zadané lince.
     * 
     * @param linka    Linka, po které se kabina pohybuje.
     */
    protected ZpětnáKabina_9d(Linka linka)
    {
        super( linka );
        čtverec = new Čtverec( kabina.getX(), kabina.getY(), PRŮMĚR, 
                              Barva.FIALOVÁ );
    }


    /***************************************************************************
     * Vytvoří kruhovou kabinu, která se bude pohybovat zadanou rychlostí
     * po zadané lince.
     * 
     * @param linka    Linka, po které se kabina pohybuje.
     */    
    public static ZpětnáKabina_9d getInstance( Linka linka )
    {
        AP.nekresli();
            ZpětnáKabina_9d kabina = new ZpětnáKabina_9d( linka );
        AP.vraťKresli();
        kabina.přesunuto();
        return kabina;
    }



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

    /***************************************************************************
     * 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 )
    {
        AP.nekresli();
            super  .setPozice( x,         y         );
            čtverec.setPozice( x-POLOMĚR, y-POLOMĚR );
        AP.vraťKresli();
    }
    
    

//== 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 )
    {
        čtverec.nakresli( kreslítko );
        super  .nakresli( kreslítko );
    }

//== PŘEKRYTÉ METODY IMPLEMENTOVANÝCH ROZHRANÍ =================================

    /***************************************************************************
     * Metoda vyžadovaná rozhraním IMultiposuvný: definuje akci, 
     * která se má provést v okamžiku, 
     * kdy je objekt doveden do požadované cílové pozicie.
     * 
     * @param mp   Multipřesouvač, který kabinku dovedl do cíle.
     *             Ten bude pravděpodobně požádán, aby kabinku dovezl zase dál
     *             a v případě doražení do cílové stanice
     */
    public void přesunuto()
    {
        //Zastávka, kam jsme dorazili, musí znát svého předchůdce
        další = další.getPředchozí();
        
        P.čekej( linka.getČekání() );
        
        //Necháme kabinu přesunout na další zastávku
        Multipřesouvač mp = Multipřesouvač.getInstance();
        mp.přesuň( this,  další.getPozice(),  linka.getRychlost() );
    }



//== PŘEKRYTÉ ABSTRAKTNÍ METODY RODIČOVSKÉ TŘÍDY ===============================
//== PŘEKRYTÉ KONKRÉTNÍ METODY RODIČOVSKÉ TŘÍDY ================================
//== 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 =======================================================
}

