package myuml;

import com.borland.jbcl.layout.*;
import java.awt.Graphics2D;
import java.awt.Graphics;
import java.io.Serializable;
import java.util.ArrayList;
import java.awt.BasicStroke;



/**
 * <p>Title: Hola a todos</p>
 *
 * <p>Description: este es el tutorial hola a todos</p>
 *
 * <p>Copyright: Copyright (c) 2005</p>
 *
 * <p>Company: Mi empresa</p>
 *
 * @author Mi nombre
 * @version 1.0
 */
public class MyFrame extends MyObjects implements Serializable {

    public boolean colocado = false;
    protected String guard = "";
    protected String repeat = "";
    protected String exception = "";
    protected String exception_name = "";
    public ArrayList separadores = new ArrayList();
    protected boolean block;

    //Variables incluidas en la guarda del frame
    public ArrayList variables_guarda;

    //Variables incluidas en el repeat del frame
    public ArrayList variables_repeat;

    //Expresiones negadas
    protected String guard_negada = "";

    /**
     * Crea un nuevo frame
     *
     * @param c coordenadas del frame
     */
    public MyFrame(XYConstraints c, String tipo) {
        super(c);
        name = tipo;
        block = false;
        variables_guarda = new ArrayList();
        variables_repeat = new ArrayList();

    }

    /**
     * Método que devuelve si el frame es bloqueante
     *
     * @return block del frame
     */
    public boolean getBlock(){
        return block;
    }


    /**
     * Método que establece la variable booleana block del frame
     *
     * @param block del frame
     */
    public void setBlock(boolean b){
        block = b;
    }


    /**
     * Método que devuelve la guarda que se le haya asociado al frame
     *
     * @return guarda del frame
     */
    public String getGuard(){
        return guard;
    }


    /**
     * Método que permite asociar una guarda al frame con el que estemos
     * trabajando
     *
     * @param s guarda del frame
     */
    public void setGuard(String s){
        guard = s;
    }

    /**
     * Método que devuelve el repeat que se le haya asociado al frame
     *
     * @return repeat del frame
     */
    public String getRepeat(){
        return repeat;
    }

    /**
     * Método que permite asociar un repeat al frame con el que estemos
     * trabajando
     *
     * @param s repeat del frame
     */
    public void setRepeat(String s){
        repeat = s;
    }

    /**
     * Método que devuelve la excepción que se le haya asociado al frame
     *
     * @return exception del frame
     */
    public String getException(){
        return exception;
    }


    /**
     * Método que permite asociar una excepción al frame con el que estemos
     * trabajando
     *
     * @param s exception del frame
     */
    public void setException(String s){
        exception = s;
    }

    /**
     * Método que devuelve la excepción que se le haya asociado al frame
     *
     * @return exception_name del frame
     */
    public String getException_name(){
        return exception_name;
    }


    /**
     * Método que permite asociar una excepción al frame con el que estemos
     * trabajando
     *
     * @param s exception del frame
     */
    public void setException_name(String s){
        exception_name = s;
    }


    /**
     * Método que permite agregar un separador al frame
     *
     * @param y coordenada Y del separador
     */
    public void addSeparador(Integer y){
        separadores.add(y);
    }

    public ArrayList getVariablesGuarda(){

        return variables_guarda;

    }

    public void setVariablesGuarda(ArrayList al){

        variables_guarda = al;

    }

    public ArrayList getVariablesRepeat(){

        return variables_repeat;

    }

    public void setVariablesRepeat(ArrayList al){

        variables_repeat = al;

    }

    /**
     * Método que devuelve la guarda negada que se le haya asociado al frame
     *
     * @return guarda del frame
     */
    public String getGuard_negada(){
        return guard_negada;
    }


    /**
     * Método que permite asociar una guarda negada al frame con el que estemos
     * trabajando
     *
     * @param s guarda del frame
     */
    public void setGuard_negada(String s){
        guard_negada = s;
    }

    /**
    * Método que dibuja un frame
    *
    * @param g parámetro que contiene los métodos necesarios para dibujar
    * los frame
    */
    public void paint(Graphics g){

        if(colocado){
            Graphics2D g2 = (Graphics2D) g;

            g2.setColor(col);

            String cad_frame;

            //Cadena sin guarda para el caso de los frames de tipo par
            if(this.getName().compareTo("par")==0 || this.getName().compareTo("alt")==0)
                cad_frame = name;
            else if(this.getName().compareTo("loop")==0)
                cad_frame = name+" ["+repeat+"]";
            else if(this.getName().compareTo("alt_else")==0)
                cad_frame = "alt"+" ["+guard+"]";
            else if(this.getName().compareTo("opt")==0)
                cad_frame = name+" ["+guard+"]";
            else cad_frame = name+ " "+exception_name+" ["+exception+"]";

            //Constants.write(g2, cad_frame, 20 + (cad_frame.length() - 6)*4, 10, true);
            g2.drawString(cad_frame,5,10);

            //Si se trata de un frame loop con guard también debe mostrarse en el frame

            if(this.getName().compareTo("loop")==0 && guard.compareTo("")!=0){

                //Rectángulo que contiene el tipo de frame que se trata
                g2.drawRect(0, 0, xyc.getWidth(), 28);

                //Dibujar el repeat
                g2.drawString("guard ["+guard+"]",5,25);

            }

            else{

                //Rectángulo que contiene el tipo de frame que se trata
                //Su anchura variará según la anchura total del frame
                g2.drawRect(0, 0, xyc.getWidth(), 15);

            }

            //Si se trata de un frame de tipo alt_else se debe pintar el else debajo del separador
            if(this.getName().compareTo("alt_else")==0){

                g2.drawString("else",5,((Integer)separadores.get(0)).intValue() + 10);

                g2.drawRect(0,((Integer)separadores.get(0)).intValue(),30, 15);

            }

            //Rectángulo con la dimensión total del frame

            if(this.getName().compareTo("alt_else")!=0){
                g2.drawRect(0, 0, xyc.getWidth() - 1, xyc.getHeight() - 1);
            }
            else{
                g2.drawRect(0, 0, xyc.getWidth() - 1, xyc.getHeight() - 1);
            }
            //Dibujar las líneas de separación dentro de los frames que sean necesarias

            float dash1[] = {15.0f};
            BasicStroke dashed = new BasicStroke(1.0f,
                                      BasicStroke.CAP_BUTT,
                                      BasicStroke.JOIN_MITER,
                                      10.0f, dash1, 0.0f);

            g2.setStroke(dashed);

            for(int i = 0; i < separadores.size(); i++){

               //Dibujar una línea de trazos discontinuos en la coordenada Y indicada
               g2.drawLine(0,((Integer)separadores.get(i)).intValue(),xyc.getWidth() - 1,((Integer)separadores.get(i)).intValue());

            }

        }
    }

}
