/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sdsimulator.runnable;
import myuml.*;

/**
 *
 * @author Miguel Herreros
 */
public class GlobalEjecutable extends SecuenciaComponentesEjecutables{
    
    //..........................................................................
    public GlobalEjecutable(VectorOrdenado eventos, ContextoEjecucion contexto, AsincronosPendientes asincronos){
        super(contexto, asincronos);
        agregarComponentesEjecutables(eventos,contexto);
    }
    
    //..........................................................................
    protected void agregarComponentesEjecutables(VectorOrdenado eventos, ContextoEjecucion contexto){
        for (int i=0; i<eventos.size();i++){
            if  (eventos.get(i) instanceof MyMessage){
                MyMessage myMessage=(MyMessage)eventos.get(i);
                MensajeEjecutable mensajeEjecutable =  new MensajeEjecutable(myMessage,contexto);
                componentesEjecutables.add(mensajeEjecutable);
            }
            else { //son frames
                MyFrame myFrame=(MyFrame)eventos.get(i);
                agregarFrame(myFrame, eventos, contexto, asincronos);
            }
        }
    }
    
    //..........................................................................
    @Override
    public ResultadoEjecucion runStep(){
        if (indiceEjecucion==0)
            contexto.ejecucionPendiente();
        
        return super.runStep();
    }
    
    //..........................................................................
    @Override 
    protected ResultadoEjecucion detectadoComienzo(){
        ResultadoEjecucion retorno = new ResultadoEjecucion();
        
        retorno.x=-100000; //Para el scroll.
        retorno.y=-100000; //Para el scroll.
        
        contexto.ejecucionEmpieza();//color
        indiceEjecucion++;
        
        retorno.traza = bundle.getString("COMIENZO") + bundle.getString("SEPARADOR_EVENTOS");
        
        return retorno;
    }
    
    //..........................................................................
    @Override
    protected ResultadoEjecucion restoPasos(){
        ResultadoEjecucion retorno=new ResultadoEjecucion();
        
        if (indiceEjecucion>=componentesEjecutables.size())
            return detectadoFinal();
            
        ComponenteEjecutable componenteEjecutable=(ComponenteEjecutable) componentesEjecutables.get(indiceEjecucion);
        componenteEjecutable.postRun(); //Si es la primera vez, no hará nada.
                   
        if (componenteEjecutable.completado()){  
           indiceEjecucion++;
           
           if (indiceEjecucion>=componentesEjecutables.size())
                   return detectadoFinal();
               
           componenteEjecutable=(ComponenteEjecutable) componentesEjecutables.get(indiceEjecucion);
        }
       
        retorno = componenteEjecutable.run();
        
        asincronos.add(componenteEjecutable); //si no es un mensaje asíncrono, no se añade.
        
        retorno.traza = retorno.traza + bundle.getString("SEPARADOR_EVENTOS");
        return retorno;
    }
    
    //..........................................................................
    @Override
    protected ResultadoEjecucion detectadoFinal(){
        //Devuelve resultado vacío (coordenadas 0,0 y traza "")
        terminado=true;
        //contexto.ejecucionTerminada(); vamos a posponer esto para DiagramaEjecutable, así no se pinta
        //el contexto como terminado hasta que no queden más mensajes asíncronos sin llegar.
        return new ResultadoEjecucion();
    }
}