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

package sdsimulator.runnable;
import java.util.*;
import myuml.*;


/**
 * Esta clase, contiene todas las variables de todos los actores y objetos de un
 * diagrama de secuencia.
 * 
 * @author Miguel Herreros
 */
public class ContextoEjecucion{
    //Referencia a todos los lifeline y actores que contiene el diagrama, orde-
    //nados por posición X en la pantalla.
    private VectorOrdenado entidades;
    private Vector         variables;
    private java.util.ResourceBundle bundle;
    
    //..........................................................................
    public ContextoEjecucion(VectorOrdenado entidades) throws Exception{
        this.entidades = entidades;
        variables = detectarVariables();
        bundle = java.util.ResourceBundle.getBundle("sdsimulator/resources/runnable");
    }

    //..........................................................................
    public Variable get(String nombre){
        //Busca una variable por nombre.
        Variable variable;
        
        for (int i=0; i<variables.size();i++){ 
            variable = (Variable)variables.get(i);    
            if (nombre.compareTo(variable.getNombre())==0)
                return variable;
        }
       
        return null;
    }
    
    //..........................................................................
    public VectorOrdenado getEntidades(){
        return entidades;
    }
    
    //..........................................................................
    public void ejecucionEmpieza(){
        for (int i=0;i<entidades.size();i++){
            MyObjects objeto=(MyObjects)entidades.get(i);
            objeto.setCol(sdsimulator.Main.EN_CURSO);
        }
    }
    
    //..........................................................................   
    public void ejecucionPendiente(){
        for (int i=0;i<entidades.size();i++){
            MyObjects objeto=(MyObjects)entidades.get(i);
            objeto.setCol(sdsimulator.Main.PENDIENTE);
        }
    }
    
    //..........................................................................
    public void ejecucionTerminada(){
        for (int i=0;i<entidades.size();i++){
            MyObjects objeto=(MyObjects)entidades.get(i);
            objeto.setCol(sdsimulator.Main.COMPLETO);
        }
    }
    
    //..........................................................................
    public void reset(){
        int i;
        for (i=0;i<entidades.size();i++){
            //Todos los objetos y actores toman color inicial.
            MyObjects objeto=(MyObjects)entidades.get(i);
            objeto.setCol(sdsimulator.Main.NUEVO);
        }
        
        for (i=0; i<variables.size();i++){
            //Todas las variables toman su valor inicial.
            ((Variable)variables.get(i)).reset();    
        }
    }
    
    //..........................................................................
    /** Devuelve un string con el texto del valor de todas las varibles. Aquellas 
     *  variables que cambian automáticamente de valor (relojes) actualizan tam-
     *  bién su valor en esta función.
     * @return
     */
    public String estado(){
      String retorno="";
      Variable variable;
             
      for (int i=0; i < variables.size();i++){ 
          variable = (Variable)variables.get(i);
          
          retorno+= bundle.getString("VARIABLE");
          retorno+= variable.toString();
          retorno+= bundle.getString("VARIABLE1");
          
          if (variable.getTipo().compareToIgnoreCase("Clock")==0){
              //Esto ya, tendrá valor en la siguiente llamada.
              Integer valorAux = Integer.decode(variable.getValor());
              valorAux++;
              variable.setValor(valorAux.toString());
          }
      }
      
      retorno = bundle.getString("ESTADO")  + retorno + bundle.getString("ESTADO1");
      return  retorno;
    }
            
    //..........................................................................
    private Vector detectarVariables() throws Exception{
        variables = new Vector(100,50);
        MyObjects aux;
        ArrayList vars;
        
        for (int i=0; i<entidades.size();i++){
            aux=(MyObjects)entidades.get(i);
            vars=aux.getVariables();
            
            for (int j=0; j<vars.size();j++)
                variables.addElement(new Variable(aux,vars.get(j)));
        }
        
        return variables;
    }
}