/*
 *      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
 */

package vista;

import controlador.*;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.UIManager;
import javax.swing.tree.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
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;
import modelo.*;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;





public class jfHome extends javax.swing.JFrame {
    DocumentoRequisitos documentoRequisitos = new DocumentoRequisitos();
    Utilidades utilidades = new Utilidades();
    
    public String rutaHtml;
    public String rutaHojaEstiloHtml;
    public String rutaHojaEstilo;
    
    private ArrayList<String> subArbol;


    public jfHome() {
        // Look and Feel del SO en el que nos encontremos
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
           e.printStackTrace();
        }
        // Idioma
        rutaHojaEstilo = "HojaEstiloEspanol.xsl";
        rutaHojaEstiloHtml = "HojaEstiloEspanol_html.xsl";
        subArbol = new ArrayList<String>();
        
        // 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 iconoJTree = new ImageIcon(getClass().getResource("/vista/icons/Seccion.png"));
        render.setLeafIcon(iconoJTree);
        render.setOpenIcon(iconoJTree);
        render.setClosedIcon(iconoJTree);

        // JTree y TextPane
        limpiezaFicheros();

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

        jTextPane.setContentType("text/html");
        try { transformar(rutaHtml); } catch(Exception e) {}
    }

    // Eliminamos posibles ficheros de anteriores ejecuciones
    private void limpiezaFicheros() {
        // Eliminamos el fichero XML
        File fichero = new File("resultado.xml");
        fichero.delete();

        // Los generamos nuevamente vacío (temas de visualización del TextPane)
        fichero = new File("resultado.xml");
        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter("resultado.xml"));
            bw.write("<xml><Documento></Documento></xml>");
            bw.close();
        } catch (Exception e) {
        }

        // Eliminamos el fichero HTML
        fichero = new File("resultado.html");
        fichero.delete();
    }





    @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_anadirSubObjetivo = new javax.swing.JMenuItem();
        jMenuItem_anadirDatoEspecifico = 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();
        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_anadirSubObjetivo.setText("Añadir Subobjetivo");
        jMenuItem_anadirSubObjetivo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem_anadirSubObjetivoActionPerformed(evt);
            }
        });
        jPopupMenu.add(jMenuItem_anadirSubObjetivo);

        jMenuItem_anadirDatoEspecifico.setText("Añadir nuevo dato específico");
        jMenuItem_anadirDatoEspecifico.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem_anadirDatoEspecificoActionPerformed(evt);
            }
        });
        jPopupMenu.add(jMenuItem_anadirDatoEspecifico);

        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);
        jButton_guardar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton_guardarActionPerformed(evt);
            }
        });
        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));

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 150, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 23, 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);
        jButton_nuevaSeccionApendice.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton_nuevaSeccionApendiceActionPerformed(evt);
            }
        });
        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);
        jButton_nuevoParrafoElementoGlosario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton_nuevoParrafoElementoGlosarioActionPerformed(evt);
            }
        });
        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);
        jButton_nuevaImagen.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton_nuevaImagenActionPerformed(evt);
            }
        });
        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);
        jButton_nuevaMatrizRastreabilidad.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton_nuevaMatrizRastreabilidadActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton_nuevaMatrizRastreabilidad);

        javax.swing.tree.DefaultMutableTreeNode treeNode1 = new javax.swing.tree.DefaultMutableTreeNode("Documento de Requisitos");
        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");
        mItem_preferencias.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mItem_preferenciasActionPerformed(evt);
            }
        });
        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");
        mItem_acercaDe.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mItem_acercaDeActionPerformed(evt);
            }
        });
        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 {
            TreeNode nodoSeleccionado = (TreeNode) tp.getLastPathComponent();
            String preIdent = utilidades.getPreIdentificadorNodo (nodoSeleccionado);
            if(preIdent.equals("SEC") || preIdent.equals("APE") || nodoSeleccionado.equals(jTree.getModel().getRoot())){  // 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);
            }
            else
                this.jLabel_barraEstado.setText("Seleccione un elemento válido. (Documento de Requisitos, Sección o Apéndice)");
        }
    }//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, "", -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", -1);

            else if (preIdent.equals("UCP"))
                generarMenuPopup(1, "UCP", -1);
            
            else if (preIdent.equals("UCE"))
                generarMenuPopup(1, "UCE", -1);
            
            else if (preIdent.equals("OBJ")) {
                int nivel = 1;
                MutableTreeNode nodoPadre = (MutableTreeNode) nodoSeleccionado.getParent();
                if (nodoPadre != null) {
                    if (nodoPadre.toString().contains("OBJ")) {
                        nivel = 2;
                        MutableTreeNode nodoAbuelo = (MutableTreeNode) nodoPadre.getParent();
                        if (nodoAbuelo != null) {
                            if (nodoAbuelo.toString().contains("OBJ")) {
                                nivel = 3;
                                MutableTreeNode nodoBisabuelo = (MutableTreeNode) nodoAbuelo.getParent();
                                if (nodoBisabuelo != null) {
                                    if (nodoBisabuelo.toString().contains("OBJ")) {
                                        nivel = 4;
                                    }
                                }
                            }
                        }
                    }
                }
                generarMenuPopup(1, "OBJ", nivel);
            }
            
            else if (preIdent.equals("IRQ"))
                generarMenuPopup(1, "IRQ", -1);
            
            else if (preIdent.equals("DTE"))
                generarMenuPopup(1, "DTE", -1);

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

            else
                generarMenuPopup(-1, "", -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 {
            TreeNode nodoSeleccionado = (TreeNode) tp.getLastPathComponent();
            String preIdent = utilidades.getPreIdentificadorNodo (nodoSeleccionado);
            if(preIdent.equals("SEC") || preIdent.equals("APE") || nodoSeleccionado.equals(jTree.getModel().getRoot())){     // 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);
            }
            else
                this.jLabel_barraEstado.setText("Seleccione un elemento válido. (Documento de Requisitos, Sección o Apéndice)");
        }
    }//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 {
             TreeNode nodoSeleccionado = (TreeNode) tp.getLastPathComponent();
            String preIdent = utilidades.getPreIdentificadorNodo (nodoSeleccionado);
            if(preIdent.equals("SEC") || preIdent.equals("APE") || nodoSeleccionado.equals(jTree.getModel().getRoot())){    // 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);
            }
            else
                this.jLabel_barraEstado.setText("Seleccione un elemento válido. (Documento de Requisitos, Sección o Apéndice)");
        }
    }//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 {
            TreeNode nodoSeleccionado = (TreeNode) tp.getLastPathComponent();
            String preIdent = utilidades.getPreIdentificadorNodo (nodoSeleccionado);
            if(preIdent.equals("SEC") || preIdent.equals("APE") || nodoSeleccionado.equals(jTree.getModel().getRoot())){                                                                // 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);
            }
            else
                this.jLabel_barraEstado.setText("Seleccione un elemento válido. (Documento de Requisitos, Sección o Apéndice)");
        }
    }//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 {
            TreeNode nodoSeleccionado = (TreeNode) tp.getLastPathComponent();
            String preIdent = utilidades.getPreIdentificadorNodo (nodoSeleccionado);
            if(preIdent.equals("SEC") || preIdent.equals("APE") || nodoSeleccionado.equals(jTree.getModel().getRoot())){    // Si ruta NO vacía (se ha seleccionado elemento del JTree)...// 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);
            }
            else
                this.jLabel_barraEstado.setText("Seleccione un elemento válido. (Documento de Requisitos, Sección o Apéndice)");
        }
    }//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 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{
            TreeNode nodoSeleccionado = (TreeNode) tp.getLastPathComponent();
            String preIdent = utilidades.getPreIdentificadorNodo (nodoSeleccionado);
            if(preIdent.equals("SEC") || preIdent.equals("APE") || nodoSeleccionado.equals(jTree.getModel().getRoot())){                                                                        // 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);
            }
            else
                this.jLabel_barraEstado.setText("Seleccione un elemento válido. (Documento de Requisitos, Sección o Apéndice)");
        }
    }//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{
            TreeNode nodoSeleccionado = (TreeNode) tp.getLastPathComponent();
            String preIdent = utilidades.getPreIdentificadorNodo (nodoSeleccionado);
            if(preIdent.equals("SEC") || preIdent.equals("APE") || nodoSeleccionado.equals(jTree.getModel().getRoot())){                                                                     // 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);
            }
            else
                this.jLabel_barraEstado.setText("Seleccione un elemento válido. (Documento de Requisitos, Sección o Apéndice)");
        }
    }//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{
            TreeNode nodoSeleccionado = (TreeNode) tp.getLastPathComponent();
            String preIdent = utilidades.getPreIdentificadorNodo (nodoSeleccionado);

            if(preIdent.equals("SEC") || preIdent.equals("APE") || nodoSeleccionado.equals(jTree.getModel().getRoot())){                                                               // 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);
            }
            else
                this.jLabel_barraEstado.setText("Seleccione un elemento válido. (Documento de Requisitos, Sección o Apéndice)");
        }
    }//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 {
            TreeNode nodoSeleccionado = (TreeNode) tp.getLastPathComponent();
            String preIdent = utilidades.getPreIdentificadorNodo (nodoSeleccionado);
            if(preIdent.equals("SEC") || preIdent.equals("APE") || nodoSeleccionado.equals(jTree.getModel().getRoot())){              // 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);
            }
            else
                this.jLabel_barraEstado.setText("Seleccione un elemento válido. (Documento de Requisitos, Sección o Apéndice)");
        }
    }//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();
        String preIdent = utilidades.getPreIdentificadorNodo(nodoSeleccionado);
        String identCompleto = utilidades.getIdentificadorNodo(nodoSeleccionado);

        if (preIdent.equals("SEC")) {
            // Obtengo todos las Secciones e inicializo las variables auxiliares
            ArrayList<Seccion> seccion = documentoRequisitos.getSeccion();
            int i = 0;
            boolean encontrado = false;

            // Recorro todas las secciones y encuentro el deseado
            while (i < seccion.size() && encontrado == false) {
                if (seccion.get(i).getIdentificacion().equals(identCompleto)) {            // SI encuentro el participante deseado...
                    encontrado = true;
                    //  Lo indico
                    // Creo ventana
                    jfSeccion_Apendice jfSeccion_Apendice = new jfSeccion_Apendice(this);
                    jfSeccion_Apendice.inicializarModificacionSeccion(seccion.get(i));
                    jfSeccion_Apendice.setVisible(true);
                    this.setEnabled(false);
                    // Centrar ventana
                    jfSeccion_Apendice.setLocationRelativeTo(this);
                    documentoRequisitos.addObserver(jfSeccion_Apendice);
                }
                i++;
            }
        }
        else if (preIdent.equals("APE")) {
            // Obtengo todos los Apendices e inicializo las variables auxiliares
            ArrayList<Apendice> apendice = documentoRequisitos.getApendice();
            int i = 0;
            boolean encontrado = false;

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

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

            // Recorro todos los participantes y encuentro el deseado
            while (i < imagen.size() && encontrado == false) {
                if (imagen.get(i).getIdentificacion().equals(identCompleto)) {            // SI encuentro el participante deseado...
                    encontrado = true;                                                          //  Lo indico
                    // Creo ventana
                    jfFichero_Grafico jfFichero_Grafico = new jfFichero_Grafico(this);
                    jfFichero_Grafico.inicializarModificacion(imagen.get(i));
                    jfFichero_Grafico.setVisible(true);
                    this.setEnabled(false);
                    // Centrar ventana
                    jfFichero_Grafico.setLocationRelativeTo(this);
                    documentoRequisitos.addObserver(jfFichero_Grafico);
                }
                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 y encuentro el elemento deseado
            while (i < organizacion.size() && encontrado == false) {
                if (organizacion.get(i).getIdentificacion().equals(identCompleto)) {      // SI encuentro el deseado...
                    encontrado = true;                                                          //  Lo indico
                    // Creo ventana
                    jfOrganizacion jfOrganizacion = new jfOrganizacion(this);
                    jfOrganizacion.inicializarModificacion(organizacion.get(i));
                    jfOrganizacion.setVisible(true);
                    this.setEnabled(false);
                    // Centrar ventana
                    jfOrganizacion.setLocationRelativeTo(this);
                    documentoRequisitos.addObserver(jfOrganizacion);
                }
                i++;
            }
        }
        else 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("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 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++;
            }
        }
        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")) {
            CasoUso casoUso = CasoUso.getData(identCompleto);                   // Obtener CasoUso de la BD
            
            if (casoUso != null) {
                // Añadimos información extra que no se almacena en la BD: Autores y Fuentes
                ArrayList<CasoUso> casosUso = documentoRequisitos.getCasosUso();
                int i = 0;
                boolean encontrado = false;
                while (i < casosUso.size() && encontrado == false) {
                    if (casosUso.get(i).getIdentificacion().equals(identCompleto)) {
                        encontrado = true;
                        casoUso.setAutores(casosUso.get(i).getAutores());       // Añadimos los autores
                        casoUso.setFuentes(casosUso.get(i).getFuentes());       // Añadimos las fuentes
                    }
                    i++;
                }

                // Creo ventana
                jfCasoUso jfCasoUso = new jfCasoUso(this);
                jfCasoUso.inicializarModificacion(casoUso);
                jfCasoUso.setVisible(true);
                this.setEnabled(false);

                // Centrar ventana
                jfCasoUso.setLocationRelativeTo(this);
                documentoRequisitos.addObserver(jfCasoUso);
            } else
                jLabel_barraEstado.setText("Error: el CasoUso seleccionado parece no existir en la Base de datos");
        

        }
        else if (preIdent.equals("UCP")) {
            // Nodo padre del seleccionado
            MutableTreeNode nodoPadreSeleccionado = (MutableTreeNode) nodoSeleccionado.getParent();
            String identPadre = utilidades.getIdentificadorNodo(nodoPadreSeleccionado);
            
            Paso paso = Paso.getData(identCompleto, identPadre);        // Obtener Paso de la BD

            if (paso != null) {
                // Creo ventana
                jfCasoUso_Paso jfCasoUso_Paso = new jfCasoUso_Paso(this, identPadre);
                jfCasoUso_Paso.inicializarModificacion(paso);
                jfCasoUso_Paso.setVisible(true);
                this.setEnabled(false);

                // Centrar ventana
                jfCasoUso_Paso.setLocationRelativeTo(this);
                documentoRequisitos.addObserver(jfCasoUso_Paso);
            } else
                jLabel_barraEstado.setText("Error: el Paso seleccionado parece no existir en la Base de datos");
        }
        else if (preIdent.equals("UCE")) {
         // Nodo padre del seleccionado
            MutableTreeNode nodoPadreSeleccionado = (MutableTreeNode) nodoSeleccionado.getParent();
            String identPadreCompleto = utilidades.getIdentificadorNodo(nodoPadreSeleccionado);

            // Nodo abuelo del seleccionado
            MutableTreeNode nodoAbueloSeleccionado = (MutableTreeNode) nodoPadreSeleccionado.getParent();
            String identAbueloCompleto = utilidades.getIdentificadorNodo(nodoAbueloSeleccionado);
            
            Excepcion excepcion = Excepcion.getData(identCompleto, identAbueloCompleto, identPadreCompleto);
            if (excepcion != null) {
                // Creo ventana
                jfCasoUso_Excepcion jfCasoUso_Excepcion = new jfCasoUso_Excepcion(this, identAbueloCompleto, identPadreCompleto);
                jfCasoUso_Excepcion.inicializarModificacion(excepcion);
                jfCasoUso_Excepcion.setVisible(true);
                this.setEnabled(false);
                // Centrar ventana
                jfCasoUso_Excepcion.setLocationRelativeTo(this);
                documentoRequisitos.addObserver(jfCasoUso_Excepcion);
            } else
                jLabel_barraEstado.setText("Error: la Excepción seleccionada parece no existir en la Base de datos");  
        }
        else if (preIdent.equals("FRQ")) {
            // Obtengo el ArrayList e inicializo las variables auxiliares
            ArrayList<RequisitoFuncional> requisitoFuncional = documentoRequisitos.getRequisitosFuncionales();
            int i = 0;
            boolean encontrado = false;

            // Recorro el ArrayList y encuentro el elemento deseado
            while (i < requisitoFuncional.size() && encontrado == false) {
                if (requisitoFuncional.get(i).getIdentificacion().equals(identCompleto)) {      // SI encuentro el 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 Requisitos no funcionales 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++;
            }
        }
        else if (preIdent.equals("TRM")) {
            // Obtengo todos los participantes e inicializo las variables auxiliares
            ArrayList<MatrizRastreabilidad> matrizRastreabilidad = documentoRequisitos.getMatrizRastreabilidad();
            int i = 0;
            boolean encontrado = false;

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

        else if (preIdent.equals("DTE")) {
            // Nodo padre del seleccionado
            MutableTreeNode nodoPadreSeleccionado = (MutableTreeNode) nodoSeleccionado.getParent();
            String identPadreCompleto = utilidades.getIdentificadorNodo(nodoPadreSeleccionado);
            String ident = utilidades.getIdentificadorNodo(nodoSeleccionado);
            //Busco el requisito de informacion padre.
            ArrayList<RequisitoInformacion> reqInf = this.documentoRequisitos.getRequisitosInformacion();
            RequisitoInformacion miReqInf = new RequisitoInformacion();
            boolean encontrado = false;
            int i = 0;
            while(!encontrado && i<reqInf.size()){
                if(identPadreCompleto.equals(reqInf.get(i).getIdentificacion())){
                    encontrado = true;
                    miReqInf = reqInf.get(i);
                }
                i++;
            }

            //Busco mi dato especifico que tengo que modificar.
            ArrayList<DatoEspecifico> datoEsp = miReqInf.getDatoEspecifico();
            encontrado = false;
            i = 0;
            while(!encontrado && i<datoEsp.size()){
                if(ident.equals(datoEsp.get(i).getIdentificacion())){
                    encontrado = true;
                    // Creo ventana
                    jfDatoEspecifico jfDatoEspecifico = new jfDatoEspecifico(this, miReqInf.getIdentificacion());
                    jfDatoEspecifico.inicializarModificacion(datoEsp.get(i));
                    jfDatoEspecifico.setVisible(true);
                    this.setEnabled(false);
                    // Centrar ventana
                    jfDatoEspecifico.setLocationRelativeTo(this);
                    documentoRequisitos.addObserver(jfDatoEspecifico);
                }
                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);

        //Rellenar un array con los identificadores de todos los objetos a eliminar.
        
        nodos_a_eliminar(subArbol, nodoSeleccionado);
        subArbol.add(identCompleto);

        if (preIdent.equals("SEC")) {
            //documentoRequisitos.removeSeccion(identCompleto);
            if (nodoSeleccionado.getChildCount() > 0)
            {
                documentoRequisitos.eliminarTodo(subArbol, nodoSeleccionado);
                subArbol.clear();
            }
        }

        else if (preIdent.equals("APE")) {
          //  documentoRequisitos.removeApendice(identCompleto);
            if (nodoSeleccionado.getChildCount() > 0)
            {
                documentoRequisitos.eliminarTodo(subArbol, nodoSeleccionado);
                subArbol.clear();
            }
        }
        else if (preIdent.equals("PRG")) {
            documentoRequisitos.removeParrafo(identCompleto);
        }
        else if (preIdent.equals("GRF")) {
            documentoRequisitos.removeImagen(identCompleto);
        }
        else if (preIdent.equals("ORG")) {
            documentoRequisitos.removeOrganizacion(identCompleto);
        }
        else if (preIdent.equals("STK")) {
            documentoRequisitos.removeParticipante(identCompleto);
        }
        else if (preIdent.equals("MET")) {
            documentoRequisitos.removeReunion(identCompleto);
        }
        else if (preIdent.equals("OBJ")) {
            //mirar el nodo padre.
            documentoRequisitos.removeObjetivo(nodoSeleccionado, identCompleto);
        }
        else if (preIdent.equals("ACT")) {
            documentoRequisitos.removeActor(identCompleto);
        }
        else if (preIdent.equals("IRQ")) {
           documentoRequisitos.removeReqInformacion(identCompleto);
        }
        else if (preIdent.equals("DTE")) {
            //mirar el nodo padre
            MutableTreeNode nodoPadreSeleccionado = (MutableTreeNode) nodoSeleccionado.getParent();
            String identPadreCompleto = utilidades.getIdentificadorNodo(nodoPadreSeleccionado);
            documentoRequisitos.removeDatoEspecifico(identPadreCompleto, identCompleto);
        }
        else if (preIdent.equals("CRQ")) {
            documentoRequisitos.removeReqRestriccion(identCompleto);
        }
        // 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")) {
            documentoRequisitos.removeCasoUso(identCompleto);
        }
        // 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);
            documentoRequisitos.removeCasoUso_Paso(identPadreCompleto, identCompleto);
        }
        // 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);
            documentoRequisitos.removeCasoUso_Excepcion(identAbueloCompleto, identPadreCompleto, identCompleto);
        }
        else if (preIdent.equals("FRQ")) {
            documentoRequisitos.removeReqFuncional(identCompleto);
        }
        else if (preIdent.equals("NFR")) {
            documentoRequisitos.removeReqNoFuncional(identCompleto);
        }
        else if (preIdent.equals("TRM")) {
            documentoRequisitos.removeMatrizRastreabilidad(identCompleto);
        }

        // 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")) {
            documentoRequisitos.removeCasoUso(identCompleto);
        }


        // 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);
            documentoRequisitos.removeCasoUso_Paso(identPadreCompleto, identCompleto);
        }

        // 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);
            documentoRequisitos.removeCasoUso_Excepcion(identAbueloCompleto, identPadreCompleto, identCompleto);
        }

        // Lo elimino también del JTree
        MutableTreeNode nodoAeliminar = (MutableTreeNode) tp.getLastPathComponent();
        ((DefaultTreeModel)jTree.getModel()).removeNodeFromParent(nodoAeliminar);
        int alturaJTree = jTree.getModel().getChildCount(jTree.getModel().getRoot());
        if (alturaJTree == 0)
            limpiezaFicheros();



        // Actualizo datos visibles
        this.actualizarTextPane();
        try { transformar(rutaHtml); } catch(Exception e) {}
    }//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 {
            TreeNode nodoSeleccionado = (TreeNode) tp.getLastPathComponent();
            String preIdent = utilidades.getPreIdentificadorNodo (nodoSeleccionado);
            if(preIdent.equals("SEC") || preIdent.equals("APE") || nodoSeleccionado.equals(jTree.getModel().getRoot())){    // 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);
            }
            else
                this.jLabel_barraEstado.setText("Seleccione un elemento válido. (Documento de Requisitos, Sección o Apéndice)");
        }
    }//GEN-LAST:event_jButton_nuevoActorActionPerformed
    private void jButton_nuevaSeccionApendiceActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_nuevaSeccionApendiceActionPerformed
        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)...
            TreeNode nodoSeleccionado = (TreeNode) tp.getLastPathComponent();
            String preIdent = utilidades.getPreIdentificadorNodo (nodoSeleccionado);
            if(preIdent.equals("SEC") || preIdent.equals("APE") || nodoSeleccionado.equals(jTree.getModel().getRoot())){
                this.jLabel_barraEstado.setText("");
                // Creo ventana
                jfSeccion_Apendice jfSeccion_Apendice = new jfSeccion_Apendice(this);
                jfSeccion_Apendice.setVisible(true);
                this.setEnabled(false);
                //Centrar ventana
                jfSeccion_Apendice.setLocationRelativeTo(this);
                documentoRequisitos.addObserver(jfSeccion_Apendice);
           }
           else
               this.jLabel_barraEstado.setText("Seleccione un elemento válido. (Documento de Requisitos, Sección o Apéndice)");
        }
    }//GEN-LAST:event_jButton_nuevaSeccionApendiceActionPerformed
    private void jButton_nuevoParrafoElementoGlosarioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_nuevoParrafoElementoGlosarioActionPerformed
        TreePath tp = getJTree().getSelectionPath();                            // GET ruta
        if (tp == null) {                                                       // Si ruta vacía...
            this.jLabel_barraEstado.setText("Seleccione un elemento");
        } 
        else {
            TreeNode nodoSeleccionado = (TreeNode) tp.getLastPathComponent();
            String preIdent = utilidades.getPreIdentificadorNodo (nodoSeleccionado);
            if(preIdent.equals("SEC") || preIdent.equals("APE") || nodoSeleccionado.equals(jTree.getModel().getRoot())){
                this.jLabel_barraEstado.setText("");
                // Creo ventana
                jfParrafo_ElementoGlosario jfParrafo_ElementoGlosario = new jfParrafo_ElementoGlosario(this);
                jfParrafo_ElementoGlosario.setVisible(true);
                this.setEnabled(false);
                //Centrar ventana
                jfParrafo_ElementoGlosario.setLocationRelativeTo(this);
                documentoRequisitos.addObserver(jfParrafo_ElementoGlosario);
            }
            else
                this.jLabel_barraEstado.setText("Seleccione un elemento válido. (Documento de Requisitos, Sección o Apéndice)");
        }
    }//GEN-LAST:event_jButton_nuevoParrafoElementoGlosarioActionPerformed
    private void jButton_nuevaImagenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_nuevaImagenActionPerformed
        TreePath tp = getJTree().getSelectionPath();                        // GET ruta
        if (tp == null) {                                                       // Si ruta vacía...
            this.jLabel_barraEstado.setText("Seleccione un elemento");
        }
        else{
            TreeNode nodoSeleccionado = (TreeNode) tp.getLastPathComponent();
            String preIdent = utilidades.getPreIdentificadorNodo (nodoSeleccionado);

            if(preIdent.equals("SEC") || preIdent.equals("APE") || nodoSeleccionado.equals(jTree.getModel().getRoot())){                                                // Si ruta NO vacía (se ha seleccionado elemento del JTree)...
                this.jLabel_barraEstado.setText("");
                // Creo ventana
                jfFichero_Grafico jfFichero_Grafico = new jfFichero_Grafico(this);
                jfFichero_Grafico.setVisible(true);
                this.setEnabled(false);
                //Centrar ventana
                jfFichero_Grafico.setLocationRelativeTo(this);
                documentoRequisitos.addObserver(jfFichero_Grafico);
            }
            else
                this.jLabel_barraEstado.setText("Seleccione un elemento válido. (Documento de Requisitos, Sección o Apéndice)");
        }
    }//GEN-LAST:event_jButton_nuevaImagenActionPerformed
    private void jButton_nuevaMatrizRastreabilidadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_nuevaMatrizRastreabilidadActionPerformed
        TreePath tp = getJTree().getSelectionPath();                            // GET ruta
        if (tp == null) {                                                       // Si ruta vacía...
            this.jLabel_barraEstado.setText("Seleccione un elemento");
        }
        else {
            TreeNode nodoSeleccionado = (TreeNode) tp.getLastPathComponent();
            String preIdent = utilidades.getPreIdentificadorNodo (nodoSeleccionado);
            if(preIdent.equals("SEC") || preIdent.equals("APE") || nodoSeleccionado.equals(jTree.getModel().getRoot())){
                this.jLabel_barraEstado.setText("");
                // Creo ventana
                jfMatriz_Rastreabilidad jfMatriz_Rastreabilidad = new jfMatriz_Rastreabilidad(this);
                jfMatriz_Rastreabilidad.setVisible(true);
                this.setEnabled(false);
                //Centrar ventana
                jfMatriz_Rastreabilidad.setLocationRelativeTo(this);
                documentoRequisitos.addObserver(jfMatriz_Rastreabilidad);
            }
            else
                this.jLabel_barraEstado.setText("Seleccione un elemento válido. (Documento de Requisitos, Sección o Apéndice)");
        }
    }//GEN-LAST:event_jButton_nuevaMatrizRastreabilidadActionPerformed

    private void jButton_guardarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_guardarActionPerformed
        try {
            String a = transformar(rutaHtml);
        } catch (Exception ex) {
            Logger.getLogger(jfHome.class.getName()).log(Level.SEVERE, null, ex);
        }
    }//GEN-LAST:event_jButton_guardarActionPerformed

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

        // Calculo nivel
        int nivel = 2;
        MutableTreeNode nodoSeleccionado = (MutableTreeNode) tp.getLastPathComponent();
        MutableTreeNode nodoPadre = (MutableTreeNode) nodoSeleccionado.getParent();
        MutableTreeNode nodoAbuelo = (MutableTreeNode) nodoPadre.getParent();
        if (nodoAbuelo != null) {
            if (nodoAbuelo.toString().contains("OBJ")) {
                nivel = 3;
            }
        }

        if (tp == null) {                                                       // Si ruta vacía...
            this.jLabel_barraEstado.setText("Seleccione un Objetivo");
        } else {                                                                // Si ruta NO vacía (se ha seleccionado elemento del JTree)...
            this.jLabel_barraEstado.setText("");
            // Comprobar que nodo seleccionado es un Objetivo
            String preIdentObjetivoPadre = utilidades.getPreIdentificadorNodo (nodoSeleccionado);
            if (preIdentObjetivoPadre.equals("OBJ")) {
                // Creo ventana de Objetivo
                String identObjetivoPadre = utilidades.getIdentificadorNodo(nodoSeleccionado);
                jfObjetivo jfObjetivo = new jfObjetivo(this, identObjetivoPadre, true, nivel);
                jfObjetivo.setVisible(true);
                this.setEnabled(false);
                //Centrar ventana
                jfObjetivo.setLocationRelativeTo(this);
                documentoRequisitos.addObserver(jfObjetivo);
            } else
                this.jLabel_barraEstado.setText("Seleccione un Objetivo");
        }
    }//GEN-LAST:event_jMenuItem_anadirSubObjetivoActionPerformed

    private void jMenuItem_anadirDatoEspecificoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem_anadirDatoEspecificoActionPerformed
        TreePath tp = getJTree().getSelectionPath();                            // GET ruta
        
        if (tp == null) {                                                       // Si ruta vacía...
            this.jLabel_barraEstado.setText("Seleccione un Requisito de Información");
        } else {                                                                // Si ruta NO vacía (se ha seleccionado elemento del JTree)...
            this.jLabel_barraEstado.setText("");
            // Comprobar que nodo seleccionado es un Objetivo
            MutableTreeNode nodoSeleccionado = (MutableTreeNode) tp.getLastPathComponent();
            String preIdentReqInformacionPadre = utilidades.getPreIdentificadorNodo (nodoSeleccionado);
            if (preIdentReqInformacionPadre.equals("IRQ")) {
                // Creo ventana de Objetivo
                String identReqInformacionPadre = utilidades.getIdentificadorNodo(nodoSeleccionado);
                jfDatoEspecifico jfDatoEspecifico = new jfDatoEspecifico(this,identReqInformacionPadre);
                jfDatoEspecifico.setVisible(true);
                this.setEnabled(false);
                //Centrar ventana
                jfDatoEspecifico.setLocationRelativeTo(this);
                documentoRequisitos.addObserver(jfDatoEspecifico);
            } else
                this.jLabel_barraEstado.setText("Seleccione un Requisito de Información");
        }
    }//GEN-LAST:event_jMenuItem_anadirDatoEspecificoActionPerformed

    private void mItem_preferenciasActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mItem_preferenciasActionPerformed
            // Creo ventana
            jfPreferencias jfPreferencias = new jfPreferencias(this);
            jfPreferencias.setVisible(true);
            this.setEnabled(false);
            //Centrar ventana
            jfPreferencias.setLocationRelativeTo(this);
            documentoRequisitos.addObserver(jfPreferencias);
    }//GEN-LAST:event_mItem_preferenciasActionPerformed

    private void mItem_acercaDeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mItem_acercaDeActionPerformed
            // Creo ventana
            jfAcercaDe jfAcercaDe = new jfAcercaDe(this);
            jfAcercaDe.setVisible(true);
            this.setEnabled(false);
            //Centrar ventana
            jfAcercaDe.setLocationRelativeTo(this);
            documentoRequisitos.addObserver(jfAcercaDe);
    }//GEN-LAST:event_mItem_acercaDeActionPerformed




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

        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 if (preIdent.equals("UCE")) {
                jPopupMenu.removeAll();
                jPopupMenu.add(jMenuItem_subir);
                jPopupMenu.add(jMenuItem_bajar);
                jPopupMenu.addSeparator();
                jPopupMenu.add(jMenuItem_editarPropiedades);
                jPopupMenu.addSeparator();
                jPopupMenu.add(jMenuItem_eliminar);
            }
            else if (preIdent.equals("OBJ")) {
                if (nivel >= 1 && nivel <= 2) {
                    jPopupMenu.removeAll();
                    jPopupMenu.add(jMenuItem_subir);
                    jPopupMenu.add(jMenuItem_bajar);
                    jPopupMenu.addSeparator();
                    jPopupMenu.add(jMenuItem_anadirSubObjetivo);
                    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);
                }
            }            
            else if (preIdent.equals("IRQ")) {
                jPopupMenu.removeAll();
                jPopupMenu.add(jMenuItem_subir);
                jPopupMenu.add(jMenuItem_bajar);
                jPopupMenu.addSeparator();
                jPopupMenu.add(jMenuItem_anadirDatoEspecifico);
                jPopupMenu.add(jMenuItem_editarPropiedades); 
                jPopupMenu.addSeparator();
                jPopupMenu.add(jMenuItem_eliminar);
            }
            else if (preIdent.equals("DTE")) {
                jPopupMenu.removeAll();
                jPopupMenu.add(jMenuItem_subir);
                jPopupMenu.add(jMenuItem_bajar);
                jPopupMenu.addSeparator();
                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(String ruta) throws Exception {

        String xmlOrigen = "resultado.xml";
        //String xslOrigen = "src/modelo/" + rutaHojaEstilo;
        String xslOrigen = rutaHojaEstilo;
        String xslHTML = rutaHojaEstiloHtml;

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

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

        TransformerFactory factoriaTrans = TransformerFactory.newInstance();
        Transformer transformador = factoriaTrans.newTransformer(xsltSource);
        Transformer transformadorHtml = factoriaTrans.newTransformer(xsltSourceHtml);
        try {
            transformador.transform(xmlSource, bufferResultado);
        } catch (Exception e) {}
        try {
            transformadorHtml.transform(xmlSource, bufferResultadoHtml);
        } catch (Exception e) {}
        jTextPane.setText(cadenaSalida.toString());

        // Creamos fichero HTML
        if (ruta == null)
            try {
                File fichHTML = new java.io.File("resultado.html");
                fichHTML.createNewFile();
                fichHTML.setWritable(true);

                FileWriter fr = new FileWriter(fichHTML);
                fr.write(cadenaSalidaHtml.toString());
                fr.flush();
                fr.close();

            } catch(Exception e) {
                // ...
            }
        else{
            try {
                File fichHTML = new java.io.File(ruta);
                fichHTML.createNewFile();
                fichHTML.setWritable(true);

                FileWriter fr = new FileWriter(fichHTML);
                fr.write(cadenaSalida.toString());
                fr.flush();
                fr.close();

            } catch(Exception e) {
                // ...
            }
        }

        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 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_anadirDatoEspecifico;
    private javax.swing.JMenuItem jMenuItem_anadirExcepcion;
    private javax.swing.JMenuItem jMenuItem_anadirPaso;
    private javax.swing.JMenuItem jMenuItem_anadirSubObjetivo;
    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;
    }

    // Devuelve la ruta completa hasta el nodo seleccionado
    public MutableTreeNode getCurrentNode() {
        TreePath tp = jTree.getSelectionPath();
        return (MutableTreeNode) ((MutableTreeNode) tp.getLastPathComponent()).getParent();
    }

    public MutableTreeNode getInsertNode() {
        TreePath tp = jTree.getSelectionPath();
        return (MutableTreeNode) tp.getLastPathComponent();
    }
    public int getInsertIndex(MutableTreeNode nodoSeleccionado) {
        return nodoSeleccionado.getChildCount();
    }

    public void crearNodos(DefaultMutableTreeNode root, Result result, Document document, Element raiz) {

        if (root.getChildCount() > 0) {
            for(Enumeration e=root.children(); e.hasMoreElements();){
                    DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.nextElement();
                    documentoRequisitos.toXML(node, result, document, raiz);
                    crearNodos(node, result, document, raiz);
                                                                    }
            try {
                transformar(rutaHtml);

            } catch (Exception ex) {
                   Logger.getLogger(jfHome.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }


    // Actualiza el TextPane
    public void actualizarTextPane() {
        this.getJTree().setCellRenderer(new RendererArbol());
        DefaultTreeModel model=(DefaultTreeModel)this.getJTree().getModel();
        DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot();
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            DOMImplementation implementation = builder.getDOMImplementation();
            Document document = implementation.createDocument(null, "xml", null);
            Element raiz = document.createElement("Documento");                 // Elemento raiz
            document.setXmlVersion("1.0");                                      // Versión de nuestro XML
            document.getDocumentElement().appendChild(raiz);                    // Pegamos la raiz al documento

            Result result = new StreamResult(new java.io.File("resultado.xml")); //Nombre del archivo

            crearNodos(root, result, document, raiz);

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

    }
    public void nodos_a_eliminar(ArrayList<String> subArbol, MutableTreeNode nodoSeleccionado){
        if (nodoSeleccionado.getChildCount() > 0) {
            for(Enumeration e=nodoSeleccionado.children(); e.hasMoreElements();){
                    DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.nextElement();
                    subArbol.add(utilidades.getIdentificadorNodo(node));
                    nodos_a_eliminar(subArbol, node);  ////  COMPROBAR QUE NO SIGA CON LOS DEMAS ARBOLES!!!!
            }
        }
    }
}
