/*
 *      Luis Israel Diéguez Arjona
 *      Sonia Cejas Soria
 *      Sergio Cabello García
 *      María José González Cordero
 *
 *      Ingeniería del Software de Gestión II
 *      Ingeniería Técnica Informática de Gestión
 *      Universidad de Huelva
 */

/*
 *      JTree por defecto:
            Documento de requisitos del sistema
             1 Organizaciones
             2 Introducción
             3 Participantes del proyecto
             4 Descripción actual
             5 Objetivos del sistema
             6 Requisitos del sistema
              6.1 Requisitos de información
              6.2 Requisitos funcionales
               6.2.1 Diagrama de casos de uso
               6.2.2 Definicion de autores
               6.2.3 Casos de uso del sistema
              6.3 Requisisitos no funcionales
             7 Matriz de rastreabilidad
             8 Glosario de términos
 */

package vista;

import controlador.Utilidades;
import java.io.File;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import modelo.*;
import javax.swing.ImageIcon;
import javax.swing.UIManager;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;





public class jfHome extends javax.swing.JFrame {
    DocumentoRequisitos documentoRequisitos = new DocumentoRequisitos();
    Utilidades utilidades = new Utilidades();





    public jfHome() {
        // Look and Feel del SO en el que nos encontremos
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
           e.printStackTrace();
        }
        
        // Pantalla maximizada
        this.setExtendedState(MAXIMIZED_BOTH);

        // Configuración del icono de la aplicación
        this.setIconImage(new ImageIcon(getClass().getResource("/vista/icons/IconoAplicacion.png")).getImage());

        // Inicialización de los componentes
        initComponents();
        jTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);   // Una única selección de nodos

        //Centrar ventana
        this.setLocationRelativeTo(null);

        // Iconos del JTree
        DefaultTreeCellRenderer render = (DefaultTreeCellRenderer)jTree.getCellRenderer();
        ImageIcon icono = new ImageIcon(getClass().getResource("/vista/icons/DirectorioJTree.png"));
        render.setLeafIcon(icono);
        render.setOpenIcon(icono);
        render.setClosedIcon(icono);

        // Expandir el JTree
        for (int i = 0; i < jTree.getSize().height; i++)
            jTree.expandPath(getJTree().getPathForRow(i));

        // Inicialización del TextPane
        jTextPane.setContentType("text/html");
    }





    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPopupMenu = new javax.swing.JPopupMenu();
        jMenuItem_subir = new javax.swing.JMenuItem();
        jMenuItem_bajar = new javax.swing.JMenuItem();
        jSeparator6 = new javax.swing.JSeparator();
        jMenuItem_anadirPaso = new javax.swing.JMenuItem();
        jMenuItem_anadirExcepcion = new javax.swing.JMenuItem();
        jMenuItem_editarPropiedades = new javax.swing.JMenuItem();
        jSeparator7 = new javax.swing.JSeparator();
        jMenuItem_eliminar = new javax.swing.JMenuItem();
        jToolBar1 = new javax.swing.JToolBar();
        jButton_nuevo = new javax.swing.JButton();
        jButton_abrir = new javax.swing.JButton();
        jButton_guardar = new javax.swing.JButton();
        jSeparator1 = new javax.swing.JToolBar.Separator();
        jButton_cortar = new javax.swing.JButton();
        jButton_copiar = new javax.swing.JButton();
        jButton_pegar = new javax.swing.JButton();
        jPanel1 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();
        jButton_nuevaSeccionApendice = new javax.swing.JButton();
        jButton_nuevoParrafoElementoGlosario = new javax.swing.JButton();
        jButton_nuevaImagen = new javax.swing.JButton();
        jSeparator2 = new javax.swing.JToolBar.Separator();
        jButton_nuevaOrganizacion = new javax.swing.JButton();
        jButton_nuevoParticipante = new javax.swing.JButton();
        jButton_nuevaReunion = new javax.swing.JButton();
        jSeparator3 = new javax.swing.JToolBar.Separator();
        jButton_nuevoObjetivo = new javax.swing.JButton();
        jButton_nuevoActor = new javax.swing.JButton();
        jButton_nuevoReqInformacion = new javax.swing.JButton();
        jButton_nuevoReqRestriccion = new javax.swing.JButton();
        jButton_nuevoCasoUso = new javax.swing.JButton();
        jButton_nuevoReqFuncional = new javax.swing.JButton();
        jButton_nuevoReqNoFuncional = new javax.swing.JButton();
        jButton_nuevaMatrizRastreabilidad = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTree = new javax.swing.JTree();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTextPane = new javax.swing.JTextPane();
        jToolBar_barraEstado = new javax.swing.JToolBar();
        jLabel_barraEstado = new javax.swing.JLabel();
        menuBar = new javax.swing.JMenuBar();
        jMenu_archivo = new javax.swing.JMenu();
        mItem_nuevo = new javax.swing.JMenuItem();
        mItem_abrir = new javax.swing.JMenuItem();
        mItem_cerrar = new javax.swing.JMenuItem();
        jSeparator5 = new javax.swing.JSeparator();
        mItem_guardar = new javax.swing.JMenuItem();
        mItem_guardarComo = new javax.swing.JMenuItem();
        jSeparator4 = new javax.swing.JSeparator();
        mItem_salir = new javax.swing.JMenuItem();
        jMenu_editar = new javax.swing.JMenu();
        mItem_cortar = new javax.swing.JMenuItem();
        mItem_copiar = new javax.swing.JMenuItem();
        mItem_pegar = new javax.swing.JMenuItem();
        jMenu_ver = new javax.swing.JMenu();
        mItem_barraHerramientas = new javax.swing.JMenuItem();
        mItem_barraEstado = new javax.swing.JMenuItem();
        mItem_barraCreacion = new javax.swing.JMenuItem();
        jMenu_herramientas = new javax.swing.JMenu();
        mItem_preferencias = new javax.swing.JMenuItem();
        jMenu_ventana = new javax.swing.JMenu();
        jMenu_ayuda = new javax.swing.JMenu();
        mItem_ayuda = new javax.swing.JMenuItem();
        mItem_acercaDe = new javax.swing.JMenuItem();

        jPopupMenu.setComponentPopupMenu(jPopupMenu);
        jPopupMenu.addPopupMenuListener(new javax.swing.event.PopupMenuListener() {
            public void popupMenuCanceled(javax.swing.event.PopupMenuEvent evt) {
            }
            public void popupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt) {
            }
            public void popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) {
                jPopupMenuPopupMenuWillBecomeVisible(evt);
            }
        });

        jMenuItem_subir.setText("Subir");
        jPopupMenu.add(jMenuItem_subir);

        jMenuItem_bajar.setText("Bajar");
        jPopupMenu.add(jMenuItem_bajar);
        jPopupMenu.add(jSeparator6);

        jMenuItem_anadirPaso.setText("Añadir paso");
        jMenuItem_anadirPaso.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem_anadirPasoActionPerformed(evt);
            }
        });
        jPopupMenu.add(jMenuItem_anadirPaso);

        jMenuItem_anadirExcepcion.setText("Añadir excepción");
        jMenuItem_anadirExcepcion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem_anadirExcepcionActionPerformed(evt);
            }
        });
        jPopupMenu.add(jMenuItem_anadirExcepcion);

        jMenuItem_editarPropiedades.setText("Editar propiedades");
        jMenuItem_editarPropiedades.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem_editarPropiedadesActionPerformed(evt);
            }
        });
        jPopupMenu.add(jMenuItem_editarPropiedades);
        jPopupMenu.add(jSeparator7);

        jMenuItem_eliminar.setText("Eliminar");
        jMenuItem_eliminar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem_eliminarActionPerformed(evt);
            }
        });
        jPopupMenu.add(jMenuItem_eliminar);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("AZETA Requirements Management");
        setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));

        jToolBar1.setFloatable(false);
        jToolBar1.setRollover(true);
        jToolBar1.setPreferredSize(new java.awt.Dimension(696, 33));

        jButton_nuevo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/Nuevo.png"))); // NOI18N
        jButton_nuevo.setToolTipText("Nuevo");
        jButton_nuevo.setFocusable(false);
        jButton_nuevo.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_nuevo.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton_nuevo);

        jButton_abrir.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/Abrir.png"))); // NOI18N
        jButton_abrir.setToolTipText("Abrir");
        jButton_abrir.setFocusable(false);
        jButton_abrir.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_abrir.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton_abrir);

        jButton_guardar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/Guardar.png"))); // NOI18N
        jButton_guardar.setToolTipText("Guardar");
        jButton_guardar.setFocusable(false);
        jButton_guardar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_guardar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton_guardar);
        jToolBar1.add(jSeparator1);

        jButton_cortar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/Cortar.png"))); // NOI18N
        jButton_cortar.setToolTipText("Cortar");
        jButton_cortar.setFocusable(false);
        jButton_cortar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_cortar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton_cortar);

        jButton_copiar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/Copiar.png"))); // NOI18N
        jButton_copiar.setToolTipText("Copiar");
        jButton_copiar.setFocusable(false);
        jButton_copiar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_copiar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton_copiar);

        jButton_pegar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/Pegar.png"))); // NOI18N
        jButton_pegar.setToolTipText("Pegar");
        jButton_pegar.setFocusable(false);
        jButton_pegar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_pegar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton_pegar);

        jPanel1.setMaximumSize(new java.awt.Dimension(150, 23));
        jPanel1.setPreferredSize(new java.awt.Dimension(50, 23));

        jButton1.setText("Actualizar TextPane");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addContainerGap(11, Short.MAX_VALUE)
                .addComponent(jButton1)
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addComponent(jButton1)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jToolBar1.add(jPanel1);

        jButton_nuevaSeccionApendice.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/SeccionNueva.png"))); // NOI18N
        jButton_nuevaSeccionApendice.setToolTipText("Nueva sección/apéndice");
        jButton_nuevaSeccionApendice.setFocusable(false);
        jButton_nuevaSeccionApendice.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_nuevaSeccionApendice.setMaximumSize(new java.awt.Dimension(33, 31));
        jButton_nuevaSeccionApendice.setMinimumSize(new java.awt.Dimension(31, 31));
        jButton_nuevaSeccionApendice.setPreferredSize(new java.awt.Dimension(31, 31));
        jButton_nuevaSeccionApendice.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton_nuevaSeccionApendice);
        jButton_nuevaSeccionApendice.getAccessibleContext().setAccessibleDescription("");

        jButton_nuevoParrafoElementoGlosario.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/ParrafoNuevo.png"))); // NOI18N
        jButton_nuevoParrafoElementoGlosario.setToolTipText("Nuevo párrafo/elemento del glosario");
        jButton_nuevoParrafoElementoGlosario.setFocusable(false);
        jButton_nuevoParrafoElementoGlosario.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_nuevoParrafoElementoGlosario.setMaximumSize(new java.awt.Dimension(33, 31));
        jButton_nuevoParrafoElementoGlosario.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton_nuevoParrafoElementoGlosario);

        jButton_nuevaImagen.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/ImagenNueva.png"))); // NOI18N
        jButton_nuevaImagen.setToolTipText("Nueva imagen");
        jButton_nuevaImagen.setFocusable(false);
        jButton_nuevaImagen.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_nuevaImagen.setMaximumSize(new java.awt.Dimension(33, 31));
        jButton_nuevaImagen.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton_nuevaImagen);

        jSeparator2.setMaximumSize(new java.awt.Dimension(25, 32767));
        jToolBar1.add(jSeparator2);

        jButton_nuevaOrganizacion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/OrganizacionNueva.png"))); // NOI18N
        jButton_nuevaOrganizacion.setToolTipText("Nueva organización");
        jButton_nuevaOrganizacion.setFocusable(false);
        jButton_nuevaOrganizacion.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_nuevaOrganizacion.setMaximumSize(new java.awt.Dimension(33, 31));
        jButton_nuevaOrganizacion.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton_nuevaOrganizacion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton_nuevaOrganizacionActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton_nuevaOrganizacion);

        jButton_nuevoParticipante.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/ParticipanteNuevo.png"))); // NOI18N
        jButton_nuevoParticipante.setToolTipText("Nuevo participante");
        jButton_nuevoParticipante.setFocusable(false);
        jButton_nuevoParticipante.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_nuevoParticipante.setMaximumSize(new java.awt.Dimension(33, 31));
        jButton_nuevoParticipante.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton_nuevoParticipante.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton_nuevoParticipanteActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton_nuevoParticipante);

        jButton_nuevaReunion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/ReunionNueva.png"))); // NOI18N
        jButton_nuevaReunion.setToolTipText("Nueva reunión");
        jButton_nuevaReunion.setFocusable(false);
        jButton_nuevaReunion.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_nuevaReunion.setMaximumSize(new java.awt.Dimension(33, 31));
        jButton_nuevaReunion.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton_nuevaReunion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton_nuevaReunionActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton_nuevaReunion);

        jSeparator3.setMaximumSize(new java.awt.Dimension(25, 32767));
        jToolBar1.add(jSeparator3);

        jButton_nuevoObjetivo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/ObjetivoNuevo.png"))); // NOI18N
        jButton_nuevoObjetivo.setToolTipText("Nuevo objetivo");
        jButton_nuevoObjetivo.setFocusable(false);
        jButton_nuevoObjetivo.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_nuevoObjetivo.setMaximumSize(new java.awt.Dimension(33, 31));
        jButton_nuevoObjetivo.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton_nuevoObjetivo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton_nuevoObjetivoActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton_nuevoObjetivo);

        jButton_nuevoActor.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/ActorNuevo.png"))); // NOI18N
        jButton_nuevoActor.setToolTipText("Nuevo actor");
        jButton_nuevoActor.setFocusable(false);
        jButton_nuevoActor.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_nuevoActor.setMaximumSize(new java.awt.Dimension(33, 31));
        jButton_nuevoActor.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton_nuevoActor.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton_nuevoActorActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton_nuevoActor);

        jButton_nuevoReqInformacion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/ReqInformacionNuevo.png"))); // NOI18N
        jButton_nuevoReqInformacion.setToolTipText("Nuevo requisito de información");
        jButton_nuevoReqInformacion.setFocusable(false);
        jButton_nuevoReqInformacion.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_nuevoReqInformacion.setMaximumSize(new java.awt.Dimension(33, 31));
        jButton_nuevoReqInformacion.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton_nuevoReqInformacion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton_nuevoReqInformacionActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton_nuevoReqInformacion);

        jButton_nuevoReqRestriccion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/ReqRestriccionNuevo.png"))); // NOI18N
        jButton_nuevoReqRestriccion.setToolTipText("Nuevo requisito de restricción");
        jButton_nuevoReqRestriccion.setFocusable(false);
        jButton_nuevoReqRestriccion.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_nuevoReqRestriccion.setMaximumSize(new java.awt.Dimension(33, 31));
        jButton_nuevoReqRestriccion.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton_nuevoReqRestriccion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton_nuevoReqRestriccionActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton_nuevoReqRestriccion);

        jButton_nuevoCasoUso.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/CasoUsoNuevo.png"))); // NOI18N
        jButton_nuevoCasoUso.setToolTipText("Nuevo caso de uso");
        jButton_nuevoCasoUso.setFocusable(false);
        jButton_nuevoCasoUso.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_nuevoCasoUso.setMaximumSize(new java.awt.Dimension(33, 31));
        jButton_nuevoCasoUso.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton_nuevoCasoUso.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton_nuevoCasoUsoActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton_nuevoCasoUso);

        jButton_nuevoReqFuncional.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/ReqFuncionalNuevo.png"))); // NOI18N
        jButton_nuevoReqFuncional.setToolTipText("Nuevo requisito funcional");
        jButton_nuevoReqFuncional.setFocusable(false);
        jButton_nuevoReqFuncional.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_nuevoReqFuncional.setMaximumSize(new java.awt.Dimension(33, 31));
        jButton_nuevoReqFuncional.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton_nuevoReqFuncional.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton_nuevoReqFuncionalActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton_nuevoReqFuncional);

        jButton_nuevoReqNoFuncional.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/ReqNoFuncionalNuevo.png"))); // NOI18N
        jButton_nuevoReqNoFuncional.setToolTipText("Nuevo requisito no funcional");
        jButton_nuevoReqNoFuncional.setFocusable(false);
        jButton_nuevoReqNoFuncional.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_nuevoReqNoFuncional.setMaximumSize(new java.awt.Dimension(33, 31));
        jButton_nuevoReqNoFuncional.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton_nuevoReqNoFuncional.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton_nuevoReqNoFuncionalActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton_nuevoReqNoFuncional);

        jButton_nuevaMatrizRastreabilidad.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/MatrizRastreabilidadNueva.png"))); // NOI18N
        jButton_nuevaMatrizRastreabilidad.setToolTipText("Nueva matriz de rastreabilidad");
        jButton_nuevaMatrizRastreabilidad.setFocusable(false);
        jButton_nuevaMatrizRastreabilidad.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton_nuevaMatrizRastreabilidad.setMaximumSize(new java.awt.Dimension(33, 31));
        jButton_nuevaMatrizRastreabilidad.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton_nuevaMatrizRastreabilidad);

        javax.swing.tree.DefaultMutableTreeNode treeNode1 = new javax.swing.tree.DefaultMutableTreeNode("Documento de requisitos del sistema");
        jTree.setModel(new javax.swing.tree.DefaultTreeModel(treeNode1));
        jTree.setComponentPopupMenu(jPopupMenu);
        jScrollPane1.setViewportView(jTree);

        jTextPane.setEditable(false);
        jScrollPane2.setViewportView(jTextPane);

        jToolBar_barraEstado.setFloatable(false);
        jToolBar_barraEstado.setRollover(true);
        jToolBar_barraEstado.add(jLabel_barraEstado);

        jMenu_archivo.setText("Archivo");

        mItem_nuevo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/Nuevo.png"))); // NOI18N
        mItem_nuevo.setText("Nuevo");
        jMenu_archivo.add(mItem_nuevo);

        mItem_abrir.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/Abrir.png"))); // NOI18N
        mItem_abrir.setText("Abrir");
        jMenu_archivo.add(mItem_abrir);

        mItem_cerrar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/Cerrar.png"))); // NOI18N
        mItem_cerrar.setText("Cerrar");
        jMenu_archivo.add(mItem_cerrar);
        jMenu_archivo.add(jSeparator5);

        mItem_guardar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/Guardar.png"))); // NOI18N
        mItem_guardar.setText("Guardar");
        jMenu_archivo.add(mItem_guardar);

        mItem_guardarComo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/GuardarComo.png"))); // NOI18N
        mItem_guardarComo.setText("Guardar como...");
        jMenu_archivo.add(mItem_guardarComo);
        jMenu_archivo.add(jSeparator4);

        mItem_salir.setText("Salir");
        mItem_salir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mItem_salirActionPerformed(evt);
            }
        });
        jMenu_archivo.add(mItem_salir);

        menuBar.add(jMenu_archivo);

        jMenu_editar.setText("Editar");

        mItem_cortar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/Cortar.png"))); // NOI18N
        mItem_cortar.setText("Cortar");
        jMenu_editar.add(mItem_cortar);

        mItem_copiar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/Copiar.png"))); // NOI18N
        mItem_copiar.setText("Copiar");
        jMenu_editar.add(mItem_copiar);

        mItem_pegar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/Pegar.png"))); // NOI18N
        mItem_pegar.setText("Pegar");
        jMenu_editar.add(mItem_pegar);

        menuBar.add(jMenu_editar);

        jMenu_ver.setText("Ver");

        mItem_barraHerramientas.setText("Barra de herramientas");
        jMenu_ver.add(mItem_barraHerramientas);

        mItem_barraEstado.setText("Barra de estado");
        jMenu_ver.add(mItem_barraEstado);

        mItem_barraCreacion.setText("Barra de creación");
        jMenu_ver.add(mItem_barraCreacion);

        menuBar.add(jMenu_ver);

        jMenu_herramientas.setText("Herramientas");

        mItem_preferencias.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/Preferencias.png"))); // NOI18N
        mItem_preferencias.setText("Preferencias");
        jMenu_herramientas.add(mItem_preferencias);

        menuBar.add(jMenu_herramientas);

        jMenu_ventana.setText("Ventana");
        menuBar.add(jMenu_ventana);

        jMenu_ayuda.setText("Ayuda");

        mItem_ayuda.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/Ayuda.png"))); // NOI18N
        mItem_ayuda.setText("Ayuda");
        jMenu_ayuda.add(mItem_ayuda);

        mItem_acercaDe.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/icons/AcercaDe.png"))); // NOI18N
        mItem_acercaDe.setText("Acerca de");
        jMenu_ayuda.add(mItem_acercaDe);

        menuBar.add(jMenu_ayuda);

        setJMenuBar(menuBar);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(10, 10, 10)
                        .addComponent(jToolBar_barraEstado, javax.swing.GroupLayout.DEFAULT_SIZE, 910, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 266, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 626, Short.MAX_VALUE)
                        .addGap(10, 10, 10))
                    .addComponent(jToolBar1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 920, Short.MAX_VALUE)))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 444, Short.MAX_VALUE)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 444, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jToolBar_barraEstado, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void mItem_salirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mItem_salirActionPerformed
        System.exit(0);
}//GEN-LAST:event_mItem_salirActionPerformed
    private void jButton_nuevoCasoUsoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_nuevoCasoUsoActionPerformed
        TreePath tp = getJTree().getSelectionPath();                            // GET ruta

        if (tp == null) {                                                       // Si ruta vacía...
            this.jLabel_barraEstado.setText("Seleccione un elemento");
        } else {                                                                // Si ruta NO vacía (se ha seleccionado elemento del JTree)...
            this.jLabel_barraEstado.setText("");
            // Creo ventana de CasoUso
            jfCasoUso jfCasoUso = new jfCasoUso(this);
            jfCasoUso.setVisible(true);
            this.setEnabled(false);
            //Centrar ventana
            jfCasoUso.setLocationRelativeTo(this);
            documentoRequisitos.addObserver(jfCasoUso);
        }
    }//GEN-LAST:event_jButton_nuevoCasoUsoActionPerformed
    private void jPopupMenuPopupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) {//GEN-FIRST:event_jPopupMenuPopupMenuWillBecomeVisible
        // Nodo seleccionado actualmente
        TreePath tp = jTree.getSelectionPath();

        if (tp == null) {                                                       // Si ruta vacía...
            generarMenuPopup(-1, "");                                           //  No mostrar menú

        } else {                                                                // Si ruta NO vacía...
            MutableTreeNode nodoSeleccionado = (MutableTreeNode) tp.getLastPathComponent();

            // Identifico el tipo de Caso de uso que es (Actor, Reunión,...), recupero su información y la restauro
            String preIdent = utilidades.getPreIdentificadorNodo(nodoSeleccionado);

            if (preIdent.equals("UC"))
                generarMenuPopup(1, "UC");

            else if (preIdent.equals("UCP"))
                generarMenuPopup(1, "UCP");

            else if (preIdent.equals("SEC") ||
                preIdent.equals("PRG") ||
                preIdent.equals("GRF") ||
                preIdent.equals("ORG") ||
                preIdent.equals("STK") ||
                preIdent.equals("MET") ||
                preIdent.equals("OBJ") ||
                preIdent.equals("ACT") ||
                preIdent.equals("IRQ") ||
                preIdent.equals("CRQ") ||
                preIdent.equals("UCE") ||
                preIdent.equals("FRQ") ||
                preIdent.equals("NFR") ||
                preIdent.equals("TRM") )
                generarMenuPopup(1, "");

            else
                generarMenuPopup(-1, "");                                       // No mostrar menú
        }

    }//GEN-LAST:event_jPopupMenuPopupMenuWillBecomeVisible
    private void jButton_nuevoReqFuncionalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_nuevoReqFuncionalActionPerformed
        TreePath tp = getJTree().getSelectionPath();                            // GET ruta

        if (tp == null) {                                                       // Si ruta vacía...
            this.jLabel_barraEstado.setText("Seleccione un elemento");
        } else {                                                                // Si ruta NO vacía (se ha seleccionado elemento del JTree)...
            this.jLabel_barraEstado.setText("");
            // Creo ventana
            jfReq_Funcional jfReq_Funcional = new jfReq_Funcional(this);
            jfReq_Funcional.setVisible(true);
            this.setEnabled(false);
            //Centrar ventana
            jfReq_Funcional.setLocationRelativeTo(this);
            documentoRequisitos.addObserver(jfReq_Funcional);
        }
    }//GEN-LAST:event_jButton_nuevoReqFuncionalActionPerformed
    private void jButton_nuevoReqNoFuncionalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_nuevoReqNoFuncionalActionPerformed
        TreePath tp = getJTree().getSelectionPath();                            // GET ruta

        if (tp == null) {                                                       // Si ruta vacía...
            this.jLabel_barraEstado.setText("Seleccione un elemento");
        } else {                                                                // Si ruta NO vacía (se ha seleccionado elemento del JTree)...
            this.jLabel_barraEstado.setText("");
            // Creo ventana
            jfReq_NoFuncional jfReq_NoFuncional = new jfReq_NoFuncional(this);
            jfReq_NoFuncional.setVisible(true);
            this.setEnabled(false);
            //Centrar ventana
            jfReq_NoFuncional.setLocationRelativeTo(this);
            documentoRequisitos.addObserver(jfReq_NoFuncional);
        }
    }//GEN-LAST:event_jButton_nuevoReqNoFuncionalActionPerformed
    private void jButton_nuevoReqRestriccionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_nuevoReqRestriccionActionPerformed
        TreePath tp = getJTree().getSelectionPath();                            // GET ruta

        if (tp == null) {                                                       // Si ruta vacía...
            this.jLabel_barraEstado.setText("Seleccione un elemento");
        } else {                                                                // Si ruta NO vacía (se ha seleccionado elemento del JTree)...
            this.jLabel_barraEstado.setText("");
            // Creo ventana
            jfReq_Restriccion jfReq_Restriccion = new jfReq_Restriccion(this);
            jfReq_Restriccion.setVisible(true);
            this.setEnabled(false);
            //Centrar ventana
            jfReq_Restriccion.setLocationRelativeTo(this);
            documentoRequisitos.addObserver(jfReq_Restriccion);
        }
    }//GEN-LAST:event_jButton_nuevoReqRestriccionActionPerformed
    private void jButton_nuevoReqInformacionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_nuevoReqInformacionActionPerformed
        TreePath tp = getJTree().getSelectionPath();                            // GET ruta

        if (tp == null) {                                                       // Si ruta vacía...
            this.jLabel_barraEstado.setText("Seleccione un elemento");
        } else {                                                                // Si ruta NO vacía (se ha seleccionado elemento del JTree)...
            this.jLabel_barraEstado.setText("");
            // Creo ventana
            jfReq_Informacion jfReq_Informacion = new jfReq_Informacion(this);
            jfReq_Informacion.setVisible(true);
            this.setEnabled(false);
            //Centrar ventana
            jfReq_Informacion.setLocationRelativeTo(this);

            documentoRequisitos.addObserver(jfReq_Informacion);
        }
    }//GEN-LAST:event_jButton_nuevoReqInformacionActionPerformed
    private void jMenuItem_anadirPasoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem_anadirPasoActionPerformed
        TreePath tp = getJTree().getSelectionPath();                            // GET ruta

        if (tp == null) {                                                       // Si ruta vacía...
            this.jLabel_barraEstado.setText("Seleccione un Caso de uso");
        } else {                                                                // Si ruta NO vacía (se ha seleccionado elemento del JTree)...
            this.jLabel_barraEstado.setText("");
            // Comprobar que nodo seleccionado es un Caso de uso
            MutableTreeNode nodoSeleccionado = (MutableTreeNode) tp.getLastPathComponent();
            String preIdentCasoUsoPadre = utilidades.getPreIdentificadorNodo (nodoSeleccionado);
            if (preIdentCasoUsoPadre.equals("UC")) {
                // Creo ventana de Paso
                String identCasoUsoPadre = utilidades.getIdentificadorNodo(nodoSeleccionado);
                jfCasoUso_Paso jfCasoUso_Paso = new jfCasoUso_Paso(this, identCasoUsoPadre);
                jfCasoUso_Paso.setVisible(true);
                this.setEnabled(false);
                //Centrar ventana
                jfCasoUso_Paso.setLocationRelativeTo(this);
                documentoRequisitos.addObserver(jfCasoUso_Paso);
            } else
                this.jLabel_barraEstado.setText("Seleccione un Caso de uso");
        }
    }//GEN-LAST:event_jMenuItem_anadirPasoActionPerformed
    private void jMenuItem_anadirExcepcionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem_anadirExcepcionActionPerformed
        TreePath tp = getJTree().getSelectionPath();                            // GET ruta

        if (tp == null) {                                                       // Si ruta vacía...
            this.jLabel_barraEstado.setText("Seleccione un Paso de un Caso de Uso");
        } else {                                                                // Si ruta NO vacía (se ha seleccionado elemento del JTree)...
            this.jLabel_barraEstado.setText("");
            // Comprobar que nodo seleccionado es un Paso
            MutableTreeNode nodoSeleccionado = (MutableTreeNode) tp.getLastPathComponent();
            String preIdentPasoPadre = utilidades.getPreIdentificadorNodo (nodoSeleccionado);
            if (preIdentPasoPadre.equals("UCP")) {
                // Creo ventana de Excepción
                MutableTreeNode nodoPadre = (MutableTreeNode) nodoSeleccionado.getParent();
                String identCasoUsoPadre = utilidades.getIdentificadorNodo(nodoPadre);
                String identPasoPadre = utilidades.getIdentificadorNodo(nodoSeleccionado);
                jfCasoUso_Excepcion jfCasoUso_Excepcion = new jfCasoUso_Excepcion(this, identCasoUsoPadre, identPasoPadre);
                jfCasoUso_Excepcion.setVisible(true);
                this.setEnabled(false);
                //Centrar ventana
                jfCasoUso_Excepcion.setLocationRelativeTo(this);
                documentoRequisitos.addObserver(jfCasoUso_Excepcion);
            } else
                this.jLabel_barraEstado.setText("Seleccione un Paso de un Caso de Uso");
        }
    }//GEN-LAST:event_jMenuItem_anadirExcepcionActionPerformed
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        this.actualizarTextPane();
    }//GEN-LAST:event_jButton1ActionPerformed
    private void jButton_nuevoObjetivoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_nuevoObjetivoActionPerformed
           TreePath tp = getJTree().getSelectionPath();                            // GET ruta

        if (tp == null) {                                                       // Si ruta vacía...
            this.jLabel_barraEstado.setText("Seleccione un elemento");
        } else {                                                                // Si ruta NO vacía (se ha seleccionado elemento del JTree)...
            this.jLabel_barraEstado.setText("");
            // Creo ventana
            jfObjetivo jfObjetivo = new jfObjetivo(this);
            jfObjetivo.setVisible(true);
            this.setEnabled(false);
            //Centrar ventana
            jfObjetivo.setLocationRelativeTo(this);
            documentoRequisitos.addObserver(jfObjetivo);
        }
    }//GEN-LAST:event_jButton_nuevoObjetivoActionPerformed
    private void jButton_nuevaReunionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_nuevaReunionActionPerformed
        TreePath tp = getJTree().getSelectionPath();                            // GET ruta

        if (tp == null) {                                                       // Si ruta vacía...
            this.jLabel_barraEstado.setText("Seleccione un elemento");
        } else {                                                                // Si ruta NO vacía (se ha seleccionado elemento del JTree)...
            this.jLabel_barraEstado.setText("");
            // Creo ventana
            jfReunion jfReunion = new jfReunion(this);
            jfReunion.setVisible(true);
            this.setEnabled(false);
            //Centrar ventana
            jfReunion.setLocationRelativeTo(this);
            documentoRequisitos.addObserver(jfReunion);
        }
    }//GEN-LAST:event_jButton_nuevaReunionActionPerformed
    private void jButton_nuevoParticipanteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_nuevoParticipanteActionPerformed
        TreePath tp = getJTree().getSelectionPath();                            // GET ruta

        if (tp == null) {                                                       // Si ruta vacía...
            this.jLabel_barraEstado.setText("Seleccione un elemento");
        } else {                                                                // Si ruta NO vacía (se ha seleccionado elemento del JTree)...
            this.jLabel_barraEstado.setText("");
            // Creo ventana
            jfParticipante jfParticipante = new jfParticipante(this);
            jfParticipante.setVisible(true);
            this.setEnabled(false);
            // Centrar ventana
            jfParticipante.setLocationRelativeTo(this);
            documentoRequisitos.addObserver(jfParticipante);
        }
    }//GEN-LAST:event_jButton_nuevoParticipanteActionPerformed
    private void jButton_nuevaOrganizacionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_nuevaOrganizacionActionPerformed
        TreePath tp = getJTree().getSelectionPath();                            // GET ruta

        if (tp == null) {                                                       // Si ruta vacía...
            this.jLabel_barraEstado.setText("Seleccione un elemento");
        } else {                                                                // Si ruta NO vacía (se ha seleccionado elemento del JTree)...
            this.jLabel_barraEstado.setText("");
            // Creo ventana
            jfOrganizacion organizacion = new jfOrganizacion(this);
            organizacion.setVisible(true);
            this.setEnabled(false);
            //Centrar ventana
            organizacion.setLocationRelativeTo(this);
            documentoRequisitos.addObserver(organizacion);
        }
    }//GEN-LAST:event_jButton_nuevaOrganizacionActionPerformed





    private void jMenuItem_editarPropiedadesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem_editarPropiedadesActionPerformed
        // Nodo seleccionado actualmente
        TreePath tp = jTree.getSelectionPath();
        MutableTreeNode nodoSeleccionado = (MutableTreeNode) tp.getLastPathComponent();

        // Identifico el tipo de Caso de uso que es (Actor, Reunión,...), recupero su información y la restauro
        String preIdent = utilidades.getPreIdentificadorNodo(nodoSeleccionado);
        String identCompleto = utilidades.getIdentificadorNodo(nodoSeleccionado);

        if (preIdent.equals("STK")) {
            // Obtengo todos los participantes e inicializo las variables auxiliares
            ArrayList<Participante> participantes = documentoRequisitos.getParticipante();
            int i = 0;
            boolean encontrado = false;

            // Recorro todos los participantes y encuentro el deseado
            while (i < participantes.size() && encontrado == false) {
                if (participantes.get(i).getIdentificacion().equals(identCompleto)) {           // SI encuentro el participante deseado...
                    encontrado = true;                                                          //  Lo indico
                    // Creo ventana
                    jfParticipante jfParticipante = new jfParticipante(this);
                    jfParticipante.inicializarModificacion(participantes.get(i));
                    jfParticipante.setVisible(true);
                    this.setEnabled(false);
                    // Centrar ventana
                    jfParticipante.setLocationRelativeTo(this);
                    documentoRequisitos.addObserver(jfParticipante);
                }
                i++;
            }
        } else if (preIdent.equals("MET")) {
            // Obtengo el ArrayList e inicializo las variables auxiliares
            ArrayList<Reunion> reuniones = documentoRequisitos.getReuniones();
            int i = 0;
            boolean encontrado = false;

            // Recorro el ArrayList y encuentro el elemento deseado
            while (i < reuniones.size() && encontrado == false) {
                if (reuniones.get(i).getIdentificacion().equals(identCompleto)) {               // SI encuentro el deseado...
                    encontrado = true;                                                          //  Lo indico
                    // Creo ventana
                    jfReunion jfReunion = new jfReunion(this);
                    jfReunion.inicializarModificacion(reuniones.get(i));
                    jfReunion.setVisible(true);
                    this.setEnabled(false);
                    // Centrar ventana
                    jfReunion.setLocationRelativeTo(this);
                    documentoRequisitos.addObserver(jfReunion);
                }
                i++;
            }
        } else if (preIdent.equals("IRQ")) {
            // Obtengo el ArrayList e inicializo las variables auxiliares
            ArrayList<RequisitoInformacion> reqInformacion = documentoRequisitos.getRequisitosInformacion();
            int i = 0;
            boolean encontrado = false;

            // Recorro el ArrayList y encuentro el elemento deseado
            while (i < reqInformacion.size() && encontrado == false) {
                if (reqInformacion.get(i).getIdentificacion().equals(identCompleto)) {      // SI encuentro el deseado...
                    encontrado = true;                                                          //  Lo indico
                    // Creo ventana
                    jfReq_Informacion jfReq_Informacion = new jfReq_Informacion(this);
                    jfReq_Informacion.inicializarModificacion(reqInformacion.get(i));
                    jfReq_Informacion.setVisible(true);
                    this.setEnabled(false);
                    // Centrar ventana
                    jfReq_Informacion.setLocationRelativeTo(this);
                    documentoRequisitos.addObserver(jfReq_Informacion);
                }
                i++;
     //SERGIOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
            }
        } else if (preIdent.equals("ORG")) {
            // Obtengo todos los participantes e inicializo las variables auxiliares
            ArrayList<Organizacion> organizaciones = documentoRequisitos.getOrganizacion();
            int i = 0;
            boolean encontrado = false;

            // Recorro todos los participantes y encuentro el deseado
            while (i < organizaciones.size() && encontrado == false) {
                if (organizaciones.get(i).getIdentificacion().equals(identCompleto)) {            // SI encuentro el participante deseado...
                    encontrado = true;                                                          //  Lo indico
                    // Creo ventana
                    jfOrganizacion jfOrganizacion = new jfOrganizacion(this);
                    jfOrganizacion.inicializarModificacion(organizaciones.get(i));
                    jfOrganizacion.setVisible(true);
                    this.setEnabled(false);
                    // Centrar ventana
                    jfOrganizacion.setLocationRelativeTo(this);
                    documentoRequisitos.addObserver(jfOrganizacion);
                }
                i++;
             }
        } else if (preIdent.equals("OBJ")) {
                // Obtengo todos los participantes e inicializo las variables auxiliares
                ArrayList<Objetivo> objetivo = documentoRequisitos.getObjetivos();
                int i = 0;
                boolean encontrado = false;

                // Recorro todos los participantes y encuentro el deseado
                while (i < objetivo.size() && encontrado == false) {
                    if (objetivo.get(i).getIdentificacion().equals(identCompleto)) {            // SI encuentro el participante deseado...
                        encontrado = true;                                                          //  Lo indico
                        // Creo ventana
                        jfObjetivo jfObjetivo = new jfObjetivo(this);
                        jfObjetivo.inicializarModificacion(objetivo.get(i));
                        jfObjetivo.setVisible(true);
                        this.setEnabled(false);
                        // Centrar ventana
                        jfObjetivo.setLocationRelativeTo(this);
                        documentoRequisitos.addObserver(jfObjetivo);
                    }
                    i++;
                }
        } else if (preIdent.equals("ACT")) {
            // Obtengo todos los participantes e inicializo las variables auxiliares
            ArrayList<Actor> actor = documentoRequisitos.getActores();
            int i = 0;
            boolean encontrado = false;

            // Recorro todos los participantes y encuentro el deseado
            while (i < actor.size() && encontrado == false) {
                if (actor.get(i).getIdentificacion().equals(identCompleto)) {            // SI encuentro el participante deseado...
                    encontrado = true;                                                          //  Lo indico
                    // Creo ventana
                    jfActor jfActor = new jfActor(this);
                    jfActor.inicializarModificacion(actor.get(i));
                    jfActor.setVisible(true);
                    this.setEnabled(false);
                    // Centrar ventana
                    jfActor.setLocationRelativeTo(this);
                    documentoRequisitos.addObserver(jfActor);
                }
                i++;
            }
        } else if (preIdent.equals("IRQ")) {
            // Obtengo todos los participantes e inicializo las variables auxiliares
            ArrayList<RequisitoInformacion> requisitoInformacion = documentoRequisitos.getRequisitosInformacion();
            int i = 0;
            boolean encontrado = false;

            // Recorro todos los participantes y encuentro el deseado
            while (i < requisitoInformacion.size() && encontrado == false) {
                if (requisitoInformacion.get(i).getIdentificacion().equals(identCompleto)) {            // SI encuentro el participante deseado...
                    encontrado = true;                                                          //  Lo indico
                    // Creo ventana
                    jfReq_Informacion jfReq_Informacion = new jfReq_Informacion(this);
                    jfReq_Informacion.inicializarModificacion(requisitoInformacion.get(i));
                    jfReq_Informacion.setVisible(true);
                    this.setEnabled(false);
                    // Centrar ventana
                    jfReq_Informacion.setLocationRelativeTo(this);
                    documentoRequisitos.addObserver(jfReq_Informacion);
                }
                i++;
            }
        } else if (preIdent.equals("CRQ")) {
            // Obtengo todos los participantes e inicializo las variables auxiliares
            ArrayList<RequisitoRestriccion> requisitoRestriccion = documentoRequisitos.getRequisitosRestriccion();
            int i = 0;
            boolean encontrado = false;

            // Recorro todos los participantes y encuentro el deseado
            while (i < requisitoRestriccion.size() && encontrado == false) {
                if (requisitoRestriccion.get(i).getIdentificacion().equals(identCompleto)) {            // SI encuentro el participante deseado...
                    encontrado = true;                                                          //  Lo indico
                    // Creo ventana
                    jfReq_Restriccion jfReq_Restriccion = new jfReq_Restriccion(this);
                    jfReq_Restriccion.inicializarModificacion(requisitoRestriccion.get(i));
                    jfReq_Restriccion.setVisible(true);
                    this.setEnabled(false);
                    // Centrar ventana
                    jfReq_Restriccion.setLocationRelativeTo(this);
                    documentoRequisitos.addObserver(jfReq_Restriccion);
                }
                i++;
            }
        } else if (preIdent.equals("UC")) {
            // Obtengo todos los participantes e inicializo las variables auxiliares
            ArrayList<CasoUso> casoUso = documentoRequisitos.getCasosUso();
            int i = 0;
            boolean encontrado = false;

            // Recorro todos los participantes y encuentro el deseado
            while (i < casoUso.size() && encontrado == false) {
                if (casoUso.get(i).getIdentificacion().equals(identCompleto)) {            // SI encuentro el participante deseado...
                    encontrado = true;                                                          //  Lo indico
                    // Creo ventana
                    jfCasoUso jfCasoUso = new jfCasoUso(this);
                    jfCasoUso.inicializarModificacion(casoUso.get(i));
                    jfCasoUso.setVisible(true);
                    this.setEnabled(false);
                    // Centrar ventana
                    jfCasoUso.setLocationRelativeTo(this);
                    documentoRequisitos.addObserver(jfCasoUso);
                }
                i++;
            }
        } else if (preIdent.equals("FRQ")) {
            // Obtengo todos los participantes e inicializo las variables auxiliares
            ArrayList<RequisitoFuncional> requisitoFuncional = documentoRequisitos.getRequisitosFuncionales();
            int i = 0;
            boolean encontrado = false;

            // Recorro todos los participantes y encuentro el deseado
            while (i < requisitoFuncional.size() && encontrado == false) {
                if (requisitoFuncional.get(i).getIdentificacion().equals(identCompleto)) {            // SI encuentro el participante deseado...
                    encontrado = true;                                                          //  Lo indico
                    // Creo ventana
                    jfReq_Funcional jfReq_Funcional = new jfReq_Funcional(this);
                    jfReq_Funcional.inicializarModificacion(requisitoFuncional.get(i));
                    jfReq_Funcional.setVisible(true);
                    this.setEnabled(false);
                    // Centrar ventana
                    jfReq_Funcional.setLocationRelativeTo(this);
                    documentoRequisitos.addObserver(jfReq_Funcional);
                }
                i++;
            }
        }
                    else if (preIdent.equals("NFR")) {
                // Obtengo todos los participantes e inicializo las variables auxiliares
                ArrayList<RequisitoNoFuncional> reqNoFuncionales = documentoRequisitos.getRequisitosNoFuncionales();
                int i = 0;
                boolean encontrado = false;

                // Recorro todos los participantes y encuentro el deseado
                while (i < reqNoFuncionales.size() && encontrado == false) {
                    if (reqNoFuncionales.get(i).getIdentificacion().equals(identCompleto)) {            // SI encuentro el participante deseado...
                        encontrado = true;
                        //  Lo indico
                        // Creo ventana
                        jfReq_NoFuncional jfReq_NoFuncional = new jfReq_NoFuncional(this);
                        jfReq_NoFuncional.inicializarModificacion(reqNoFuncionales.get(i));
                        jfReq_NoFuncional.setVisible(true);
                        this.setEnabled(false);
                        // Centrar ventana
                        jfReq_NoFuncional.setLocationRelativeTo(this);
                        documentoRequisitos.addObserver(jfReq_NoFuncional);
                    }
                    i++;
                }
            }
    }//GEN-LAST:event_jMenuItem_editarPropiedadesActionPerformed

    private void jMenuItem_eliminarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem_eliminarActionPerformed
        // Nodo seleccionado actualmente
        TreePath tp = jTree.getSelectionPath();
        MutableTreeNode nodoSeleccionado = (MutableTreeNode) tp.getLastPathComponent();

        // Identifico el tipo de Caso de uso que es (Actor, Reunión,...), recupero su información y la restauro
        String preIdent = utilidades.getPreIdentificadorNodo(nodoSeleccionado);
        String identCompleto = utilidades.getIdentificadorNodo(nodoSeleccionado);


        if (preIdent.equals("STK")) {
            // Obtengo todos los participantes e inicializo las variables auxiliares
            ArrayList<Participante> participantes = documentoRequisitos.getParticipante();
            int i = 0;
            boolean encontrado = false;

            // Recorro todos los participantes, encuentro el deseado y lo elimino
            while (i < participantes.size() && encontrado == false) {
                if (participantes.get(i).getIdentificacion().equals(identCompleto)) {           // SI encuentro el participante deseado...
                    encontrado = true;                                                          //  Lo indico
                    documentoRequisitos.getParticipante().remove(i);                            //  Y lo elimino
                }
                i++;
            }
        } else if (preIdent.equals("MET")) {
            // Obtengo el ArrayList e inicializo las variables auxiliares
            ArrayList<Reunion> reuniones = documentoRequisitos.getReuniones();
            int i = 0;
            boolean encontrado = false;

            // Recorro el ArrayList, encuentro el elemento deseado y lo elimino
            while (i < reuniones.size() && encontrado == false) {
                if (reuniones.get(i).getIdentificacion().equals(identCompleto)) {           // SI encuentro el deseado...
                    encontrado = true;                                                          //  Lo indico
                    documentoRequisitos.getReuniones().remove(i);                               //  Y lo elimino
                }
                i++;
            }
        } else if (preIdent.equals("IRQ")) {
            // Obtengo el ArrayList e inicializo las variables auxiliares
            ArrayList<RequisitoInformacion> reqInformacion = documentoRequisitos.getRequisitosInformacion();
            int i = 0;
            boolean encontrado = false;

            // Recorro el ArrayList, encuentro el elemento deseado y lo elimino
            while (i < reqInformacion.size() && encontrado == false) {
                if (reqInformacion.get(i).getIdentificacion().equals(identCompleto)) {      // SI encuentro el deseado...
                    encontrado = true;                                                          //  Lo indico
                    documentoRequisitos.getRequisitosInformacion().remove(i);                   //  Y lo elimino
                }
                i++;
            }
        } else if (preIdent.equals("CRQ")) {
            // Obtengo el ArrayList e inicializo las variables auxiliares
            ArrayList<RequisitoRestriccion> reqRestriccion = documentoRequisitos.getRequisitosRestriccion();
            int i = 0;
            boolean encontrado = false;

            // Recorro el ArrayList, encuentro el elemento deseado y lo elimino
            while (i < reqRestriccion.size() && encontrado == false) {
                if (reqRestriccion.get(i).getIdentificacion().equals(identCompleto)) {      // SI encuentro el deseado...
                    encontrado = true;                                                          //  Lo indico
                    documentoRequisitos.getRequisitosRestriccion().remove(i);                   //  Y lo elimino
                }
                i++;
            }
        } else if (preIdent.equals("FRQ")) {
            // Obtengo el ArrayList e inicializo las variables auxiliares
            ArrayList<RequisitoFuncional> reqFuncionales = documentoRequisitos.getRequisitosFuncionales();
            int i = 0;
            boolean encontrado = false;

            // Recorro el ArrayList, encuentro el elemento deseado y lo elimino
            while (i < reqFuncionales.size() && encontrado == false) {
                if (reqFuncionales.get(i).getIdentificacion().equals(identCompleto)) {      // SI encuentro el deseado...
                    encontrado = true;                                                          //  Lo indico
                    documentoRequisitos.getRequisitosFuncionales().remove(i);                   //  Y lo elimino
                }
                i++;
            }
        } else if (preIdent.equals("NFR")) {
            // Obtengo el ArrayList e inicializo las variables auxiliares
            ArrayList<RequisitoNoFuncional> reqNoFuncionales = documentoRequisitos.getRequisitosNoFuncionales();
            int i = 0;
            boolean encontrado = false;

            // Recorro el ArrayList, encuentro el elemento deseado y lo elimino
            while (i < reqNoFuncionales.size() && encontrado == false) {
                if (reqNoFuncionales.get(i).getIdentificacion().equals(identCompleto)) {    // SI encuentro el deseado...
                    encontrado = true;                                                          //  Lo indico
                    documentoRequisitos.getRequisitosNoFuncionales().remove(i);                 //  Y lo elimino
                }
                i++;
            }
        }else if (preIdent.equals("ORG")) {
            // Obtengo el ArrayList e inicializo las variables auxiliares
            ArrayList<Organizacion> organizacion = documentoRequisitos.getOrganizacion();
            int i = 0;
            boolean encontrado = false;

            // Recorro el ArrayList, encuentro el elemento deseado y lo elimino
            while (i < organizacion.size() && encontrado == false) {
                if (organizacion.get(i).getIdentificacion().equals(identCompleto)) {    // SI encuentro el deseado...
                    encontrado = true;                                                          //  Lo indico
                    documentoRequisitos.getOrganizacion().remove(i);                 //  Y lo elimino
                }
                i++;
            }
        }else if (preIdent.equals("OBJ")) {
            // Obtengo el ArrayList e inicializo las variables auxiliares
            ArrayList<Objetivo> objetivo = documentoRequisitos.getObjetivos();
            int i = 0;
            boolean encontrado = false;

            // Recorro el ArrayList, encuentro el elemento deseado y lo elimino
            while (i < objetivo.size() && encontrado == false) {
                if (objetivo.get(i).getIdentificacion().equals(identCompleto)) {    // SI encuentro el deseado...
                    encontrado = true;                                                          //  Lo indico
                    documentoRequisitos.getObjetivos().remove(i);                 //  Y lo elimino
                }
                i++;
            }
        }else if (preIdent.equals("ACT")) {
            // Obtengo el ArrayList e inicializo las variables auxiliares
            ArrayList<Actor> actor = documentoRequisitos.getActores();
            int i = 0;
            boolean encontrado = false;

            // Recorro el ArrayList, encuentro el elemento deseado y lo elimino
            while (i < actor.size() && encontrado == false) {
                if (actor.get(i).getIdentificacion().equals(identCompleto)) {    // SI encuentro el deseado...
                    encontrado = true;                                                          //  Lo indico
                    documentoRequisitos.getActores().remove(i);                 //  Y lo elimino
                }
                i++;
            }
        }else if (preIdent.equals("UC")) {
            // Obtengo el ArrayList e inicializo las variables auxiliares
            ArrayList<CasoUso> casoUsos = documentoRequisitos.getCasosUso();
            int i = 0;
            boolean encontrado = false;

            // Recorro el ArrayList, encuentro el elemento deseado y lo elimino
            while (i < casoUsos.size() && encontrado == false) {
                if (casoUsos.get(i).getIdentificacion().equals(identCompleto)) {    // SI encuentro el deseado...
                    encontrado = true;                                                          //  Lo indico
                    documentoRequisitos.getCasosUso().remove(i);                 //  Y lo elimino
                }
                i++;
            }
        }

        // Tener en cuenta que a la hora de eliminar un Caso de uso, hay que eliminar sus pasos asociados, y de cada paso sus excepciones
        else if (preIdent.equals("UC")) {
            // Obtengo el ArrayList e inicializo las variables auxiliares
            ArrayList<CasoUso> casoUso = documentoRequisitos.getCasosUso();
            int i = 0;
            boolean encontrado = false;

            // Recorro el ArrayList, encuentro el elemento deseado y lo elimino
            while (i < casoUso.size() && encontrado == false) {
                if (casoUso.get(i).getIdentificacion().equals(identCompleto)) {           // SI encuentro el deseado...
                    encontrado = true;                                                    //  Lo indico
                    //Removemos cada paso
                    ArrayList<Paso> paso = casoUso.get(i).getPaso();
                    if(!paso.isEmpty()){ //Si el array NO está vacio proceder a eliminar los elementos.
                        int j=0;
                        while (j < paso.size()){
                            //Eliminamos cada excepcion.
                            ArrayList<Excepcion> excepcion = casoUso.get(i).getPaso().get(j).getExcepcion();
                            if(!excepcion.isEmpty()){
                                documentoRequisitos.getCasosUso().get(i).getPaso().get(j).getExcepcion().removeAll(excepcion);
                            }
                            documentoRequisitos.getCasosUso().get(i).getPaso().remove(j);
                        }
                        j++;
                    }
                    documentoRequisitos.getCasosUso().remove(i);                               //  Y lo elimino
                }
                i++;
            }
        }


        // Tener en cuenta que a la hora de eliminar un Caso de uso, hay que eliminar sus pasos asociados, y de cada paso sus excepciones
        else if (preIdent.equals("UC")) {
            // Obtengo el ArrayList e inicializo las variables auxiliares
            ArrayList<CasoUso> casoUso = documentoRequisitos.getCasosUso();
            int i = 0;
            boolean encontrado = false;

            // Recorro el ArrayList, encuentro el elemento deseado y lo elimino
            while (i < casoUso.size() && encontrado == false) {
                if (casoUso.get(i).getIdentificacion().equals(identCompleto)) {           // SI encuentro el deseado...
                    encontrado = true;                                                    //  Lo indico
                    //Removemos cada paso
                    ArrayList<Paso> paso = casoUso.get(i).getPaso();
                    if(!paso.isEmpty()){ //Si el array NO está vacio proceder a eliminar los elementos.
                        int j=0;
                        while (j < paso.size()){
                            //Eliminamos cada excepcion.
                            ArrayList<Excepcion> excepcion = casoUso.get(i).getPaso().get(j).getExcepcion();
                            if(!excepcion.isEmpty()){//Si el array NO está vacio proceder a eliminar los elementos.
                                documentoRequisitos.getCasosUso().get(i).getPaso().get(j).getExcepcion().removeAll(excepcion);
                            }
                            documentoRequisitos.getCasosUso().get(i).getPaso().remove(j);
                        }
                        j++;
                    }
                    documentoRequisitos.getCasosUso().remove(i);                               //  Y lo elimino
                }
                i++;
            }
        }


        // Tener en cuenta que a la hora de eliminar un Caso de uso, hay que eliminar sus pasos asociados, y de cada paso sus excepciones
        else if (preIdent.equals("UCP")) {
            MutableTreeNode nodoPadreSeleccionado = (MutableTreeNode) nodoSeleccionado.getParent();
            String identPadreCompleto = utilidades.getIdentificadorNodo(nodoPadreSeleccionado);
            Boolean encontrado = false;
            // Obtengo el ArrayList e inicializo las variables auxiliares
            ArrayList<CasoUso> casoUso = documentoRequisitos.getCasosUso();
            for(int i=0; i<casoUso.size();i++){
                //Buscar el paso que es dentro del caso de uso
                if (casoUso.get(i).getIdentificacion().equals(identPadreCompleto)){
                    //Buscar el paso exacto que es para eliminar todas sus excepciones.
                   ArrayList<Paso> paso = casoUso.get(i).getPaso();
                   for(int j=0; j<paso.size();j++){
                       if (paso.get(j).getIdentificacion().equals(identCompleto)){
                           ArrayList<Excepcion> excepciones = casoUso.get(i).getPaso().get(j).getExcepcion();
                           //Compruebo que tenga excepciones.
                           if(!excepciones.isEmpty())
                               documentoRequisitos.getCasosUso().get(i).getPaso().get(j).getExcepcion().removeAll(excepciones); 
                           encontrado = true;
                       }
                       if(encontrado){
                           documentoRequisitos.getCasosUso().get(i).getPaso().remove(j);
                           break;
                       }
                   }
                }
            }
        }

        // Tener en cuenta que a la hora de eliminar un Caso de uso, hay que eliminar sus pasos asociados, y de cada paso sus excepciones
        else if (preIdent.equals("UCE")) {
            MutableTreeNode nodoPadreSeleccionado = (MutableTreeNode) nodoSeleccionado.getParent();
            String identPadreCompleto = utilidades.getIdentificadorNodo(nodoPadreSeleccionado);
            MutableTreeNode nodoAbueloSeleccionado = (MutableTreeNode) nodoPadreSeleccionado.getParent();
            String identAbueloCompleto = utilidades.getIdentificadorNodo(nodoAbueloSeleccionado);
            
            // Obtengo el ArrayList e inicializo las variables auxiliares
            ArrayList<CasoUso> casoUso = documentoRequisitos.getCasosUso();
            for(int i=0; i<casoUso.size();i++){
                //Buscar el paso que es dentro del caso de uso
                if (casoUso.get(i).getIdentificacion().equals(identAbueloCompleto)){
                    //Buscar el paso exacto que es para eliminar todas sus excepciones.
                   ArrayList<Paso> paso = casoUso.get(i).getPaso();
                   for(int j=0; j<paso.size();j++){
                       if (paso.get(j).getIdentificacion().equals(identPadreCompleto)){
                           ArrayList<Excepcion> excepciones = casoUso.get(i).getPaso().get(j).getExcepcion();
                           //Recorro el array buscando la excepcion que es
                           for(int k=0; k<excepciones.size();k++){
                               if (excepciones.get(k).getIdentificacion().equals(identCompleto)){
                                   documentoRequisitos.getCasosUso().get(i).getPaso().get(j).getExcepcion().remove(k);
                                   break;
                               }
                           }
                       }
                   }
                }
            }
        }

        // Actualizo datos visibles
        this.actualizarJTree();
        this.actualizarTextPane();
    }//GEN-LAST:event_jMenuItem_eliminarActionPerformed

    private void jButton_nuevoActorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_nuevoActorActionPerformed
        TreePath tp = getJTree().getSelectionPath();                            // GET ruta

        if (tp == null) {                                                       // Si ruta vacía...
            this.jLabel_barraEstado.setText("Seleccione un elemento");
        } else {                                                                // Si ruta NO vacía (se ha seleccionado elemento del JTree)...
            this.jLabel_barraEstado.setText("");
            // Creo ventana
            jfActor jfActor = new jfActor(this);
            jfActor.setVisible(true);
            this.setEnabled(false);
            //Centrar ventana
            jfActor.setLocationRelativeTo(this);
            documentoRequisitos.addObserver(jfActor);
        }
    }//GEN-LAST:event_jButton_nuevoActorActionPerformed




    
    // Función para generar mi menú conforme lo que necesite
    public void generarMenuPopup(int instruccion, String preIdent) {

        if (instruccion == -1)
            jPopupMenu.removeAll();

        else {
            if (preIdent.equals("UC")) {
                jPopupMenu.removeAll();
                jPopupMenu.add(jMenuItem_subir);
                jPopupMenu.add(jMenuItem_bajar);
                jPopupMenu.addSeparator();
                jPopupMenu.add(jMenuItem_anadirPaso);
                jPopupMenu.add(jMenuItem_editarPropiedades);
                jPopupMenu.addSeparator();
                jPopupMenu.add(jMenuItem_eliminar);
            }
            else if (preIdent.equals("UCP")) {
                jPopupMenu.removeAll();
                jPopupMenu.add(jMenuItem_subir);
                jPopupMenu.add(jMenuItem_bajar);
                jPopupMenu.addSeparator();
                jPopupMenu.add(jMenuItem_anadirExcepcion);
                jPopupMenu.add(jMenuItem_editarPropiedades);
                jPopupMenu.addSeparator();
                jPopupMenu.add(jMenuItem_eliminar);
            }
            else {
                jPopupMenu.removeAll();
                jPopupMenu.add(jMenuItem_subir);
                jPopupMenu.add(jMenuItem_bajar);
                jPopupMenu.addSeparator();
                jPopupMenu.add(jMenuItem_editarPropiedades);
                jPopupMenu.addSeparator();
                jPopupMenu.add(jMenuItem_eliminar);
            }
        }
    }

    // Da formato a la información del fichero XML a partir de la hoja de estilo XSL
    public String transformar() throws Exception {
        String xmlOrigen = "resultado.xml";
        String xslOrigen = "src/modelo/HojaEstilo.xsl";

        Source xmlSource = new StreamSource(new File(xmlOrigen));
        Source xsltSource = new StreamSource(new File(xslOrigen));

        StringWriter cadenaSalida = new StringWriter();
        Result bufferResultado = new StreamResult(cadenaSalida);

        TransformerFactory factoriaTrans = TransformerFactory.newInstance();
        Transformer transformador = factoriaTrans.newTransformer(xsltSource);

        transformador.transform(xmlSource, bufferResultado);
        jTextPane.setText(cadenaSalida.toString());

        return cadenaSalida.toString();
    }





    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new jfHome().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton_abrir;
    private javax.swing.JButton jButton_copiar;
    private javax.swing.JButton jButton_cortar;
    private javax.swing.JButton jButton_guardar;
    private javax.swing.JButton jButton_nuevaImagen;
    private javax.swing.JButton jButton_nuevaMatrizRastreabilidad;
    private javax.swing.JButton jButton_nuevaOrganizacion;
    private javax.swing.JButton jButton_nuevaReunion;
    private javax.swing.JButton jButton_nuevaSeccionApendice;
    private javax.swing.JButton jButton_nuevo;
    private javax.swing.JButton jButton_nuevoActor;
    private javax.swing.JButton jButton_nuevoCasoUso;
    private javax.swing.JButton jButton_nuevoObjetivo;
    private javax.swing.JButton jButton_nuevoParrafoElementoGlosario;
    private javax.swing.JButton jButton_nuevoParticipante;
    private javax.swing.JButton jButton_nuevoReqFuncional;
    private javax.swing.JButton jButton_nuevoReqInformacion;
    private javax.swing.JButton jButton_nuevoReqNoFuncional;
    private javax.swing.JButton jButton_nuevoReqRestriccion;
    private javax.swing.JButton jButton_pegar;
    private javax.swing.JLabel jLabel_barraEstado;
    private javax.swing.JMenuItem jMenuItem_anadirExcepcion;
    private javax.swing.JMenuItem jMenuItem_anadirPaso;
    private javax.swing.JMenuItem jMenuItem_bajar;
    private javax.swing.JMenuItem jMenuItem_editarPropiedades;
    private javax.swing.JMenuItem jMenuItem_eliminar;
    private javax.swing.JMenuItem jMenuItem_subir;
    private javax.swing.JMenu jMenu_archivo;
    private javax.swing.JMenu jMenu_ayuda;
    private javax.swing.JMenu jMenu_editar;
    private javax.swing.JMenu jMenu_herramientas;
    private javax.swing.JMenu jMenu_ventana;
    private javax.swing.JMenu jMenu_ver;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPopupMenu jPopupMenu;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JToolBar.Separator jSeparator1;
    private javax.swing.JToolBar.Separator jSeparator2;
    private javax.swing.JToolBar.Separator jSeparator3;
    private javax.swing.JSeparator jSeparator4;
    private javax.swing.JSeparator jSeparator5;
    private javax.swing.JSeparator jSeparator6;
    private javax.swing.JSeparator jSeparator7;
    private javax.swing.JTextPane jTextPane;
    private javax.swing.JToolBar jToolBar1;
    private javax.swing.JToolBar jToolBar_barraEstado;
    private javax.swing.JTree jTree;
    private javax.swing.JMenuItem mItem_abrir;
    private javax.swing.JMenuItem mItem_acercaDe;
    private javax.swing.JMenuItem mItem_ayuda;
    private javax.swing.JMenuItem mItem_barraCreacion;
    private javax.swing.JMenuItem mItem_barraEstado;
    private javax.swing.JMenuItem mItem_barraHerramientas;
    private javax.swing.JMenuItem mItem_cerrar;
    private javax.swing.JMenuItem mItem_copiar;
    private javax.swing.JMenuItem mItem_cortar;
    private javax.swing.JMenuItem mItem_guardar;
    private javax.swing.JMenuItem mItem_guardarComo;
    private javax.swing.JMenuItem mItem_nuevo;
    private javax.swing.JMenuItem mItem_pegar;
    private javax.swing.JMenuItem mItem_preferencias;
    private javax.swing.JMenuItem mItem_salir;
    private javax.swing.JMenuBar menuBar;
    // End of variables declaration//GEN-END:variables





    public javax.swing.JTree getJTree() {
        return jTree;
    }
    public void setJTree(javax.swing.JTree jTree) {
        this.jTree = jTree;
    }
    // Actualiza el JTree con los elementos almacenados en el documento de requisitos
    public void actualizarJTree() {
        // Nodo seleccionado actualmente
        TreePath tp = jTree.getSelectionPath();
        //MutableTreeNode nodoSeleccionado = (MutableTreeNode) tp.getLastPathComponent();
        
        // Root del JTree
        MutableTreeNode root = new DefaultMutableTreeNode("Documento de requisitos del sistema");
        DefaultTreeModel model = new DefaultTreeModel(root);
        
        // Casos de uso
        ArrayList<CasoUso> casosUso = documentoRequisitos.getCasosUso();
        for (int i = 0; i < casosUso.size(); i++) {
            MutableTreeNode nodoCasoUso = new DefaultMutableTreeNode(casosUso.get(i).getNombre() + " (" + casosUso.get(i).getIdentificacion() + ")");
            model.insertNodeInto(nodoCasoUso,(MutableTreeNode) model.getRoot(), i);

            // Pasos
            ArrayList<Paso> pasos = casosUso.get(i).getPaso();
            for (int j = 0; j < pasos.size(); j++) {
                String nombre;
                if(pasos.get(j).getNombre().length()>30)
                    nombre = pasos.get(j).getNombre().substring(0,30) + "...";
                else
                    nombre = pasos.get(j).getNombre();

                MutableTreeNode nodoPaso = new DefaultMutableTreeNode(nombre + "(" + pasos.get(j).getIdentificacion() + ")");
                model.insertNodeInto(nodoPaso, nodoCasoUso, j);

                // Excepciones
                ArrayList<Excepcion> excepciones = pasos.get(j).getExcepcion();
                for (int k = 0; k < excepciones.size(); k++) {
                    MutableTreeNode nodoExcepcion = new DefaultMutableTreeNode(excepciones.get(k).getNombre().substring(0, 30) + " (" + excepciones.get(k).getIdentificacion() + ")");
                    model.insertNodeInto(nodoExcepcion, nodoPaso, k);
                }
            }
        }

        // Requisitos Funcionales
        ArrayList<RequisitoFuncional> reqFuncionales = documentoRequisitos.getRequisitosFuncionales();
        for (int i = 0; i < reqFuncionales.size(); i++) {
            MutableTreeNode nodoReq = new DefaultMutableTreeNode(reqFuncionales.get(i).getNombre() + " (" + reqFuncionales.get(i).getIdentificacion() + ")");
            model.insertNodeInto(nodoReq,(MutableTreeNode) model.getRoot(), i);
        }

        // Requisitos No Funcionales
        ArrayList<RequisitoNoFuncional> reqNoFuncionales = documentoRequisitos.getRequisitosNoFuncionales();
        for (int i = 0; i < reqNoFuncionales.size(); i++) {
            MutableTreeNode nodoReq = new DefaultMutableTreeNode(reqNoFuncionales.get(i).getNombre() + " (" + reqNoFuncionales.get(i).getIdentificacion() + ")");
            model.insertNodeInto(nodoReq,(MutableTreeNode) model.getRoot(), i);
        }

        // Requisitos de Información
        ArrayList<RequisitoInformacion> reqsInformacion = documentoRequisitos.getRequisitosInformacion();
        for (int i = 0; i < reqsInformacion.size(); i++) {
            MutableTreeNode nodoReq = new DefaultMutableTreeNode(reqsInformacion.get(i).getNombre() + " (" + reqsInformacion.get(i).getIdentificacion() + ")");
            model.insertNodeInto(nodoReq,(MutableTreeNode) model.getRoot(), i);
        }

        // Requisitos de Restricción
        ArrayList<RequisitoRestriccion> reqsRestriccion = documentoRequisitos.getRequisitosRestriccion();
        for (int i = 0; i < reqsRestriccion.size(); i++) {
            MutableTreeNode nodoReq = new DefaultMutableTreeNode(reqsRestriccion.get(i).getNombre() + " (" + reqsRestriccion.get(i).getIdentificacion() + ")");
            model.insertNodeInto(nodoReq,(MutableTreeNode) model.getRoot(), i);
        }


        // Participante
        ArrayList<Participante> participante = documentoRequisitos.getParticipante();
        for (int i = 0; i < participante.size(); i++){
            MutableTreeNode nodoParticipante = new DefaultMutableTreeNode(participante.get(i).getNombre() + "(" + participante.get(i).getIdentificacion() + ")");
            model.insertNodeInto(nodoParticipante, (MutableTreeNode) model.getRoot(), i);
        }

        // Reunión
        ArrayList<Reunion> reunion = documentoRequisitos.getReuniones();
        for (int i = 0; i < reunion.size(); i++){
            MutableTreeNode nodoReunion = new DefaultMutableTreeNode(reunion.get(i).getNombre() + "(" + reunion.get(i).getIdentificacion() + ")");
            model.insertNodeInto(nodoReunion, (MutableTreeNode) model.getRoot(), i);
        }

        // Objetivo
        ArrayList<Objetivo> objetivo = documentoRequisitos.getObjetivos();
        for (int i = 0; i < objetivo.size(); i++){
            MutableTreeNode nodoObjetivo = new DefaultMutableTreeNode(objetivo.get(i).getNombre() + "(" + objetivo.get(i).getIdentificacion() + ")");
            model.insertNodeInto(nodoObjetivo, (MutableTreeNode) model.getRoot(), i);
        }

        // Actor
        ArrayList<Actor> actor = documentoRequisitos.getActores();
        for (int i = 0; i < actor.size(); i++){
            MutableTreeNode nodoActor = new DefaultMutableTreeNode(actor.get(i).getNombre() + "(" + actor.get(i).getIdentificacion() + ")");
            model.insertNodeInto(nodoActor, (MutableTreeNode) model.getRoot(), i);
        }

        // Organizacion
        ArrayList<Organizacion> organizacion = documentoRequisitos.getOrganizacion();
        for (int i = 0; i < organizacion.size(); i++){
            MutableTreeNode nodoOrganizacion = new DefaultMutableTreeNode(organizacion.get(i).getNombre() + "(" + organizacion.get(i).getIdentificacion() + ")");
            model.insertNodeInto(nodoOrganizacion, (MutableTreeNode) model.getRoot(), i);
        }


        // SET sobre el modelo del JTree y selecciono un nodo
        jTree.setModel(model);
        //jTree.setSelectionPath((TreePath) nodoSeleccionado);

        // Expandir el JTree
        for (int i = 0; i < jTree.getSize().height; i++)
            jTree.expandPath(getJTree().getPathForRow(i));


    }

    // Actualiza el TextPane
    public void actualizarTextPane() {
        try {
            documentoRequisitos.toXML();
            String resultado = transformar();
        } catch (Exception e) {
            Logger.getLogger(jfHome.class.getName()).log(Level.SEVERE, null, e);
        }
    }

}
