package traduccion;
import java.awt.*;
import java.awt.event.*;
import java.awt.Image;
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.JPanel;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JToolBar;
import javax.swing.JButton;
import javax.swing.ImageIcon;
import javax.swing.text.DefaultEditorKit;
import javax.swing.JLabel;
import javax.swing.BorderFactory;
import javax.swing.border.Border;
import java.io.*;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.border.TitledBorder;
import javax.swing.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.*;
import org.dom4j.Element;
import java.util.Date;
import org.dom4j.Document;
import java.util.Random;
import javax.swing.tree.DefaultMutableTreeNode;
import com.borland.jbcl.layout.XYLayout;
import com.borland.jbcl.layout.XYConstraints;
import myuml.MyLifeLine;
import myuml.MyActor;
import com.umlet.control.Constants;
import myuml.MyMessage;
import myuml.Shared;
import myuml.MyFrame;
import java.awt.Rectangle;
import org.dom4j.io.XMLWriter;
import org.dom4j.DocumentHelper;
import myuml.MyObjects;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import traduccion.ToolTreeModel;
import java.awt.Insets;
import org.dom4j.io.OutputFormat;
import java.util.ArrayList;
import java.util.StringTokenizer;
import javax.swing.table.AbstractTableModel;
import java.util.Vector;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.event.DocumentListener;
import javax.swing.event.DocumentEvent;
import javax.swing.text.Caret;
import de.fzi.XPath.*;
import de.fzi.XPath.Parser.*;
import javax.swing.Action;
import java.net.URL;
import javax.help.HelpSet;
import java.net.MalformedURLException;

/**
 *
 */
public class TraduccionMarco extends JFrame implements ActionListener,WindowStateListener {

    //Cadena de texto para almacenar la ruta al autómata temporizado final
    String TimedAutomata="";
    //Definiciones necesarias para el diálogo con el modelador
    Document doc;
    String fichero2 = new String();
    Element content, header, raiz, contmodelo, collaboration, interaction;
    Date dat = new Date();
    //Identificador para los objetos, es un número aleatorio
    Random ident = new Random();
    //Declaración de todos los componentes que se utilizan en el diseño de la aplicación
    BorderLayout borderLayout1 = new BorderLayout();
    JLabel statusBar2 = new JLabel();
    JPanel jPanelUML = new JPanel();
    BorderLayout borderLayout2 = new BorderLayout();
    BorderLayout borderLayout3 = new BorderLayout();
    DefaultMutableTreeNode elemen= new DefaultMutableTreeNode("Código XMI");
    JTree jTree1 = new JTree(elemen);
    public JPanel jPanelDraw = new JPanel();
    JToolBar jToolBar1 = new JToolBar();
    JButton jButtonActor = new JButton();
    JButton jButtonLifeline = new JButton();
    JButton jButtonMessage = new JButton();
    String ruta = "";
    Border border12 = BorderFactory.createEmptyBorder(1, 0, 0, 0);
    JButton jButton42 = new JButton();
    XYLayout xYLayout1 = new XYLayout();


    String fichero;
    JPanel contentPane;
    JMenuBar jMenuBar1 = new JMenuBar();
    JMenu jMenuFile = new JMenu();
    JMenu jMenuWSCDL = new JMenu();
    JMenu jMenuTimed = new JMenu();
    JMenu jMenuCPN = new JMenu();
    JMenuItem jMenuFileExit = new JMenuItem();

    JMenuItem jMenuFileOpenWSFile =new JMenuItem();
    JMenuItem jMenuFileOpenXMIFile =new JMenuItem();
    JMenu jMenuHelp = new JMenu();
    JMenuItem jMenuHelpAbout = new JMenuItem();
    ImageIcon image1 = new ImageIcon(traduccion.TraduccionMarco.class.
                                     getResource("openFile.png"));
    ImageIcon image2 = new ImageIcon(traduccion.TraduccionMarco.class.
                                     getResource("closeFile.png"));
    ImageIcon image3 = new ImageIcon(traduccion.TraduccionMarco.class.
                                     getResource("help.png"));


    ImageIcon image4 = new ImageIcon(traduccion.TraduccionMarco.class.
                                     getResource("save.png"));
    ImageIcon image5 = new ImageIcon(traduccion.TraduccionMarco.class.
                                     getResource("execute.png"));
    ImageIcon imagen= new ImageIcon(traduccion.TraduccionMarco.class.
                                     getResource("model.png"));

    Border border1 = BorderFactory.createLineBorder(SystemColor.controlShadow,
            2);
    TitledBorder titledBorder1 = new TitledBorder("");
    Border border2 = BorderFactory.createLineBorder(SystemColor.controlShadow,
            2);
    TitledBorder titledBorder2 = new TitledBorder("");
    TitledBorder titledBorder3 = new TitledBorder("");
    TitledBorder titledBorder4 = new TitledBorder("");
    JButton jButton3 = new JButton();
    TitledBorder titledBorder5 = new TitledBorder("");
    JTabbedPane jTabbedPane1 = new JTabbedPane();
    JPanel jPanel1 = new JPanel();
    JPanel jPanel2 = new JPanel();
    JPanel jPanel3 = new JPanel();
    JPanel jPanel4 = new JPanel();
    JLabel jLabel1 = new JLabel();
    JLabel jLabel2 = new JLabel();
    JLabel jLabel3 = new JLabel();
    JLabel jLabel4 = new JLabel();

    JLabel etiqueta= new JLabel();
    JButton jButton4 = new JButton();
    JButton jButton5 = new JButton();
    JScrollPane jScrollPane3 = new JScrollPane();
    JScrollPane jScrollPane1 = new JScrollPane();
    JScrollPane jScrollPane2 = new JScrollPane();
    JTextArea jTextArea1 = new JTextArea();
    JTextArea jTextArea2 = new JTextArea();
    JTextArea jTextArea3 = new JTextArea();
    JScrollPane jScrollPane4 = new JScrollPane();
    JTextArea jTextArea4 = new JTextArea();
    JScrollPane jScrollPane5 = new JScrollPane();
    JMenuItem jMenuItem2 = new JMenuItem();
    JMenuItem jMenuItem3 = new JMenuItem();
    JMenuItem jMenuItem4 = new JMenuItem();
    JButton jButton12 = new JButton();
    JButton jButton13 = new JButton();
    JMenuItem jMenuFileOpenUML = new JMenuItem();
    JMenuItem jMenuFileSaveUML = new JMenuItem();
    JButton jButtonExport = new JButton();
    JScrollPane jScrollPane6 = new JScrollPane();
    JTextArea jTextArea5 = new JTextArea();
    JButton jButtonUPPAAL = new JButton();
    JButton jButtonFrame = new JButton();
    JSplitPane jSplitPane1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
    JSplitPane jSplitPane2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
    JSplitPane jSplitPane3 = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
    JScrollPane jScrollPane7 = new JScrollPane();
    String cadena_guarda = "", cadena_repeat = "";
    MyObjects obj_act = null;

    //Pestaña CPN Tools
    JLabel jLabel5 = new JLabel();
    JLabel jLabel6 = new JLabel();
    JScrollPane jScrollPane8 = new JScrollPane();
    JScrollPane jScrollPane9 = new JScrollPane();
    JTextArea jTextArea6 = new JTextArea();
    JTextArea jTextArea7 = new JTextArea();
    JButton jButton14 = new JButton();
    JButton jButton15 = new JButton();


    private class MyTableModel extends AbstractTableModel{
        private String[] columnNames = {"Properties","Values"};
        private Object[][] data = { };
        private MyObjects obj = null;

        public int getColumnCount() {
            return columnNames.length;
        }

        public int getRowCount() {
            return data.length;
        }

        public String getColumnName(int col) {
            return columnNames[col];
        }

        public Object getValueAt(int row, int col) {
            return data[row][col];
        }

        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }

        /*
         * Sólo se debe poder editar la segunda columna
         */
        public boolean isCellEditable(int row, int col) {
            if (col == 1) {
                return true;
            } else {
                return false;
            }
        }

        /*
         * Método que genera el evento para indicar que se ha modificado un valor
         */
        public void setValueAt(Object value, int row, int col) {
            data[row][col] = value;
            fireTableCellUpdated(row, col);
        }

        /*
         * Método que inserta una nueva fila
         */
        public void addRows(Object[][] campos) {
            data=new Object[campos.length][2];

            for(int i = 0; i < campos.length; i++){

                data[i][0] = campos[i][0];
                data[i][1] = campos[i][1];

            }
            fireTableRowsUpdated(0, campos.length);

        }

        /*
         * Método que elimina todas las filas de la tabla
         */
        public void deleteRows() {

            data = new Object[0][0];
            fireTableDataChanged();

        }


        /*
         * Método que fija el objeto actual sobre el cual se muestran los datos
         * en la tabla de propiedades
         */
        public void setObject(MyObjects objeto) {

            obj = objeto;

        }

        /*
         * Método que devuelve el objeto actual sobre el cual se muestran los datos
         * en la tabla de propiedades
         */
        public MyObjects getObject() {

            return obj;

        }

    }

    class MyDocumentListener implements DocumentListener {

        private boolean repeat;

        MyDocumentListener(boolean rep){

            repeat = rep;

        }

        public void insertUpdate(DocumentEvent event) {
            if(repeat){
                try{
                    cadena_repeat = event.getDocument().getText(0,event.getDocument().getLength());
                }
                catch(Exception e){}

            }
            else{

                try {
                    cadena_guarda = event.getDocument().getText(0,event.getDocument().getLength());
                } catch (Exception e) {}

            }
        }

        public void removeUpdate(DocumentEvent event) {
            if(repeat){

                try{
                    cadena_repeat = event.getDocument().getText(0,event.getDocument().getLength());
                }
                catch(Exception e){}

            }
            else{

                try {
                    cadena_guarda = event.getDocument().getText(0,event.getDocument().getLength());
                } catch (Exception e) {}

            }
        }

        public void changedUpdate(DocumentEvent event) {
            System.out.println("Changed Update");
        }

    }


    public class CheckBoxCellEditor extends AbstractCellEditor implements TableCellEditor {
      protected JCheckBox checkBox;
      protected boolean EsCheckBox;
      protected boolean EsRepeat;
      MyDocumentListener mdl_repeat = new MyDocumentListener(true);
      MyDocumentListener mdl_guarda = new MyDocumentListener(false);

      public CheckBoxCellEditor() {
          checkBox = new JCheckBox();
          checkBox.setHorizontalAlignment(SwingConstants.CENTER);
          checkBox.setBackground(Color.white);
      }

      public Component getTableCellEditorComponent(
              JTable table,
              Object value,
              boolean isSelected,
              int row,
              int column) {


          //Sólo se debe aplicar a partir de la segunda fila
          if((row > 1 && obj_act.getName().compareTo("loop")==0) || (row > 0 && obj_act.getName().compareTo("opt")==0)){

              checkBox.setSelected(((Boolean) value).booleanValue());

              Component c = table.getDefaultRenderer(String.class).
                            getTableCellRendererComponent(table, value, isSelected, false,
                                                          row, column);
              if (c != null) {
                  checkBox.setBackground(c.getBackground());
              }

              EsCheckBox = true;

              return checkBox;
          }
          else{

              EsCheckBox = false;

              JTextField jtf = new JTextField();

              jtf.setBorder(null);

              jtf.setEditable(false);

              jtf.setBackground(new Color(49,106,197));

              jtf.setForeground(Color.white);

              jtf.addMouseListener(new
                                     TraduccionMarco_jTextFieldCampo_mouseAdapter(this));

              if(row == 0 && obj_act.getName().compareTo("loop")==0){

                  EsRepeat = true;
                  jtf.getDocument().addDocumentListener(mdl_repeat);

                  //Fijar el valor del repeat a la guarda actual
                  jtf.setText(((MyFrame)obj_act).getRepeat());

              }
              else if(row == 1 && obj_act.getName().compareTo("loop")==0){

                  EsRepeat = false;
                  jtf.getDocument().addDocumentListener(mdl_guarda);

                  //Fijar el valor de guarda a la guarda actual
                  jtf.setText(((MyFrame)obj_act).getGuard());
              }

              else{

                  EsRepeat = false;
                  jtf.getDocument().addDocumentListener(mdl_guarda);

                  //Fijar el valor de guarda a la guarda actual
                  jtf.setText(((MyFrame)obj_act).getGuard());
              }

              return jtf;

          }
      }

      public Object getCellEditorValue() {

          if(!EsCheckBox){

              if(EsRepeat) return cadena_repeat;
              else return cadena_guarda;
          }
          else{

              return Boolean.valueOf(checkBox.isSelected());

          }

          //return Boolean.valueOf(checkBox.isSelected());

      }

      public void jTextFieldCampo_mouseClicked(MouseEvent e) {

        //Cuando se haga doble click se podra editar el campo
        if(e.getClickCount() == 2){

            JTextField jtf = (JTextField)e.getComponent();

            //Establecer el color de fondo y el color de la letra
            jtf.setBackground(Color.white);

            jtf.setForeground(Color.black);

            //Poner un borde
            jtf.setBorder(BorderFactory.createLineBorder(Color.black));

            //Permitir que se edite el campo de texto
            jtf.setEditable(true);

            //Darle la forma adecuada al cursor que marca en que parte de la
            //caja de texto nos encontramos
            Caret ca = jtf.getCaret();

            ca.setVisible(true);

            jtf.setCaret(ca);

            //Seleccionar todo el texto existente
            jtf.setSelectionStart(0);
            jtf.setSelectionEnd(jtf.getText().length());

        }

    }

  }

  public class MyTableCellRenderer implements TableCellRenderer {

      protected JTextField texto = new JTextField();
      protected JCheckBox checkBox = new JCheckBox();

      public MyTableCellRenderer() {
          checkBox = new JCheckBox();
          checkBox.setHorizontalAlignment(SwingConstants.CENTER);
          checkBox.setBackground(Color.white);
          texto.setBorder(null);
      }

        // This method is called each time a cell in a column
        // using this renderer needs to be rendered.
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) {
            // 'value' is value contained in the cell located at
            // (rowIndex, vColIndex)
            if (isSelected) {
                // cell (and perhaps other cells) are selected
                //table.changeSelection(rowIndex,vColIndex+1,false,true);
            }

            if (hasFocus) {
                // this cell is the anchor and the table has the focus
            }

            if(obj_act instanceof MyFrame && obj_act.getName().compareTo("loop")==0){

                if (rowIndex > 1) {
                    checkBox.setSelected(((Boolean) value).booleanValue());
                    return checkBox;

                }
                else{

                // Configure the component with the specified value
                texto.setText(value.toString());
                return texto;

                }

            }

            else if(obj_act instanceof MyFrame && obj_act.getName().compareTo("opt")==0){

                if (rowIndex > 0) {
                    checkBox.setSelected(((Boolean) value).booleanValue());
                    return checkBox;

                }
                else{

                // Configure the component with the specified value
                texto.setText(value.toString());
                return texto;

                }

            }

            else{
                // Configure the component with the specified value
                texto.setText(value.toString());
                return texto;

            }
        }

        // The following methods override the defaults for performance reasons
        public void validate() {}
        public void revalidate() {}
        protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
        public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
    }



    MyTableModel MyTable = new MyTableModel();
    JTable table = new JTable(MyTable);

    private class MyListener2 implements MouseListener{

        public void mouseExited(MouseEvent e) {}
        public void mouseEntered(MouseEvent e) {}
        public void mouseReleased(MouseEvent e) {}
        public void mousePressed(MouseEvent e) {}

        //Deseleccionar cualquier componente seleccionado
        public void mouseClicked(MouseEvent e)
        {
            //Dejar limpia la tabla de propiedades
            limpiarPropiedades();
            setActual(null);
        }
    }

    Action ActionBorrado = new AbstractAction() {
    public void actionPerformed(ActionEvent e) {

        //Ver que haya algún objeto seleccionado
        if(obj_act != null){

            MyObjects objeto = (MyObjects) obj_act;
            String ident = objeto.getID();
            JPanel panel = (JPanel) objeto.getParent();

            //Dejar marcado que el objeto actual se queda como null
            setActual(null);

            //Dejar limpia la tabla de propiedades
            limpiarPropiedades();

            //Si se trata de un lifeline o de un actor
            if(objeto instanceof MyLifeLine || objeto instanceof MyActor){

                //Modificar el color del objeto
                objeto.setCol(Color.red);

                //Si se trata de un actor o de un lifeline colorear también los mensajes enviados y recibidos
                if (objeto instanceof MyActor || objeto instanceof MyLifeLine) {

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

                        ((MyObjects) objeto.sendedMsg.get(i)).setCol(new Color(200, 0, 0));

                    }

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

                        ((MyObjects) objeto.receivedMsg.get(i)).setCol(new Color(200, 0, 0));

                    }

                }

                //Se debe repintar el panel que contiene a los objetos
                panel.repaint();
                panel.updateUI();

                //Si el estado se ha quedado como WAITSOURCE no se ha
                //completado el mensaje y hay que eliminarlo de la lista de componentes
                if (Shared.state.compareTo(Shared.state.WAITSOURCE) == 0) {

                    panel.remove(0);

                }

                //Si el estado es WAITPOSITION
                if (Shared.state.compareTo(Shared.state.WAITPOSITION) == 0) {

                    //Ver la posicion del ultimo frame que se haya añadido a la lista
                    int posicion = 0;
                    Component[] lista = panel.getComponents();

                    for (int i = 0; i < lista.length; i++) {

                        //Si se trata de un frame
                        if ((lista[i] instanceof MyFrame)) {

                            posicion = i;
                            break;

                        }

                    }

                    panel.remove(posicion);

                    //Devolver el estado al valor por defecto
                    Shared.state = Shared.state.DEFAULT;

                }

                //En caso de que el estado sea WAITDEST también se debe eliminar de la lista de mensajes enviados
                //del objeto que corresponda

                if (Shared.state.compareTo(Shared.state.WAITDEST) == 0) {

                    //Recoger el mensaje que se va a borrar
                    MyMessage mensaje = (MyMessage) panel.getComponent(0);

                    //Borrar el mensaje de la lista de componentes
                    panel.remove(0);

                    //Buscar el componente que lo envíe y borrarlo de su lista
                    Component[] lista = panel.getComponents();

                    for (int i = 0; i < lista.length; i++) {

                        if (lista[i] instanceof MyActor ||
                            lista[i] instanceof MyLifeLine) {

                            ((MyObjects) lista[i]).deleteSendMessage(mensaje);

                        }

                    }

                }

                //Dejar el estado como default
                Shared.state = Shared.State.DEFAULT;

                JOptionPane optionPane = new JOptionPane();

                Object[] options = {"Yes", "No", "Cancel"};

                int ret = optionPane.showOptionDialog(optionPane,
                        "Do you want to delete the selected component?", "Delete",
                                                      optionPane.YES_NO_CANCEL_OPTION,
                                                      optionPane.QUESTION_MESSAGE, null,
                                                      options, null);
                if (ret == JOptionPane.YES_OPTION) {

                    //Se tiene que mirar que no contenga variables que estén en algún frame
                    boolean no_borrar = false;

                    ArrayList variables = objeto.getVariables();

                    Component lista_obj [] = panel.getComponents();

                    //Se deben mirar los objetos que sean frames
                    for (int i = 0; i < lista_obj.length; i++) {

                        if (lista_obj[i] instanceof MyFrame) {

                            ArrayList guarda = ((MyFrame)lista_obj[i]).getVariablesGuarda();
                            ArrayList repeat = ((MyFrame)lista_obj[i]).getVariablesRepeat();

                            for(int j = 0; j < guarda.size(); j++){

                                for(int k =0; k < variables.size(); k++){

                                    if(((Object[])variables.get(k))[0].toString().compareTo(guarda.get(j).toString())==0){

                                        no_borrar = true;
                                        break;

                                    }

                                }

                                if(no_borrar) break;

                            }

                            if(!no_borrar){

                                for(int j = 0; j < repeat.size(); j++){

                                    for(int k =0; k < variables.size(); k++){

                                        if (((Object[])variables.get(k))[0].toString().compareTo(repeat.get(j).toString()) == 0) {

                                            no_borrar = true;
                                            break;

                                        }

                                    }

                                }

                                if(no_borrar) break;

                            }

                        }

                        if(no_borrar) break;
                    }

                    if(!no_borrar){
                        panel.remove(objeto);
                        objeto.repaint();

                        //Guardar la coordenada X inicial del objeto
                        int coord_X = objeto.getX();

                        Component lista[] = panel.getComponents();
                        for (int i = 0; i < lista.length; i++) {
                            //el objeto es un mensaje
                            if (lista[i] instanceof MyMessage) {
                                MyMessage mensaje = (MyMessage) lista[i];
                                String destino = mensaje.getDest();
                                String origen = mensaje.getSource();
                                if (ident == destino || ident == origen) {
                                    mensaje.getParent().remove(mensaje);

                                    //También se debe borrar el mensaje de cada objeto que lo tenga
                                    //en su lista de send o receive
                                    for (int j = 0; j < lista.length; j++) {

                                        if (lista[j] instanceof MyActor ||
                                            lista[j] instanceof MyLifeLine) {

                                            ((MyObjects) lista[j]).deleteSendMessage(mensaje);
                                            ((MyObjects) lista[j]).deleteReceiveMessage(mensaje);

                                        }

                                        //Se deben subir hacia arriba los mensajes posteriores
                                        if (lista[j] instanceof MyMessage &&
                                            ((MyMessage) lista[j]).getY() > mensaje.getY()) {

                                            XYConstraints c = ((MyMessage) lista[j]).
                                                              getXY();

                                            //Coordenada y en la que se va a dibujar el mensaje
                                            c.setY(c.getY() - 30);

                                            ((MyMessage) lista[j]).editXYconstraints(c);

                                        }

                                        //También se deben subir hacia arriba los frames posteriores
                                        if (lista[j] instanceof MyFrame &&
                                            ((MyFrame) lista[j]).getY() > mensaje.getY()) {

                                            XYConstraints c = ((MyFrame) lista[j]).
                                                              getXY();

                                            //Coordenada y en la que se va a dibujar el mensaje
                                            c.setY(c.getY() - 30);

                                            ((MyFrame) lista[j]).editXYconstraints(c);

                                        }

                                        //Se debe borrar de los frames en que este incluido y recortar
                                        //la altura del frame
                                        if (lista[j] instanceof MyFrame &&
                                            ((MyFrame) lista[j]).includeMsg.contains(mensaje)) {

                                            ((MyObjects) lista[j]).deleteIncludeMessage(mensaje);

                                            XYConstraints c = ((MyFrame) lista[j]).
                                                              getXY();

                                            //Coordenada y en la que se va a dibujar el mensaje
                                            c.setHeight(c.getHeight() - 30);

                                            ((MyFrame) lista[j]).editXYconstraints(c);

                                            //Subir hacia arriba separadores en caso de tipo "par" o tipo "alt"
                                            if (((MyFrame) lista[j]).getName().compareTo("par") ==
                                                0 ||
                                                ((MyFrame) lista[j]).getName().compareTo("alt") == 0) {

                                                ArrayList separadores = ((MyFrame) lista[j]).
                                                        separadores;

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

                                                    if (((Integer) separadores.get(k)).intValue() +
                                                        lista[j].getY() >
                                                        mensaje.getY()) {

                                                        int valor = ((Integer) separadores.get(k)).
                                                                    intValue();

                                                        separadores.remove(k);
                                                        separadores.add(k, new Integer(valor - 30));

                                                    }

                                                }

                                                //Se deben eliminar aquellos separadores que ya no sean necesarios
                                                for (int k = 0; k < separadores.size(); k++) {

                                                    //Si el valor es igual a 28 es que ya no queda ningún mensaje por encima
                                                    if ((((Integer) separadores.get(k)).intValue() ==
                                                         28)) {

                                                        separadores.remove(k);

                                                    }

                                                    else {

                                                        //Si es igual al siguiente
                                                        if (k < separadores.size() - 1 &&
                                                            ((Integer) separadores.get(k)).intValue() ==
                                                            ((Integer) separadores.get(k + 1)).
                                                            intValue()) {

                                                            separadores.remove(k);

                                                        }

                                                    }
                                                }

                                            }

                                            //Subir hacia arriba el separador si procede en el caso del tipo "alt_else"
                                            if (((MyFrame) lista[j]).getName().compareTo("alt_else") ==
                                                0) {

                                                ArrayList separadores = ((MyFrame) lista[j]).
                                                        separadores;

                                                if (((Integer) separadores.get(0)).intValue() +
                                                    lista[j].getY() >
                                                    mensaje.getY()) {

                                                    int valor = ((Integer) separadores.get(0)).
                                                                intValue();

                                                    separadores.remove(0);
                                                    separadores.add(0, new Integer(valor - 30));

                                                }

                                            }

                                        }

                                    }

                                }

                            }
                            //el objeto es un actor o un lifeline
                            if (lista[i] instanceof MyActor || lista[i] instanceof MyLifeLine) {

                                //Si se trata de uno posterior al que hemos borrado
                                if (coord_X < lista[i].getX()) {

                                    //Se deben modificar sus coordenadas para que
                                    //ocupe el espacio dejado por el anterior

                                    //Obtener las coordenadas actuales
                                    XYConstraints c = ((MyObjects) lista[i]).getXY();

                                    //Generar las nuevas coordenadas
                                    c.setX(c.getX() - 300);

                                    //Ponerle las nuevas coordenadas al objeto
                                    ((MyObjects) lista[i]).editXYconstraints(c);

                                    //Actualizar la posición de los mensajes
                                    ((MyObjects) lista[i]).updatePosition(coord_X, i, lista);

                                }

                            }
                            //el objeto es un frame
                            if (lista[i] instanceof MyFrame) {

                                //Se debe recortar su tamaño para ajustarse a un rol menos
                                //Obtener las coordenadas actuales
                                XYConstraints c = ((MyObjects) lista[i]).getXY();

                                //Generar las nuevas coordenadas
                                c.setWidth(c.getWidth() - 300);

                                //Si la anchura queda con un tamaño menor a 0 es
                                //porque ya no quedan roles
                                if (c.getWidth() < 0) {

                                    //Se elimina el frame
                                    panel.remove(lista[i]);

                                }

                                //Ponerle las nuevas coordenadas al objeto
                                ((MyObjects) lista[i]).editXYconstraints(c);

                            }

                        }
                    }
                    else{

                        //Mostrar el aviso de que no se trata de una variable válida
                        JOptionPane optionPane2 = new JOptionPane();
                        Object[] options2 = {"Ok"};
                        optionPane.showOptionDialog(optionPane2,
                                "Object can be deleted. A variable defined in this object is being used in a frame",
                                "Message", optionPane2.YES_NO_OPTION,
                                optionPane2.ERROR_MESSAGE, null,
                                options2, null);

                    }

                    //Si el panel se ha quedado vacío se debe limpiar la ventana de código
                    if (panel.getComponentCount() == 1) {

                        ((TraduccionMarco) panel.getRootPane().getParent()).
                                deleteCode();

                    }

                }

            }

            //Si se trata de un mensaje
            else if(objeto instanceof MyMessage){

                //Modificar el color del objeto
                objeto.setCol(Color.red);

                //Se debe repintar el panel que contiene a los objetos
                panel.repaint();
                panel.updateUI();

                //Si el estado se ha quedado como WAITSOURCE no se ha
                //completado el mensaje y hay que eliminarlo de la lista de componentes
                if (Shared.state.compareTo(Shared.state.WAITSOURCE) == 0) {

                    panel.remove(0);

                }

                //Si el estado es WAITPOSITION
                if (Shared.state.compareTo(Shared.state.WAITPOSITION) == 0) {

                    //Ver la posicion del ultimo frame que se haya añadido a la lista
                    int posicion = 0;
                    Component[] lista = panel.getComponents();

                    for (int i = 0; i < lista.length; i++) {

                        //Si se trata de un frame
                        if ((lista[i] instanceof MyFrame)) {

                            posicion = i;
                            break;

                        }

                    }

                    panel.remove(posicion);

                    //Devolver el estado al valor por defecto
                    Shared.state = Shared.state.DEFAULT;

                }

                //En caso de que el estado sea WAITDEST también se debe eliminar de la lista de mensajes enviados
                //del objeto que corresponda

                if (Shared.state.compareTo(Shared.state.WAITDEST) == 0) {

                    //Recoger el mensaje que se va a borrar
                    MyMessage mensaje = (MyMessage) panel.getComponent(0);

                    //Borrar el mensaje de la lista de componentes
                    panel.remove(0);

                    //Buscar el componente que lo envíe y borrarlo de su lista
                    Component[] lista = panel.getComponents();

                    for (int i = 0; i < lista.length; i++) {

                        if (lista[i] instanceof MyActor ||
                            lista[i] instanceof MyLifeLine) {

                            ((MyObjects) lista[i]).deleteSendMessage(mensaje);

                        }

                    }

                }

                //Dejar el estado como default
                Shared.state = Shared.State.DEFAULT;

                JOptionPane optionPane = new JOptionPane();

                Object[] options = {"Yes", "No", "Cancel"};

                int ret = optionPane.showOptionDialog(optionPane,
                        "Do you want to delete the selected component?", "Delete",
                                                      optionPane.YES_NO_CANCEL_OPTION,
                                                      optionPane.QUESTION_MESSAGE, null,
                                                      options, null);
                if (ret == JOptionPane.YES_OPTION) {

                    panel.remove(objeto);
                    objeto.repaint();

                    Component lista [] = panel.getComponents();

                    //Se debe borrar el mensaje de cada objeto que lo tenga
                    //en su lista de send o receive
                    for (int j = 0; j < lista.length; j++) {

                        if (lista[j] instanceof MyActor || lista[j] instanceof MyLifeLine){

                            MyMessage mensaje = (MyMessage) objeto;

                            ((MyObjects)lista[j]).deleteSendMessage(mensaje);
                            ((MyObjects)lista[j]).deleteReceiveMessage(mensaje);

                        }

                        //También se debe borrar de la lista de incluidos de un frame
                        //y recortar el frame que lo incluye
                        if (lista[j] instanceof MyFrame && ((MyFrame)lista[j]).getY() <= objeto.getY()
                                && ((MyFrame)lista[j]).getY() + ((MyFrame)lista[j]).getHeight() > objeto.getY()){

                            MyMessage mensaje = (MyMessage) objeto;

                            ((MyObjects)lista[j]).deleteIncludeMessage(mensaje);

                            XYConstraints c = ((MyFrame)lista[j]).getXY();

                            //Recortar la altura
                            c.setHeight(c.getHeight() - 30);

                            ((MyFrame)lista[j]).editXYconstraints(c);

                            //Subir hacia arriba separadores en caso de tipo "par" o "alt"
                            if(((MyFrame)lista[j]).getName().compareTo("par")==0 || ((MyFrame) lista[j]).getName().compareTo("alt") == 0){

                                ArrayList separadores = ((MyFrame)lista[j]).separadores;

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

                                    if (((Integer) separadores.get(k)).intValue() + lista[j].getY() > mensaje.getY()) {

                                        int valor = ((Integer) separadores.get(k)).intValue();

                                        separadores.remove(k);
                                        separadores.add(k,new Integer(valor - 30));

                                    }

                                }

                                //Se deben eliminar aquellos separadores que ya no sean necesarios
                                for(int k = 0; k < separadores.size(); k ++){

                                    //Si el valor es igual a 28 es que ya no queda ningún mensaje por encima
                                    if((((Integer)separadores.get(k)).intValue() == 28)){

                                        separadores.remove(k);

                                    }

                                    else{

                                        //Si es igual al siguiente
                                        if (k < separadores.size() - 1 &&((Integer) separadores.get(k)).intValue() == ((Integer) separadores.get(k + 1)).intValue()) {

                                            separadores.remove(k);

                                        }

                                    }
                                }


                            }

                            //Subir hacia arriba el separador si procede en el caso del tipo "alt_else"
                            if(((MyFrame)lista[j]).getName().compareTo("alt_else")==0){

                                ArrayList separadores = ((MyFrame)lista[j]).separadores;

                                if (((Integer) separadores.get(0)).intValue() + lista[j].getY() > mensaje.getY()) {

                                    int valor = ((Integer) separadores.get(0)).intValue();

                                    separadores.remove(0);
                                    separadores.add(0,new Integer(valor - 30));

                                }

                            }


                        }


                        //También se deben subir hacia arriba los mensajes posteriores
                        if (lista[j] instanceof MyMessage && ((MyMessage)lista[j]).getY() > objeto.getY()){

                            XYConstraints c = ((MyMessage)lista[j]).getXY();

                            //Coordenada y en la que se va a dibujar el mensaje
                            c.setY(c.getY() - 30);

                            ((MyMessage)lista[j]).editXYconstraints(c);

                        }

                        //También se deben subir hacia arriba los frames posteriores
                        if (lista[j] instanceof MyFrame && ((MyFrame)lista[j]).getY() > objeto.getY()){

                            XYConstraints c = ((MyFrame)lista[j]).getXY();

                            //Coordenada y en la que se va a dibujar el mensaje
                            c.setY(c.getY() - 30);

                            ((MyFrame)lista[j]).editXYconstraints(c);

                        }


                    }

                    //Se deben recortar las lineas de los actor y los lifelines
                    for (int j = 0; j < lista.length; j++) {

                        if (lista[j] instanceof MyLifeLine){

                            MyLifeLine lin = ((MyLifeLine) lista[j]);

                            XYConstraints c2 = lin.getXY();

                            c2.setHeight(c2.getHeight() - 30);

                            lin.editXYconstraints(c2);

                        }

                        if (lista[j] instanceof MyActor) {

                            MyActor lin = ((MyActor) lista[j]);

                            XYConstraints c2 = lin.getXY();

                            c2.setHeight(c2.getHeight() - 30);

                            lin.editXYconstraints(c2);

                        }

                    }


                }

            }

            else{

                //Modificar el color del objeto
                objeto.setCol(Color.red);

                //Si se trata de un objeto de tipo frame colorear también los elementos interiores para notar que se van a eliminar
                if (objeto instanceof MyFrame) {

                    MyFrame frm = (MyFrame) objeto;

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

                        ((MyObjects) frm.includeMsg.get(i)).setCol(new Color(
                                200, 0, 0));

                    }

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

                        ((MyObjects) frm.includeFrm.get(i)).setCol(new Color(
                                200, 0, 0));

                    }

                }

                //Se debe repintar el panel que contiene a los objetos
                panel.repaint();
                panel.updateUI();

                //Si el estado se ha quedado como WAITSOURCE no se ha
                //completado el mensaje y hay que eliminarlo de la lista de componentes
                if (Shared.state.compareTo(Shared.state.WAITSOURCE) == 0) {

                    panel.remove(0);

                }

                //Si el estado es WAITPOSITION
                if (Shared.state.compareTo(Shared.state.WAITPOSITION) == 0) {

                    //Ver la posicion del ultimo frame que se haya añadido a la lista
                    int posicion = 0;
                    Component[] lista = panel.getComponents();

                    for (int i = 0; i < lista.length; i++) {

                        //Si se trata de un frame
                        if ((lista[i] instanceof MyFrame)) {

                            posicion = i;
                            break;

                        }

                    }

                    panel.remove(posicion);

                    //Devolver el estado al valor por defecto
                    Shared.state = Shared.state.DEFAULT;

                }

                //En caso de que el estado sea WAITDEST también se debe eliminar de la lista de mensajes enviados
                //del objeto que corresponda

                if (Shared.state.compareTo(Shared.state.WAITDEST) == 0) {

                    //Recoger el mensaje que se va a borrar
                    MyMessage mensaje = (MyMessage) panel.getComponent(0);

                    //Borrar el mensaje de la lista de componentes
                    panel.remove(0);

                    //Buscar el componente que lo envíe y borrarlo de su lista
                    Component[] lista = panel.getComponents();

                    for (int i = 0; i < lista.length; i++) {

                        if (lista[i] instanceof MyActor ||
                            lista[i] instanceof MyLifeLine) {

                            ((MyObjects) lista[i]).deleteSendMessage(mensaje);

                        }

                    }

                }

                //Dejar el estado como default
                Shared.state = Shared.State.DEFAULT;

                JOptionPane optionPane = new JOptionPane();

                Object[] options = {"Yes", "No", "Cancel"};

                int ret = optionPane.showOptionDialog(optionPane,
                        "Do you want to delete the selected component?",
                        "Delete", optionPane.YES_NO_CANCEL_OPTION,
                        optionPane.QUESTION_MESSAGE, null, options, null);
                if (ret == JOptionPane.YES_OPTION) {

                    panel.remove(objeto);
                    objeto.repaint();

                    Component lista[] = panel.getComponents();
                    int n_mensajes = objeto.includeMsg.size();
                    int n_frames = objeto.includeFrm.size();
                    int n_frames_else = 0;

                    //Ver cuantos frames incluidos son alt_else
                    for (int j = 0; j < n_frames; j++) {

                        if (((MyFrame) objeto.includeFrm.get(j)).getName().
                            compareTo("alt_else") == 0) {

                            n_frames_else++;

                        }

                    }

                    n_frames = n_frames - n_frames_else;

                    for (int j = 0; j < lista.length; j++) {

                        //Se deben subir hacia arriba los mensajes posteriores
                        if (lista[j] instanceof MyMessage &&
                            ((MyMessage) lista[j]).getY() >= objeto.getY()) {

                            //Si el mensaje está incluido en su lista se tiene que borrar

                            if ((objeto.getY() + objeto.getHeight()) >
                                ((MyMessage) lista[j]).getY()) {

                                objeto.deleteIncludeMessage((MyMessage)
                                        lista[j]);
                                panel.remove(lista[j]);

                                //Se deben borrar de la lista de otros frames que lo contengan
                                for (int k = 0; k < lista.length; k++) {

                                    if (lista[k] instanceof MyFrame) {

                                        ((MyFrame) lista[k]).includeMsg.
                                                remove(lista[j]);

                                    }

                                }

                            }

                            else {

                                XYConstraints c = ((MyMessage) lista[j]).
                                        getXY();

                                //Coordenada y en la que se va a dibujar el mensaje
                                if (objeto.getName().compareTo("alt_else") !=
                                    0)
                                    c.setY(c.getY() -
                                           (60 + n_mensajes * 30 +
                                            n_frames * 60 +
                                            n_frames_else * 90));
                                else
                                    c.setY(c.getY() -
                                           (90 + n_mensajes * 30 +
                                            n_frames * 60 +
                                            n_frames_else * 90));

                                ((MyMessage) lista[j]).editXYconstraints(c);

                            }

                        }

                        //También se deben subir hacia arriba los frames posteriores
                        if (lista[j] instanceof MyFrame &&
                            ((MyFrame) lista[j]).getY() > objeto.getY() &&
                            ((MyFrame) lista[j]).getY() +
                            ((MyFrame) lista[j]).getHeight() >
                            objeto.getY() + objeto.getHeight()) {

                            XYConstraints c = ((MyFrame) lista[j]).getXY();

                            //Coordenada y en la que se va a dibujar el frame
                            if (objeto.getName().compareTo("alt_else") != 0)
                                c.setY(c.getY() -
                                       (60 + n_mensajes * 30 +
                                        n_frames * 60 + n_frames_else * 90));
                            else
                                c.setY(c.getY() -
                                       (90 + n_mensajes * 30 +
                                        n_frames * 60 + n_frames_else * 90));

                            ((MyFrame) lista[j]).editXYconstraints(c);

                        }

                        //Se deben borrar los frames incluidos en el frame actual
                        if (lista[j] instanceof MyFrame &&
                            objeto.includeFrm.contains(lista[j])) {

                            panel.remove(lista[j]);

                            //Se deben borrar de la lista de otros frames que lo contengan
                            for (int k = 0; k < lista.length; k++) {

                                if (lista[k] instanceof MyFrame) {

                                    ((MyFrame) lista[k]).includeFrm.remove(
                                            lista[j]);

                                }

                            }

                        }

                        //Se debe recortar el tamaño de los frames que contengan al que se ha borrado

                        if (lista[j] instanceof MyFrame &&
                            ((MyFrame) lista[j]).includeFrm.contains(objeto)) {

                            //Se debe recortar 60 por cada frame incluido el actual y 30 por cada mensaje
                            XYConstraints c = ((MyFrame) lista[j]).getXY();

                            if (objeto.getName().compareTo("alt_else") != 0)
                                c.setHeight(c.getHeight() -
                                            (60 + n_mensajes * 30 +
                                             n_frames * 60 +
                                             n_frames_else * 90));
                            else
                                c.setHeight(c.getHeight() -
                                            (90 + n_mensajes * 30 +
                                             n_frames * 60 +
                                             n_frames_else * 90));

                            ((MyFrame) lista[j]).editXYconstraints(c);

                            //Se debe eliminar el frame de su lista
                            ((MyFrame) lista[j]).includeFrm.remove(objeto);

                            //Subir hacia arriba separadores en caso de tipo "par" o "alt"
                            if (((MyFrame) lista[j]).getName().compareTo(
                                    "par") == 0 ||
                                ((MyFrame) lista[j]).
                                getName().compareTo("alt") == 0) {

                                ArrayList separadores = ((MyFrame) lista[j]).
                                        separadores;

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

                                    if (((Integer) separadores.get(k)).
                                        intValue() + lista[j].getY() >
                                        objeto.getY()) {

                                        int valor = ((Integer) separadores.
                                                get(k)).intValue();

                                        separadores.remove(k);
                                        if (objeto.getName().compareTo(
                                                "alt_else") != 0)
                                            separadores.add(k,
                                                    new Integer(valor -
                                                    (60 + n_mensajes * 30 +
                                                    n_frames * 60 +
                                                    n_frames_else * 90)));
                                        else
                                            separadores.add(k,
                                                    new Integer(valor -
                                                    (90 + n_mensajes * 30 +
                                                    n_frames * 60 +
                                                    n_frames_else * 90)));

                                    }

                                }

                                //Se deben eliminar aquellos separadores que ya no sean necesarios
                                for (int k = 0; k < separadores.size(); k++) {

                                    //Si el valor es igual a 28 es que ya no queda ningún mensaje por encima
                                    if (((Integer) separadores.get(k)).
                                        intValue() == 28) {

                                        separadores.remove(k);

                                    }

                                    else {

                                        //Si es igual al siguiente
                                        if (k < separadores.size() - 1 &&
                                            ((Integer) separadores.get(k)).
                                            intValue() ==
                                            ((Integer)
                                             separadores.get(k + 1)).
                                            intValue()) {

                                            separadores.remove(k);

                                        }

                                    }
                                }

                            }

                            //Subir hacia arriba el separador si procede en el caso "alt_else"
                            if (((MyFrame) lista[j]).getName().compareTo(
                                    "alt_else") == 0) {

                                ArrayList separadores = ((MyFrame) lista[j]).
                                        separadores;

                                if (((Integer) separadores.get(0)).intValue() +
                                    lista[j].getY() > objeto.getY()) {

                                    int valor = ((Integer) separadores.get(
                                            0)).intValue();

                                    separadores.remove(0);
                                    if (objeto.getName().compareTo(
                                            "alt_else") != 0)
                                        separadores.add(0,
                                                new Integer(valor -
                                                (60 + n_mensajes * 30 +
                                                n_frames * 60 +
                                                n_frames_else * 90)));
                                    else
                                        separadores.add(0,
                                                new Integer(valor -
                                                (90 + n_mensajes * 30 +
                                                n_frames * 60 +
                                                n_frames_else * 90)));

                                }

                            }

                        }

                    }

                    //Se deben recortar las lineas de los actor y los lifelines
                    for (int j = 0; j < lista.length; j++) {

                        if (lista[j] instanceof MyLifeLine) {

                            MyLifeLine lin = ((MyLifeLine) lista[j]);

                            XYConstraints c2 = lin.getXY();

                            if (objeto.getName().compareTo("alt_else") != 0)
                                c2.setHeight(c2.getHeight() -
                                             (60 + n_mensajes * 30 +
                                              n_frames * 60 +
                                              n_frames_else * 90));
                            else
                                c2.setHeight(c2.getHeight() -
                                             (90 + n_mensajes * 30 +
                                              n_frames * 60 +
                                              n_frames_else * 90));

                            lin.editXYconstraints(c2);

                        }

                        if (lista[j] instanceof MyActor) {

                            MyActor lin = ((MyActor) lista[j]);

                            XYConstraints c2 = lin.getXY();

                            if (objeto.getName().compareTo("alt_else") != 0)
                                c2.setHeight(c2.getHeight() -
                                             (60 + n_mensajes * 30 +
                                              n_frames * 60 +
                                              n_frames_else * 90));
                            else
                                c2.setHeight(c2.getHeight() -
                                             (90 + n_mensajes * 30 +
                                              n_frames * 60 +
                                              n_frames_else * 90));

                            lin.editXYconstraints(c2);

                        }

                    }

                    //Si el panel se ha quedado vacío se debe limpiar la ventana de código
                    if (panel.getComponentCount() == 1) {

                        ((TraduccionMarco) panel.getRootPane().getParent()).
                                deleteCode();

                    }

                }

            }

            //Modificar el color del objeto al inicial
            objeto.setCol(Color.black);

            //Si se trata de un objeto de tipo frame se deben devolver los elementos incluidos al color negro
            if (objeto instanceof MyFrame) {

                MyFrame frm = (MyFrame) objeto;

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

                    ((MyObjects) frm.includeMsg.get(i)).setCol(Color.black);

                }

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

                    ((MyObjects) frm.includeFrm.get(i)).setCol(Color.black);

                }

            }

            //Si se trata de un actor o de un lifeline colorear también los mensajes enviados y recibidos de nuevo de negro
            if (objeto instanceof MyActor || objeto instanceof MyLifeLine) {

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

                    ((MyObjects) objeto.sendedMsg.get(i)).setCol(Color.
                            black);

                }

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

                    ((MyObjects) objeto.receivedMsg.get(i)).setCol(Color.
                            black);

                }

            }

            //Se debe repintar el panel que contiene a los objetos
            panel.repaint();
            panel.updateUI();

        }

    }
    };
    JMenu jMenu1 = new JMenu();
    JMenuItem jMenuHelp1 = new JMenuItem();

    public TraduccionMarco() {
        try {

            setDefaultCloseOperation(EXIT_ON_CLOSE);
            jbInit();
            //Iconos del modelador
            icons();


        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }

    /**
     * Component initialization.
     *
     * @throws java.lang.Exception
     */
    private void jbInit() throws Exception {

        jPanelDraw.addMouseListener(new MyListener2());

        //Listener para ver cuando se modifica el tamaño
        addWindowStateListener(this);

        //Keybinding para suprimir
        jPanelDraw.getInputMap(jPanelDraw.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0),
                            "borrado");
        jPanelDraw.getActionMap().put("borrado",
                                     ActionBorrado);

        contentPane = (JPanel) getContentPane();
        contentPane.setLayout(borderLayout1);
        setSize(new Dimension(900, 600));
        setTitle("WST");
        jMenuFile.setText("File");
        jMenuFileExit.setText("Exit");
        jMenuFileExit.addActionListener(new
                                        TraduccionMarco_jMenuFileExit_ActionAdapter(this));

        jMenuWSCDL.setText("WS-CDL");
        jMenuTimed.setText("Timed Automata");
        jMenuCPN.setText("CPN Tools");
        jMenuHelp.setText("Help");
        jMenuHelpAbout.setText("About...");
        jMenuHelpAbout.addActionListener(new
                                         TraduccionMarco_jMenuHelpAbout_ActionAdapter(this));
        jTabbedPane1.setBounds(new Rectangle(8, 4, 875, 534));
        jPanel2.setLayout(null);

        jLabel1.setFont(new java.awt.Font("Dialog", Font.BOLD, 16));
        jLabel1.setBorder(titledBorder2);
        jLabel1.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel1.setHorizontalTextPosition(SwingConstants.CENTER);
        jLabel1.setIcon(null);
        jLabel1.setText("WS-CDL");
        jLabel1.setBounds(new Rectangle(4, 3, 384, 18));
        jLabel2.setFont(new java.awt.Font("Dialog", Font.BOLD, 16));
        jLabel2.setBorder(titledBorder2);
        jLabel2.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel2.setText("TIMED AUTOMATA");
        jLabel2.setBounds(new Rectangle(478, 2, 384, 17));
        jPanel1.setLayout(null);
        jLabel3.setFont(new java.awt.Font("Dialog", Font.BOLD, 16));
        jLabel3.setBorder(titledBorder2);
        jLabel3.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel3.setHorizontalTextPosition(SwingConstants.CENTER);
        jLabel3.setText("XMI");
        jLabel3.setBounds(new Rectangle(6, 9, 380, 18));
        jLabel4.setFont(new java.awt.Font("Dialog", Font.BOLD, 16));
        jLabel4.setBorder(titledBorder2);
        jLabel4.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel4.setText("WS-CDL");
        jLabel4.setBounds(new Rectangle(470, 7, 388, 19));
        jButton4.setBounds(new Rectangle(392, 190, 78, 24));
        jButton4.setBorder(titledBorder3);
        jButton4.setIcon(null);
        jButton4.setMargin(new Insets(2, 2, 2, 2));
        jButton4.setMnemonic('0');
        jButton4.setText("Transform");
        jButton4.addActionListener(new TraduccionMarco_jButton4_actionAdapter(this));
        jButton5.setBounds(new Rectangle(394, 178, 69, 24));
        jButton5.setBorder(titledBorder3);
        jButton5.setIcon(null);
        jButton5.setMargin(new Insets(2, 2, 2, 2));
        jButton5.setText("Transform");
        jButton5.addActionListener(new TraduccionMarco_jButton5_actionAdapter(this));
        // jButton5.addActionListener(new TraduccionMarco_jButton5_actionAdapter(this));
        jScrollPane3.setBounds(new Rectangle(478, 21, 380, 443));
        jScrollPane1.setBounds(new Rectangle(6, 27, 380, 439));
        jScrollPane2.getViewport().setBackground(Color.red);
        jScrollPane2.setBounds(new Rectangle(470, 26, 387, 442));
        jTextArea1.setEditable(false);
        jTextArea1.setText("");
        jTextArea2.setEditable(false);
        jTextArea2.setText("");
        jTextArea3.setEditable(false);
        jTextArea3.setText("");
        jScrollPane4.setBounds(new Rectangle(5, 21, 380, 446));
        jTextArea4.setEditable(false);
        jTextArea4.setText("");
        jPanel3.setLayout(borderLayout3);
        jScrollPane5.setBounds(new Rectangle(3, 3, 860, 357));
        jMenuItem2.setText("Save Timed Automata File...");
        jMenuItem2.addActionListener(new
                                     TraduccionMarco_jMenuItem2_actionAdapter(this));

        jMenuItem3.setText("Save WS-CDL File...");
        jMenuItem3.addActionListener(new
                                     TraduccionMarco_jMenuItem3_actionAdapter(this));
        jMenuItem4.setText("Save Coloured Petri Net...");
        jMenuItem4.addActionListener(new
                                     TraduccionMarco_jMenuItem4_actionAdapter(this));

        jButton12.setBounds(new Rectangle(394, 269, 69, 24));
        jButton12.setText("Clear");
        jButton12.addActionListener(new TraduccionMarco_jButton12_actionAdapter(this));
        jButton13.setBounds(new Rectangle(393, 279, 77, 23));
        jButton13.setText("Clear");
        jButton13.addActionListener(new TraduccionMarco_jButton13_actionAdapter(this));
        jMenuFileOpenUML.setText("Open UML Diagram...");
        jMenuFileOpenUML.addActionListener(new
                TraduccionMarco_jMenuFileOpenUML_actionAdapter(this));
        jMenuFileSaveUML.setText("Save UML Diagram...");
        jMenuFileSaveUML.addActionListener(new
                TraduccionMarco_jMenuFileSaveUML_actionAdapter(this));
        jButtonExport.setText("Export XMI");
        jButtonExport.addActionListener(new TraduccionMarco_jButtonExport_actionAdapter(this));
        jScrollPane6.setBounds(new Rectangle(3, 360, 860, 126));
        jTextArea5.setToolTipText("");
        jTextArea5.setEditable(false);
        jTextArea5.setText("XMI Code");
        jButtonLifeline.setToolTipText("New LifeLine");
        jButtonActor.setToolTipText("New Actor");
        jButtonMessage.setToolTipText("New Message");
        jButtonUPPAAL.setBounds(new Rectangle(781, 471, 76, 23));
        jButtonUPPAAL.setText("UPPAAL");
        jButtonUPPAAL.addActionListener(new TraduccionMarco_jButtonUPPAAL_actionAdapter(this));
        jButtonFrame.setToolTipText("New Frame");
        jButtonFrame.addActionListener(new
                TraduccionMarco_jButtonFrame_actionAdapter(this));
        jMenu1.setText("Help");
        jMenuHelp1.setText("Help");
        jMenuHelp1.addActionListener(new
                                     TraduccionMarco_jMenuHelp1_actionAdapter(this));
        jPanelDraw.setBackground(Color.white);
        jMenuBar1.add(jMenuFile);

        jMenuFile.add(jMenuFileOpenUML);

        jMenuFile.add(jMenuFileOpenXMIFile);
        jMenuFileOpenXMIFile.setText("Open XMI File...");
        jMenuFileOpenXMIFile.addActionListener(new
                                               TraduccionMarco_jMenuFileOpenXMI_ActionAdapter(this));


        jMenuFile.add(jMenuFileOpenWSFile);
        jMenuFileOpenWSFile.setText("Open WS-CDL File...");
        jMenuFileOpenWSFile.addActionListener(new
                                         TraduccionMarco_jMenuFileOpen_ActionAdapter(this));

        jMenuFile.add(jMenuFileSaveUML);
        jMenuFile.add(jMenuFileExit);

        jMenuBar1.add(jMenuWSCDL);
        jMenuBar1.add(jMenuTimed);
        jMenuBar1.add(jMenuCPN);
        jMenuBar1.add(jMenuHelp);
        jMenuHelp.add(jMenuHelp1);
        jMenuHelp.add(jMenuHelpAbout);
        setJMenuBar(jMenuBar1);
        contentPane.add(jTabbedPane1,java.awt.BorderLayout.CENTER);
        jPanel2.add(jLabel1);
        jPanel2.add(jLabel2);
        jPanel2.add(jScrollPane3);
        jPanel2.add(jScrollPane4);
        jPanel2.add(jButton4);
        jPanel2.add(jButton13);
        jPanel2.add(jButtonUPPAAL);
        jTabbedPane1.add(jPanel3, "RT-UML DIAGRAM");
        jSplitPane1.setOneTouchExpandable(true);
        jSplitPane2.setOneTouchExpandable(true);
        jPanel3.add(jSplitPane1, java.awt.BorderLayout.CENTER);
        jSplitPane3.setDividerSize(0);
        jSplitPane3.add(jToolBar1, JSplitPane.TOP);
        jSplitPane3.add(jScrollPane5, JSplitPane.BOTTOM);
        jSplitPane2.add(jSplitPane3, JSplitPane.LEFT);
        jSplitPane2.add(jScrollPane7, JSplitPane.RIGHT);
        jSplitPane1.add(jSplitPane2, JSplitPane.TOP);
        jSplitPane1.add(jScrollPane6, JSplitPane.BOTTOM);
        setVisible(true);
        jSplitPane2.setDividerLocation(0.8);
        jSplitPane1.setDividerLocation(0.75);
        jPanel3.add(statusBar2, java.awt.BorderLayout.SOUTH);
        jScrollPane6.getViewport().add(jTextArea5);
        jScrollPane4.getViewport().add(jTextArea4);
        jScrollPane3.getViewport().add(jTextArea3);
        jScrollPane7.getViewport().add(table);
        jTabbedPane1.add(jPanel1, "RT-UML2WS-CDL");
        jPanel1.add(jLabel4);
        jPanel1.add(jLabel3);
        jPanel1.add(jScrollPane1);
        jScrollPane1.getViewport().add(jTextArea1);
        jPanel1.add(jScrollPane2);
        jPanel1.add(jButton5);
        jPanel1.add(jButton12);
        jScrollPane2.getViewport().add(jTextArea2);
        jTabbedPane1.add(jPanel2, "WS-CDL2TimedAutomata");
        jMenuWSCDL.add(jMenuItem3);
        jMenuTimed.add(jMenuItem2);
        jMenuCPN.add(jMenuItem4);


        //Comienzo pestaña para traducción a CPN
        jPanel4.setLayout(null);

        jLabel5.setFont(new java.awt.Font("Dialog", Font.BOLD, 16));
        jLabel5.setBorder(titledBorder2);
        jLabel5.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel5.setHorizontalTextPosition(SwingConstants.CENTER);
        jLabel5.setIcon(null);
        jLabel5.setText("WS-CDL");
        jLabel5.setBounds(new Rectangle(4, 3, 384, 18));
        jLabel6.setFont(new java.awt.Font("Dialog", Font.BOLD, 16));
        jLabel6.setBorder(titledBorder2);
        jLabel6.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel6.setText("CPN Tools");
        jLabel6.setBounds(new Rectangle(478, 2, 384, 17));
        jScrollPane8.setBounds(new Rectangle(5, 21, 380, 446));
        jScrollPane9.setBounds(new Rectangle(478, 21, 380, 443));
        jTextArea6.setEditable(false);
        jTextArea6.setText("");
        jTextArea7.setEditable(false);
        jTextArea7.setText("");
        jButton14.setBounds(new Rectangle(392, 190, 78, 24));
        jButton14.setBorder(titledBorder3);
        jButton14.setIcon(null);
        jButton14.setMargin(new Insets(2, 2, 2, 2));
        jButton14.setMnemonic('0');
        jButton14.setText("Transform");
        jButton14.addActionListener(new TraduccionMarco_jButton14_actionAdapter(this));
        jButton15.setBounds(new Rectangle(393, 279, 77, 23));
        jButton15.setText("Clear");
        jButton15.addActionListener(new TraduccionMarco_jButton15_actionAdapter(this));

        jPanel4.add(jLabel5);
        jPanel4.add(jLabel6);
        jPanel4.add(jScrollPane8);
        jPanel4.add(jScrollPane9);
        jPanel4.add(jButton14);
        jPanel4.add(jButton15);

        jScrollPane8.getViewport().add(jTextArea6);
        jScrollPane9.getViewport().add(jTextArea7);


        jTabbedPane1.add(jPanel4, "WS-CDL2CPNTools");

        //Fin pestaña para traducción a CPN

        //Inicializacion de los elementos necesarios para el modelador
        statusBar2.setBounds(new Rectangle(3, 486, 860, 17));
        statusBar2.setText(" ");
        jPanelUML.setLayout(borderLayout2);
        jPanelDraw.setLayout(xYLayout1);
        jToolBar1.setBorder(BorderFactory.createEtchedBorder());
        jToolBar1.setFloatable(false);

        jButtonLifeline.addActionListener(new
                                          TraduccionMarco_jButtonLifeline_actionAdapter(this));
        jButtonActor.addActionListener(new TraduccionMarco_jButtonActor_actionAdapter(this));
        jButtonMessage.addActionListener(new
                                         TraduccionMarco_jButtonMessage_actionAdapter(this));

        jButton42.setText("Clear");
        jButton42.addActionListener(new TraduccionMarco_jButton42_actionAdapter(this));
        borderLayout2.setHgap(10);
        borderLayout2.setVgap(5);

        //Añadir las partes del modelador en el panel de la pestaña correspondiente
        jScrollPane5.getViewport().add(jPanelUML, java.awt.BorderLayout.CENTER);
        jPanelUML.add(jPanelDraw, java.awt.BorderLayout.CENTER);
        jToolBar1.add(jButtonLifeline);
        jToolBar1.add(jButtonActor);
        jToolBar1.add(jButtonMessage);
        jToolBar1.add(jButtonFrame);
        jToolBar1.add(jButton42);
        jToolBar1.add(jButtonExport);
        //jPanelDraw.add(jToolBar1, new XYConstraints(0, 0, 1200, -1));

        //Asignar ayuda al botón de menú
        File f = new File("javaHelp/ejemplo.hs");

        URL hsURL = null;
        try {
            hsURL = f.toURL();
        } catch (MalformedURLException ex) {
            ex.printStackTrace();
        }

        try {
            HelpSet helpset = new HelpSet(null, hsURL);
            javax.help.HelpBroker help_browser = helpset.createHelpBroker();
            help_browser.enableHelpOnButton(jMenuHelp1, "introduction", helpset);
        } catch (Exception u) {
            u.printStackTrace();
        }

    }

    /**
     * File | Exit action performed.
     *
     * @param actionEvent ActionEvent

     */
    void jMenuFileSaveWS_actionPerformed(ActionEvent actionEvent){
       FileDialog fd = new FileDialog(new Frame(), "Save XMI file...", FileDialog.SAVE);
      fd.setFile("*.xml");
      fd.show();
      if ( fd.getDirectory() != null ) {
            if ( fd.getFile() != null ){
        String stt =fd.getDirectory();
        String st = fd.getFile();

        try{
          FileWriter fw = new FileWriter(stt + st);
          BufferedWriter br =new BufferedWriter(fw);
          DefaultEditorKit dek = new DefaultEditorKit();
          dek.write(br,jTextArea1.getDocument(), 0,jTextArea1.getDocument().getLength());
        fw.close();
        }
        catch(Exception e){
            System.err.println("Error: " +e);

        }
           System.out.println(fd.getDirectory() + fd.getFile());
      }else
        System.out.println("Save cancelled !");
        }

    }


    void jMenuFileSave_actionPerformed(ActionEvent actionEvent){
     FileDialog fd = new FileDialog(new Frame(), "Save WS-CDL file...", FileDialog.SAVE);
       fd.setFile("*.xml");
       fd.show();
       if ( fd.getDirectory() != null ) {
            if ( fd.getFile() != null ){
         String stt =fd.getDirectory();
         String st = fd.getFile();

         try{
           FileWriter fw = new FileWriter(stt + st);
           BufferedWriter br =new BufferedWriter(fw);
           DefaultEditorKit dek = new DefaultEditorKit();
           dek.write(br,jTextArea4.getDocument(), 0,jTextArea4.getDocument().getLength());
         fw.close();
         }
         catch(Exception e){
             System.err.println("Error: " +e);

         }
            System.out.println(fd.getDirectory() + fd.getFile());
       }else
         System.out.println("Save cancelled !");
        }

    }
    void jMenuFileOpenWS_actionPerformed(ActionEvent actionEvent){
        FileDialog fd=new FileDialog(new JFrame("prueba"),"Open WS-CDL File",FileDialog.LOAD);
        fd.show();

       if ( fd.getFile() != null )
       {

         String path=fd.getDirectory() + fd.getFile();
         fichero = path;
         try
         {
           FileInputStream fr=new FileInputStream(path);
           BufferedInputStream br=new BufferedInputStream(fr);
           int str;
           while((str=br.read())!=-1)
           {
           char c=(char)str;
           String s=""+c;
           jTextArea4.append(s);
           jTextArea6.append(s);
                }


         }

         catch(Exception exc)
         {
           System.out.println(exc);
         }
            System.out.println(fd.getDirectory() + fd.getFile());


    }


    }






    void jMenuFileOpenXMI_actionPerformed(ActionEvent actionEvent){
       FileDialog fd=new FileDialog(new JFrame("prueba"),"Open XMI File",FileDialog.LOAD);
       fd.show();

      if ( fd.getFile() != null )
      {

        String path=fd.getDirectory() + fd.getFile();
        fichero = path;
        try
        {
          FileInputStream fr=new FileInputStream(path);
          BufferedInputStream br=new BufferedInputStream(fr);
          int str;
          while((str=br.read())!=-1)
          {
          char c=(char)str;
          String s=""+c;
          jTextArea1.append(s);
               }


        }

        catch(Exception exc)
        {
          System.out.println(exc);
        }
           System.out.println(fd.getDirectory() + fd.getFile());


   }


   }

    void jMenuFileExit_actionPerformed(ActionEvent actionEvent) {
        System.exit(0);
    }

    /**
     * Help | About action performed.
     *
     * @param actionEvent ActionEvent
     */
    void jMenuHelpAbout_actionPerformed(ActionEvent actionEvent) {
        TraduccionMarco_AboutBox dlg = new TraduccionMarco_AboutBox(this);
        Dimension dlgSize = dlg.getPreferredSize();
        Dimension frmSize = getSize();
        Point loc = getLocation();
        dlg.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x,
                        (frmSize.height - dlgSize.height) / 2 + loc.y);
        dlg.setModal(true);
        dlg.pack();
        dlg.show();
    }

    public void jButton4_actionPerformed(ActionEvent e) {

     try{
      if ( fichero != null)
     {
         jTextArea3.setText("");

         //Dejar también la cádena con la ruta al autómata final como vacía
         TimedAutomata = "";


            TransformerFactory tFactory = TransformerFactory.newInstance();
            Transformer transformer1 =
            tFactory.newTransformer(new StreamSource("XSLFiles/wsta1.xsl"));

            transformer1.transform(new StreamSource(fichero),
                                  new StreamResult(new FileOutputStream("XSLFiles/salida1.xml")));


          TransformerFactory t2Factory = TransformerFactory.newInstance();
            Transformer transformer2 =
                    t2Factory.newTransformer(new StreamSource("XSLFiles/wsta2.xsl"));
            transformer2.transform(new StreamSource("XSLFiles/salida1.xml"),
                                  new StreamResult(new
                    FileOutputStream("XSLFiles/salida2.xml")));

          TransformerFactory t3Factory = TransformerFactory.newInstance();
            Transformer transformer3 =
                    t3Factory.newTransformer(new StreamSource("XSLFiles/wsta3.xsl"));
            transformer3.transform(new StreamSource("XSLFiles/salida2.xml"),
                                  new StreamResult(new
                    FileOutputStream("XSLFiles/salida3.xml")));

          //Se debe añadir una nueva plantilla para dividir los or en múltiples transiciones
          TransformerFactory t4Factory = TransformerFactory.newInstance();
            Transformer transformer4 =
                    t4Factory.newTransformer(new StreamSource("XSLFiles/wsta4.xsl"));
            transformer4.transform(new StreamSource("XSLFiles/salida3.xml"),
                                  new StreamResult(new
                    FileOutputStream("XSLFiles/final.xml")));


         FileInputStream fr=new FileInputStream("XSLFiles/final.xml");
          BufferedInputStream br=new BufferedInputStream(fr);
          int str;
          while((str=br.read())!=-1)
          {
          char c=(char)str;
          String s=""+c;
          jTextArea3.append(s);
                }


     }
        else
         {
            }
        }
        catch (Exception excp){
            excp.printStackTrace();
        }


    }

    public void jButton14_actionPerformed(ActionEvent e) {

     try{
      if ( fichero != null)
     {
         jTextArea7.setText("");


            TransformerFactory tFactory = TransformerFactory.newInstance();
            Transformer transformer1 =
            tFactory.newTransformer(new StreamSource("XSLFiles/cpn1.xsl"));

            transformer1.transform(new StreamSource(fichero),
                                  new StreamResult(new FileOutputStream("XSLFiles/salida1.xml")));


          /*TransformerFactory t2Factory = TransformerFactory.newInstance();
            Transformer transformer2 =
                    t2Factory.newTransformer(new StreamSource("XSLFiles/cpn2.xsl"));
            transformer2.transform(new StreamSource("XSLFiles/salida1.xml"),
                                  new StreamResult(new
                    FileOutputStream("XSLFiles/salida2.xml")));*/

          TransformerFactory t3Factory = TransformerFactory.newInstance();
            Transformer transformer3 =
                    t3Factory.newTransformer(new StreamSource("XSLFiles/cpn3.xsl"));
            transformer3.transform(new StreamSource("XSLFiles/salida2.xml"),
                                  new StreamResult(new
                    FileOutputStream("XSLFiles/final.xml")));

         FileInputStream fr=new FileInputStream("XSLFiles/final.xml");
          BufferedInputStream br=new BufferedInputStream(fr);
          int str;
          while((str=br.read())!=-1)
          {
          char c=(char)str;
          String s=""+c;
          jTextArea7.append(s);
                }


     }
        else
         {
            }
        }
        catch (Exception excp){
            excp.printStackTrace();
        }


    }


    public void jButtonExport_actionPerformed(ActionEvent e) {

        exportar(e);

    }

    public void jButton5_actionPerformed(ActionEvent e) {
        try{
    if ( fichero != null)
   {
         jTextArea2.setText("");

          TransformerFactory tFactory = TransformerFactory.newInstance();
          Transformer transformer1 =
          tFactory.newTransformer(new StreamSource("XSLFiles/umlws1.xsl"));

          transformer1.transform(new StreamSource(fichero),
                                new StreamResult(new FileOutputStream("XSLFiles/resul.xml")));


        TransformerFactory t2Factory = TransformerFactory.newInstance();
          Transformer transformer2 =
                  t2Factory.newTransformer(new StreamSource("XSLFiles/umlws2.xsl"));
          transformer2.transform(new StreamSource("XSLFiles/resul.xml"),
                                new StreamResult(new
                  FileOutputStream("XSLFiles/salida.xml")));

        TransformerFactory t3Factory = TransformerFactory.newInstance();
          Transformer transformer3 =
                  t3Factory.newTransformer(new StreamSource("XSLFiles/umlws3.xsl"));
          transformer3.transform(new StreamSource("XSLFiles/salida.xml"),
                                new StreamResult(new
                  FileOutputStream("XSLFiles/final.xml")));

        FileInputStream fr=new FileInputStream("XSLFiles/final.xml");
        BufferedInputStream br=new BufferedInputStream(fr);
        int str;
        while((str=br.read())!=-1)
        {
        char c=(char)str;
        String s=""+c;
        jTextArea2.append(s);
              }

   }
      else
       {
          }
      }
      catch (Exception excp){
          excp.printStackTrace();
      }






    }
    /**
     * Invoked when an action occurs.
     *
     * @param e ActionEvent
     * @todo Implement this java.awt.event.ActionListener method
     */
    public void actionPerformed(ActionEvent e) {
    }

    public void jMenuItem2_actionPerformed(ActionEvent a) {

      if (jTextArea3.getText().compareTo("")==0){
          JOptionPane optionPane= new JOptionPane();
          Object[] options = {"Ok"};
          optionPane.showOptionDialog(optionPane,"There is not resulting Timed Automata code to save","Message",optionPane.YES_NO_OPTION,optionPane.INFORMATION_MESSAGE, null, options, null);
      }

      else{

          FileDialog fd = new FileDialog(new Frame(), "Save Timed Automata File",
                                         FileDialog.SAVE);
          fd.setFile("*.xml");
          fd.show();
          if (fd.getDirectory() != null) {
              if (fd.getFile() != null) {
                  String stt = fd.getDirectory();
                  String st = fd.getFile();

                  try {
                      FileWriter fw = new FileWriter(stt + st);
                      BufferedWriter br = new BufferedWriter(fw);
                      DefaultEditorKit dek = new DefaultEditorKit();
                      dek.write(br, jTextArea3.getDocument(), 0,
                                jTextArea3.getDocument().getLength());
                      fw.close();

                      //Se debe dejar la ruta al fichero donde se ha guardado en una cadena de texto global
                      //para poder consultarla posteriormente y abrir el resultado en UPPAAL
                      TimedAutomata = stt + st;

                  } catch (Exception e) {
                      System.err.println("Error: " + e);

                  }
                  System.out.println(fd.getDirectory() + fd.getFile());
              } else
                  System.out.println("Save cancelled !");
          }

      }

   }

    public void jMenuItem3_actionPerformed(ActionEvent a) {

        if (jTextArea2.getText().compareTo("")==0){
             JOptionPane optionPane= new JOptionPane();
             Object[] options = {"Ok"};
             optionPane.showOptionDialog(optionPane,"There is not resulting WS-CDL code to save","Message",optionPane.YES_NO_OPTION,optionPane.INFORMATION_MESSAGE, null, options, null);
         }

         else{

             FileDialog fd = new FileDialog(new Frame(), "Save WS-CDL File",
                                            FileDialog.SAVE);
             fd.setFile("*.xml");
             fd.show();
             if (fd.getDirectory() != null) {
                 if (fd.getFile() != null) {
                     String stt = fd.getDirectory();
                     String st = fd.getFile();

                     try {
                         FileWriter fw = new FileWriter(stt + st);
                         BufferedWriter br = new BufferedWriter(fw);
                         DefaultEditorKit dek = new DefaultEditorKit();
                         dek.write(br, jTextArea2.getDocument(), 0,
                                   jTextArea2.getDocument().getLength());
                         fw.close();

                         //Escribir también el resultado en la primera área de
                         //texto de la siguiente ventana para no tener que cargarlo
                         String path=stt + st;
                         fichero = path;

                         FileInputStream fr = new FileInputStream(path);
                         BufferedInputStream bis = new BufferedInputStream(fr);
                         int str;
                         while ((str = bis.read()) != -1) {
                             char c = (char) str;
                             String s = "" + c;
                             jTextArea4.append(s);
                         }

                     } catch (Exception e) {
                         System.err.println("Error: " + e);

                     }
                     System.out.println(fd.getDirectory() + fd.getFile());
                 } else
                     System.out.println("Save cancelled !");
             }
         }
    }

    public void jMenuItem4_actionPerformed(ActionEvent a) {

      if (jTextArea7.getText().compareTo("")==0){
          JOptionPane optionPane= new JOptionPane();
          Object[] options = {"Ok"};
          optionPane.showOptionDialog(optionPane,"There is not resulting CPN Tools code to save","Message",optionPane.YES_NO_OPTION,optionPane.INFORMATION_MESSAGE, null, options, null);
      }

      else{

          FileDialog fd = new FileDialog(new Frame(), "Save CPN Tools File",
                                         FileDialog.SAVE);
          fd.setFile("*.cpn");
          fd.show();
          if (fd.getDirectory() != null) {
              if (fd.getFile() != null) {
                  String stt = fd.getDirectory();
                  String st = fd.getFile();

                  try {
                      FileWriter fw = new FileWriter(stt + st);
                      BufferedWriter br = new BufferedWriter(fw);
                      DefaultEditorKit dek = new DefaultEditorKit();
                      dek.write(br, jTextArea7.getDocument(), 0,
                                jTextArea7.getDocument().getLength());
                      fw.close();

                  } catch (Exception e) {
                      System.err.println("Error: " + e);

                  }
                  System.out.println(fd.getDirectory() + fd.getFile());
              } else
                  System.out.println("Save cancelled !");
          }

      }

   }


    public void jButton12_actionPerformed(ActionEvent e) {
           jTextArea1.setText("");
           jTextArea2.setText("");

    }

    public void jButton13_actionPerformed(ActionEvent e) {
        jTextArea3.setText("");
        jTextArea4.setText("");

        //Dejar también la cádena con la ruta al autómata final como vacía
        TimedAutomata = "";
    }

    public void jButton15_actionPerformed(ActionEvent e) {
        jTextArea6.setText("");
        jTextArea7.setText("");
    }


    /**
     * Método que asigna a cada botón el icono que queremos que tenga
     */
    private void icons() {
        jButtonActor.setIcon(new ImageIcon(traduccion.TraduccionMarco.class.getResource(
                "tb_actor.png")));
        jButtonLifeline.setIcon(new ImageIcon(traduccion.TraduccionMarco.class.
                                              getResource(
                "tb_lifeline.png")));
        jButtonMessage.setIcon(new ImageIcon(traduccion.TraduccionMarco.class.
                                             getResource(
                "tb_association_directed.png")));
        jButtonFrame.setIcon(new ImageIcon(traduccion.TraduccionMarco.class.
                                             getResource(
                "tb_frame.png")));


    }

    /**
       * Crea el documento XML, con el contenido XMI común a todos los elementos,
       * la cabecera del documento.
       *
       * @return Devuelve el documento xml que hemos creado
       */
      public Document XMLDocument() {
          //Fecha q va a controlar las modificaciones sobre el modelo
          Date dat_model = new Date();

          Document docxmi = DocumentHelper.createDocument();
          docxmi.setXMLEncoding("windows-1252");

          //Establecer la referencia a la DTD que se va a utilizar, en este caso
          //la DTD de UML versión 1.3
          //docxmi.addDocType("XMI", "SYSTEM", "UMLX13.dtd");
          docxmi.addDocType("XMI", null, null);

          //Añadimos la raiz del documento xml con sus atributos correspondientes
          raiz = docxmi.addElement("XMI");
          raiz.addAttribute("xmi.version", "1.0");
          raiz.addAttribute("timestamp", dat.toString());

          //Creamos los nodos que cuelgan de la raiz del documento
          header = raiz.addElement("XMI.header");

          //Lo que cuelga de el nodo 'content' es el contenido del diagrama de secuencia que dibujemos
          content = raiz.addElement("XMI.content");

          //Creamos los nodos que cuelgan de la cabecera
          Element documentation = header.addElement("XMI.documentation");
          documentation.addElement("XMI.exporter").setText(
                  "Generacion de Coreografias");
          documentation.addElement("XMI.exporterVersion").setText("1.0");
          Element metamodel = header.addElement("XMI.metamodel");
          metamodel.addAttribute("xmi.name", "UML");
          metamodel.addAttribute("xmi.version", "1.3");

          //Creamos los nodos asociados para crear el modelo que va a contener los elementos
          content.addComment("Model information");
          int id = Math.abs(ident.nextInt());
          String idmodel = "G_" + id;

          content.addElement("Model_Management.Model").addAttribute("xmi.id",
                  idmodel);
          content.addElement("Foundation.Core.Model.Element.name").setText(
                  "SequenceModel");

          content.addElement("Foundation.Core.ModelElement.visibility").
                  addAttribute("xmi.value", "public");
          content.addElement("Foundation.Core.ModelElement.isSpecification").
                  addAttribute("xmi.value", "false");
          content.addElement("Foundation.Core.ModelElement.isRoot").
                  addAttribute(
                          "xmi.value", "false");
          content.addElement("Foundation.Core.ModelElement.isLeaf").
                  addAttribute(
                          "xmi.value", "false");
          content.addElement("Foundation.Core.ModelElement.isAbstract").
                  addAttribute("xmi.value", "false");

          //ETIQUETAS COMUNES A TODO EL MODELO PARA EL CONTROL DE VERSIONES
          content.addComment("TaggedValues of general model");
          //Fecha de creacion
          Element e1 = content.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e1.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("created");
          e1.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText(dat.toString());
          Element e2 = e1.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e2.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  idmodel);
          //Fecha de modificación
          Element e3 = content.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e3.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("modified");
          e3.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText(dat_model.toString());
          Element e4 = e3.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e4.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  idmodel);
          //Tiene control
          Element e5 = content.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e5.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("iscontrolled");
          e5.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("TRUE");
          Element e6 = e5.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e6.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  idmodel);
          //Ruta
          Element e7 = content.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e7.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("xmlpath");
          e7.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText(ruta);
          Element e8 = e7.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e8.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  idmodel);
          //Version
          Element e9 = content.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e9.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("version");
          e9.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("1.0");
          Element e10 = e9.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e10.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  idmodel);
          //Usa DTD
          Element e11 = content.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e11.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("usedtd");
          e11.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("TRUE");
          Element e12 = e11.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e12.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  idmodel);
          //Version de xmi
          Element e13 = content.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e13.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("xmiver");
          e13.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("Generic XMI 1.0/UML 1.3");
          Element e14 = e13.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e14.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  idmodel);
          //logxml
          Element e15 = content.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e15.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("logxml");
          e15.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("FALSE");
          Element e16 = e15.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e16.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  idmodel);
          //Fase
          Element e17 = content.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e17.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("phase");
          e17.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("1.0");
          Element e18 = e17.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e18.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  idmodel);
          //Estado
          Element e19 = content.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e19.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("status");
          e19.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("Proposed");
          Element e20 = e19.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e20.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  idmodel);
          //Complejidad
          Element e21 = content.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e21.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("complexity");
          e21.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("1");
          Element e22 = e21.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e22.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  idmodel);

          //A partir de aqui se va a ir añadiendo el contenido del diagrama
          content.addComment("Contents of model");
          contmodelo = content.addElement(
                  "Foundation.Core.Namespace.ownedElement");
          return docxmi;
      }

      /**
       * Método que genera el código xmi asociado a los actores que se van a
       * introducir en el diagrama
       *
       * @return Documento con el contenido xmi de los 'actores'
       */
      public Document XMIActor(MyObjects act) {
          Document xmiactor = DocumentHelper.createDocument();
          Date dat_act = new Date();
          contmodelo.addComment("New Actor");
          Element e1 = contmodelo.addElement(
                  "Behavioral_Elements.Use_Cases.Actor");

          e1.addAttribute("xmi.id", act.getID());
          e1.addElement("Foundation.Core.ModelElement.name").setText(act.
                  getName());
          e1.addElement("Foundation.Core.ModelElement.visibility").
                  addAttribute(
                          "xmi.value", "public");
          e1.addElement("Foundation.Core.ModelElement.isSpecification").
                  addAttribute("xmi.value", "false");
          e1.addElement("Foundation.Core.GeneralizableElement.isRoot").
                  addAttribute("xmi.value", "false");
          e1.addElement("Foundation.Core.GeneralizableElement.isLeaf").
                  addAttribute("xmi.value", "false");
          e1.addElement("Foundation.Core.GeneralizableElement.isAbstract").
                  addAttribute("xmi.value", "false");

          //ETIQUETAS ASOCIADAS
          contmodelo.addComment("TaggedValues of Actor");
          //Version
          Element e2 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e2.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("version");
          e2.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("1.0");
          Element e3 = e2.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e3.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  act.getID());
          //Fecha de creación
          Element e4 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e4.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("date_created");
          e4.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText(dat.toString());
          Element e5 = e4.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e5.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  act.getID());
          //Fecha de modificacion
          Element e6 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e6.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("date_modified");
          e6.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText(dat_act.toString());
          Element e7 = e6.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e7.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  act.getID());
          //Fase
          Element e8 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e8.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("phase");
          e8.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("1.0");
          Element e9 = e8.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e9.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  act.getID());
          //Estado
          Element e10 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e10.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("status");
          e10.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("Proposed");
          Element e11 = e10.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e11.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  act.getID());
          //Estilo
          Element e12 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e12.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("style");
          String style = "BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0";
          e12.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText(style);
          Element e13 = e12.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e13.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  act.getID());

          //Se deben guardar las variables que define este actor,
          //incluyendo nomber, tipo y valor inicial si se ha definido

          ArrayList vars = act.getVariables();

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

              Element e14 = contmodelo.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue");
              e14.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                      setText("Variable");
              if(((Object[])vars.get(i))[2].toString().compareTo("")!=0){

                  e14.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText(((Object[])vars.get(i))[0].toString()+"="+((Object[])vars.get(i))[2].toString()+" "+((Object[])vars.get(i))[1].toString());

              }
              else{

                  e14.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText(((Object[])vars.get(i))[0].toString()+" "+((Object[])vars.get(i))[1].toString());

              }

              Element e15 = e14.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
              e15.addElement("Foundation.Core.ModelElement").addAttribute(
                      "xmi.idref",
                      act.getID());

          }

          return xmiactor;

      }

      /**
       * Método que genera el código xmi asociado a los lifelines que va a tener
       * el diagrama
       *
       * @return Documento con el contenido xmi de los 'lifelines'
       */
      public Document XMILifeLine(MyObjects life) {
          Document xmilifeline = DocumentHelper.createDocument();
          Date dat_life = new Date();
          contmodelo.addComment("New LifeLine");
          Element e2 = contmodelo.addElement(
                  "Behavioral_Elements.Collaborations.ClassifierRole");

          e2.addAttribute("xmi.id", life.getID());
          e2.addElement("Foundation.Core.ModelElement.name").setText(life.
                  getName());
          e2.addElement("Foundation.Core.ModelElement.visibility").
                  addAttribute(
                          "xmi.value", "public");
          e2.addElement("Foundation.Core.ModelElement.isSpecification").
                  addAttribute("xmi.value", "false");
          e2.addElement("Foundation.Core.GeneralizableElement.isRoot").
                  addAttribute("xmi.value", "false");
          e2.addElement("Foundation.Core.GeneralizableElement.isLeaf").
                  addAttribute("xmi.value", "false");
          e2.addElement("Foundation.Core.GeneralizableElement.isAbstract").
                  addAttribute("xmi.value", "false");
          Element e3 = e2.addElement(
                  "Behavioral_Elements.Collaborations.ClassifierRole.multiplicity");
          Element e4 = e3.addElement("Foundation.Data_Types.Multiplicity");
          Element e5 = e4.addElement(
                  "Foundation.Data_Types.Multiplicity.range");
          Element e6 = e5.addElement(
                  "Foundation.Data_Types.Multiplicity.range");
          e6.addElement("Foundation.Data_Types.MultiplicityRange.lower").
                  setText(
                          "1");
          e6.addElement("Foundation.Data_Types.MultiplicityRange.upper").
                  setText(
                          "1");

          contmodelo.addComment("TaggedValues of Lifeline");
          //Version
          Element e7 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e7.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("version");
          e7.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("1.0");
          Element e8 = e7.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e8.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  life.getID());
          //Fecha de creación
          Element e9 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e9.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("date_created");
          e9.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText(dat.toString());
          Element e10 = e9.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e10.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  life.getID());
          //Fecha de modificacion
          Element e11 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e11.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("date_modified");
          e11.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText(dat_life.toString());
          Element e12 = e11.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e12.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  life.getID());
          //Fase
          Element e13 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e13.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("phase");
          e13.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("1.0");
          Element e14 = e13.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e14.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  life.getID());
          //Estado
          Element e15 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e15.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("status");
          e15.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("Proposed");
          Element e16 = e15.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e16.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  life.getID());
          //Estilo
          Element e17 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e17.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("style");
          String style = "BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0";
          e17.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText(style);
          Element e18 = e17.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e18.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  life.getID());

          //Se deben guardar las variables que define este actor
          //en esta guarda

          ArrayList vars = life.getVariables();

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

              Element e19 = contmodelo.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue");
              e19.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                      setText("Variable");
              if(((Object[])vars.get(i))[2].toString().compareTo("")!=0){

                  e19.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText(((Object[])vars.get(i))[0].toString()+"="+((Object[])vars.get(i))[2].toString()+" "+((Object[])vars.get(i))[1].toString());

              }
              else{

                  e19.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText(((Object[])vars.get(i))[0].toString()+" "+((Object[])vars.get(i))[1].toString());

              }

              Element e20 = e19.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
              e20.addElement("Foundation.Core.ModelElement").addAttribute(
                      "xmi.idref",
                      life.getID());

          }

          return xmilifeline;
      }

      /**
       * Método que genera el código xmi asociado a los mensajes que va a contener
       * el diagrama.
       *
       * @return Documento con el contenido xmi de los 'mensajes'.
       */
      public Document XMIMessage(MyObjects msg, int seq_mensaje) {
          Document xmimensaje = DocumentHelper.createDocument();
          MyMessage msgaux = (MyMessage) msg;
          String origen = msgaux.getSource();
          String destino = msgaux.getDest();

          interaction.addComment("New Message");

          //Código del mensaje
          Element e4 = interaction.addElement(
                  "Behavioral_Elements.Collaborations.Message").
                       addAttribute("xmi.id", msg.getID());
          e4.addElement("Foundation.Core.ModelElement.name").setText(msg.
                  getName());
          e4.addElement("Foundation.Core.ModelElement.visibility").
                  addAttribute(
                          "xmi.value", "private");
          e4.addElement("Foundation.Core.ModelElement.isSpecification").
                  addAttribute("xmi.value", "false");
          Element e5 = e4.addElement(
                  "Behavioral_Elements.Collaborations.Message.sender");
          e5.addElement("Behavioral_Elements.Collaborations.ClassifierRole").
                  addAttribute("xmi.idref", origen);
          Element e6 = e4.addElement(
                  "Behavioral_Elements.Collaborations.Message.receiver");
          e6.addElement("Behavioral_Elements.Collaborations.ClassifierRole").
                  addAttribute("xmi.idref", destino);
          Element e7 = e4.addElement(
                  "Behavioral_Elements.Collaborations.Message.action");
          e7.addElement(
                  "Behavioral_Elements.Common_Behavior.UninterpretedAction").
                  addAttribute("xmi.id", msg.getID());

          //Añadir otro campo con el id del frame en que esté contenido
          //Si no está dentro de ningún frame se deja vacío
          Element e71 = e4.addElement(
                  "Behavioral_Elements.Collaborations.Message.frame");

          //Recorrer los frames para ver si hay alguno que lo contenga
          //y ninguno más interior
          Component lista [] = jPanelDraw.getComponents();
          int altura = 0;
          MyFrame frame = null;

          for (int i = 0; i < lista.length; i++) {

              if (lista[i] instanceof MyFrame && msgaux.getY() <= ((MyFrame)lista[i]).getY()+((MyFrame)lista[i]).getHeight() &&
                  lista[i] instanceof MyFrame && msgaux.getY() > ((MyFrame)lista[i]).getY() &&
                  ((MyFrame)lista[i]).getY() > altura){

                  frame = ((MyFrame)lista[i]);
                  altura = frame.getY();

              }

          }

          if(frame != null){

              e71.addElement(
                      "Foundation.Extension_Mechanisms.Stereotype").
                      addAttribute("xmi.idref", frame.getID());
          }
          else{

              e71.addElement(
                      "Foundation.Extension_Mechanisms.Stereotype").
                      addAttribute("xmi.idref", "");

          }

          contmodelo.addComment("TaggedValues of Message");
          //Instante de envio
          Element e8 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e8.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("sendingInstant");
          e8.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("105");
          Element e9 = e8.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e9.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  msg.getID());
          //Duración del proceso
          Element e10 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e10.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("processingDuration");
          e10.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("20");
          Element e11 = e10.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e11.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  msg.getID());
          //Número de secuencia
          Element e12 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e12.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("sequenceNumber");
          e12.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText(""+seq_mensaje);
          Element e13 = e12.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e13.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  msg.getID());

          //Si el mensaje está dentro de un frame de tipo par se debe mirar
          //en que parte del parallel está
          if(frame != null && frame.getName().compareTo("par")==0){

              int parte = 1;

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

                  if(msg.getY() > frame.getY() + ((Integer)frame.separadores.get(i)).intValue()){

                      parte++;

                  }

              }

              //Orden dentro del par
              Element e14 = contmodelo.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue");
              e14.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                      setText("parOrder");
              e14.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText("" + parte);
              Element e15 = e14.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
              e15.addElement("Foundation.Core.ModelElement").addAttribute(
                      "xmi.idref",
                      msg.getID());

          }

          //Si el mensaje está dentro de un frame de tipo alt se debe mirar
          //en que parte del alt está
          if(frame != null && frame.getName().compareTo("alt")==0){

              int parte = 1;

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

                  if(msg.getY() > frame.getY() + ((Integer)frame.separadores.get(i)).intValue()){

                      parte++;

                  }

              }


              //Orden dentro del alt
              Element e14 = contmodelo.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue");
              e14.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                      setText("altOrder");
              e14.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText("" + parte);
              Element e15 = e14.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
              e15.addElement("Foundation.Core.ModelElement").addAttribute(
                      "xmi.idref",
                      msg.getID());

          }

          //Si el mensaje está dentro de un frame de tipo alt else se debe mirar
          //en cual de las dos partes está
          if(frame != null && frame.getName().compareTo("alt_else")==0){

              int parte = 1;

              if(msg.getY() > frame.getY() + ((Integer)frame.separadores.get(0)).intValue()){

                  parte = 2;

              }

              //Orden dentro del alt else
              Element e14 = contmodelo.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue");
              e14.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                      setText("altelseOrder");
              e14.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText("" + parte);
              Element e15 = e14.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
              e15.addElement("Foundation.Core.ModelElement").addAttribute(
                      "xmi.idref",
                      msg.getID());

          }

          //Se deben guardar también las actualizaciones de variables que se hagan en el mensaje
          ArrayList al = msgaux.getUpdates();

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

              Element e16 = contmodelo.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue");
              e16.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                      setText("update");
              e16.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText("" + ((Object[])al.get(i))[0].toString()+"="+((Object[])al.get(i))[1].toString());
              Element e17 = e16.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
              e17.addElement("Foundation.Core.ModelElement").addAttribute(
                      "xmi.idref",
                      msg.getID());

          }

          //Se debe guardar si hay un intercambio de variables
          if(msgaux.getSend_variable().compareTo("")!=0 && msgaux.getReceive_variable().compareTo("")!=0){
              Element e18 = contmodelo.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue");
              e18.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                      setText("send_variable");
              e18.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText(msgaux.getSend_variable());
              Element e19 = e18.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
              e19.addElement("Foundation.Core.ModelElement").addAttribute("xmi.idref",msg.getID());
              Element e20 = contmodelo.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue");
              e20.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                      setText("receive_variable");
              e20.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText(msgaux.getReceive_variable());
              Element e21 = e20.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
              e21.addElement("Foundation.Core.ModelElement").addAttribute("xmi.idref",msg.getID());

          }


          //Se debe incluir el timeout si lo hay
          if(msgaux.getTimeout_clock().compareTo("")!=0 && msgaux.getTimeout().compareTo("")!=0){
              Element e22 = contmodelo.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue");
              e22.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                      setText("timeout");
              e22.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText(msgaux.getTimeout_clock()+" <= "+msgaux.getTimeout());
              Element e23 = e22.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
              e23.addElement("Foundation.Core.ModelElement").addAttribute("xmi.idref",msg.getID());

          }

          //Finalmente se debe incluir excepción generada si la hay
          if(msgaux.getException_variable().compareTo("")!=0){
              Element e24 = contmodelo.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue");
              e24.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                      setText("exception");
              e24.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText(msgaux.getException_variable());
              Element e25 = e24.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
              e25.addElement("Foundation.Core.ModelElement").addAttribute("xmi.idref",msg.getID());

          }


          return xmimensaje;
      }

      /**
       * Método que genera el código xmi asociado a los frames que va a tener
       * el diagrama
       *
       * @return Documento con el contenido xmi de los 'frames'
       */
      public Document XMIFrame(MyObjects frame, int seq_frame,int num_frame) {
          Document xmiframe = DocumentHelper.createDocument();
          MyFrame frmaux = (MyFrame) frame;
          Date dat_frame = new Date();
          contmodelo.addComment("New Frame");

          //Se añade un estereotipo para los frames
          Element e2 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.Stereotype");

          e2.addAttribute("xmi.id", frame.getID());
          e2.addElement("Foundation.Core.ModelElement.name").setText(frame.
                  getName()+num_frame);
          e2.addElement("Foundation.Core.ModelElement.visibility").
                  addAttribute(
                          "xmi.value", "public");
          e2.addElement("Foundation.Core.ModelElement.isSpecification").
                  addAttribute("xmi.value", "false");
          e2.addElement("Foundation.Core.GeneralizableElement.isRoot").
                  addAttribute("xmi.value", "false");
          e2.addElement("Foundation.Core.GeneralizableElement.isLeaf").
                  addAttribute("xmi.value", "false");
          e2.addElement("Foundation.Core.GeneralizableElement.isAbstract").
                  addAttribute("xmi.value", "false");
          Element e3 = e2.addElement(
                  "Behavioral_Elements.Collaborations.ClassifierRole.multiplicity");
          Element e4 = e3.addElement("Foundation.Data_Types.Multiplicity");
          Element e5 = e4.addElement(
                  "Foundation.Data_Types.Multiplicity.range");
          Element e6 = e5.addElement(
                  "Foundation.Data_Types.Multiplicity.range");
          e6.addElement("Foundation.Data_Types.MultiplicityRange.lower").
                  setText(
                          "1");
          e6.addElement("Foundation.Data_Types.MultiplicityRange.upper").
                  setText(
                          "1");

          //Añadir otro campo con el id del frame en que esté contenido
          //Si no está dentro de ningún frame se deja vacío
          Element e61 = e2.addElement(
                  "Foundation.Extension_Mechanisms.Stereotype.frame");

          //Recorrer los frames para ver si hay alguno que lo contenga
          //y ninguno más interior
          Component lista [] = jPanelDraw.getComponents();
          int altura = 0;
          MyFrame frame_sup = null;

          for (int i = 0; i < lista.length; i++) {

              if (lista[i] instanceof MyFrame && frmaux.getY() < ((MyFrame)lista[i]).getY()+((MyFrame)lista[i]).getHeight() &&
                  lista[i] instanceof MyFrame && frmaux.getY() > ((MyFrame)lista[i]).getY() &&
                  ((MyFrame)lista[i]).getY() > altura){

                  frame_sup = ((MyFrame)lista[i]);
                  altura = frame_sup.getY();

              }

          }

          if(frame_sup != null){

              e61.addElement(
                      "Foundation.Extension_Mechanisms.Stereotype").
                      addAttribute("xmi.idref", frame_sup.getID());
          }
          else{

              e61.addElement(
                      "Foundation.Extension_Mechanisms.Stereotype").
                      addAttribute("xmi.idref", "");

          }


          contmodelo.addComment("TaggedValues of Frame");
          //Version
          Element e7 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e7.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("version");
          e7.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("1.0");
          Element e8 = e7.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e8.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  frame.getID());
          //Fecha de creación
          Element e9 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e9.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("date_created");
          e9.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText(dat.toString());
          Element e10 = e9.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e10.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  frame.getID());
          //Fecha de modificacion
          Element e11 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e11.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("date_modified");
          e11.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText(dat_frame.toString());
          Element e12 = e11.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e12.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  frame.getID());
          //Fase
          Element e13 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e13.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("phase");
          e13.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("1.0");
          Element e14 = e13.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e14.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  frame.getID());
          //Estado
          Element e15 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e15.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("status");
          e15.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText("Proposed");
          Element e16 = e15.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e16.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  frame.getID());
          //Estilo
          Element e17 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e17.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("style");
          String style = "BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0";
          e17.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText(style);
          Element e18 = e17.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e18.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  frame.getID());

          //Si el frame está dentro de otro frame de tipo par se debe mirar
          //en que parte del parallel está
          if(frame_sup != null && frame_sup.getName().compareTo("par")==0){

              int parte = 1;

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

                  if(frame.getY() > frame_sup.getY() + ((Integer)frame_sup.separadores.get(i)).intValue()){

                      parte++;

                  }

              }

              //Orden dentro del par
              Element e19 = contmodelo.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue");
              e19.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                      setText("parOrder");
              e19.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText("" + parte);
              Element e20 = e19.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
              e20.addElement("Foundation.Core.ModelElement").addAttribute(
                      "xmi.idref",
                      frame.getID());

          }

          //Si el frame está dentro de un frame de tipo alt se debe mirar
          //en que parte del alt está
          if(frame_sup != null && frame_sup.getName().compareTo("alt")==0){

              int parte = 1;

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

                  if(frame.getY() > frame_sup.getY() + ((Integer)frame_sup.separadores.get(i)).intValue()){

                      parte++;

                  }

              }


              //Orden dentro del alt
              Element e19 = contmodelo.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue");
              e19.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                      setText("altOrder");
              e19.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText("" + parte);
              Element e20 = e19.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
              e20.addElement("Foundation.Core.ModelElement").addAttribute(
                      "xmi.idref",
                      frame.getID());

          }

          //Si el frame está dentro de un frame de tipo alt if/else se debe mirar
          //en cual de las dos partes está
          if(frame_sup != null && frame_sup.getName().compareTo("alt_else")==0){

              int parte = 1;

              if(frame.getY() > frame_sup.getY() + ((Integer)frame_sup.separadores.get(0)).intValue()){

                  parte = 2;

              }

              //Orden dentro del alt if/else
              Element e19 = contmodelo.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue");
              e19.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                      setText("altelseOrder");
              e19.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText("" + parte);
              Element e20 = e19.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
              e20.addElement("Foundation.Core.ModelElement").addAttribute(
                      "xmi.idref",
                      frame.getID());

          }


          //Se debe guardar la guarda asociada al frame y la variable utilizada
          //en esta guarda
          if((frmaux.getName().compareTo("opt")==0
             || frmaux.getName().compareTo("loop")==0 || frmaux.getName().compareTo("alt_else")==0) && (frmaux.getGuard().compareTo("")!=0)){

              //Guarda del frame
              Element e21 = contmodelo.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue");
              e21.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                      setText("Guard");
              e21.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText(frmaux.getGuard());
              Element e22 = e21.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
              e22.addElement("Foundation.Core.ModelElement").addAttribute(
                      "xmi.idref",
                      frame.getID());

          }

          //Se debe guardar el repeat asociado a un frame de tipo loop
          //y la variable utilizada en este frame
          if(frmaux.getName().compareTo("loop")==0){

              //repeat del frame
              Element e25 = contmodelo.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue");
              e25.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                      setText("Repeat");
              e25.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText(frmaux.getRepeat());
              Element e26 = e25.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
              e26.addElement("Foundation.Core.ModelElement").addAttribute(
                      "xmi.idref",
                      frame.getID());

          }

          //Se debe guardar la guarda invertida en el caso de loop y alt_else
          if(frmaux.getName().compareTo("alt_else")==0){

              //Guarda invertida del frame
              Element e27 = contmodelo.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue");
              e27.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                      setText("Guard_invert");
              e27.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText(frmaux.getGuard_negada());
              Element e28 = e27.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
              e28.addElement("Foundation.Core.ModelElement").addAttribute(
                      "xmi.idref",
                      frame.getID());

          }

          //Se debe guardar la excepcion en el caso de frame exception
          if(frmaux.getName().compareTo("Exception")==0){

              //exception del frame
              Element e29 = contmodelo.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue");
              e29.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                      setText("Exception");
              e29.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                      setText(frmaux.getException());
              Element e30 = e29.addElement(
                      "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
              e30.addElement("Foundation.Core.ModelElement").addAttribute(
                      "xmi.idref",
                      frame.getID());

          }


          //Número de secuencia
          Element e31 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e31.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("sequenceNumber");
          e31.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText(""+seq_frame);
          Element e32 = e31.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e32.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  frame.getID());

          //Número de elementos contenidos dentro del frame
          //Se cuenta doble en el caso de los frames incluidos al
          //tener que contar el principio y el final
          Element e33 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e33.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("elements");
          e33.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText(""+((2*frmaux.includeFrm.size())+frmaux.includeMsg.size()));
          Element e34 = e33.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e34.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  frame.getID());

          //También se debe almacenar si es bloqueante
          Element e35 = contmodelo.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue");
          e35.addElement("Foundation.Extension_Mechanisms.TaggedValue.tag").
                  setText("block");
          e35.addElement("Foundation.Extension_Mechanisms.TaggedValue.value").
                  setText(""+frmaux.getBlock());
          Element e36 = e35.addElement(
                  "Foundation.Extension_Mechanisms.TaggedValue.modelElement");
          e36.addElement("Foundation.Core.ModelElement").addAttribute(
                  "xmi.idref",
                  frame.getID());

          return xmiframe;
      }


      /**
       * Método que añade al documento xmi que estamos creando la parte final, que
       * es común a todos los diagramas, independientemente de su contenido.
       */
      public void XMLfin() {
          Document fin = DocumentHelper.createDocument();
          XMIDiagram();
          Element difference = raiz.addElement("XMI.difference");
          Element extension = raiz.addElement("XMI.extensions");
          extension.addAttribute("xmi.extender", "Generacion de Coreografias");
          doc.appendContent(fin);
      }

      /**
       * Método que añade el código asociado al diagrama de secuencia general.
       */
      public void XMIDiagram() {
          Document diagramas = DocumentHelper.createDocument();
          contmodelo.addComment("Diagram xmi code");
          doc.appendContent(diagramas);
      }

      /**
       * Guarda el fichero creado en memoria, cuyo contenido es el código xmi
       * del diagrama que hayamos creado, con extension xml.
       *
       * @param doc Documento que se va a almacenar en memoria
       * @throws IOException
       */
      public void XMLwrite(Document doc, String fich) throws IOException {

          OutputFormat format = OutputFormat.createPrettyPrint();
          XMLWriter writer = new XMLWriter(new FileWriter(fich),format);
          writer.write(doc);
          writer.close();

      }


    /**
     * Método que dibuja un Lifeline sobre la ventana de diseño en las coordenadas
     * indicadas
     *
     * @param e ActionEvent
     */
    public void jButtonLifeline_actionPerformed(ActionEvent e) {

        //Si el estado se ha quedado como WAITSOURCE no se ha
        //completado el mensaje y hay que eliminarlo de la lista de componentes
        if(Shared.state.compareTo(Shared.state.WAITSOURCE)==0){

            jPanelDraw.remove(0);

        }

        //Si el estado es WAITPOSITION
        if (Shared.state.compareTo(Shared.state.WAITPOSITION) == 0) {

            //Ver la posicion del ultimo frame que se haya añadido a la lista
            int posicion = 0;
            Component[] lista = jPanelDraw.getComponents();

            for (int i = 0; i < lista.length; i++) {

                //Si se trata de un frame
                if ((lista[i] instanceof MyFrame)) {

                    posicion = i;
                    break;

                }

            }

            jPanelDraw.remove(posicion);

            //Devolver el estado al valor por defecto
            Shared.state = Shared.state.DEFAULT;

        }



        //En caso de que el estado sea WAITDEST también se debe eliminar de la lista de mensajes enviados
        //del objeto que corresponda

        if(Shared.state.compareTo(Shared.state.WAITDEST)==0){

            //Recoger el mensaje que se va a borrar
            MyMessage mensaje = (MyMessage) jPanelDraw.getComponent(0);

            //Borrar el mensaje de la lista de componentes
            jPanelDraw.remove(0);

            //Buscar el componente que lo envíe y borrarlo de su lista
            Component [] lista = jPanelDraw.getComponents();

            for (int i = 0; i < lista.length; i++) {

                if (lista[i] instanceof MyActor || lista[i] instanceof MyLifeLine){

                    ((MyObjects)lista[i]).deleteSendMessage(mensaje);

                }

            }

        }

        //Dejar el estado como default
        Shared.state = Shared.State.DEFAULT;

        //Modificar las coordenas de los lifeline conforme vayamos añadiendo más
        int n_elementos = 0;

        Component [] lista = jPanelDraw.getComponents();

        for (int i = 0; i < lista.length; i++) {

            if (lista[i] instanceof MyActor || lista[i] instanceof MyLifeLine){

                n_elementos++;

            }

            //Si se encuentra un frame se debe ampliar para que también incluya
            //el nuevo rol
            if(lista[i] instanceof MyFrame){

                XYConstraints c = ((MyFrame) lista[i]).getXY();

                //Se amplia la anchura del frame
                c.setWidth(c.getWidth() + 300);

                ((MyFrame) lista[i]).editXYconstraints(c);

            }

        }

        //Ampliar la línea según mensajes y frames
        int mensajes = 0;
        int frames = 0;
        int frames_altelse = 0;

        for (int i = 0; i < lista.length; i++) {

            if (lista[i] instanceof MyMessage){

                mensajes++;

            }

            if(lista[i] instanceof MyFrame){

                if(lista[i].getName().compareTo("alt_else")!=0){

                    frames++;

                }

                else{

                    frames_altelse++;

                }

            }

        }


        XYConstraints c = new XYConstraints(50, 50, 100, 1000 + mensajes * 30 + frames * 60 + frames_altelse * 90);

        if (n_elementos != 0){

            //Desplazamiento en el eje x según el número de elementos
            c = new XYConstraints(50 + n_elementos * 300, 50, 100, 1000 + mensajes * 30 + frames * 60 + frames_altelse * 90);

        }

        //Asignarle al lifeline un nombre que todavía no se haya utilizado
        String nombre = "Lifeline";
        int contador = 1;
        boolean existe;

        do{

            existe = false;

            for (int i = 0; i < lista.length; i++) {

                //Si se trata de un componente con nombre se debe mirar que no coincida con el nuevo nombre
                if((lista[i] instanceof MyLifeLine || lista[i] instanceof MyActor || lista[i] instanceof MyMessage)
                   && nombre.compareTo(lista[i].getName())==0){

                    existe = true;
                    nombre = "Lifeline" + contador;
                    contador++;
                    break;

                }

            }

        }while(existe);

        MyLifeLine life = new MyLifeLine(nombre, c);
        jPanelDraw.add(life, c, 0);
        statusBar2.setText(" New LifeLine");
        int id = Math.abs(ident.nextInt());
        String idlifeline = "LF_" + id;
        life.setID(idlifeline);
        repaint();
        jPanelDraw.updateUI();

    }


    /**
     * Método que dibuja un actor sobre la ventana de diseño en las coordenadas
     * indicadas
     *
     * @param e ActionEvent
     */
    public void jButtonActor_actionPerformed(ActionEvent e) {

        //Si el estado se ha quedado como WAITSOURCE no se ha
        //completado el mensaje y hay que eliminarlo de la lista de componentes
        if(Shared.state.compareTo(Shared.state.WAITSOURCE)==0){

            jPanelDraw.remove(0);

        }

        //Si el estado es WAITPOSITION
        if (Shared.state.compareTo(Shared.state.WAITPOSITION) == 0) {

            //Ver la posicion del ultimo frame que se haya añadido a la lista
            int posicion = 0;
            Component[] lista = jPanelDraw.getComponents();

            for (int i = 0; i < lista.length; i++) {

                //Si se trata de un frame
                if ((lista[i] instanceof MyFrame)) {

                    posicion = i;
                    break;

                }

            }

            jPanelDraw.remove(posicion);

            //Devolver el estado al valor por defecto
            Shared.state = Shared.state.DEFAULT;

        }


        //En caso de que el estado sea WAITDEST también se debe eliminar de la lista de mensajes enviados
        //del objeto que corresponda

        if(Shared.state.compareTo(Shared.state.WAITDEST)==0){

            //Recoger el mensaje que se va a borrar
            MyMessage mensaje = (MyMessage) jPanelDraw.getComponent(0);

            //Borrar el mensaje de la lista de componentes
            jPanelDraw.remove(0);

            //Buscar el componente que lo envíe y borrarlo de su lista
            Component [] lista = jPanelDraw.getComponents();

            for (int i = 0; i < lista.length; i++) {

                if (lista[i] instanceof MyActor || lista[i] instanceof MyLifeLine){

                    ((MyObjects)lista[i]).deleteSendMessage(mensaje);

                }

            }

        }

        //Dejar el estado como default
        Shared.state = Shared.State.DEFAULT;

        //Modificar las coordenas de los Actors conforme vayamos añadiendo más
        int n_elementos = 0;

        Component [] lista = jPanelDraw.getComponents();

        for (int i = 0; i < lista.length; i++) {

            if (lista[i] instanceof MyActor || lista[i] instanceof MyLifeLine){

                n_elementos++;

            }

            //Si se encuentra un frame se debe ampliar para que también incluya
            //el nuevo rol
            if (lista[i] instanceof MyFrame) {

                XYConstraints c = ((MyFrame) lista[i]).getXY();

                //Se amplia la anchura del frame
                c.setWidth(c.getWidth() + 300);

                ((MyFrame) lista[i]).editXYconstraints(c);

            }

        }

        //Ampliar la línea según mensajes y frames
        int mensajes = 0;
        int frames = 0;
        int frames_altelse = 0;

        for (int i = 0; i < lista.length; i++) {

            if (lista[i] instanceof MyMessage){

                mensajes++;

            }

            if(lista[i] instanceof MyFrame){

                if(lista[i].getName().compareTo("alt_else")!=0){

                    frames++;

                }

                else{

                    frames_altelse++;

                }

            }

        }

        XYConstraints c = new XYConstraints(50, 35, 100, 1000 + mensajes * 30 + frames * 60 + frames_altelse * 90);

        if (n_elementos != 0){

            //Desplazamiento en el eje x según el número de elementos
            c = new XYConstraints(50 + n_elementos * 300, 35, 100, 1000 + mensajes * 30 + frames * 60 + frames_altelse * 90);

        }

        //Asignarle al actor un nombre que todavía no se haya utilizado
        String nombre = "Actor";
        int contador = 1;
        boolean existe;

        do{

            existe = false;

            for (int i = 0; i < lista.length; i++) {

                //Si se trata de un componente con nombre se debe mirar que no coincida con el nuevo nombre
                if((lista[i] instanceof MyLifeLine || lista[i] instanceof MyActor || lista[i] instanceof MyMessage)
                   && nombre.compareTo(lista[i].getName())==0){

                    existe = true;
                    nombre = "Actor" + contador;
                    contador++;
                    break;

                }

            }

        }while(existe);


        MyActor act = new MyActor(nombre, c);
        jPanelDraw.add(act, c, 0);
        statusBar2.setText("New Actor");

        int id = Math.abs(ident.nextInt());
        String idactor = "ACT_" + id;
        act.setID(idactor);
        repaint();
        jPanelDraw.updateUI();

    }

    /**
     * Método que dibuja un mensaje sobre la ventana de diseño en las coordenadas
     * indicadas
     *
     * @param e ActionEvent
     */
    public void jButtonMessage_actionPerformed(ActionEvent e) {

        //Si el estado se ha quedado como WAITSOURCE no se ha
        //completado el mensaje y hay que eliminarlo de la lista de componentes
        if(Shared.state.compareTo(Shared.state.WAITSOURCE)==0){

            jPanelDraw.remove(0);

        }

        //Si el estado es WAITPOSITION
        if (Shared.state.compareTo(Shared.state.WAITPOSITION) == 0) {

            //Ver la posicion del ultimo frame que se haya añadido a la lista
            int posicion = 0;
            Component[] lista = jPanelDraw.getComponents();

            for (int i = 0; i < lista.length; i++) {

                //Si se trata de un frame
                if ((lista[i] instanceof MyFrame)) {

                    posicion = i;
                    break;

                }

            }

            jPanelDraw.remove(posicion);

            //Devolver el estado al valor por defecto
            Shared.state = Shared.state.DEFAULT;

        }



        //En caso de que el estado sea WAITDEST también se debe eliminar de la lista de mensajes enviados
        //del objeto que corresponda

        if(Shared.state.compareTo(Shared.state.WAITDEST)==0){

            //Recoger el mensaje que se va a borrar
            MyMessage mensaje = (MyMessage) jPanelDraw.getComponent(0);

            //Borrar el mensaje de la lista de componentes
            jPanelDraw.remove(0);

            //Buscar el componente que lo envíe y borrarlo de su lista
            Component [] lista = jPanelDraw.getComponents();

            for (int i = 0; i < lista.length; i++) {

                if (lista[i] instanceof MyActor || lista[i] instanceof MyLifeLine){

                    ((MyObjects)lista[i]).deleteSendMessage(mensaje);

                }

            }

        }



        //Por el momento no se da elección entre mensaje síncrono o asíncrono
/*
        //Se debe llamar a un diálogo que permita seleccionar el tipo de mensaje
        JOptionPane optionPane= new JOptionPane();
        ButtonGroup buttonGroup = new ButtonGroup();
        JRadioButton radioButton1 = new JRadioButton("Synchronous",true);
        JRadioButton radioButton2 = new JRadioButton("Asynchronous",true);
        String type = "Type of message:";
        Object[] radioButtonArray = {type, radioButton1, radioButton2};

        buttonGroup.add(radioButton1);
        buttonGroup.add(radioButton2);

        Object[] options = {"Ok","Cancel"};
        int ret = optionPane.showOptionDialog(optionPane,radioButtonArray,"Type selection",optionPane.YES_NO_OPTION,optionPane.QUESTION_MESSAGE, null, options, null);

        if (ret==JOptionPane.YES_OPTION){

            XYConstraints c = new XYConstraints(0, 0, 60,
                                            Constants.getFontsize() + 12);

            if(radioButton1.isSelected()){
                Shared.msg = new MyMessage(c, false);
            }
            else{
                Shared.msg = new MyMessage(c, true);
            }
        }
*/
        XYConstraints c = new XYConstraints(0, 0, 60,Constants.getFontsize() + 12);
        Shared.msg = new MyMessage(c, false);


            //Asignarle al mensaje un nombre que todavía no se haya utilizado
            Component[] lista = jPanelDraw.getComponents();
            String nombre = "Message";
            int contador = 1;
            boolean existe;

            do {

                existe = false;

                for (int i = 0; i < lista.length; i++) {

                    //Si se trata de un componente con nombre se debe mirar que no coincida con el nuevo nombre
                    if ((lista[i] instanceof MyLifeLine || lista[i] instanceof MyActor ||
                         lista[i] instanceof MyMessage)
                        && nombre.compareTo(lista[i].getName()) == 0) {

                        existe = true;
                        nombre = "Message" + contador;
                        contador++;
                        break;

                    }

                }

            } while (existe);

            Shared.msg.setName(nombre);
            Shared.state = Shared.State.WAITSOURCE;
            jPanelDraw.add(Shared.msg, c, 0);
            statusBar2.setText(" Click the first element");

            int id = Math.abs(ident.nextInt());
            String idmessage = "MSG_" + id;
            Shared.msg.setID(idmessage);

     }

    /**
       * Limpia el contenido del JPanel, que muestra el diagrama de secuencia
       * generado.
       *
       * @param e ActionEvent
       */
      public void jButton42_actionPerformed(ActionEvent e) {
          int num= jPanelDraw.getComponentCount();
          if (num==0){
              JOptionPane optionPane= new JOptionPane();
              //optionPane.showMessageDialog(jPanelDraw,"There is not diagram to delete");
              Object[] options = {"Ok"};
              optionPane.showOptionDialog(optionPane,"There is not diagram to delete","Message",optionPane.YES_NO_OPTION,optionPane.INFORMATION_MESSAGE, null, options, null);
          }
          else{

              //Colorear todos los componentes del panel de rojo
              Component[] lista = jPanelDraw.getComponents();

              for(int i = 0; i < lista.length; i++){

                  if(lista[i] instanceof MyObjects){

                      ((MyObjects)lista[i]).setCol(Color.red);

                  }

              }

              //Se debe repintar el panel que contiene a los objetos
              jPanelDraw.repaint();
              jPanelDraw.updateUI();

              JOptionPane optionPane= new JOptionPane();
              Object[] options = {"Yes","No","Cancel"};
              int ret=optionPane.showOptionDialog(optionPane,"Do you want to delete the diagram?","Delete the diagram",optionPane.YES_NO_CANCEL_OPTION,optionPane.QUESTION_MESSAGE, null, options, null);
              if (ret==JOptionPane.YES_OPTION){
                  jPanelDraw.removeAll();
                  statusBar2.setText("Diagram deleted");
                  //jPanelDraw.add(jToolBar1, new XYConstraints(0, 0, 1200, -1));
                  repaint();

                  //Volver también a dejar el área de texto con su valor inicial
                  jTextArea5.setText("XMI Code");

                  //Dejar la variable de estado a su valor por defecto
                  Shared.state = Shared.state.DEFAULT;

              }

              //Colorear todos los componentes del panel de negro nuevamente

              for(int i = 0; i < lista.length; i++){

                  if(lista[i] instanceof MyObjects){

                      ((MyObjects)lista[i]).setCol(Color.black);

                  }

              }

              //Se debe repintar el panel que contiene a los objetos
              jPanelDraw.repaint();
              jPanelDraw.updateUI();


          }
      }

      public void jMenuFileOpenUML_actionPerformed(ActionEvent e) {

        FileDialog fd = new FileDialog(new JFrame("prueba"), "Open UML Diagram",
                                         FileDialog.LOAD);
          fd.show();

          if (fd.getFile() != null) {
              String path = fd.getDirectory() + fd.getFile();
              try{

                 //Abrir el diagrama de secuencia

                 //jPanelDraw.setLayout(null);

                 jPanelDraw.removeAll();
                 statusBar2.setText("Open file: "+ fd.getFile());
                 //jPanelDraw.add(jToolBar1, new XYConstraints(0, 0, 1200, -1));
                 repaint();

                 //Dejar vacía el área de texto
                 jTextArea5.setText("XMI code");

                 //Dejar la variable de estado a su valor por defecto
                 Shared.state = Shared.state.DEFAULT;

                 FileInputStream fis = new FileInputStream(path);
                 ObjectInputStream ois = new ObjectInputStream(fis);
                 Component [] lista2 = (Component [])ois.readObject();
                 for (int k=0;k<lista2.length;k++){
                     System.out.println("Añadiendo los componentes al panel");
                     Component nuevo = (Component)lista2[k];
                     if(nuevo instanceof MyLifeLine){
                         XYConstraints c = new XYConstraints(nuevo.getX(),
                                 nuevo.getY(), nuevo.getWidth(), nuevo.getHeight());

                         MyLifeLine life = new MyLifeLine(nuevo.getName(),c);
                         life.setID(((MyObjects)nuevo).getID());

                         //Recuperar los mensajes enviados y recibidos
                         life.sendedMsg = ((MyObjects)nuevo).sendedMsg;
                         life.receivedMsg = ((MyObjects)nuevo).receivedMsg;

                         //Recuperar las variables definidas
                         life.setVariables(((MyObjects)nuevo).getVariables());

                         jPanelDraw.add(life, c, 0);
                     }
                     if(nuevo instanceof MyActor){
                         XYConstraints c = new XYConstraints(nuevo.getX(),
                                 nuevo.getY(), nuevo.getWidth(), nuevo.getHeight());

                         MyActor actor = new MyActor(nuevo.getName(),c);
                         actor.setID(((MyObjects)nuevo).getID());

                         //Recuperar los mensajes enviados y recibidos
                         actor.sendedMsg = ((MyObjects)nuevo).sendedMsg;
                         actor.receivedMsg = ((MyObjects)nuevo).receivedMsg;

                         //Recuperar las variables definidas
                         actor.setVariables(((MyObjects)nuevo).getVariables());

                         jPanelDraw.add(actor, c, 0);
                     }

                     if(nuevo instanceof MyMessage){

                         XYConstraints c = new XYConstraints(nuevo.getX(),
                                 nuevo.getY(), nuevo.getWidth(), nuevo.getHeight());

                         MyMessage message = new MyMessage(c,((MyMessage)nuevo).getAsin());
                         message.setID(((MyObjects)nuevo).getID());

                         //Recuperar todos los atributos del mensage
                         message.setName(nuevo.getName());
                         message.source = ((MyMessage)nuevo).source;
                         message.dest = ((MyMessage)nuevo).dest;
                         message.inverted = ((MyMessage)nuevo).inverted;
                         message.setUpdates(((MyMessage)nuevo).getUpdates());
                         message.setTimeout_clock(((MyMessage)nuevo).getTimeout_clock());
                         message.setTimeout(((MyMessage)nuevo).getTimeout());
                         message.setSend_variable(((MyMessage)nuevo).getSend_variable());
                         message.setReceive_variable(((MyMessage)nuevo).getReceive_variable());
                         message.setException_variable(((MyMessage)nuevo).getException_variable());

                         jPanelDraw.add(message, c, 0);

                     }

                 }

                 //Recorrer la lista a la inversa para cargar los frames en el orden correcto
                 for (int k=lista2.length - 1;k >= 0;k--){

                     Component nuevo = (Component)lista2[k];

                     if(nuevo instanceof MyFrame){

                         Component [] lista = jPanelDraw.getComponents();

                         int posicion = 0;

                         for (int i = lista.length - 1; i > 0; i--) {

                             //Si no se trata de un frame
                             if (!(lista[i] instanceof MyFrame)) {

                                 posicion = i + 1;
                                 break;

                             }

                         }

                         XYConstraints c = new XYConstraints(nuevo.getX(),
                                 nuevo.getY(), nuevo.getWidth(), nuevo.getHeight());

                         MyFrame frame = new MyFrame(c,nuevo.getName());
                         frame.setID(((MyObjects)nuevo).getID());

                         //Recuperar todos los atributos del frame
                         frame.includeMsg = ((MyObjects)nuevo).includeMsg;
                         frame.includeFrm = ((MyObjects)nuevo).includeFrm;
                         frame.separadores = ((MyFrame)nuevo).separadores;
                         frame.setGuard(((MyFrame)nuevo).getGuard());
                         frame.setRepeat(((MyFrame)nuevo).getRepeat());
                         frame.colocado = true;
                         frame.setBlock(((MyFrame)nuevo).getBlock());
                         frame.setVariablesGuarda(((MyFrame)nuevo).getVariablesGuarda());
                         frame.setVariablesRepeat(((MyFrame)nuevo).getVariablesRepeat());
                         frame.setGuard_negada(((MyFrame)nuevo).getGuard_negada());
                         frame.setException(((MyFrame)nuevo).getException());
                         frame.setException_name(((MyFrame)nuevo).getException_name());

                         jPanelDraw.add(frame, c, posicion);

                     }

                 }


                 //Una vez se llega a este punto se deben rellenar las listas de
                 //mensajes y frames con los nuevos objetos en vez de con los viejos

                 Component[] lista = jPanelDraw.getComponents();

                  for (int i = 0; i < lista.length; i++) {

                      if(lista[i] instanceof MyLifeLine || lista[i] instanceof MyActor){

                          MyObjects objeto = (MyObjects)lista[i];

                          //Modificar la lista de mensajes enviados
                          for(int j = 0; j < objeto.sendedMsg.size(); j++){

                              int y = ((MyMessage)(objeto.sendedMsg.get(j))).getY();

                              objeto.sendedMsg.remove(j);

                              //Buscar el mensaje con la misma y
                              for (int k = 0; k < lista.length; k++) {

                                  if(lista[k] instanceof MyMessage && ((MyMessage)lista[k]).getXY().getY() == y){

                                      objeto.sendedMsg.add(j,lista[k]);

                                  }

                              }

                          }

                          //Modificar la lista de mensajes recibidos
                          for(int j = 0; j < objeto.receivedMsg.size(); j++){

                              int y = ((MyMessage)(objeto.receivedMsg.get(j))).getY();

                              objeto.receivedMsg.remove(j);

                              //Buscar el mensaje con la misma y
                              for (int k = 0; k < lista.length; k++) {

                                  if(lista[k] instanceof MyMessage && ((MyMessage)lista[k]).getXY().getY() == y){

                                      objeto.receivedMsg.add(j,lista[k]);

                                  }

                              }

                          }

                     }

                     if(lista[i] instanceof MyFrame){

                         MyObjects objeto = (MyObjects)lista[i];

                         //Modificar la lista de mensajes incluidos
                         for(int j = 0; j < objeto.includeMsg.size(); j++){

                              int y = ((MyMessage)(objeto.includeMsg.get(j))).getY();

                              objeto.includeMsg.remove(j);

                              //Buscar el mensaje con la misma y
                              for (int k = 0; k < lista.length; k++) {

                                  if(lista[k] instanceof MyMessage && ((MyMessage)lista[k]).getXY().getY() == y){

                                      objeto.includeMsg.add(j,lista[k]);

                                  }

                              }

                         }

                         //Modificar la lista de frames incluidos
                         for(int j = 0; j < objeto.includeFrm.size(); j++){

                              int y = ((MyFrame)(objeto.includeFrm.get(j))).getY();

                              objeto.includeFrm.remove(j);

                              //Buscar el frame con la misma y
                              for (int k = 0; k < lista.length; k++) {

                                  if(lista[k] instanceof MyFrame && ((MyFrame)lista[k]).getXY().getY() == y){

                                      objeto.includeFrm.add(j,lista[k]);

                                  }

                              }

                         }

                     }

                  }

                 repaint();

                 System.out.print("Deserealizacion realizada correctamente");
                 ois.close();

              }
              catch(Exception e1){
                  System.out.println("Error al leer el fichero");
                  System.out.println(e1);

                  jTextArea5.setText("XMI code");

                  //Mostrar un cuadro de error de que es imposible cargar el fichero
                  JOptionPane optionPane= new JOptionPane();
                  Object[] options = {"Ok"};
                  optionPane.showOptionDialog(optionPane,
                                              "File could not be opened",
                                              "Message", optionPane.YES_NO_OPTION,
                                              optionPane.ERROR_MESSAGE, null,
                                              options, null);



              }
          }
    }


    public void jMenuFileSaveUML_actionPerformed(ActionEvent e) {

        guardar(e);

    }

    public void jButtonUPPAAL_actionPerformed(ActionEvent e) {

        String s = null;

        // Lanzar la herramienta de UPPAAL

        try {

            //Si no se a guardado ningún Timed Automata
            if(TimedAutomata.compareTo("")==0){

                JOptionPane optionPane= new JOptionPane();
                Object[] options = {"Ok"};
                optionPane.showOptionDialog(optionPane,"You have to save a timed automata before","Error",optionPane.YES_NO_OPTION,optionPane.INFORMATION_MESSAGE, null, options, null);

            }

            //Si se ha guardado alguno se abre la herramienta de UPPAAL con este automata
            else{

                System.out.println(TimedAutomata);
                Process p = Runtime.getRuntime().exec("java -jar uppaal.jar \""+TimedAutomata.replaceAll(" ","%20")+"\"", null,
                                                      new File("uppaal-4.0.6"));
            }
        }
        catch (IOException ex) {
            JOptionPane optionPane= new JOptionPane();
            Object[] options = {"Ok"};
            optionPane.showOptionDialog(optionPane,"Could not find the UPPAAL tool","Error",optionPane.YES_NO_OPTION,optionPane.INFORMATION_MESSAGE, null, options, null);

      }


    }

    public void jButtonFrame_actionPerformed(ActionEvent actionEvent) {

        //Si el estado se ha quedado como WAITSOURCE no se ha
        //completado el mensaje y hay que eliminarlo de la lista de componentes
        if(Shared.state.compareTo(Shared.state.WAITSOURCE)==0){

            jPanelDraw.remove(0);

        }

        //Si el estado es WAITPOSITION
        if (Shared.state.compareTo(Shared.state.WAITPOSITION) == 0) {

            //Ver la posicion del ultimo frame que se haya añadido a la lista
            int posicion = 0;
            Component[] lista = jPanelDraw.getComponents();

            for (int i = 0; i < lista.length; i++) {

                //Si se trata de un frame
                if ((lista[i] instanceof MyFrame)) {

                    posicion = i;
                    break;

                }

            }

            jPanelDraw.remove(posicion);

            //Devolver el estado al valor por defecto
            Shared.state = Shared.state.DEFAULT;

        }


        //En caso de que el estado sea WAITDEST también se debe eliminar de la lista de mensajes enviados
        //del objeto que corresponda

        if(Shared.state.compareTo(Shared.state.WAITDEST)==0){

            //Recoger el mensaje que se va a borrar
            MyMessage mensaje = (MyMessage) jPanelDraw.getComponent(0);

            //Borrar el mensaje de la lista de componentes
            jPanelDraw.remove(0);

            //Buscar el componente que lo envíe y borrarlo de su lista
            Component [] lista = jPanelDraw.getComponents();

            for (int i = 0; i < lista.length; i++) {

                if (lista[i] instanceof MyActor || lista[i] instanceof MyLifeLine){

                    ((MyObjects)lista[i]).deleteSendMessage(mensaje);

                }

            }

        }

        //Dejar el estado como default
        Shared.state = Shared.State.DEFAULT;

        //En primer lugar se debe mirar que haya algún actor o lifeline
        int n_roles = 0;

        Component lista [] = jPanelDraw.getComponents();

        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){

                n_roles++;

            }

        }

        //Si no hay roles
        if(n_roles == 0){

            JOptionPane optionPane= new JOptionPane();
            Object[] options = {"Ok"};
            optionPane.showOptionDialog(optionPane,"There are not actors or lifelines","Error",optionPane.YES_NO_OPTION,optionPane.INFORMATION_MESSAGE, null, options, null);

        }

        else{

            //Se debe llamar a un diálogo que permita seleccionar el tipo de frame
            JOptionPane optionPane= new JOptionPane();
            ButtonGroup buttonGroup = new ButtonGroup();
            JRadioButton radioButton1 = new JRadioButton("Alt alternative",true);
            JRadioButton radioButton2 = new JRadioButton("Alt if/else",true);
            JRadioButton radioButton3 = new JRadioButton("Opt optional");
            JRadioButton radioButton4 = new JRadioButton("Loop");
            JRadioButton radioButton5 = new JRadioButton("Par parallel");
            JRadioButton radioButton6 = new JRadioButton("Exception");
            String type = "Type of frame:";
            Object[] radioButtonArray = {type, radioButton1, radioButton2, radioButton3, radioButton4, radioButton5, radioButton6};

            buttonGroup.add(radioButton1);
            buttonGroup.add(radioButton2);
            buttonGroup.add(radioButton3);
            buttonGroup.add(radioButton4);
            buttonGroup.add(radioButton5);
            buttonGroup.add(radioButton6);

            //JOptionPane.showConfirmDialog(optionPane, radioButtonArray, "Type selection", optionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
            Object[] options = {"Ok","Cancel"};
            int ret = optionPane.showOptionDialog(optionPane,radioButtonArray,"Type selection",optionPane.YES_NO_OPTION,optionPane.QUESTION_MESSAGE, null, options, null);

            if (ret==JOptionPane.YES_OPTION){

                XYConstraints c = new XYConstraints();
                MyFrame frame = new MyFrame(c,"tipo");

                //Recoger el tipo de frame que se va a crear

                //Si es de tipo Alt
                if(radioButton1.isSelected()){

                    String tipo = "alt";

                    //Su anchura variará según el número de roles
                    c = new XYConstraints(50, 140, n_roles * 100 + (n_roles - 1) * 200, 55);
                    frame = new MyFrame(c, tipo);
                }

                //Si es de tipo Alt if/else
                if(radioButton2.isSelected()){

                    String tipo = "alt_else";

                    //Su anchura variará según el número de roles
                    c = new XYConstraints(50, 140, n_roles * 100 + (n_roles - 1) * 200, 85);
                    frame = new MyFrame(c, tipo);

                    //Añadir el separador de este tipo de alt

                    frame.addSeparador(28);

                }

                //Si es de tipo Opt
                if(radioButton3.isSelected()){

                    String tipo = "opt";

                    //Su anchura variará según el número de roles
                    c = new XYConstraints(50, 140, n_roles * 100 + (n_roles - 1) * 200, 55);
                    frame = new MyFrame(c, tipo);
                }

                //Si es de tipo loop
                if(radioButton4.isSelected()){

                    String tipo = "loop";

                    //Su anchura variará según el número de roles
                    c = new XYConstraints(50, 140, n_roles * 100 + (n_roles - 1) * 200, 55);
                    frame = new MyFrame(c, tipo);
                }

                //Si es de tipo par
                if(radioButton5.isSelected()){

                    String tipo = "par";

                    //Su anchura variará según el número de roles
                    c = new XYConstraints(50, 140, n_roles * 100 + (n_roles - 1) * 200, 55);
                    frame = new MyFrame(c, tipo);
                }

                //Si es de tipo exception
                if(radioButton6.isSelected()){

                    String tipo = "Exception";

                    //Su anchura variará según el número de roles
                    c = new XYConstraints(50, 140, n_roles * 100 + (n_roles - 1) * 200, 55);
                    frame = new MyFrame(c, tipo);
                }

                Shared.frm = frame;

                //Añadir como primer frame dentro de los frames que haya en la lista
                int posicion = 0;

                for (int i = lista.length - 1; i > 0; i--) {

                    //Si no se trata de un frame
                    if (!(lista[i] instanceof MyFrame)) {

                        posicion = i + 1;
                        break;

                    }

                }

                jPanelDraw.add(frame, c, posicion);

                int id = Math.abs(ident.nextInt());
                String idframe = "FR_" + id;
                frame.setID(idframe);

                //Si no se trata de un frame de excepción
                if(!radioButton6.isSelected()){
                    statusBar2.setText("Click the position in the diagram");
                    Shared.state = Shared.State.WAITPOSITION;
                }

                //Si se trata de un frame de excepción
                else{

                    //Llamar al método que lo deje en la posición adecuada
                    Shared.frm.addPositionFrameException(Shared.frm);
                    Shared.state = Shared.State.DEFAULT;
                    ((TraduccionMarco) (((JPanel)(jPanelDraw.getParent())).getRootPane().getParent())).modifyMessage("Frame placed");

                }


                repaint();
            }
        }

    }

    //Método para borrar el contenido del área de código
    public void deleteCode(){

        jTextArea5.setText("XMI Code");

    }

    //Método para modificar el texto del mensaje que se muestra
    public void modifyMessage(String text){

        statusBar2.setText(text);

    }

    private void exportar(ActionEvent e){

        int num= jPanelDraw.getComponentCount();
          if (num==1){
              JOptionPane optionPane= new JOptionPane();
              //optionPane.showMessageDialog(jPanelDraw,"There is not diagram to delete");
              Object[] options = {"Ok"};
              optionPane.showOptionDialog(optionPane,"There is not diagram to export","Message",optionPane.YES_NO_OPTION,optionPane.INFORMATION_MESSAGE, null, options, null);
          }

          else{

              //Se debe mirar que en todos los frames que tengan guarda se haya establecido una condición de guarda
              //y que todos los frames tengan algún mensaje en su interior
              //Se debe mirar también que un alt_else tenga contenido en ambas partes
              boolean sin_guarda = false;
              boolean sin_repeat = false;
              boolean sin_mensaje = false;
              boolean sin_mensaje_if = false;
              boolean sin_mensaje_else = false;
              boolean alt_incorrecto = false;

              //Si se trata de un frame de excepción se debe mirar que trate alguna excepción
              boolean sin_excepcion = false;

              Component[] lista1 = jPanelDraw.getComponents();

              for (int i = 0; i < lista1.length; i++){

                  if(lista1[i] instanceof MyFrame
                          && ((lista1[i].getName().compareTo("opt")==0) || (lista1[i].getName().compareTo("alt_else")==0))
                          && (((MyFrame)lista1[i])).getGuard().compareTo("")==0){

                      sin_guarda = true;
                      break;

                  }

                  if(lista1[i] instanceof MyFrame
                          && lista1[i].getName().compareTo("loop")==0
                          && (((MyFrame)lista1[i])).getRepeat().compareTo("")==0){

                      sin_repeat = true;
                      break;

                  }


                  if(lista1[i] instanceof MyFrame && lista1[i].getName().compareTo("alt_else")!=0 && (((MyFrame)lista1[i])).includeMsg.size()==0){
                      sin_mensaje = true;
                      break;
                  }

                  //Ver si existe algún contenido en ambas partes de los alt_else
                  if(lista1[i] instanceof MyFrame && lista1[i].getName().compareTo("alt_else")==0){

                      sin_mensaje_if = true;
                      sin_mensaje_else = true;

                      //Recorrer los mensajes incluidos

                      ArrayList l_mensajes = (((MyFrame)lista1[i])).includeMsg;

                      for(int j = 0; j < l_mensajes.size(); j++){

                          MyMessage men = (MyMessage)l_mensajes.get(j);

                          if(men.getY() < ((MyFrame)lista1[i]).getY() + ((Integer)((MyFrame)lista1[i]).separadores.get(0)).intValue()){

                              sin_mensaje_if = false;

                          }

                          else{

                              sin_mensaje_else = false;

                          }

                      }

                      if(sin_mensaje_if || sin_mensaje_else){

                          break;

                      }

                  }

                  //También se debe mirar que dentro de cada una de las partes de un frame de tipo alt
                  //sólo haya un frame o una secuencia de mensajes

                  if(lista1[i] instanceof MyFrame && lista1[i].getName().compareTo("alt")==0){

                      MyFrame frame = (MyFrame) lista1[i];
                      int y_inicio,y_fin,y_frame=frame.getY();

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

                          int frame_count = 0;
                          int message_count = 0;

                          if(j==0){
                              y_inicio = y_frame;
                              y_fin = y_frame + ((Integer) frame.separadores.get(0)).intValue();
                          }
                          else{
                              y_inicio = y_frame + ((Integer) frame.separadores.get(j - 1)).intValue();
                              y_fin = y_frame + ((Integer) frame.separadores.get(j)).intValue();
                          }

                          //Ver los elementos de la lista contenidos en ese tramo
                          Component[] lista2 = jPanelDraw.getComponents();

                          for (int k = 0; k < lista2.length; k++){

                              //Comparación de la coordenada y
                              if(lista2[k].getY() > y_inicio && lista2[k].getY() < y_fin){

                                  //Se  debe comprobar que no haya ningún frame más interior en el
                                  //que esté anidado el elemento
                                  boolean anidado = false;

                                  Component[] lista3 = jPanelDraw.getComponents();

                                  for (int l = 0; l < lista3.length; l++){

                                      if(lista3[l] instanceof MyFrame && lista3[l].getY() > y_inicio && lista3[l].getY() < y_fin
                                              && lista3[l].getY() < lista2[k].getY() && lista3[l].getY() + lista3[l].getHeight() > lista2[k].getY()){

                                          anidado = true;
                                          break;

                                      }

                                  }

                                  if(!anidado){
                                      if (lista2[k] instanceof MyMessage)
                                          message_count++;
                                      if (lista2[k] instanceof MyFrame)
                                          frame_count++;
                                  }
                              }

                          }

                          //Si vemos que no es válido acabamos
                          if(frame_count >= 2 || (frame_count == 1 && message_count > 0)){

                              alt_incorrecto = true;
                              break;
                          }

                      }
                  }

                  if(alt_incorrecto) break;

                  if(lista1[i] instanceof MyFrame
                          && lista1[i].getName().compareTo("Exception")==0
                          && (((MyFrame)lista1[i])).getException().compareTo("")==0){

                      sin_excepcion = true;
                      break;

                  }


              }

              if(sin_guarda){

                  JOptionPane optionPane= new JOptionPane();
                  Object[] options = {"Ok"};
                  optionPane.showOptionDialog(optionPane, "There are frames without guard condition",
                                              "Message", optionPane.YES_NO_OPTION,
                                              optionPane.INFORMATION_MESSAGE, null, options, null);

              }

              else if(sin_repeat){

                  JOptionPane optionPane= new JOptionPane();
                  Object[] options = {"Ok"};
                  optionPane.showOptionDialog(optionPane, "There are frames without repeat condition",
                                              "Message", optionPane.YES_NO_OPTION,
                                              optionPane.INFORMATION_MESSAGE, null, options, null);

              }


              else if(sin_mensaje){

                  JOptionPane optionPane= new JOptionPane();
                  Object[] options = {"Ok"};
                  optionPane.showOptionDialog(optionPane, "There are frames without messages",
                                              "Message", optionPane.YES_NO_OPTION,
                                              optionPane.INFORMATION_MESSAGE, null, options, null);

              }

              else if(sin_mensaje_if || sin_mensaje_else){

                  JOptionPane optionPane= new JOptionPane();
                  Object[] options = {"Ok"};
                  optionPane.showOptionDialog(optionPane, "There are \"alt if/else\" frames without messages in one part",
                                              "Message", optionPane.YES_NO_OPTION,
                                              optionPane.INFORMATION_MESSAGE, null, options, null);

              }


              else if(alt_incorrecto){

                  JOptionPane optionPane= new JOptionPane();
                  Object[] options = {"Ok"};
                  optionPane.showOptionDialog(optionPane, "\"alt alternative\" frames can have only one frame or several messages in each part",
                                              "Message", optionPane.YES_NO_OPTION,
                                              optionPane.INFORMATION_MESSAGE, null, options, null);

              }

              else if(sin_excepcion){

                  JOptionPane optionPane= new JOptionPane();
                  Object[] options = {"Ok"};
                  optionPane.showOptionDialog(optionPane, "There are exception frames without exception",
                                              "Message", optionPane.YES_NO_OPTION,
                                              optionPane.INFORMATION_MESSAGE, null, options, null);

              }


              else{

                  boolean primero = true;
                  int mensajes = 0;

                  //Llevar la cuenta de cada tipo de frame
                  int alt_count = 0;
                  int opt_count = 0;
                  int loop_count = 0;
                  int par_count = 0;
                  int alt_else_count = 0;
                  int exception_count = 0;

                  FileDialog fd = new FileDialog(new Frame(), "Export to XMI File...",
                                                 FileDialog.SAVE);
                  fd.setFile("*.xml");
                  fd.show();

                  if (fd.getDirectory() != null) {
                      if (fd.getFile() != null) {
                          String stt = fd.getDirectory();
                          String st = fd.getFile();
                          fichero = stt + st;
                          statusBar2.setText("Export file " + fichero);

                          ruta = fd.getDirectory() + fd.getFile();
                          doc = XMLDocument();

                          //Si el estado se ha quedado como WAITSOURCE no se ha
                          //completado el mensaje y hay que eliminarlo de la lista de componentes
                          if (Shared.state.compareTo(Shared.state.WAITSOURCE) == 0) {

                              jPanelDraw.remove(0);

                              //Devolver el estado al valor por defecto
                              Shared.state = Shared.state.DEFAULT;

                          }

                          //Si el estado es WAITPOSITION
                          if (Shared.state.compareTo(Shared.state.WAITPOSITION) == 0) {

                              //Ver la posicion del ultimo frame que se haya añadido a la lista
                              int posicion = 0;
                              Component[] lista = jPanelDraw.getComponents();

                              for (int i = 0; i < lista.length; i++) {

                                  //Si se trata de un frame
                                  if ((lista[i] instanceof MyFrame)) {

                                      posicion = i;
                                      break;

                                  }

                              }

                              jPanelDraw.remove(posicion);

                              //Devolver el estado al valor por defecto
                              Shared.state = Shared.state.DEFAULT;

                          }

                          //En caso de que el estado sea WAITDEST también se debe eliminar de la lista de mensajes enviados
                          //del objeto que corresponda

                          if (Shared.state.compareTo(Shared.state.WAITDEST) == 0) {

                              //Recoger el mensaje que se va a borrar
                              MyMessage mensaje = (MyMessage) jPanelDraw.getComponent(0);

                              //Borrar el mensaje de la lista de componentes
                              jPanelDraw.remove(0);

                              //Buscar el componente que lo envíe y borrarlo de su lista
                              Component[] lista = jPanelDraw.getComponents();

                              for (int i = 0; i < lista.length; i++) {

                                  if (lista[i] instanceof MyActor ||
                                      lista[i] instanceof MyLifeLine) {

                                      ((MyObjects) lista[i]).deleteSendMessage(
                                              mensaje);

                                  }

                              }

                              //Devolver el estado al valor por defecto
                              Shared.state = Shared.state.DEFAULT;

                          }

                          //Tenemos una lista con los componentes que forman el diagrama
                          Component[] lista = jPanelDraw.getComponents();

                          //Se debe ordenar la lista según la componente X para que los
                          //mensajes estén en el orden correcto
                          //Como la lista no será muy grande se utiliza ordenación por inserción
                          //También se debe incluir el orden en que aparecen los frames

                          Component tmp;
                          int a, b, tmp_valor;
                          int N = lista.length;

                          for (a = 0; a < N; a++) {

                              tmp = lista[a];
                              tmp_valor = lista[a].getY();

                              for (b = a; (b > 0) && (tmp_valor < lista[b - 1].getY());
                                       b--) {

                                  lista[b] = lista[b - 1];

                              }

                              lista[b] = tmp;
                          }

                          for (int i = 0; i < lista.length; i++) {
                              if (lista[i] instanceof MyActor) {
                                  Document actor = XMIActor((MyActor) lista[i]);
                                  doc.appendContent(actor);
                              } else if (lista[i] instanceof MyLifeLine) {
                                  Document lifeline = XMILifeLine((MyLifeLine) lista[
                                          i]);
                                  doc.appendContent(lifeline);
                                  //Ver que es un mensaje y que el origen no es igual al destino
                              } else if ((lista[i] instanceof MyMessage)) {
                                  mensajes++;
                                  if (primero) {
                                      primero = false;
                                      //Llega el primer mensaje y tenemos que establecer una única
                                      //colaboracion y una única interaccion.
                                      //Código de la colaboración
                                      int id1 = Math.abs(ident.nextInt());
                                      String idcol = id1 + "_COL";
                                      contmodelo.addComment("COLLABORATION");
                                      collaboration = contmodelo.addElement(
                                              "Behavioral_Elements.Collaborations.Collaborations").
                                                      addAttribute("xmi.id", idcol);
                                      collaboration.addElement(
                                              "Foundation.Core.ModelElement.name").
                                              setText(
                                                      "Collaborations");
                                      collaboration.addElement(
                                              "Foundation.Core.ModelElement.visibility").
                                              addAttribute(
                                                      "xmi.value", "public");
                                      collaboration.addElement(
                                              "Foundation.Core.ModelElement.isSpecification").
                                              addAttribute("xmi.value", "false");
                                      collaboration.addElement(
                                              "Foundation.Core.GeneralizableElement.isRoot").
                                              addAttribute("xmi.value", "false");
                                      collaboration.addElement(
                                              "Foundation.Core.GeneralizableElement.isLeaf").
                                              addAttribute("xmi.value", "false");
                                      collaboration.addElement(
                                              "Foundation.Core.GeneralizableElement.isAbstract").
                                              addAttribute("xmi.value", "false");

                                      //Código de la interacción
                                      collaboration.addComment("INTERACTION");
                                      interaction = collaboration.addElement(
                                              "Behavioral_Elements.Collaborations.Collaboration.interaction");
                                      int id2 = Math.abs(ident.nextInt());
                                      //Identificador de la interacción
                                      String idint = id2 + "_INT";
                                      interaction.addElement(
                                              "Behavioral_Elements.Collaborations.Interaction").
                                              addAttribute("xmi.id", idint);
                                      interaction.addElement(
                                              "Foundation.core.ModelElement.name").
                                              setText(idint);
                                      interaction.addElement(
                                              "Foundation.Core.ModelElement.visibility").
                                              addAttribute("xmi.value", "public");
                                      interaction.addElement(
                                              "Foundation.Core.ModelElement.isSpecification").
                                              addAttribute("xmi.value", "false");
                                  }

                                  //Se debe añadir 1 a la secuencia por cada frame completo anterior
                                  int frames = 0;

                                  for (int j = 0; j < i; j++) {

                                      if (lista[j] instanceof MyFrame){

                                          //Ver que el frame está completo por encima del objeto
                                          if(lista[j].getY() + lista[j].getHeight() < lista[i].getY()){

                                              frames++;

                                          }

                                      }

                                  }

                                  Document msg = XMIMessage((MyMessage) lista[i],
                                                            mensajes + frames);
                                  doc.appendContent(msg);
                              } else if (lista[i] instanceof MyFrame) {
                                  mensajes++;

                                  //Se debe añadir 1 a la secuencia por cada frame completo anterior
                                  int frames = 0;

                                  for (int j = 0; j < i; j++) {

                                      if (lista[j] instanceof MyFrame){

                                          //Ver que el frame está completo por encima del objeto
                                          if(lista[j].getY() + lista[j].getHeight() < lista[i].getY()){

                                              frames++;

                                          }

                                      }

                                  }

                                  int count = 0;

                                  //Añadir 1 a la secuencia del tipo de frame
                                  if(lista[i].getName().compareTo("alt")==0){
                                      alt_count++;
                                      count = alt_count;
                                  }
                                  else if(lista[i].getName().compareTo("opt")==0){
                                      opt_count++;
                                      count = opt_count;
                                  }
                                  else if(lista[i].getName().compareTo("loop")==0){
                                      loop_count++;
                                      count = loop_count;
                                  }
                                  else if(lista[i].getName().compareTo("par")==0){
                                      par_count++;
                                      count = par_count;
                                  }
                                  else if(lista[i].getName().compareTo("alt_else")==0){
                                      alt_else_count++;
                                      count = alt_else_count;
                                  }
                                  else if(lista[i].getName().compareTo("Exception")==0){
                                      exception_count++;
                                      count = exception_count;
                                  }



                                  Document frame = XMIFrame((MyFrame) lista[i],
                                                            mensajes + frames, count);
                                  doc.appendContent(frame);
                              }
                          }
                          XMLfin();
                          try {
                              try {

                                  XMLwrite(doc, fichero);

                                  //Mostrar también el contenido en el cuadro inferior de la pestaña
                                  //Cargar también el resultado en la primera área de texto
                                  //de la siguiente pestaña
                                  FileInputStream fr = new FileInputStream(fichero);
                                  BufferedInputStream br = new BufferedInputStream(fr);
                                  int str;


                                  jTextArea5.setText("");
                                  jTextArea1.setText("");

                                  while ((str = br.read()) != -1) {
                                      char c = (char) str;
                                      String s = "" + c;
                                      jTextArea5.append(s);
                                      jTextArea1.append(s);
                                  }

                              } catch (IOException e1) {
                                  System.out.println("Error al serializar" + e1);
                              }
                          } catch (Exception ex) {
                              System.err.println("Error: " + e);
                          }

                          //Una vez escrito el contenido del fichero lo borramos para evitar duplicados
                          doc = null;

                      } else {
                          System.out.println("Save cancelled !");
                      }
                  }
              }
          }
    }

    private void guardar(ActionEvent e){

        int num= jPanelDraw.getComponentCount();
          if (num==1){
              JOptionPane optionPane= new JOptionPane();
              //optionPane.showMessageDialog(jPanelDraw,"There is not diagram to delete");
              Object[] options = {"Ok"};
              optionPane.showOptionDialog(optionPane,"There is not diagram to save","Message",optionPane.YES_NO_OPTION,optionPane.INFORMATION_MESSAGE, null, options, null);
          }

          else{

              FileDialog fd = new FileDialog(new Frame(), "Save diagram to File...",
                                                 FileDialog.SAVE);
              fd.setFile("*.xml");
              fd.show();

              if (fd.getDirectory() != null) {
                  if (fd.getFile() != null) {
                      String stt = fd.getDirectory();
                      String st = fd.getFile();
                      fichero = stt + st;

                      Component[] lista = jPanelDraw.getComponents();

                      try {
                          ObjectOutputStream salida = new ObjectOutputStream(new
                                  FileOutputStream(fichero));
                          salida.writeObject(lista);
                          salida.close();
                      } catch (Exception ex) {
                          System.err.println("Error: " + e);
                      }
                  }
                  else {
                      System.out.println("Save cancelled !");
                  }

              }
          }


    }


    public void seleccionObjeto(MyObjects obj, Object[][] campos){

        //Si se trata de un frame de tipo loop
        if(obj instanceof MyFrame && obj.getName().compareTo("loop")==0){

            MyTable = new MyTableModel();
            table.setModel(MyTable);

            table.getColumnModel().getColumn(1).setCellEditor(new CheckBoxCellEditor());
            table.getColumnModel().getColumn(1).setCellRenderer(new MyTableCellRenderer());

        }

        //Si se trata de un frame de tipo opt
        else if(obj instanceof MyFrame && obj.getName().compareTo("opt")==0){

            MyTable = new MyTableModel();
            table.setModel(MyTable);

            table.getColumnModel().getColumn(1).setCellEditor(new CheckBoxCellEditor());
            table.getColumnModel().getColumn(1).setCellRenderer(new MyTableCellRenderer());

        }

        //En cualquier otro caso se debe dejar el modelo creado sin modificacion
        else{

            MyTable = new MyTableModel();
            table.setModel(MyTable);

        }

        //Añadir un listener para escuchar las modificaciones en la tabla
        table.getModel().addTableModelListener(new TableModelListener() {

            public void tableChanged(TableModelEvent e) {

                //Ver cuando el cambio es debido a que se ha modificado una celda
                if(e.getColumn()!=-1){

                    MyObjects obj = MyTable.getObject();

                    //Ver si se trata de un objeto cuyo nombre se ha modificado
                    if(obj instanceof MyLifeLine || obj instanceof MyActor || obj instanceof MyMessage){

                        boolean valid = false;
                        String nombre = MyTable.getValueAt(e.getFirstRow(),e.getColumn()).toString();

                        try {

                            //Ver que name es una variable XPath válida
                            XPathParser par = new XPathParser(new StringReader(nombre));

                            String var = par.QName();

                            //Si var y left tienen el mismo tamaño se toma como válido
                            if (var.length() == nombre.length()) {

                                valid = true;

                            }

                            //Capturar error o excepción, señal de que la expresión no es válida
                        } catch (Throwable ex) {

                            System.out.println(ex);

                        }

                        if (valid) {

                            //Se debe comprobar que no exista otro objeto que no sea
                            //el mismo con el mismo nombre

                            Component[] lista = jPanelDraw.getComponents();
                            boolean existe = false;

                            for (int i = 0; i < lista.length; i++) {

                                //Si se trata de un componente con nombre se debe mirar que no coincida con el nuevo nombre
                                if ((lista[i] instanceof MyLifeLine ||
                                     lista[i] instanceof MyActor ||
                                     lista[i] instanceof MyMessage)
                                    && lista[i] != obj
                                    && nombre.compareTo(lista[i].getName()) == 0) {

                                    existe = true;
                                    break;

                                }

                            }

                            //Provisionalmente se deja que puedan tener varios el mismo nombre
                            //existe=false;

                            if (!existe) {

                                //Modificar el nombre del objeto
                                obj.setName(nombre);
                                obj.repaint();

                            } else {

                                //Mostrar mensaje de que no es válida la expresion
                                JOptionPane optionPane2 = new JOptionPane();
                                Object[] options2 = {"Ok"};
                                optionPane2.showOptionDialog(optionPane2,
                                                             "Component name already exists",
                                                             "Message",
                                                             optionPane2.YES_NO_OPTION,
                                                             optionPane2.ERROR_MESSAGE, null,
                                                             options2, null);

                                MyTable.setValueAt(obj.getName(),e.getFirstRow(),e.getColumn());

                            }

                        } else {

                            //Mostrar mensaje de que no es válida la expresion
                            JOptionPane optionPane2 = new JOptionPane();
                            Object[] options2 = {"Ok"};
                            optionPane2.showOptionDialog(optionPane2,
                                                         "Invalid component name",
                                                         "Message", optionPane2.YES_NO_OPTION,
                                                         optionPane2.ERROR_MESSAGE, null,
                                                         options2, null);
                            MyTable.setValueAt(obj.getName(),e.getFirstRow(),e.getColumn());

                        }

                    }

                    //Ver si se trata de un frame
                    if(obj instanceof MyFrame){

                        MyFrame frm = (MyFrame)obj;

                        //Ver el tipo de frame que se trata

                        //Si es un frame de tipo alt/else
                        if (frm.getName().compareTo("alt_else") == 0) {

                            String guard = MyTable.getValueAt(e.getFirstRow(),e.getColumn()).toString();

                            //Si tiene nombre asignado
                            if (guard != null && guard.compareTo("") != 0) {

                                String guarda_text = guard.replaceAll("==", "=");

                                //Llamar a la función que se encarga de parsear las guardas
                                boolean valid;
                                String var_guarda = parseoGuarda(guarda_text, false);

                                if (var_guarda != null)
                                    valid = true;
                                else
                                    valid = false;

                                //Provisional para dejar cualquier expresión de guarda como válida
                                //valid = true;

                                if (valid) {
                                    //Modificar la guarda para que = sea ==
                                    guarda_text = cambiarIguales(guarda_text);
                                    frm.setGuard(guarda_text);
                                    frm.repaint();

                                    if (frm.getName().compareTo("alt_else") == 0) {

                                        //Ver como sería la negación de la guarda para dejarla también almacenada
                                        String guarda_negada = guardaNegada(guarda_text).replaceAll(".0","");
                                        frm.setGuard_negada(cambiarIguales(guarda_negada));

                                    }

                                    //Almacenar las variables que contiene actualmente la guarda
                                    ArrayList vars_guarda = new ArrayList();

                                    StringTokenizer st = new StringTokenizer(var_guarda);

                                    while (st.hasMoreTokens()) {

                                        String var_act = st.nextToken();

                                        //Ver que la variable no forme ya parte del array de variables
                                        boolean esta = false;

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

                                            if (vars_guarda.get(i).toString().compareTo(var_act) == 0) {

                                                esta = true;
                                                break;

                                            }

                                        }

                                        if (!esta)
                                            vars_guarda.add(var_act);

                                    }

                                    //Actualizar el ArrayList con las variables de la guarda
                                    frm.setVariablesGuarda(vars_guarda);

                                }

                                else {

                                    //Mostrar mensaje de que no es válida la expresion
                                    JOptionPane optionPane2 = new JOptionPane();
                                    Object[] options2 = {"Ok"};
                                    optionPane2.showOptionDialog(optionPane2,
                                                                 "Invalid guard expresion",
                                                                 "Message", optionPane2.YES_NO_OPTION,
                                                                 optionPane2.ERROR_MESSAGE, null,
                                                                 options2, null);
                                    MyTable.setValueAt(frm.getGuard() ,e.getFirstRow(),e.getColumn());
                                }
                            }


                        }

                        //Si es un frame de tipo opt
                        if (frm.getName().compareTo("opt") == 0) {

                            //Ver que fila es la que se esta modificando
                            if(e.getFirstRow() == 0){

                                String guard = MyTable.getValueAt(e.getFirstRow(),e.getColumn()).toString();

                                //Si tiene nombre asignado
                                if (guard != null && guard.compareTo("") != 0) {

                                    String guarda_text = guard.replaceAll("==", "=");

                                    //Llamar a la función que se encarga de parsear las guardas
                                    boolean valid;
                                    String var_guarda = parseoGuarda(guarda_text, false);

                                    if (var_guarda != null)
                                        valid = true;
                                    else
                                        valid = false;

                                    //Provisional para dejar cualquier expresión de guarda como válida
                                    //valid = true;

                                    if (valid) {
                                        //Modificar la guarda para que = sea ==
                                        guarda_text = cambiarIguales(guarda_text);
                                        frm.setGuard(guarda_text);
                                        frm.repaint();

                                        if (frm.getName().compareTo("alt_else") == 0) {

                                            //Ver como sería la negación de la guarda para dejarla también almacenada
                                            String guarda_negada = guardaNegada(guarda_text).replaceAll(
                                                    ".0", "");
                                            frm.setGuard_negada(cambiarIguales(guarda_negada));

                                        }

                                        //Almacenar las variables que contiene actualmente la guarda
                                        ArrayList vars_guarda = new ArrayList();

                                        StringTokenizer st = new StringTokenizer(var_guarda);

                                        while (st.hasMoreTokens()) {

                                            String var_act = st.nextToken();

                                            //Ver que la variable no forme ya parte del array de variables
                                            boolean esta = false;

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

                                                if (vars_guarda.get(i).toString().compareTo(var_act) == 0) {

                                                    esta = true;
                                                    break;

                                                }

                                            }

                                            if (!esta)
                                                vars_guarda.add(var_act);

                                        }

                                        //Actualizar el ArrayList con las variables de la guarda
                                        frm.setVariablesGuarda(vars_guarda);

                                    }

                                    else {

                                        //Mostrar mensaje de que no es válida la expresion
                                        JOptionPane optionPane2 = new JOptionPane();
                                        Object[] options2 = {"Ok"};
                                        optionPane2.showOptionDialog(optionPane2,
                                                                     "Invalid guard expresion",
                                                                     "Message", optionPane2.YES_NO_OPTION,
                                                                     optionPane2.ERROR_MESSAGE, null,
                                                                     options2, null);
                                        MyTable.setValueAt(frm.getGuard(), e.getFirstRow(), e.getColumn());
                                    }
                                }

                            }

                            if(e.getFirstRow() == 1){

                                //Modificar si se trata de un opt bloqueante
                                frm.setBlock(((Boolean)MyTable.getValueAt(e.getFirstRow(),e.getColumn())).booleanValue());

                            }
                        }

                        //Si es un frame de tipo loop
                        if (frm.getName().compareTo("loop") == 0) {

                            //Ver que fila es la que se esta modificando
                            if(e.getFirstRow() == 0){

                                //Modificar el repeat del objeto
                                String repeat = MyTable.getValueAt(e.getFirstRow(),e.getColumn()).toString();

                                //Si tiene nombre asignado
                                if (repeat != null && repeat.compareTo("") != 0) {

                                    String repeat_text = repeat.replaceAll("==", "=");

                                    //Llamar a la función que se encarga de parsear las guardas
                                    boolean valid;
                                    String var_guarda = parseoGuarda(repeat_text,false);

                                    if (var_guarda != null)
                                        valid = true;
                                    else
                                        valid = false;

                                    //Provisional para dejar cualquier expresión de guarda como válida
                                    //valid = true;

                                    if (valid) {
                                        //Modificar la guarda para que = sea ==
                                        repeat_text = cambiarIguales(repeat_text);
                                        frm.setRepeat(repeat_text);
                                        frm.repaint();

                                        //Almacenar las variables que contiene actualmente la guarda
                                        ArrayList vars_guarda = new ArrayList();

                                        StringTokenizer st = new StringTokenizer(var_guarda);

                                        while (st.hasMoreTokens()) {

                                            String var_act = st.nextToken();

                                            //Ver que la variable no forme ya parte del array de variables
                                            boolean esta = false;

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

                                                if (vars_guarda.get(i).toString().compareTo(var_act) == 0) {

                                                    esta = true;
                                                    break;

                                                }

                                            }

                                            if (!esta)
                                                vars_guarda.add(var_act);

                                        }

                                        //Actualizar el ArrayList con las variables de la guarda
                                        frm.setVariablesRepeat(vars_guarda);

                                    }

                                    else {

                                        //Mostrar mensaje de que no es válida la expresion
                                        JOptionPane optionPane2 = new JOptionPane();
                                        Object[] options2 = {"Ok"};
                                        optionPane2.showOptionDialog(optionPane2,
                                                                     "Invalid repeat expresion",
                                                                     "Message", optionPane2.YES_NO_OPTION,
                                                                     optionPane2.ERROR_MESSAGE, null,
                                                                     options2, null);
                                        MyTable.setValueAt(frm.getRepeat(),e.getFirstRow(),e.getColumn());
                                    }
                                }
                            }

                            if(e.getFirstRow() == 1){

                                //Modificar la guarda del objeto
                                String guard = MyTable.getValueAt(e.getFirstRow(),e.getColumn()).toString();

                                //Si tiene nombre asignado
                                if (guard != null && guard.compareTo("") != 0) {

                                    String guarda_text = guard.replaceAll("==", "=");

                                    //Llamar a la función que se encarga de parsear las guardas
                                    boolean valid;
                                    String var_guarda = parseoGuarda(guarda_text,false);

                                    if (var_guarda != null)
                                        valid = true;
                                    else
                                        valid = false;

                                    //Provisional para dejar cualquier expresión de guarda como válida
                                    //valid = true;

                                    if (valid) {
                                        //Modificar la guarda para que = sea ==
                                        guarda_text = cambiarIguales(guarda_text);
                                        frm.setGuard(guarda_text);
                                        frm.repaint();

                                        //Almacenar las variables que contiene actualmente la guarda
                                        ArrayList vars_guarda = new ArrayList();

                                        StringTokenizer st = new StringTokenizer(var_guarda);

                                        while (st.hasMoreTokens()) {

                                            String var_act = st.nextToken();

                                            //Ver que la variable no forme ya parte del array de variables
                                            boolean esta = false;

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

                                                if (vars_guarda.get(i).toString().compareTo(var_act) == 0) {

                                                    esta = true;
                                                    break;

                                                }

                                            }

                                            if (!esta)
                                                vars_guarda.add(var_act);

                                        }

                                        //Actualizar el ArrayList con las variables de la guarda
                                        frm.setVariablesGuarda(vars_guarda);

                                    }

                                    else {

                                        //Mostrar mensaje de que no es válida la expresion
                                        JOptionPane optionPane2 = new JOptionPane();
                                        Object[] options2 = {"Ok"};
                                        optionPane2.showOptionDialog(optionPane2,
                                                                     "Invalid guard expresion",
                                                                     "Message", optionPane2.YES_NO_OPTION,
                                                                     optionPane2.ERROR_MESSAGE, null,
                                                                     options2, null);
                                        MyTable.setValueAt(frm.getGuard() ,e.getFirstRow(),e.getColumn());
                                    }
                                }
                                else{

                                    String guarda_text = guard;

                                    frm.setGuard(guarda_text);
                                    frm.repaint();

                                    //Actualizar el ArrayList con las variables de la guarda
                                    frm.setVariablesGuarda(new ArrayList());

                                }

                            }

                            if(e.getFirstRow() == 2){

                                //Modificar si se trata de un loop bloqueante
                                frm.setBlock(((Boolean)MyTable.getValueAt(e.getFirstRow(),e.getColumn())).booleanValue());

                            }


                        }

                        //Si se trata de un exception
                        if (frm.getName().compareTo("Exception") == 0) {

                            //Ver que fila es la que se esta modificando
                            if(e.getFirstRow() == 0){

                                String exception_name = MyTable.getValueAt(e.getFirstRow(), e.getColumn()).
                                                   toString();

                                //Si tiene nombre asignado
                                if (exception_name != null && exception_name.compareTo("") != 0) {

                                       //Modificar nombre de la excepción
                                       frm.setException_name(exception_name);
                                       frm.repaint();
                                }

                            }

                            else{
                                String exception = MyTable.getValueAt(e.getFirstRow(), e.getColumn()).
                                                   toString();

                                //Si tiene nombre asignado
                                if (exception != null && exception.compareTo("") != 0) {

                                    //Llamar a la función que se encarga de parsear las excepciones
                                    boolean valid;
                                    valid = parseoException(exception);

                                    if (valid) {
                                        //Modificar la excepción
                                        frm.setException(exception);
                                        frm.repaint();
                                    }

                                    else {

                                        //Ver si se corresponde con el timeout asociado a algún mensaje
                                        Component[] lista = jPanelDraw.getComponents();

                                        for (int i = 0; i < lista.length; i++) {

                                            if (lista[i] instanceof MyMessage) {

                                                String timeout = ((MyMessage) lista[i]).getTimeout();
                                                String timeout_clock = ((MyMessage) lista[i]).
                                                                       getTimeout_clock();

                                                timeout = timeout_clock + "<=" + timeout;

                                                if (timeout.compareTo(exception.replaceAll(" ", "")) == 0) {

                                                    valid = true;

                                                    //Modificar la excepción
                                                    frm.setException(exception.replaceAll(" ", ""));
                                                    frm.repaint();

                                                    break;

                                                }

                                            }
                                        }

                                        if (!valid) {
                                            //Mostrar mensaje de que no es válida la expresion
                                            JOptionPane optionPane2 = new JOptionPane();
                                            Object[] options2 = {"Ok"};
                                            optionPane2.showOptionDialog(optionPane2,
                                                                         "Invalid exception",
                                                                         "Message",
                                                                         optionPane2.YES_NO_OPTION,
                                                                         optionPane2.ERROR_MESSAGE, null,
                                                                         options2, null);
                                            MyTable.setValueAt(frm.getException(), e.getFirstRow(),
                                                               e.getColumn());
                                        }
                                    }
                                }
                            }

                        }
                    }

                    repaint();
                    jPanelDraw.updateUI();

                }
            }
        });

        MyTable.setObject(obj);
        MyTable.addRows(campos);
        repaint();
        table.updateUI();

    }

    public void limpiarPropiedades() {

        MyTable.deleteRows();

    }

    public void setActual(MyObjects objeto) {

        //Si hay algún objeto actualmente seleccionado
        if(obj_act != null){

            //Modificar el color del objeto actualmente seleccionado
            obj_act.setCol(Color.black);

            //Se debe repintar el panel que contiene a los objetos
            jPanelDraw.repaint();
            jPanelDraw.updateUI();


        }

        //Fijar el nuevo objeto actual
        obj_act = objeto;

    }

    public String parseoGuarda(String guarda_text, boolean es_not){

        //Cadena con las nuevas variables
        String new_var = "";

        //Eliminar todos los espacios en blanco existentes en la cadena
        guarda_text = guarda_text.trim();

        //Variable booleana que indique si nos encontramos dentro de un not
        boolean en_not = es_not;

        //Intentar quitar todos los not que tenga la expresión para analizarla
        //como si fuera sin not
        if(guarda_text.startsWith("not(")){

            //Ver donde se inicia el primer not
            int index = guarda_text.indexOf("not(");

            //Ver donde acaba el not que se ha encontrado
            int index_fin = 0;
            String despues_not = guarda_text.substring(index + 4);
            int index_recorrido = 0;

            while((index_fin == 0) && (despues_not.indexOf(")",index_recorrido + 1) != -1)){

                index_recorrido = despues_not.indexOf(")",index_recorrido + 1);

                //Ver que el número de parentesis que se abren y se cierran
                //entre medias sea igual
                String entre_parentesis = despues_not.substring(0,index_recorrido);
                int n_abre = 0, n_cierra = 0;

                for (int i = 0; i < entre_parentesis.length(); i++){

                    if(entre_parentesis.charAt(i)=='(') n_abre++;
                    if(entre_parentesis.charAt(i)==')') n_cierra++;

                }

                if(n_abre == n_cierra){

                    index_fin = index_recorrido;

                }

            }

            //Quitar el not de la expresión si afecta a toda la expresión
            if((index_fin + 4 == guarda_text.lastIndexOf(")")) && (guarda_text.lastIndexOf(")") == guarda_text.length() - 1)){

                //Dejar marcado que nos encontramos dentro de un not
                en_not = true;

                guarda_text = guarda_text.substring(index + 4, guarda_text.lastIndexOf(")"));

            }
        }

        XPathParser parseo = new XPathParser(new StringReader(guarda_text));

        try{

            NaryExpr ne = (NaryExpr) parseo.OrExpr();

            //El número de expresiones en que se divide debe ser mayor que 2, en caso contrario se toma como no válido
            if (ne.getExprsCount() < 2) {

                return null;

            }

            //Si el número de expresiones en que se divide es justamente 2
            else if (ne.getExprsCount() == 2){

                //Ver si la expresión es relacional

                parseo = new XPathParser(new StringReader(guarda_text));

                try{

                    RelationalExpr re1 = (RelationalExpr) parseo.RelationalExpr();

                    //Se debe mirar que la guarda ya no contenga ningún parentesis
                    if(guarda_text.contains("(") || guarda_text.contains(")")){

                        return null;

                    }

                    else{

                        //Si es relacional se debe mirar que los hijos sean variables y números
                        //y que sean compatibles

                        String hijo1 = ne.getExpr(0).toString();

                        parseo = new XPathParser(new StringReader(hijo1));

                        String tipo_hijo1 = "";

                        try {

                            try {

                                //Ver si es un número
                                Integer.parseInt(hijo1.replaceFirst(".0",""));
                                tipo_hijo1 = "numero";

                            } catch (Throwable exh2) {

                                //Si no es un número
                                hijo1 = ne.getExpr(0).toString().substring(7);

                                parseo = new XPathParser(new StringReader(hijo1));

                                //Ver que sea una variable válida
                                String vari = parseo.QName();

                                //Ver que el tamaño de hijo1 y del resultado del parseo coinciden
                                if (vari.length() != hijo1.length()) {

                                    return null;

                                }

                                else {

                                    //Se debe mirar si se trata de true o false
                                    if(hijo1.compareTo("true")==0 || hijo1.compareTo("false")==0){

                                        tipo_hijo1 = "Bool";

                                    }

                                    else{

                                        //Si se trata de una variable válida se debe mirar que
                                        //esté definida en algún Actor o Lifeline
                                        Component[] lista = jPanelDraw.getComponents();
                                        ArrayList al = new ArrayList();

                                        boolean existe = false;

                                        for (int i = 0; i < lista.length; i++) {

                                            if (lista[i] instanceof MyActor ||
                                                lista[i] instanceof MyLifeLine) {

                                                MyObjects mo = (MyObjects) lista[i];

                                                al = mo.getVariables();

                                                for (int j = 0; j < al.size(); j++) {

                                                    if (((Object[]) al.get(j))[0].toString().compareTo(vari) ==
                                                        0) {

                                                        existe = true;
                                                        tipo_hijo1 = ((Object[]) al.get(j))[1].toString();

                                                        //Si la expresion es sobre un or no puede ser de tipo clock
                                                        //Tampoco puede ser en un not
                                                        if((en_not) && tipo_hijo1.compareTo("Clock")==0)
                                                            return null;

                                                        break;

                                                    }

                                                }

                                            }

                                            if (existe)
                                                break;

                                        }

                                        //Si la variable no está definida
                                        if (!existe)
                                            return null;

                                    }

                                }

                            }

                            //Añadirlo a la lista de variables correspondiente
                            //si no se trata de un número
                            if(tipo_hijo1.compareTo("numero")!=0) new_var = hijo1 + " ";
                            String hijo2 = ne.getExpr(1).toString();

                            parseo = new XPathParser(new StringReader(hijo2));

                            String tipo_hijo2 = "";

                            try {

                                //Ver que sea un número
                                Integer.parseInt(hijo2.replaceFirst(".0",""));

                                //Ver que además de ser un número lo devuelto por
                                //el parseo no se están descartando caracteres al
                                //final de la expresión

                                String hijo_fin = "";

                                if(guarda_text.contains("<=")){

                                    hijo_fin = guarda_text.substring(guarda_text.indexOf("<=")+2,guarda_text.length()).trim().replaceFirst(".0","");

                                }
                                else if (guarda_text.contains("<")){

                                    hijo_fin = guarda_text.substring(guarda_text.indexOf("<")+1,guarda_text.length()).trim().replaceFirst(".0","");

                                }
                                else if (guarda_text.contains(">=")){

                                    hijo_fin = guarda_text.substring(guarda_text.indexOf(">=")+2,guarda_text.length()).trim().replaceFirst(".0","");

                                }
                                else{

                                    hijo_fin = guarda_text.substring(guarda_text.indexOf(">")+1,guarda_text.length()).trim().replaceFirst(".0","");

                                }

                                Integer.parseInt(hijo_fin);

                                tipo_hijo2 = "numero";

                            } catch (Throwable exh2) {

                                //Si no es un número
                                hijo2 = ne.getExpr(1).toString().substring(7);
                                parseo = new XPathParser(new StringReader(hijo2));

                                //Ver que sea una variable válida
                                String vari = parseo.QName();

                                //Ver que el tamaño de hijo1 y del resultado del parseo coinciden
                                if (vari.length() != hijo2.length()) {

                                    return null;

                                }

                                else {

                                    //Se debe mirar si se trata de true o false
                                    if(hijo2.compareTo("true")==0 || hijo2.compareTo("false")==0){

                                        tipo_hijo2 = "Bool";

                                    }

                                    else{

                                        //Si se trata de una variable válida se debe mirar que
                                        //esté definida en algún Actor o Lifeline
                                        Component[] lista = jPanelDraw.getComponents();
                                        ArrayList al = new ArrayList();

                                        boolean existe = false;

                                        for (int i = 0; i < lista.length; i++) {

                                            if (lista[i] instanceof MyActor ||
                                                lista[i] instanceof MyLifeLine) {

                                                MyObjects mo = (MyObjects) lista[i];

                                                al = mo.getVariables();

                                                for (int j = 0; j < al.size(); j++) {

                                                    if (((Object[]) al.get(j))[0].toString().compareTo(vari) ==
                                                        0) {

                                                        existe = true;
                                                        tipo_hijo2 = ((Object[]) al.get(j))[1].toString();

                                                        //Si la expresion es sobre un or no puede ser de tipo clock
                                                        if((en_not) && tipo_hijo2.compareTo("Clock")==0)
                                                            return null;

                                                        break;

                                                    }

                                                }

                                            }

                                            if (existe)
                                                break;

                                        }

                                        //Si la variable no está definida
                                        if (!existe)
                                            return null;
                                    }
                                }

                            }

                            //Añadirlo a la lista de variables correspondiente
                            //si no se trata de un número
                            if(tipo_hijo2.compareTo("numero")!=0) new_var = hijo2 + " ";

                            //La expresión no será válida si una variable es un reloj
                            //y la otra un booleano
                            if((tipo_hijo1.compareTo("Clock")==0 && tipo_hijo2.compareTo("Boolean")==0) ||
                               (tipo_hijo1.compareTo("Boolean")==0 && tipo_hijo2.compareTo("Clock")==0) ||
                               (tipo_hijo1.compareTo("Clock")==0 && tipo_hijo2.compareTo("Bool")==0) ||
                               (tipo_hijo1.compareTo("Bool")==0 && tipo_hijo2.compareTo("Clock")==0)){

                                return null;

                            }


                        } catch (Throwable exh1) {

                            return null;

                        }
                    }
                }

                catch (Throwable ex1) {

                    //Si no es relacional ver si la expresion es de igualdad

                    parseo = new XPathParser(new StringReader(guarda_text));

                    try{

                        EqualityExpr eq1 = (EqualityExpr) parseo.EqualityExpr();

                        //Se debe mirar que la guarda ya no contenga ningún parentesis
                        if (guarda_text.contains("(") || guarda_text.contains(")")) {

                            return null;

                        }

                        else {

                            //Si es una igualdad se debe mirar que los hijos sean números
                            //o variables y que sean compatibles

                            String hijo1 = ne.getExpr(0).toString();

                            parseo = new XPathParser(new StringReader(hijo1));

                            String tipo_hijo1 = "";

                            try {

                                try {

                                    //Ver si es un número
                                    Integer.parseInt(hijo1.replaceFirst(".0",""));
                                    tipo_hijo1 = "numero";

                                } catch (Throwable exh2) {

                                    //Si no es un número
                                    hijo1 = ne.getExpr(0).toString().substring(7);

                                    parseo = new XPathParser(new StringReader(hijo1));

                                    //Ver que sea una variable válida
                                    String vari = parseo.QName();

                                    //Ver que el tamaño de hijo1 y del resultado del parseo coinciden
                                    if (vari.length() != hijo1.length()) {

                                        return null;

                                    }

                                    else {

                                        //Se debe mirar si se trata de true o false
                                        if (hijo1.compareTo("true") == 0 ||
                                            hijo1.compareTo("false") == 0) {

                                            tipo_hijo1 = "Bool";

                                        }

                                        else {

                                            //Si se trata de una variable válida se debe mirar que
                                            //esté definida en algún Actor o Lifeline
                                            Component[] lista = jPanelDraw.getComponents();
                                            ArrayList al = new ArrayList();

                                            boolean existe = false;

                                            for (int i = 0; i < lista.length; i++) {

                                                if (lista[i] instanceof MyActor ||
                                                    lista[i] instanceof MyLifeLine) {

                                                    MyObjects mo = (MyObjects) lista[i];

                                                    al = mo.getVariables();

                                                    for (int j = 0; j < al.size(); j++) {

                                                        if (((Object[]) al.get(j))[0].toString().
                                                            compareTo(vari) ==
                                                            0) {

                                                            existe = true;
                                                            tipo_hijo1 = ((Object[]) al.get(j))[1].
                                                                         toString();
                                                            //Si la expresion es sobre un or no puede ser de tipo clock
                                                            if ((en_not) && tipo_hijo1.compareTo("Clock") == 0)
                                                                return null;

                                                            break;

                                                        }

                                                    }

                                                }

                                                if (existe)
                                                    break;

                                            }

                                            //Si la variable no está definida
                                            if (!existe)
                                                return null;

                                        }

                                    }

                                }

                                //Añadirlo a la lista de variables correspondiente
                                //si no se trata de un número
                                if (tipo_hijo1.compareTo("numero") != 0)
                                    new_var = hijo1 + " ";
                                String hijo2 = ne.getExpr(1).toString();

                                parseo = new XPathParser(new StringReader(hijo2));

                                String tipo_hijo2 = "";

                                try {

                                    //Ver que sea un número
                                    Integer.parseInt(hijo2.replaceFirst(".0",""));

                                    //Ver que además de ser un número lo devuelto por
                                    //el parseo no se están descartando caracteres al
                                    //final de la expresión

                                    String hijo_fin = "";

                                    if (guarda_text.contains("!=")) {

                                        hijo_fin = guarda_text.substring(guarda_text.indexOf("!=") + 2,
                                                                         guarda_text.length()).trim().
                                                                         replaceFirst(".0", "");


                                    } else {

                                        hijo_fin = guarda_text.substring(guarda_text.indexOf("=") + 1,
                                                                         guarda_text.length()).trim().
                                                                         replaceFirst(".0", "");

                                    }

                                    Integer.parseInt(hijo_fin);


                                    tipo_hijo2 = "numero";

                                } catch (Throwable exh2) {

                                    //Si no es un número
                                    hijo2 = ne.getExpr(1).toString().substring(7);
                                    parseo = new XPathParser(new StringReader(hijo2));

                                    //Ver que sea una variable válida
                                    String vari = parseo.QName();

                                    //Ver que el tamaño de hijo1 y del resultado del parseo coinciden
                                    if (vari.length() != hijo2.length()) {

                                        return null;

                                    }

                                    else {

                                        //Se debe mirar si se trata de true o false
                                        if (hijo2.compareTo("true") == 0 ||
                                            hijo2.compareTo("false") == 0) {

                                            tipo_hijo2 = "Bool";

                                        }

                                        else {

                                            //Si se trata de una variable válida se debe mirar que
                                            //esté definida en algún Actor o Lifeline
                                            Component[] lista = jPanelDraw.getComponents();
                                            ArrayList al = new ArrayList();

                                            boolean existe = false;

                                            for (int i = 0; i < lista.length; i++) {

                                                if (lista[i] instanceof MyActor ||
                                                    lista[i] instanceof MyLifeLine) {

                                                    MyObjects mo = (MyObjects) lista[i];

                                                    al = mo.getVariables();

                                                    for (int j = 0; j < al.size(); j++) {

                                                        if (((Object[]) al.get(j))[0].toString().
                                                            compareTo(vari) ==
                                                            0) {

                                                            existe = true;
                                                            tipo_hijo2 = ((Object[]) al.get(j))[1].
                                                                         toString();

                                                            //Si la expresion es sobre un or no puede ser de tipo clock
                                                            if ((en_not) && tipo_hijo2.compareTo("Clock") == 0)
                                                                return null;

                                                            break;

                                                        }

                                                    }

                                                }

                                                if (existe)
                                                    break;

                                            }

                                            //Si la variable no está definida
                                            if (!existe)
                                                return null;
                                        }
                                    }

                                }

                                //Añadirlo a la lista de variables correspondiente
                                //si no se trata de un número
                                if (tipo_hijo2.compareTo("numero") != 0)
                                    new_var = hijo2 + " ";

                                //La expresión no será válida si una variable es un reloj
                                //y la otra un booleano. Tampoco será válida si uno de los dos
                                //hijos es un reloj y es una expresión de desigualdad
                                if ((tipo_hijo1.compareTo("Clock") == 0 && tipo_hijo2.compareTo("Boolean") == 0) ||
                                    (tipo_hijo1.compareTo("Boolean") == 0 && tipo_hijo2.compareTo("Clock") == 0) ||
                                    (tipo_hijo1.compareTo("Clock") == 0 && tipo_hijo2.compareTo("Bool") == 0) ||
                                    (tipo_hijo1.compareTo("Bool") == 0 && tipo_hijo2.compareTo("Clock") == 0) ||
                                    (guarda_text.contains("!=") && (tipo_hijo1.compareTo("Clock") == 0 || tipo_hijo2.compareTo("Clock") == 0))) {

                                    return null;

                                }

                            } catch (Throwable exh1) {

                                return null;

                            }

                        }
                    }

                    catch (Throwable ex2) {

                        //Si no es de igualdad ver si la expresion es un and
                        parseo = new XPathParser(new StringReader(guarda_text));

                        try {

                            AndExpr and1 = (AndExpr) parseo.AndExpr();

                            //Llamar recursivamente a la función para cada uno de los hijos

                            String hijo1;

                            if(ne.getExpr(0).toString().startsWith("not("))
                                hijo1 = ne.getExpr(0).toString().replaceAll("child::","").replaceAll("AND","and").replaceAll("OR","or");
                            else
                                hijo1 = ne.getExpr(0).toString().substring(1,ne.getExpr(0).toString().length()-1).replaceAll("child::","").replaceAll("AND","and").replaceAll("OR","or");
                            if(parseoGuarda(hijo1,en_not)==null) return null;
                            String var1 = parseoGuarda(hijo1,en_not);

                            String hijo2;

                            if(ne.getExpr(1).toString().startsWith("not("))
                                hijo2 = ne.getExpr(1).toString().replaceAll("child::","").replaceAll("AND","and").replaceAll("OR","or");
                            else
                                hijo2 = ne.getExpr(1).toString().substring(1,ne.getExpr(1).toString().length()-1).replaceAll("child::","").replaceAll("AND","and").replaceAll("OR","or");
                            if(parseoGuarda(hijo2,en_not)==null) return null;
                            String var2 = parseoGuarda(hijo2,en_not);

                            //El resultado debe ser una combinación de ambas cadenas
                            new_var = var1 + var2;


                        }

                        catch (Throwable ex3) {

                            //Si no es un and ver si la expresion es un or
                            parseo = new XPathParser(new StringReader(guarda_text));

                            try {

                                OrExpr or1 = (OrExpr) parseo.OrExpr();

                                //Llamar recursivamente a la función para cada uno de los hijos

                                String hijo1;

                                if (ne.getExpr(0).toString().startsWith("not("))
                                    hijo1 = ne.getExpr(0).toString().replaceAll("child::",
                                            "").replaceAll("AND", "and").replaceAll("OR", "or");
                                else
                                    hijo1 = ne.getExpr(0).toString().substring(1,
                                            ne.getExpr(0).toString().length() - 1).replaceAll("child::", "").
                                            replaceAll("AND", "and").replaceAll("OR", "or");
                                if(parseoGuarda(hijo1,en_not)==null) return null;
                                String var1 = parseoGuarda(hijo1,en_not);

                                String hijo2;

                                if (ne.getExpr(1).toString().startsWith("not("))
                                    hijo2 = ne.getExpr(1).toString().replaceAll("child::",
                                            "").replaceAll("AND", "and").replaceAll("OR", "or");
                                else
                                    hijo2 = ne.getExpr(1).toString().substring(1,
                                            ne.getExpr(1).toString().length() - 1).replaceAll("child::", "").
                                            replaceAll("AND", "and").replaceAll("OR", "or");
                                if(parseoGuarda(hijo2,en_not)==null) return null;
                                String var2 = parseoGuarda(hijo2,en_not);


                                //El resultado debe ser una combinación de ambas cadenas
                                if (var1.compareTo("") != 0 && var2.compareTo("") != 0) {

                                    new_var = var1 + var2;

                                }
                                else return null;



                            }

                            catch (Throwable ex4) {

                                return null;

                            }

                        }

                    }

                }

            }

            //Si el número de expresiones en que se divide es mayor que 2
            else{

                int n_hijos = ne.getExprsCount();

                //Ver si la expresion es un and
                parseo = new XPathParser(new StringReader(guarda_text));

                try {

                    AndExpr and1 = (AndExpr) parseo.AndExpr();

                    //Llamar recursivamente a la función para cada uno de los hijos

                    for(int i = 0; i < n_hijos; i++){

                        String hijo;

                        if (ne.getExpr(i).toString().startsWith("not("))
                            hijo = ne.getExpr(i).toString().replaceAll(
                                    "child::", "").replaceAll("AND", "and").
                                    replaceAll("OR", "or");
                        else
                            hijo = ne.getExpr(i).toString().substring(1,
                                    ne.getExpr(i).toString().length() - 1).
                                    replaceAll("child::", "").replaceAll("AND",
                                    "and").replaceAll("OR", "or");
                         if(parseoGuarda(hijo,en_not)==null) return null;
                         String var_hijo = parseoGuarda(hijo,en_not);

                         //El resultado debe ser la cadena de todos los hijos
                         new_var = new_var + var_hijo;

                    }

                }

                catch (Throwable ex3) {

                    //Si no es un and ver si la expresion es un or
                    parseo = new XPathParser(new StringReader(guarda_text));

                    try {

                        OrExpr or1 = (OrExpr) parseo.OrExpr();

                        //Llamar recursivamente a la función para cada uno de los hijos

                        for (int i = 0; i < n_hijos; i++) {

                            String hijo;

                            if (ne.getExpr(i).toString().startsWith("not("))
                                hijo = ne.getExpr(i).toString().replaceAll(
                                        "child::", "").replaceAll("AND", "and").
                                       replaceAll("OR", "or");
                            else
                                hijo = ne.getExpr(i).toString().substring(1,
                                        ne.getExpr(i).toString().length() - 1).
                                       replaceAll("child::", "").replaceAll("AND",
                                        "and").replaceAll("OR", "or");
                            if(parseoGuarda(hijo,en_not)==null) return null;
                            String var_hijo = parseoGuarda(hijo,en_not);

                            //El resultado debe ser la cadena de todos los hijos
                            if (var_hijo.compareTo("") != 0) {

                                new_var = new_var + var_hijo;

                            }
                            else return null;

                        }

                    }

                    catch (Throwable ex4) {

                        return null;

                    }

                }


            }

        }
        catch (Throwable ex) {

            return null;
        }

        //Devolver las variables
        return new_var;

    }

    public boolean parseoException(String exception){

    //exception debe ser una variable de tipo Exception ya definida
    Component[] lista = jPanelDraw.getComponents();
    ArrayList al = new ArrayList();

    boolean existe = false;

    for (int i = 0; i < lista.length; i++) {

        if (lista[i] instanceof MyActor ||
            lista[i] instanceof MyLifeLine) {

            MyObjects mo = (MyObjects) lista[i];

            al = mo.getVariables();

            for (int j = 0; j < al.size(); j++) {

                if (((Object[]) al.get(j))[0].toString().compareTo(exception) ==
                    0) {

                    //Debe ser de tipo exception
                    if(((Object[]) al.get(j))[1].toString().compareTo("Exception")==0){
                        existe = true;
                        break;
                    }
                }
            }
        }

        if (existe)
            break;

    }

    //Si la variable no está definida
    if (!existe) return false;
    else return true;
}


    public String guardaNegada(String guarda_text){

        //Eliminar todos los espacios en blanco existentes en la cadena
        guarda_text = guarda_text.trim();

        //Dejar los iguales dobles como iguales simples para poder parsear las
        //expresiones de igualdad
        guarda_text = guarda_text.replaceAll("==","=");

        //Si lo primero que se encuentra es un not que afecta a toda la expresión
        //se devuelve la expresión sin el not
        if(guarda_text.startsWith("not(")){

            //Ver donde se inicia el primer not
            int index = guarda_text.indexOf("not(");

            //Ver donde acaba el not que se ha encontrado
            int index_fin = 0;
            String despues_not = guarda_text.substring(index + 4);
            int index_recorrido = 0;

            while((index_fin == 0) && (despues_not.indexOf(")",index_recorrido + 1) != -1)){

                index_recorrido = despues_not.indexOf(")",index_recorrido + 1);

                //Ver que el número de parentesis que se abren y se cierran
                //entre medias sea igual
                String entre_parentesis = despues_not.substring(0,index_recorrido);
                int n_abre = 0, n_cierra = 0;

                for (int i = 0; i < entre_parentesis.length(); i++){

                    if(entre_parentesis.charAt(i)=='(') n_abre++;
                    if(entre_parentesis.charAt(i)==')') n_cierra++;

                }

                if(n_abre == n_cierra){

                    index_fin = index_recorrido;

                }

            }

            //Si afecta a toda la expresión
            if((index_fin + 4 == guarda_text.lastIndexOf(")")) && (guarda_text.lastIndexOf(")") == guarda_text.length() - 1)){

                guarda_text = guarda_text.substring(index + 4, guarda_text.lastIndexOf(")"));

                return guarda_text;

            }
        }

        XPathParser parseo = new XPathParser(new StringReader(guarda_text));

        try{

            NaryExpr ne = (NaryExpr) parseo.OrExpr();

            //Si el número de expresiones en que se divide es justamente 2
            if (ne.getExprsCount() == 2){

                //Ver si la expresión es relacional

                parseo = new XPathParser(new StringReader(guarda_text));

                try{

                    RelationalExpr re1 = (RelationalExpr) parseo.RelationalExpr();

                    //Si es relacional se debe cambiar la comparación realizada
                    //por la complementaria

                    if(guarda_text.contains("<") && !guarda_text.contains("<=")){

                        return guarda_text.replaceAll("<",">=");

                    }
                    else if(guarda_text.contains("<=")){

                        return guarda_text.replaceAll("<=",">");

                    }
                    else if(guarda_text.contains(">") && !guarda_text.contains(">=")){

                        return guarda_text.replaceAll(">","<=");

                    }
                    else{

                        return guarda_text.replaceAll(">=","<");

                    }

                }

                catch (Throwable ex1) {

                    //Si no es relacional ver si la expresion es de igualdad

                    parseo = new XPathParser(new StringReader(guarda_text));
                    try{

                        EqualityExpr eq1 = (EqualityExpr) parseo.EqualityExpr();

                        //Se debe poner la expresión complementaria a la expresión
                        //de igualdad actual
                        if(guarda_text.contains("!=")){

                            return guarda_text.replaceAll("!=","==");

                        }
                        //Si la expresión es una igualdad se debe mirar si alguna
                        //de las variables es un reloj
                        else{

                            int index = guarda_text.indexOf("=");

                            String hijo1 = guarda_text.substring(0,index).trim();
                            String hijo2 = guarda_text.substring(index+1,guarda_text.length()).trim();

                            String tipo_hijo1 = "";
                            String tipo_hijo2 = "";

                            boolean hay_reloj = false;
                            boolean comprobado_hijo1 = false;
                            boolean comprobado_hijo2 = false;

                            //Si se trata de una variable válida se debe mirar que
                            //esté definida en algún Actor o Lifeline
                            Component[] lista = jPanelDraw.getComponents();
                            ArrayList al = new ArrayList();

                            for (int i = 0; i < lista.length; i++) {

                                if (lista[i] instanceof MyActor ||
                                    lista[i] instanceof MyLifeLine) {

                                    MyObjects mo = (MyObjects) lista[i];

                                    al = mo.getVariables();

                                    for (int j = 0; j < al.size(); j++) {

                                        if (((Object[]) al.get(j))[0].toString().
                                            compareTo(hijo1) ==
                                            0) {

                                            tipo_hijo1 = ((Object[]) al.get(j))[1].
                                                         toString();
                                            comprobado_hijo1 = true;

                                            //Si es de tipo clock
                                            if (tipo_hijo1.compareTo("Clock") == 0)

                                               hay_reloj = true;

                                            break;

                                        }

                                        if (((Object[]) al.get(j))[0].toString().
                                            compareTo(hijo2) ==
                                            0) {

                                            tipo_hijo2 = ((Object[]) al.get(j))[1].
                                                         toString();
                                            comprobado_hijo2 = true;

                                            //Si es de tipo clock
                                            if (tipo_hijo2.compareTo("Clock") == 0)

                                               hay_reloj = true;

                                            break;

                                        }

                                    }

                                }

                                if (comprobado_hijo1 && comprobado_hijo2)
                                    break;

                            }

                            //Si existe un reloj en la expresión
                            if (hay_reloj){

                                return "("+hijo1+"<"+hijo2+")"+"or"+"("+hijo1+">"+hijo2+")";

                            }
                            else{

                                return guarda_text.replaceAll("=","!=");

                            }

                        }

                    }

                    catch (Throwable ex2) {

                        //Si no es de igualdad ver si la expresion es un and
                        parseo = new XPathParser(new StringReader(guarda_text));

                        try {

                            AndExpr and1 = (AndExpr) parseo.AndExpr();

                            //Llamar recursivamente a la función para cada uno de los hijos

                            String hijo1;

                            if(ne.getExpr(0).toString().startsWith("not("))
                                hijo1 = ne.getExpr(0).toString().replaceAll("child::","").replaceAll("AND","and").replaceAll("OR","or");
                            else
                                hijo1 = ne.getExpr(0).toString().substring(1,ne.getExpr(0).toString().length()-1).replaceAll("child::","").replaceAll("AND","and").replaceAll("OR","or");

                            String hijo2;

                            //Se debe mantener el not
                            if(ne.getExpr(1).toString().startsWith("not("))
                                hijo2 = ne.getExpr(1).toString().replaceAll("child::","").replaceAll("AND","and").replaceAll("OR","or");
                            else
                                hijo2 = ne.getExpr(1).toString().substring(1,ne.getExpr(1).toString().length()-1).replaceAll("child::","").replaceAll("AND","and").replaceAll("OR","or");

                            //Se debe devolver el or de las expresiones negadas
                            return "("+guardaNegada(hijo1)+") or ("+guardaNegada(hijo2)+")";

                        }

                        catch (Throwable ex3) {

                            //Si no es un and ver si la expresion es un or
                            parseo = new XPathParser(new StringReader(guarda_text));

                            try {

                                OrExpr or1 = (OrExpr) parseo.OrExpr();

                                //Llamar recursivamente a la función para cada uno de los hijos

                                String hijo1;

                                if (ne.getExpr(0).toString().startsWith("not("))
                                    hijo1 = ne.getExpr(0).toString().replaceAll("child::",
                                            "").replaceAll("AND", "and").replaceAll("OR", "or");
                                else
                                    hijo1 = ne.getExpr(0).toString().substring(1,
                                            ne.getExpr(0).toString().length() - 1).replaceAll("child::", "").
                                            replaceAll("AND", "and").replaceAll("OR", "or");

                                String hijo2;

                                if (ne.getExpr(1).toString().startsWith("not("))
                                    hijo2 = ne.getExpr(1).toString().replaceAll("child::",
                                            "").replaceAll("AND", "and").replaceAll("OR", "or");
                                else
                                    hijo2 = ne.getExpr(1).toString().substring(1,
                                            ne.getExpr(1).toString().length() - 1).replaceAll("child::", "").
                                            replaceAll("AND", "and").replaceAll("OR", "or");

                                //Se debe devolver el and de las expresiones negadas
                                return "("+guardaNegada(hijo1)+") and ("+guardaNegada(hijo2)+")";

                            }

                            catch (Throwable ex4) {

                                return null;

                            }

                        }

                    }

                }

            }

            //Si el número de expresiones en que se divide es mayor que 2
            else{

              //Ver si la expresion es un and
              parseo = new XPathParser(new StringReader(guarda_text));

              try {

                  AndExpr and1 = (AndExpr) parseo.AndExpr();

                  //Llamar recursivamente a la función para los dos hijos
                  //Al ser asociativo por la izquierda se toman como los dos hijos
                  //lo que hay a la izquierda del último and y lo que hay a la derecha

                  int index = guarda_text.lastIndexOf("and");

                  String hijo1 = guarda_text.substring(0,index).trim();
                  String hijo2 = guarda_text.substring(index+3,guarda_text.length()).trim();

                  //Se deben eliminar también los paréntesis de la expresión
                  hijo2 = hijo2.substring(1,hijo2.length()-1);

                  //Se debe devolver el or de las expresiones negadas
                  return "("+guardaNegada(hijo1)+") or ("+guardaNegada(hijo2)+")";

              }

              catch (Throwable ex3) {

                  //Si no es un and ver si la expresion es un or
                  parseo = new XPathParser(new StringReader(guarda_text));

                  //Llamar recursivamente a la función para los dos hijos
                  //Al ser asociativo por la izquierda se toman como los dos hijos
                  //lo que hay a la izquierda del último or y lo que hay a la derecha

                  int index = guarda_text.lastIndexOf("or");

                  String hijo1 = guarda_text.substring(0,index).trim();
                  String hijo2 = guarda_text.substring(index+2,guarda_text.length()).trim();

                  //Se debe devolver el and de las expresiones negadas
                  return "("+guardaNegada(hijo1)+") and ("+guardaNegada(hijo2)+")";

              }


          }


        }
        catch (Throwable ex) {

            return null;
        }

    }


    public String cambiarIguales(String guarda_text){

        for(int i = 0; i < guarda_text.length(); i++){

            if(guarda_text.charAt(i)=='=' && guarda_text.charAt(i - 1)!='!'
                    && guarda_text.charAt(i - 1)!='<'
                    && guarda_text.charAt(i - 1)!='>'){

                //Añadir otro = justo después
                guarda_text = guarda_text.substring(0,i+1) + "=" + guarda_text.substring(i+1,guarda_text.length());

                //Desplazar al siguiente carácter para que no mire justo el que se acaba de añadir
                i++;

            }

        }

        return guarda_text;

    }


    public void windowStateChanged(WindowEvent e) {

        setVisible(true);
        jSplitPane2.setDividerLocation(0.8);
        jSplitPane1.setDividerLocation(0.75);

    }

    public void jMenuHelp1_actionPerformed(ActionEvent e) {

        carga_ayuda();

    }

    /**
     *  Método que carga la ayuda de la aplicación
     */
    public void carga_ayuda() {


    }


}


class TraduccionMarco_jMenuHelp1_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jMenuHelp1_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

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


class TraduccionMarco_jTextFieldCampo_mouseAdapter extends MouseAdapter {
    private TraduccionMarco.CheckBoxCellEditor adaptee;
    TraduccionMarco_jTextFieldCampo_mouseAdapter(TraduccionMarco.CheckBoxCellEditor adaptee) {
        this.adaptee = adaptee;
    }

    public void mouseClicked(MouseEvent e) {
        adaptee.jTextFieldCampo_mouseClicked(e);
    }
}


class TraduccionMarco_jButtonFrame_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jButtonFrame_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

    public void actionPerformed(ActionEvent actionEvent) {
        adaptee.jButtonFrame_actionPerformed(actionEvent);
    }
}


class TraduccionMarco_jButtonExport_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jButtonExport_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

    public void actionPerformed(ActionEvent e) {

        adaptee.jButtonExport_actionPerformed(e);
    }
}

class TraduccionMarco_jButtonUPPAAL_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jButtonUPPAAL_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

    public void actionPerformed(ActionEvent e) {

        adaptee.jButtonUPPAAL_actionPerformed(e);
    }
}


class TraduccionMarco_jMenuFileSaveUML_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jMenuFileSaveUML_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

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


class TraduccionMarco_jButton13_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jButton13_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

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

class TraduccionMarco_jButton12_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jButton12_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

    public void actionPerformed(ActionEvent e) {

        adaptee.jButton12_actionPerformed(e);

    }
}


class TraduccionMarco_jMenuItem2_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jMenuItem2_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

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


class TraduccionMarco_jMenuItem3_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jMenuItem3_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

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


class TraduccionMarco_jButton5_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jButton5_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

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


class TraduccionMarco_jButton4_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jButton4_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

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


class TraduccionMarco_jMenuFileSaveFileWS_ActionAdapter implements ActionListener{
    TraduccionMarco adaptee;
    TraduccionMarco_jMenuFileSaveFileWS_ActionAdapter(TraduccionMarco adaptee){
        this.adaptee = adaptee;
    }
    public void actionPerformed(ActionEvent actionEvent){
        adaptee.jMenuFileSaveWS_actionPerformed(actionEvent);
    }

}
class TraduccionMarco_jMenuFileSave_ActionAdapter implements ActionListener{
    TraduccionMarco adaptee;
    TraduccionMarco_jMenuFileSave_ActionAdapter(TraduccionMarco adaptee){
        this.adaptee = adaptee;
    }
    public void actionPerformed(ActionEvent actionEvent){
        adaptee.jMenuFileSave_actionPerformed(actionEvent);
    }

}
class TraduccionMarco_jMenuFileOpen_ActionAdapter implements ActionListener{
    TraduccionMarco adaptee;
    TraduccionMarco_jMenuFileOpen_ActionAdapter(TraduccionMarco adaptee){
        this.adaptee = adaptee;
    }
    public void actionPerformed(ActionEvent actionEvent){
        adaptee.jMenuFileOpenWS_actionPerformed(actionEvent);

    }

}
class TraduccionMarco_jMenuFileOpenXMI_ActionAdapter implements ActionListener{
    TraduccionMarco adaptee;
    TraduccionMarco_jMenuFileOpenXMI_ActionAdapter(TraduccionMarco adaptee){
        this.adaptee = adaptee;
    }
    public void actionPerformed(ActionEvent actionEvent){
        adaptee.jMenuFileOpenXMI_actionPerformed(actionEvent);

    }

}
class TraduccionMarco_jMenuFileExit_ActionAdapter implements ActionListener {
    TraduccionMarco adaptee;

    TraduccionMarco_jMenuFileExit_ActionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

    public void actionPerformed(ActionEvent actionEvent) {
        adaptee.jMenuFileExit_actionPerformed(actionEvent);

    }
}


class TraduccionMarco_jMenuFileOpenUML_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jMenuFileOpenUML_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

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


class TraduccionMarco_jMenuHelpAbout_ActionAdapter implements ActionListener {
    TraduccionMarco adaptee;

    TraduccionMarco_jMenuHelpAbout_ActionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

    public void actionPerformed(ActionEvent actionEvent) {
        adaptee.jMenuHelpAbout_actionPerformed(actionEvent);
    }
}

class TraduccionMarco_jButton42_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jButton42_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

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

class TraduccionMarco_jButtonMessage_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jButtonMessage_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

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


class TraduccionMarco_jButtonActor_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jButtonActor_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

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


class TraduccionMarco_jButtonLifeline_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jButtonLifeline_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

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



//Listeners para pestaña CPN Tools

class TraduccionMarco_jMenuItem4_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jMenuItem4_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

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

class TraduccionMarco_jButton14_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jButton14_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

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

class TraduccionMarco_jButton15_actionAdapter implements ActionListener {
    private TraduccionMarco adaptee;
    TraduccionMarco_jButton15_actionAdapter(TraduccionMarco adaptee) {
        this.adaptee = adaptee;
    }

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