package traduccion;

import javax.swing.JFrame;
import javax.swing.JDialog;
import java.awt.event.ActionListener;
import java.awt.event.WindowStateListener;
import java.awt.event.ActionEvent;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JList;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JComboBox;
import java.awt.Rectangle;
import java.awt.Font;
import javax.swing.SwingConstants;
import javax.swing.JButton;
import javax.swing.JTextField;
import myuml.MyObjects;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import de.fzi.XPath.*;
import de.fzi.XPath.Parser.*;
import java.io.StringReader;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;
import java.util.StringTokenizer;
import java.awt.Frame;
import myuml.MyFrame;
import myuml.MyActor;
import myuml.MyLifeLine;
import myuml.MyMessage;
import java.awt.Component;
import javax.swing.ButtonGroup;
import javax.swing.JRadioButton;

/**
 * <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 VarUpdateMarco extends JDialog implements ActionListener  {
    MyObjects objeto;
    ArrayList al;

    public VarUpdateMarco(MyObjects obj,Frame f) {
        super(f,true);
        try {
            objeto = obj;
            al = objeto.getVariables();
            jbInit();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }

    //Ver si se ha seleccionado algún elemento de la lista de variables
    private class MyListenerSelection implements ListSelectionListener{

        public void valueChanged(ListSelectionEvent e){

            //Activar el botón de actualización
            jButton2.setEnabled(true);

            //Haced invisibles campo de texto y radiobuttons
            jTextField2.setVisible(false);
            radioButton1.setVisible(false);
            radioButton2.setVisible(false);
            radioButton3.setVisible(false);


            //Cargar los datos de la variable
            String cadena = jList1.getSelectedValue().toString();
            int separador = cadena.lastIndexOf("-");

            String var = cadena.substring(0,separador - 1);
            String type = cadena.substring(separador + 2, cadena.length());

            jLabel6.setText(var);
            jLabel7.setText(type);

            //Si se trata de una variable de tipo clock, integer o string
            if(type.compareTo("Clock")==0 || type.compareTo("Integer")==0 || type.compareTo("String")==0){

                jTextField2.setVisible(true);

                //Si ya se ha establecido anteriormente una actualización para la
                //variable se debe cargar el valor en el campo de texto
                ArrayList act = ((MyMessage) objeto).getUpdates();
                boolean existe = false;
                String valor = "";

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

                    if (((String) ((Object[]) act.get(i))[0]).compareTo(var) == 0) {

                        existe = true;
                        valor = ((String) ((Object[]) act.get(i))[1]);
                        break;

                    }

                }

                if (existe) {

                    jTextField2.setText(valor);

                } else {

                    jTextField2.setText("");

                }
            }

            //Si se de una variable de tipo booleano
            else if (type.compareTo("Boolean")==0){

                //Poned como visibles los radio buttons
                radioButton1.setVisible(true);
                radioButton2.setVisible(true);
                radioButton3.setVisible(true);

                //Si ya se ha establecido anteriormente una actualización para la
                //variable se debe cargar el valor correspondiente
                ArrayList act = ((MyMessage) objeto).getUpdates();
                boolean existe = false;
                String valor = "";

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

                    if (((String) ((Object[]) act.get(i))[0]).compareTo(var) == 0) {

                        existe = true;
                        valor = ((String) ((Object[]) act.get(i))[1]);
                        break;

                    }

                }

                if (existe) {

                    if(valor.compareTo("true")==0){

                        radioButton1.setSelected(true);

                    }

                    else{

                        radioButton2.setSelected(true);

                    }

                } else {

                    radioButton3.setSelected(true);

                }

            }

            //Si se trata de una variable de excepción
            else{
                jLabel5.setVisible(false);
            }
        }

    }


    public void actionPerformed(ActionEvent e) {

    }

    private void jbInit() throws Exception {
        setTitle(objeto.getName()+" variables update");
        contentPane.setLayout(null);
        contentPane.setPreferredSize(new Dimension(1685, 494));
        setSize(new Dimension(450, 300));
        jScrollPane1.setBounds(new Rectangle(16, 37, 140, 180));
        jLabel1.setText("Defined variables");
        jLabel1.setFont(new java.awt.Font("Dialog", Font.BOLD, 16));
        jLabel1.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel1.setHorizontalTextPosition(SwingConstants.CENTER);
        jLabel1.setBounds(new Rectangle(16, 14, 140, 18));
        jLabel2.setFont(new java.awt.Font("Dialog", Font.BOLD, 16));
        jLabel2.setText("Update variable");
        jLabel2.setBounds(new Rectangle(192, 14, 225, 18));
        jLabel2.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel2.setHorizontalTextPosition(SwingConstants.CENTER);
        jLabel3.setText("Name:");
        jLabel3.setBounds(new Rectangle(192, 55, 44, 18));
        jLabel3.setFont(new java.awt.Font("Dialog", Font.BOLD, 12));
        jLabel3.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel3.setHorizontalTextPosition(SwingConstants.CENTER);
        jLabel4.setText("Type:");
        jLabel4.setBounds(new Rectangle(192, 100, 44, 14));
        jLabel4.setFont(new java.awt.Font("Dialog", Font.BOLD, 12));
        jLabel4.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel4.setHorizontalTextPosition(SwingConstants.CENTER);
        jLabel6.setBounds(new Rectangle(244, 55, 136, 19));
        jLabel7.setBounds(new Rectangle(244, 100, 136, 19));
        jButton2.setBounds(new Rectangle(272, 175, 73, 23));
        jButton2.setText("Update");
        jButton2.addActionListener(new VarUpdateMarco_jButton2_actionAdapter(this));
        jButton2.setEnabled(false);
        contentPane.add(jScrollPane1);
        contentPane.add(jLabel1);
        contentPane.add(jLabel2);
        contentPane.add(jLabel3);
        contentPane.add(jLabel4);
        contentPane.add(jButton2);
        contentPane.add(jLabel6);
        contentPane.add(jLabel7);

        //Para la actualización de los valores de la variable
        jLabel5.setText("Value:");
        jLabel5.setBounds(new Rectangle(192, 145, 44, 14));
        jLabel5.setFont(new java.awt.Font("Dialog", Font.BOLD, 12));
        jLabel5.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel5.setHorizontalTextPosition(SwingConstants.CENTER);
        jTextField2.setBounds(new Rectangle(244, 145, 136, 19));
        jTextField2.setVisible(false);

        contentPane.add(jLabel5);
        contentPane.add(jTextField2);

        //Selección de la actualización de un booleano
        buttonGroup.add(radioButton1);
        buttonGroup.add(radioButton2);
        buttonGroup.add(radioButton3);
        radioButton1.setBounds(new Rectangle(244, 145, 60, 19));
        radioButton2.setBounds(new Rectangle(300, 145, 60, 19));
        radioButton3.setBounds(new Rectangle(356, 145, 85, 19));
        radioButton1.setVisible(false);
        radioButton2.setVisible(false);
        radioButton3.setVisible(false);

        contentPane.add(radioButton1);
        contentPane.add(radioButton2);
        contentPane.add(radioButton3);

        //Rellenar la lista con las variables de todos los objetos actuales
        //Ver que no exista ya una variable con el mismo nombre en ninguno de
        //los actores o lifelines existentes, incluido el objeto actual
        JPanel jPanelDraw = (JPanel) objeto.getParent();
        Component[] lista = jPanelDraw.getComponents();
        Object[] var;
        ArrayList lista_global = new ArrayList();

        for (int i = 0; i < lista.length; i++) {
            //Si se trata de un Actor o de un LifeLine
            if ((lista[i] instanceof MyActor) || (lista[i] instanceof MyLifeLine)) {

                ArrayList lista_var = ((MyObjects)lista[i]).getVariables();
                Object[] array =new Object[lista_var.size()];

                array = lista_var.toArray();

                for(int j = 0; j < lista_var.size(); j++){
                    lista_global.add(((String) ((Object[]) array[j])[0]) + " - " + ((String) ((Object[]) array[j])[1]));

                }

            }

        }

        var = new String[lista_global.size()];
        var = lista_global.toArray();

        jList1 = new JList(var);
        jList1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        jList1.addListSelectionListener(new MyListenerSelection());
        jScrollPane1.getViewport().add(jList1);
    }

    JPanel contentPane = (JPanel) getContentPane();
    BorderLayout borderLayout1 = new BorderLayout();
    JScrollPane jScrollPane1 = new JScrollPane();

    JList jList1;
    JLabel jLabel1 = new JLabel();
    JLabel jLabel2 = new JLabel();
    JLabel jLabel3 = new JLabel();
    JLabel jLabel4 = new JLabel();
    JButton jButton2 = new JButton();
    JLabel jLabel5 = new JLabel();
    JTextField jTextField2 = new JTextField();
    JLabel jLabel6 = new JLabel();
    JLabel jLabel7 = new JLabel();
    ButtonGroup buttonGroup = new ButtonGroup();
    JRadioButton radioButton1 = new JRadioButton("True");
    JRadioButton radioButton2 = new JRadioButton("False");
    JRadioButton radioButton3 = new JRadioButton("Not updated");


    public void jButton2_actionPerformed(ActionEvent e) {

        //Cargar el valor del campo de texto y de la variable actual
        String valor = jTextField2.getText();
        String var = jLabel6.getText();

        //Se debe mirar si lo que se introduce es válido
        boolean valido=true;

        //Si es una variable de tipo integer
        if (jLabel7.getText().compareTo("Integer") == 0) {

            if (valor.compareTo("") != 0) {

                try {

                    Integer.parseInt(valor);

                } catch (NumberFormatException nfe) {
                    valido = false;
                }
            }

        }
        //Si es un reloj
        else if (jLabel7.getText().compareTo("Clock") == 0){

            if (valor.compareTo("") != 0) {

                try {

                    if(Integer.parseInt(valor) < 0) valido = false;

                } catch (NumberFormatException nfe) {
                    valido = false;
                }
            }

        }

        //Si es válido el valor de la variable
        if (valido) {

            //Si la actualización es válida ver si ya existe en la lista
            ArrayList act = ((MyMessage) objeto).getUpdates();
            int index = -1;

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

                if (((String) ((Object[]) act.get(i))[0]).compareTo(var) == 0) {

                    index = i;
                    break;

                }

            }

            Object[] update = new Object[2];
            update[0] = var;

            //Si se trata de un Clock, de un Integer o de un String
            if(jLabel7.getText().compareTo("Clock") == 0 || jLabel7.getText().compareTo("Integer") == 0 || jLabel7.getText().compareTo("String") == 0){

                update[1] = valor;

                if ((index == -1) && (valor.compareTo("") != 0)) {

                    act.add(update);

                    //Mostrar aviso de que la variable se ha actualizado
                    JOptionPane optionPane = new JOptionPane();
                    Object[] options = {"Ok"};
                    optionPane.showOptionDialog(optionPane,
                                                "Variable updated",
                                                "Message", optionPane.YES_NO_OPTION,
                                                optionPane.INFORMATION_MESSAGE, null,
                                                options, null);

                } else {

                    if (valor.compareTo("") != 0) {

                        //Mostrar aviso de que la variable se ha actualizado
                        JOptionPane optionPane = new JOptionPane();
                        Object[] options = {"Ok"};
                        optionPane.showOptionDialog(optionPane,
                                                    "Variable updated",
                                                    "Message", optionPane.YES_NO_OPTION,
                                                    optionPane.INFORMATION_MESSAGE, null,
                                                    options, null);

                        act.remove(index);
                        act.add(update);

                    }

                    else if (index != -1) {

                        act.remove(index);

                        //Mostrar aviso de que la actualización de la variable se ha eliminado
                        JOptionPane optionPane = new JOptionPane();
                        Object[] options = {"Ok"};
                        optionPane.showOptionDialog(optionPane,
                                                    "Variable update removed",
                                                    "Message", optionPane.YES_NO_OPTION,
                                                    optionPane.INFORMATION_MESSAGE, null,
                                                    options, null);

                    }

                }
            }

            //Si se trata de un booleano
            else if(jLabel7.getText().compareTo("Boolean") == 0) {

                if ((index == -1) && !radioButton3.isSelected()) {

                    if (radioButton1.isSelected()) {

                        update[1] = "true";

                    }

                    else {

                        update[1] = "false";

                    }

                    act.add(update);

                    //Mostrar aviso de que la variable se ha actualizado
                    JOptionPane optionPane = new JOptionPane();
                    Object[] options = {"Ok"};
                    optionPane.showOptionDialog(optionPane,
                                                "Variable updated",
                                                "Message", optionPane.YES_NO_OPTION,
                                                optionPane.INFORMATION_MESSAGE, null,
                                                options, null);

                } else {

                    if (!radioButton3.isSelected()) {

                        if (radioButton1.isSelected()) {

                            update[1] = "true";

                        }

                        else {

                            update[1] = "false";

                        }

                        //Mostrar aviso de que la variable se ha actualizado
                        JOptionPane optionPane = new JOptionPane();
                        Object[] options = {"Ok"};
                        optionPane.showOptionDialog(optionPane,
                                                    "Variable updated",
                                                    "Message", optionPane.YES_NO_OPTION,
                                                    optionPane.INFORMATION_MESSAGE, null,
                                                    options, null);

                        act.remove(index);
                        act.add(update);

                    }

                    else if (index != -1) {

                        act.remove(index);

                        //Mostrar aviso de que la actualización de la variable se ha eliminado
                        JOptionPane optionPane = new JOptionPane();
                        Object[] options = {"Ok"};
                        optionPane.showOptionDialog(optionPane,
                                                    "Variable update removed",
                                                    "Message", optionPane.YES_NO_OPTION,
                                                    optionPane.INFORMATION_MESSAGE, null,
                                                    options, null);

                    }

                }



            }
        }

        else{

            //Mostrar el aviso de que no se trata de un valor de variable válido
            JOptionPane optionPane = new JOptionPane();
            Object[] options = {"Ok"};
            optionPane.showOptionDialog(optionPane,
                    "Invalid variable value",
                    "Message", optionPane.YES_NO_OPTION,
                    optionPane.ERROR_MESSAGE, null,
                    options, null);


        }


    }

}

class VarUpdateMarco_jButton2_actionAdapter implements ActionListener {
    private VarUpdateMarco adaptee;
    VarUpdateMarco_jButton2_actionAdapter(VarUpdateMarco adaptee) {
        this.adaptee = adaptee;
    }

    public void actionPerformed(ActionEvent e) {
        adaptee.jButton2_actionPerformed(e);
    }
}

