/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sdsimulator.runnable;
import sdsimulator.runnable.expresiones.ExpresionLogica;
import myuml.*;

/**
 *
 * @author Miguel Herreros
 */
public class FrameOptEjecutable extends FrameEjecutable{
    private ExpresionLogica guarda;
    private boolean esperando;
    
    public FrameOptEjecutable(MyFrame myFrame, VectorOrdenado eventos, ContextoEjecucion contexto, AsincronosPendientes asincronos){
        super(myFrame,eventos,contexto,asincronos);
        guarda=new ExpresionLogica(myFrame.getGuard(), myFrame.getVariablesGuarda(), contexto);/*ExpresionLogica(myFrame.getGuard(), contexto);*/
        esperando=false;
    }
    //..........................................................................
    @Override
    public ResultadoEjecucion run(){
        return runStep();
    }
    //..........................................................................
    /** Tan sólo vamos a redefinir el comportamiento cuando se detecta el frame.
     * 
     */
    @Override
    public ResultadoEjecucion runStep(){
        switch (indiceEjecucion){
            case -1: return detectadoComienzo();
                     
            default: esperando=false;
                     return super.runStep();
        }
    }
    
    //..........................................................................
    @Override 
    protected ResultadoEjecucion detectadoComienzo(){
        ResultadoEjecucion retorno=new ResultadoEjecucion();
                     
        retorno.x=getX();
        retorno.y=getY();
                     
        if (!esperando) //la primera vez en rojo
            myFrame.setCol(sdsimulator.Main.EN_CURSO);
                     
        if (guarda.evaluar()){
            activarTodos(); //En realidad sólo activa uno (el único)
            indiceEjecucion++;
            esperando=false;
        }
        else
            esperando=true;
                     
        if (!esperando) //es la primera vez (se cumpla o no la guarda)
            retorno.traza = bundle.getString("FRAME");
        else
            retorno.traza = bundle.getString("FRAME_BLOQUEADO");
                     
        retorno.traza+= myFrame.getName();
        retorno.traza+= bundle.getString("FRAME1");
        retorno.traza+= myFrame.getID();
        retorno.traza+= bundle.getString("FRAME2");
        retorno.traza+= bundle.getString("GUARDA_BLOQUEANTE");
        retorno.traza+= guarda.toString();
        retorno.traza+= bundle.getString("GUARDA1");
        
        return retorno;
    }
    
    //..........................................................................
    @Override 
    public void reset(){
        super.reset();
        esperando=false;
    }
}
