/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * jfrmPrincipal.java
 *
 * Created on 15-nov-2011, 16:34:51
 */


package vista;

import java.awt.event.MouseEvent;
import java.util.Observer;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTree;
import javax.swing.UIManager;
import modelo.*;
import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import modelo.DocumentoReq;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
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 org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 *
 * @author acc_local
 */
public class jfrmPrincipal extends javax.swing.JFrame implements Observer{
    private DocumentoReq docPpal=new DocumentoReq();
    boolean nueva_version=true;
    Document document = null;
    Element raiz = null;
    Result result = null;
    /** Creates new form jfrmPrincipal */
    public jfrmPrincipal() {
        initComponents();
        this.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/inicio.png")).getImage());
        // Look and Feel del SO en el que nos encontremos
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            System.out.println("Error de Look and Feel");
        }
        jtxpDocumento.setContentType("text/html");
        jtxpDocumento.setText("<center><b><span style=\"font-size: large;\">Herramienta de Gestión de Requisitos</span></b></center>");
    }

    private void imprimirNodos(DefaultMutableTreeNode root) {
        
        if (nueva_version==true){
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            try{
            DocumentBuilder builder = factory.newDocumentBuilder();
            DOMImplementation implementation = builder.getDOMImplementation();
            document = implementation.createDocument(null, "xml", null);
            raiz = document.createElement("Documento"); // creamos el elemento raiz
            document.setXmlVersion("1.0"); // asignamos la version de nuestro XML
            document.getDocumentElement().appendChild(raiz); //pegamos la raiz al documento
            result = new StreamResult(new java.io.File("resultado.xml"));
            }catch(Exception e){
                System.err.println("Error: "+e);
            }
            nueva_version=false;
            //Titulo XML
            docPpal.DocumentotoXML(result, document, raiz);
            try {
                    String res = transformar();
            }
            catch (Exception ex) {
                    Logger.getLogger(jfrmPrincipal.class.getName()).log(Level.SEVERE, null, ex);
            }
            
        }

        
        if(root.getChildCount()>0){
            for(Enumeration e=root.children(); e.hasMoreElements();){
                TreeNode node=(TreeNode) e.nextElement();
                
                String identificador = node.toString();
                int inicio = identificador.indexOf("-");
                int fin = identificador.indexOf(" ");
                String id=identificador.substring(inicio +1, fin);
                
                
                
                if (identificador.startsWith("[CDU]")) {
                    docPpal.CasodeUsotoXML(docPpal.BuscarCU(id), result, document, raiz);
                }
                else if (identificador.startsWith("[REU]")) {
                    docPpal.ReuniontoXML(docPpal.BuscarREU(id), result, document, raiz);
                }
                else if (identificador.startsWith("[ORG]")) {
                    docPpal.OrganizaciontoXML(docPpal.BuscarORG(id), result, document, raiz);
                }
                else if (identificador.startsWith("[PAR]")) {
                    docPpal.ParticipantetoXML(docPpal.BuscarPAR(id), result, document, raiz);
                }
                else if (identificador.startsWith("[OBJ]")) {
                    docPpal.ObjetivotoXML(docPpal.BuscarOBJ(id), result, document, raiz);
                }
                else if (identificador.startsWith("[RFU]")) {
                    docPpal.RFuncionaltoXML(docPpal.BuscarRFU(id), result, document, raiz);
                }
                else if (identificador.startsWith("[RNF]")) {
                    docPpal.RNoFuncionaltoXML(docPpal.BuscarRNF(id), result, document, raiz);
                }
                else if (identificador.startsWith("[RIN]")) {
                    docPpal.RInformaciontoXML(docPpal.BuscarRIN(id), result, document, raiz);
                }
                else if (identificador.startsWith("[RRE]")) {
                    docPpal.RRestricciontoXML(docPpal.BuscarRRE(id), result, document, raiz);
                }
                else if (identificador.startsWith("[IMG]")) {
                    docPpal.ImagentoXML(docPpal.BuscarIMG(id), result, document, raiz);
                }
                else if (identificador.startsWith("[SEC]")) {
                    docPpal.SecciontoXML(docPpal.BuscarSEC(id), result, document, raiz);
                }
                else if (identificador.startsWith("[PRF]")) {
                    docPpal.ParrafotoXML(docPpal.BuscarPRF(id), result, document, raiz);
                }
                else if (identificador.startsWith("[ACT]")) {
                    docPpal.ActortoXML(docPpal.BuscarACT(id), result, document, raiz);
                }
                else if (identificador.startsWith("[MAT]")) {
                    docPpal.MatriztoXML(docPpal.BuscarMAT(id), result, document, raiz);
                }
               
                try {
                    if(docPpal.isJerarquia()==true) {
                        String res = transformar();
                    }
                    else {
                        String res = transformar2();
                    }
                }
                catch (Exception ex) {
                    Logger.getLogger(jfrmPrincipal.class.getName()).log(Level.SEVERE, null, ex);
                }
                imprimirNodos((DefaultMutableTreeNode) node);
            }
        }
    }
    
    public String transformar() throws Exception {
        String xmlOrigen = "resultado.xml";
        String xslOrigen = "src/modelo/XMLDocReq.xsl";
        
        Source xmlSource = new StreamSource(new File(xmlOrigen));
        Source xsltSource = new StreamSource(new File(xslOrigen));
        StringWriter cadenaSalida = new StringWriter();
        
        Result bufferResultado = new StreamResult(cadenaSalida);
        TransformerFactory factoriaTrans = TransformerFactory.newInstance();
        Transformer transformador = factoriaTrans.newTransformer(xsltSource);
        transformador.transform(xmlSource, bufferResultado);
        
        jtxpDocumento.setText(cadenaSalida.toString());
        //guardar html en fichero físico
        return cadenaSalida.toString();
    }
    
    public String transformar2() throws Exception {
        String xmlOrigen = "resultado.xml";
        String xslOrigen = "src/modelo/XMLDocReq2.xsl";
        
        Source xmlSource = new StreamSource(new File(xmlOrigen));
        Source xsltSource = new StreamSource(new File(xslOrigen));
        StringWriter cadenaSalida = new StringWriter();
        
        Result bufferResultado = new StreamResult(cadenaSalida);
        TransformerFactory factoriaTrans = TransformerFactory.newInstance();
        Transformer transformador = factoriaTrans.newTransformer(xsltSource);
        transformador.transform(xmlSource, bufferResultado);
        
        jtxpDocumento.setText(cadenaSalida.toString());
        //guardar html en fichero físico
        return cadenaSalida.toString();
    }
    
    
    
    

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPopupMenu1 = new javax.swing.JPopupMenu();
        jMenuItemEditar = new javax.swing.JMenuItem();
        jMenuItemEliminar = new javax.swing.JMenuItem();
        jScrollPane1 = new javax.swing.JScrollPane();
        jtreDocumento = new javax.swing.JTree();
        jlblMensaje = new javax.swing.JLabel();
        jToolBar1 = new javax.swing.JToolBar();
        jbtnNuevaSeccion = new javax.swing.JButton();
        jbtnParrafo = new javax.swing.JButton();
        jbtnNuevaImagen = new javax.swing.JButton();
        jbtnMatriz = new javax.swing.JButton();
        jSeparator3 = new javax.swing.JToolBar.Separator();
        jbtnAñadirParticipante = new javax.swing.JButton();
        jbtnNuevaOrg = new javax.swing.JButton();
        jbtnNuevaReunion = new javax.swing.JButton();
        jSeparator1 = new javax.swing.JToolBar.Separator();
        jbtnNuevoObjetivo = new javax.swing.JButton();
        jbtnNuevoActor = new javax.swing.JButton();
        jbtnNuevoCU = new javax.swing.JButton();
        jbtnAñadirPaso = new javax.swing.JButton();
        jbtnAñadirExcepcion = new javax.swing.JButton();
        jSeparator2 = new javax.swing.JToolBar.Separator();
        jbtnrReqFuncional = new javax.swing.JButton();
        jbtnReq_NoFuncional = new javax.swing.JButton();
        jbtnReq_Informacion = new javax.swing.JButton();
        jbtnReq_Restriccion = new javax.swing.JButton();
        jSeparator4 = new javax.swing.JSeparator();
        jScrollPane2 = new javax.swing.JScrollPane();
        jtxpDocumento = new javax.swing.JTextPane();
        jmnuBarraPpal = new javax.swing.JMenuBar();
        jmnuProyecto = new javax.swing.JMenu();
        jmniPreferencias = new javax.swing.JMenuItem();
        jmniGuardar = new javax.swing.JMenuItem();
        jmnAyuda = new javax.swing.JMenu();
        jmniAcercaDe = new javax.swing.JMenuItem();
        jmnuSalir = new javax.swing.JMenu();
        jmniSalir = new javax.swing.JMenuItem();

        jPopupMenu1.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) {
                jPopupMenu1PopupMenuWillBecomeVisible(evt);
            }
        });

        jMenuItemEditar.setText("Editar");
        jMenuItemEditar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemEditarActionPerformed(evt);
            }
        });
        jPopupMenu1.add(jMenuItemEditar);

        jMenuItemEliminar.setText("Eliminar");
        jMenuItemEliminar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemEliminarActionPerformed(evt);
            }
        });
        jPopupMenu1.add(jMenuItemEliminar);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("HGRequisitos - Universidad de Huelva");

        javax.swing.tree.DefaultMutableTreeNode treeNode1 = new javax.swing.tree.DefaultMutableTreeNode("[DOC] Documento ER");
        jtreDocumento.setModel(new javax.swing.tree.DefaultTreeModel(treeNode1));
        jtreDocumento.setComponentPopupMenu(jPopupMenu1);
        jScrollPane1.setViewportView(jtreDocumento);

        jToolBar1.setRollover(true);

        jbtnNuevaSeccion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/iconos/nueva_seccion.png"))); // NOI18N
        jbtnNuevaSeccion.setToolTipText("Nueva Sección");
        jbtnNuevaSeccion.setFocusable(false);
        jbtnNuevaSeccion.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jbtnNuevaSeccion.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jbtnNuevaSeccion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnNuevaSeccionActionPerformed(evt);
            }
        });
        jToolBar1.add(jbtnNuevaSeccion);

        jbtnParrafo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/iconos/nuevo_parrafo.png"))); // NOI18N
        jbtnParrafo.setToolTipText("Nuevo Párrafo");
        jbtnParrafo.setFocusable(false);
        jbtnParrafo.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jbtnParrafo.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jbtnParrafo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnParrafoActionPerformed(evt);
            }
        });
        jToolBar1.add(jbtnParrafo);

        jbtnNuevaImagen.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/iconos/nueva_imagen.png"))); // NOI18N
        jbtnNuevaImagen.setToolTipText("Nueva Imagen");
        jbtnNuevaImagen.setFocusable(false);
        jbtnNuevaImagen.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jbtnNuevaImagen.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jbtnNuevaImagen.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnNuevaImagenActionPerformed(evt);
            }
        });
        jToolBar1.add(jbtnNuevaImagen);

        jbtnMatriz.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/iconos/matriz.png"))); // NOI18N
        jbtnMatriz.setToolTipText("Matriz de Rastreabilidad");
        jbtnMatriz.setFocusable(false);
        jbtnMatriz.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jbtnMatriz.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jbtnMatriz.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnMatrizActionPerformed(evt);
            }
        });
        jToolBar1.add(jbtnMatriz);
        jToolBar1.add(jSeparator3);

        jbtnAñadirParticipante.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/iconos/nuevo_participante.png"))); // NOI18N
        jbtnAñadirParticipante.setToolTipText("Nuevo Participante");
        jbtnAñadirParticipante.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnAñadirParticipanteActionPerformed(evt);
            }
        });
        jToolBar1.add(jbtnAñadirParticipante);

        jbtnNuevaOrg.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/iconos/nueva_organizacion.png"))); // NOI18N
        jbtnNuevaOrg.setToolTipText("Nueva Organización");
        jbtnNuevaOrg.setFocusable(false);
        jbtnNuevaOrg.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jbtnNuevaOrg.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jbtnNuevaOrg.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnNuevaOrgActionPerformed(evt);
            }
        });
        jToolBar1.add(jbtnNuevaOrg);

        jbtnNuevaReunion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/iconos/nueva_reunion.png"))); // NOI18N
        jbtnNuevaReunion.setToolTipText("Nueva Reunión");
        jbtnNuevaReunion.setFocusable(false);
        jbtnNuevaReunion.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jbtnNuevaReunion.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jbtnNuevaReunion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnNuevaReunionActionPerformed(evt);
            }
        });
        jToolBar1.add(jbtnNuevaReunion);
        jToolBar1.add(jSeparator1);

        jbtnNuevoObjetivo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/iconos/nuevo_objetivo.png"))); // NOI18N
        jbtnNuevoObjetivo.setToolTipText("Nuevo Objetivo");
        jbtnNuevoObjetivo.setFocusable(false);
        jbtnNuevoObjetivo.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jbtnNuevoObjetivo.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jbtnNuevoObjetivo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnNuevoObjetivoActionPerformed(evt);
            }
        });
        jToolBar1.add(jbtnNuevoObjetivo);

        jbtnNuevoActor.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/iconos/nuevo_actor.png"))); // NOI18N
        jbtnNuevoActor.setToolTipText("Nuevo Actor");
        jbtnNuevoActor.setFocusable(false);
        jbtnNuevoActor.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jbtnNuevoActor.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jbtnNuevoActor.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnNuevoActorActionPerformed(evt);
            }
        });
        jToolBar1.add(jbtnNuevoActor);

        jbtnNuevoCU.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/iconos/nueva_cu.png"))); // NOI18N
        jbtnNuevoCU.setToolTipText("Nuevo Caso de Uso");
        jbtnNuevoCU.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnNuevoCUActionPerformed(evt);
            }
        });
        jToolBar1.add(jbtnNuevoCU);

        jbtnAñadirPaso.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/iconos/nuevo_paso.png"))); // NOI18N
        jbtnAñadirPaso.setToolTipText("Nuevo Paso");
        jbtnAñadirPaso.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnAñadirPasoActionPerformed(evt);
            }
        });
        jToolBar1.add(jbtnAñadirPaso);

        jbtnAñadirExcepcion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/iconos/nueva_excepcion.png"))); // NOI18N
        jbtnAñadirExcepcion.setToolTipText("Nueva Excepcion");
        jbtnAñadirExcepcion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnAñadirExcepcionActionPerformed(evt);
            }
        });
        jToolBar1.add(jbtnAñadirExcepcion);
        jToolBar1.add(jSeparator2);

        jbtnrReqFuncional.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/iconos/req_funcional.png"))); // NOI18N
        jbtnrReqFuncional.setToolTipText("Nuevo Requisito Funcional");
        jbtnrReqFuncional.setFocusable(false);
        jbtnrReqFuncional.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jbtnrReqFuncional.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jbtnrReqFuncional.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnrReqFuncionalActionPerformed(evt);
            }
        });
        jToolBar1.add(jbtnrReqFuncional);

        jbtnReq_NoFuncional.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/iconos/req_nofuncional.png"))); // NOI18N
        jbtnReq_NoFuncional.setToolTipText("Nuevo Requisito No Funcional");
        jbtnReq_NoFuncional.setFocusable(false);
        jbtnReq_NoFuncional.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jbtnReq_NoFuncional.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jbtnReq_NoFuncional.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnReq_NoFuncionalActionPerformed(evt);
            }
        });
        jToolBar1.add(jbtnReq_NoFuncional);

        jbtnReq_Informacion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/iconos/req_informacion.png"))); // NOI18N
        jbtnReq_Informacion.setToolTipText("Nuevo Requisito de Información");
        jbtnReq_Informacion.setFocusable(false);
        jbtnReq_Informacion.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jbtnReq_Informacion.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jbtnReq_Informacion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnReq_InformacionActionPerformed(evt);
            }
        });
        jToolBar1.add(jbtnReq_Informacion);

        jbtnReq_Restriccion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vista/iconos/req_restriccion.png"))); // NOI18N
        jbtnReq_Restriccion.setToolTipText("Nuevo Requisito de Restricción");
        jbtnReq_Restriccion.setFocusable(false);
        jbtnReq_Restriccion.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jbtnReq_Restriccion.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jbtnReq_Restriccion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnReq_RestriccionActionPerformed(evt);
            }
        });
        jToolBar1.add(jbtnReq_Restriccion);

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

        jmnuProyecto.setText("Proyecto");

        jmniPreferencias.setText("Preferencias");
        jmniPreferencias.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmniPreferenciasActionPerformed(evt);
            }
        });
        jmnuProyecto.add(jmniPreferencias);

        jmniGuardar.setText("Guardar");
        jmniGuardar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmniGuardarActionPerformed(evt);
            }
        });
        jmnuProyecto.add(jmniGuardar);

        jmnuBarraPpal.add(jmnuProyecto);

        jmnAyuda.setText("Ayuda");

        jmniAcercaDe.setText("Acerca de");
        jmniAcercaDe.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmniAcercaDeActionPerformed(evt);
            }
        });
        jmnAyuda.add(jmniAcercaDe);

        jmnuBarraPpal.add(jmnAyuda);

        jmnuSalir.setText("Salir");

        jmniSalir.setText("Salir");
        jmniSalir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmniSalirActionPerformed(evt);
            }
        });
        jmnuSalir.add(jmniSalir);

        jmnuBarraPpal.add(jmnuSalir);

        setJMenuBar(jmnuBarraPpal);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 833, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jlblMensaje, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 813, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 270, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 537, Short.MAX_VALUE))
                    .addComponent(jSeparator4, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 813, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jlblMensaje, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(13, 13, 13)
                .addComponent(jSeparator4, javax.swing.GroupLayout.PREFERRED_SIZE, 10, 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, 332, Short.MAX_VALUE)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 332, Short.MAX_VALUE))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents
 
    
    
    
    private void jmniSalirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmniSalirActionPerformed
        System.exit(0);
    }//GEN-LAST:event_jmniSalirActionPerformed
    
    
    private void jbtnAñadirParticipanteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnAñadirParticipanteActionPerformed
        TreePath tp = getJtreDocumento().getSelectionPath();

        if(tp!=null) {
            DefaultMutableTreeNode nodo_aux = (DefaultMutableTreeNode) tp.getLastPathComponent();
            String nombre_aux = (String) nodo_aux.getUserObject();
            if(!(nombre_aux.startsWith("[ORG]"))) {
                jlblMensaje.setText("Error: No se ha seleccionado una organización [ORG]");
            }
            else {
                MutableTreeNode insertNode= (MutableTreeNode) tp.getLastPathComponent();
                int insertIndex=0;

                if(insertNode.getChildCount()!=0) {
                    insertIndex=insertNode.getChildCount();
                }

                jfrmParticipante jfParticipante=new jfrmParticipante(this, docPpal.BuscarORG(codigo_to_id(nombre_aux)), insertNode, insertIndex, getDocPpal());
                jfParticipante.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nuevo_participante.png")).getImage());
                jfParticipante.setLocationRelativeTo(null);
                jfParticipante.setVisible(true);
                this.setEnabled(false);
            }
        }
        else {
            jlblMensaje.setText("Error: Ningun nodo seleccionado");
        }
}//GEN-LAST:event_jbtnAñadirParticipanteActionPerformed

    private void jbtnNuevoCUActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnNuevoCUActionPerformed
        TreePath tp = getJtreDocumento().getSelectionPath();
        
        if(tp!=null) {
            DefaultMutableTreeNode nodo_aux = (DefaultMutableTreeNode) tp.getLastPathComponent();
            String nombre_aux = (String) nodo_aux.getUserObject();
            if(!(nombre_aux.startsWith("[DOC]") || nombre_aux.startsWith("[SEC]"))) {
                jlblMensaje.setText("Error: No se ha seleccionado una sección [SEC] o un documento [DOC]");
            } 
            else {  
                MutableTreeNode insertNode= (MutableTreeNode) tp.getLastPathComponent();
                int insertIndex=0;
                
                if(insertNode.getChildCount()!=0) {
                    insertIndex=insertNode.getChildCount();
                }
                
                jfrmCasodeUso jfCasodeUso=new jfrmCasodeUso(this, getDocPpal(), insertNode, insertIndex);
                jfCasodeUso.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nueva_cu.png")).getImage());
                jfCasodeUso.setLocationRelativeTo(null);
                jfCasodeUso.setVisible(true);
                this.setEnabled(false);
            }
        }
        else {
            jlblMensaje.setText("Error: Ningun nodo seleccionado");
        }
    }//GEN-LAST:event_jbtnNuevoCUActionPerformed

    private void jbtnAñadirPasoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnAñadirPasoActionPerformed
        TreePath tp = getJtreDocumento().getSelectionPath();
        
        if(tp!=null) {
            DefaultMutableTreeNode nodo_aux = (DefaultMutableTreeNode) tp.getLastPathComponent();
            String nombre_aux = (String) nodo_aux.getUserObject();
            if(!nombre_aux.startsWith("[CDU]")) {
                jlblMensaje.setText("Error: No se ha seleccionado un caso de uso [CDU]");
            } 
            else {  
                MutableTreeNode insertNode= (MutableTreeNode) tp.getLastPathComponent();
                int insertIndex=0;
                
                if(insertNode.getChildCount()!=0) {
                    insertIndex=insertNode.getChildCount();
                }
                
                
                jfrmPaso jfPaso=new jfrmPaso(this, docPpal.BuscarCU(codigo_to_id(nombre_aux)), insertNode, insertIndex, getDocPpal());
                jfPaso.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nuevo_paso.png")).getImage());
                jfPaso.setLocationRelativeTo(null);
                jfPaso.setVisible(true);
                this.setEnabled(false);
            }
        }
        else {
            jlblMensaje.setText("Error: Ningun nodo seleccionado");
        }
    }//GEN-LAST:event_jbtnAñadirPasoActionPerformed

    private void jbtnAñadirExcepcionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnAñadirExcepcionActionPerformed
        TreePath tp = getJtreDocumento().getSelectionPath();
        
        if(tp!=null) {
            DefaultMutableTreeNode nodo_aux = (DefaultMutableTreeNode) tp.getLastPathComponent();
            String nombre_aux = (String) nodo_aux.getUserObject();
            if(!nombre_aux.startsWith("[PAS]")) {
                jlblMensaje.setText("Error: No se ha seleccionado un paso [PAS]");
            } 
            else {  
                MutableTreeNode insertNode= (MutableTreeNode) tp.getLastPathComponent();
                int insertIndex=0;
                
                if(insertNode.getChildCount()!=0) {
                    insertIndex=insertNode.getChildCount();
                }

                jfrmExcepcion jfExcepcion=new jfrmExcepcion(this, docPpal.BuscarPAS(codigo_to_id(nombre_aux)), insertNode, insertIndex, getDocPpal());
                jfExcepcion.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nueva_excepcion.png")).getImage());
                jfExcepcion.setLocationRelativeTo(null);
                jfExcepcion.setVisible(true);
                this.setEnabled(false);
            }
        }
        else {
            jlblMensaje.setText("Error: Ningun nodo seleccionado");
        }
    }//GEN-LAST:event_jbtnAñadirExcepcionActionPerformed

    private void jbtnNuevaOrgActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnNuevaOrgActionPerformed
        TreePath tp = getJtreDocumento().getSelectionPath();

        if(tp!=null) {
            DefaultMutableTreeNode nodo_aux = (DefaultMutableTreeNode) tp.getLastPathComponent();
            String nombre_aux = (String) nodo_aux.getUserObject();
            if(!(nombre_aux.startsWith("[DOC]") || nombre_aux.startsWith("[SEC]"))) {
                jlblMensaje.setText("Error: No se ha seleccionado una sección [SEC] o un documento [DOC]");
            }
            else {
                MutableTreeNode insertNode= (MutableTreeNode) tp.getLastPathComponent();
                int insertIndex=0;

                if(insertNode.getChildCount()!=0) {
                    insertIndex=insertNode.getChildCount();
                }

                jfrmOrganizacion jfOrganizacion=new jfrmOrganizacion(this, getDocPpal(), insertNode, insertIndex);
                jfOrganizacion.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nueva_organizacion.png")).getImage());
                jfOrganizacion.setLocationRelativeTo(null);
                jfOrganizacion.setVisible(true);
                this.setEnabled(false);
            }
        }
        else {
            jlblMensaje.setText("Error: Ningun nodo seleccionado");
        }
    }//GEN-LAST:event_jbtnNuevaOrgActionPerformed

    private void jbtnReq_RestriccionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnReq_RestriccionActionPerformed
        TreePath tp = getJtreDocumento().getSelectionPath();
        
        if(tp!=null) {
            DefaultMutableTreeNode nodo_aux = (DefaultMutableTreeNode) tp.getLastPathComponent();
            String nombre_aux = (String) nodo_aux.getUserObject();
            if(!(nombre_aux.startsWith("[DOC]") || nombre_aux.startsWith("[SEC]"))) {
                jlblMensaje.setText("Error: No se ha seleccionado una sección [SEC] o un documento [DOC]");
            }
            else {
                MutableTreeNode insertNode= (MutableTreeNode) tp.getLastPathComponent();
                int insertIndex=0;

                if(insertNode.getChildCount()!=0) {
                    insertIndex=insertNode.getChildCount();
                }

                jfrmReqRestriccion jfRestriccion=new jfrmReqRestriccion(this, getDocPpal(), insertNode, insertIndex);
                jfRestriccion.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/req_restriccion.png")).getImage());
                jfRestriccion.setLocationRelativeTo(null);
                jfRestriccion.setVisible(true);
                this.setEnabled(false);
            }
        }
        else {
            jlblMensaje.setText("Error: Ningun nodo seleccionado");
        }    
    }//GEN-LAST:event_jbtnReq_RestriccionActionPerformed

private void jbtnParrafoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnParrafoActionPerformed
        TreePath tp = getJtreDocumento().getSelectionPath();
        
        if(tp!=null) {
            DefaultMutableTreeNode nodo_aux = (DefaultMutableTreeNode) tp.getLastPathComponent();
            String nombre_aux = (String) nodo_aux.getUserObject();
            if(!(nombre_aux.startsWith("[DOC]") || nombre_aux.startsWith("[SEC]"))) {
                jlblMensaje.setText("Error: No se ha seleccionado una sección [SEC] o un documento [DOC]");
            }
            else {
                MutableTreeNode insertNode= (MutableTreeNode) tp.getLastPathComponent();
                int insertIndex=0;

                if(insertNode.getChildCount()!=0) {
                    insertIndex=insertNode.getChildCount();
                }

                jfrmParrafo jfParrafo=new jfrmParrafo(this, getDocPpal(), insertNode, insertIndex);
                jfParrafo.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nuevo_parrafo.png")).getImage());
                jfParrafo.setLocationRelativeTo(null);
                jfParrafo.setVisible(true);
                this.setEnabled(false);
            }
        }
        else {
            jlblMensaje.setText("Error: Ningun nodo seleccionado");
        }    
}//GEN-LAST:event_jbtnParrafoActionPerformed

    private void jbtnrReqFuncionalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnrReqFuncionalActionPerformed
        TreePath tp = getJtreDocumento().getSelectionPath();

        if(tp!=null) {
            DefaultMutableTreeNode nodo_aux = (DefaultMutableTreeNode) tp.getLastPathComponent();
            String nombre_aux = (String) nodo_aux.getUserObject();
            if(!(nombre_aux.startsWith("[DOC]") || nombre_aux.startsWith("[SEC]"))) {
                jlblMensaje.setText("Error: No se ha seleccionado una sección [SEC] o un documento [DOC]");
            }
            else {
                MutableTreeNode insertNode= (MutableTreeNode) tp.getLastPathComponent();
                int insertIndex=0;

                if(insertNode.getChildCount()!=0) {
                    insertIndex=insertNode.getChildCount();
                }

                jfrmReqFuncional jfFuncional=new jfrmReqFuncional(this, getDocPpal(), insertNode, insertIndex);
                jfFuncional.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/req_funcional.png")).getImage());
                jfFuncional.setLocationRelativeTo(null);
                jfFuncional.setVisible(true);
                this.setEnabled(false);
            }
        }
        else {
            jlblMensaje.setText("Error: Ningun nodo seleccionado");
        }         
    }//GEN-LAST:event_jbtnrReqFuncionalActionPerformed

    private void jbtnReq_InformacionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnReq_InformacionActionPerformed
        TreePath tp = getJtreDocumento().getSelectionPath();
        
        if(tp!=null) {
            DefaultMutableTreeNode nodo_aux = (DefaultMutableTreeNode) tp.getLastPathComponent();
            String nombre_aux = (String) nodo_aux.getUserObject();
            if(!(nombre_aux.startsWith("[DOC]") || nombre_aux.startsWith("[SEC]"))) {
                jlblMensaje.setText("Error: No se ha seleccionado una sección [SEC] o un documento [DOC]");
            }
            else {
                MutableTreeNode insertNode= (MutableTreeNode) tp.getLastPathComponent();
                int insertIndex=0;

                if(insertNode.getChildCount()!=0) {
                    insertIndex=insertNode.getChildCount();
                }

                jfrmReqInformacion jfInformacion=new jfrmReqInformacion(this, getDocPpal(), insertNode, insertIndex);
                jfInformacion.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/req_informacion.png")).getImage());
                jfInformacion.setLocationRelativeTo(null);
                jfInformacion.setVisible(true);
                this.setEnabled(false);
            }
        }
        else {
            jlblMensaje.setText("Error: Ningun nodo seleccionado");
        } 
    }//GEN-LAST:event_jbtnReq_InformacionActionPerformed

    private void jbtnReq_NoFuncionalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnReq_NoFuncionalActionPerformed
        TreePath tp = getJtreDocumento().getSelectionPath();

        if(tp!=null) {
            DefaultMutableTreeNode nodo_aux = (DefaultMutableTreeNode) tp.getLastPathComponent();
            String nombre_aux = (String) nodo_aux.getUserObject();
            if(!(nombre_aux.startsWith("[DOC]") || nombre_aux.startsWith("[SEC]"))) {
                jlblMensaje.setText("Error: No se ha seleccionado una sección [SEC] o un documento [DOC]");
            }
            else {
                MutableTreeNode insertNode= (MutableTreeNode) tp.getLastPathComponent();
                int insertIndex=0;

                if(insertNode.getChildCount()!=0) {
                    insertIndex=insertNode.getChildCount();
                }

                jfrmReqNoFuncional jfNoFuncional=new jfrmReqNoFuncional(this, getDocPpal(), insertNode, insertIndex);
                jfNoFuncional.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/req_nofuncional.png")).getImage());
                jfNoFuncional.setLocationRelativeTo(null);
                jfNoFuncional.setVisible(true);
                this.setEnabled(false);
            }
        }
        else {
            jlblMensaje.setText("Error: Ningun nodo seleccionado");
        }
    }//GEN-LAST:event_jbtnReq_NoFuncionalActionPerformed

    private void jbtnNuevaReunionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnNuevaReunionActionPerformed
        TreePath tp = getJtreDocumento().getSelectionPath();

        if(tp!=null) {
            DefaultMutableTreeNode nodo_aux = (DefaultMutableTreeNode) tp.getLastPathComponent();
            String nombre_aux = (String) nodo_aux.getUserObject();
            if(!(nombre_aux.startsWith("[DOC]") || nombre_aux.startsWith("[SEC]"))) {
                jlblMensaje.setText("Error: No se ha seleccionado una sección [SEC] o un documento [DOC]");
            }
            else {
                MutableTreeNode insertNode= (MutableTreeNode) tp.getLastPathComponent();
                int insertIndex=0;

                if(insertNode.getChildCount()!=0) {
                    insertIndex=insertNode.getChildCount();
                }

                jfrmReunion jfReunion=new jfrmReunion(this, getDocPpal(), insertNode, insertIndex);
                jfReunion.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nueva_reunion.png")).getImage());
                jfReunion.setLocationRelativeTo(null);
                jfReunion.setVisible(true);
                this.setEnabled(false);
            }
        }
        else {
            jlblMensaje.setText("Error: Ningun nodo seleccionado");
        }
    }//GEN-LAST:event_jbtnNuevaReunionActionPerformed

    private void jbtnNuevoObjetivoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnNuevoObjetivoActionPerformed
        TreePath tp = getJtreDocumento().getSelectionPath();

        if(tp!=null) {
            DefaultMutableTreeNode nodo_aux = (DefaultMutableTreeNode) tp.getLastPathComponent();
            String nombre_aux = (String) nodo_aux.getUserObject();
            if(!(nombre_aux.startsWith("[DOC]") || nombre_aux.startsWith("[SEC]") || nombre_aux.startsWith("[OBJ]"))) {
                jlblMensaje.setText("Error: No se ha seleccionado una sección [SEC] o un documento [DOC]");
            }
            else {
                MutableTreeNode insertNode= (MutableTreeNode) tp.getLastPathComponent();
                int insertIndex=0;

                if(insertNode.getChildCount()!=0) {
                    insertIndex=insertNode.getChildCount();
                }
                
                jfrmObjetivo jfObjetivo;
                //Comprobamos si es un objetivo o un subobjetivo
                if((nombre_aux.startsWith("[DOC]") || nombre_aux.startsWith("[SEC]"))) {
                    jfObjetivo=new jfrmObjetivo(this, getDocPpal(), insertNode, insertIndex);
                    jfObjetivo.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nuevo_objetivo.png")).getImage());
                    jfObjetivo.setLocationRelativeTo(null);
                    jfObjetivo.setVisible(true);
                    this.setEnabled(false);
                }
                else {
                    Objetivo aux=getDocPpal().BuscarOBJ(codigo_to_id(nombre_aux));
                    if(aux!=null){
                        jfObjetivo=new jfrmObjetivo(this, aux, insertNode, insertIndex, getDocPpal());
                        jfObjetivo.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nuevo_objetivo.png")).getImage());
                        jfObjetivo.setLocationRelativeTo(null);
                        jfObjetivo.setVisible(true);
                        this.setEnabled(false);
                    }
                    else {
                        jlblMensaje.setText("Error: No se puede añadir un Subobjetivo dentro de otro.");
                    }
                }
                
                
            }
        }
        else {
            jlblMensaje.setText("Error: Ningun nodo seleccionado");
        }
    }//GEN-LAST:event_jbtnNuevoObjetivoActionPerformed

    private void jmniAcercaDeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmniAcercaDeActionPerformed
        jfrmAcercaDe jfAcercaDe = new jfrmAcercaDe();         
        jfAcercaDe.setLocationRelativeTo(null);         
        jfAcercaDe.setVisible(true);
    }//GEN-LAST:event_jmniAcercaDeActionPerformed

    private void jbtnNuevaSeccionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnNuevaSeccionActionPerformed
        TreePath tp = getJtreDocumento().getSelectionPath();

        if(tp!=null) {
            DefaultMutableTreeNode nodo_aux = (DefaultMutableTreeNode) tp.getLastPathComponent();
            String nombre_aux = (String) nodo_aux.getUserObject();
            if(!(nombre_aux.startsWith("[DOC]") || nombre_aux.startsWith("[SEC]"))) {
                jlblMensaje.setText("Error: No se ha seleccionado una sección [SEC] o un documento [DOC]");
            }
            else {
                MutableTreeNode insertNode= (MutableTreeNode) tp.getLastPathComponent();
                int insertIndex=0;

                if(insertNode.getChildCount()!=0) {
                    insertIndex=insertNode.getChildCount();
                }

                jfrmSeccion jfSeccion=new jfrmSeccion(this, getDocPpal(), insertNode, insertIndex);
                jfSeccion.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nueva_seccion.png")).getImage());
                jfSeccion.setLocationRelativeTo(null);
                jfSeccion.setVisible(true);
                this.setEnabled(false);
            }
        }
        else {
            jlblMensaje.setText("Error: Ningun nodo seleccionado");
        }
    }//GEN-LAST:event_jbtnNuevaSeccionActionPerformed

    private void jbtnNuevoActorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnNuevoActorActionPerformed
        TreePath tp = getJtreDocumento().getSelectionPath();
        
        if(tp!=null) {
            DefaultMutableTreeNode nodo_aux = (DefaultMutableTreeNode) tp.getLastPathComponent();
            String nombre_aux = (String) nodo_aux.getUserObject();
            if(!(nombre_aux.startsWith("[DOC]") || nombre_aux.startsWith("[SEC]"))) {
                jlblMensaje.setText("Error: No se ha seleccionado una sección [SEC] o un documento [DOC]");
            }
            else {
                MutableTreeNode insertNode= (MutableTreeNode) tp.getLastPathComponent();
                int insertIndex=0;

                if(insertNode.getChildCount()!=0) {
                    insertIndex=insertNode.getChildCount();
                }

                jfrmActor jfActor=new jfrmActor(this, getDocPpal(), insertNode, insertIndex);
                jfActor.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nuevo_actor.png")).getImage());
                jfActor.setLocationRelativeTo(null);
                jfActor.setVisible(true);
                this.setEnabled(false);
            }
        }
        else {
            jlblMensaje.setText("Error: Ningun nodo seleccionado");
        }
    }//GEN-LAST:event_jbtnNuevoActorActionPerformed

    private void jbtnNuevaImagenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnNuevaImagenActionPerformed
        TreePath tp = getJtreDocumento().getSelectionPath();
        
        if(tp!=null) {
            DefaultMutableTreeNode nodo_aux = (DefaultMutableTreeNode) tp.getLastPathComponent();
            String nombre_aux = (String) nodo_aux.getUserObject();
            if(!(nombre_aux.startsWith("[DOC]") || nombre_aux.startsWith("[SEC]"))) {
                jlblMensaje.setText("Error: No se ha seleccionado una sección [SEC] o un documento [DOC]");
            }
            else {
                MutableTreeNode insertNode= (MutableTreeNode) tp.getLastPathComponent();
                int insertIndex=0;

                if(insertNode.getChildCount()!=0) {
                    insertIndex=insertNode.getChildCount();
                }

                jfrmImagen jfImagen=new jfrmImagen(this, getDocPpal(), insertNode, insertIndex);
                jfImagen.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nueva_imagen.png")).getImage());
                jfImagen.setLocationRelativeTo(null);
                jfImagen.setVisible(true);
                this.setEnabled(false);
            }
        }
        else {
            jlblMensaje.setText("Error: Ningun nodo seleccionado");
        }
    }//GEN-LAST:event_jbtnNuevaImagenActionPerformed

    private void jPopupMenu1PopupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) {//GEN-FIRST:event_jPopupMenu1PopupMenuWillBecomeVisible
        // TODO add your handling code here:
    }//GEN-LAST:event_jPopupMenu1PopupMenuWillBecomeVisible

    private void jMenuItemEditarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemEditarActionPerformed
        TreePath tp = getJtreDocumento().getSelectionPath();
        TreePath tp_padre = tp.getParentPath();
        if(tp!=null) {
            DefaultMutableTreeNode nodo_editar = (DefaultMutableTreeNode) tp.getLastPathComponent();
            DefaultMutableTreeNode nodo_padre = (DefaultMutableTreeNode) tp_padre.getLastPathComponent();
            String nombre_aux = (String) nodo_editar.getUserObject();
            String nombre_padre = (String) nodo_padre.getUserObject();
            if((nombre_aux.startsWith("[DOC]"))) {
                jlblMensaje.setText("Error: No se puede editar el Documento de Requisitos.");
            }
            else {
                if ((nombre_aux.startsWith("[CDU]"))) {
                    jfrmCasodeUso jfCasodeUso = new jfrmCasodeUso (this, docPpal.BuscarCU(codigo_to_id(nombre_aux)), nodo_editar, docPpal);
                    jfCasodeUso.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nueva_cu.png")).getImage());
                    jfCasodeUso.setLocationRelativeTo(null);
                    jfCasodeUso.setVisible(true);
                    this.setEnabled(false);
                }else if((nombre_aux.startsWith("[ACT]"))) {
                    jfrmActor jfActor = new jfrmActor (this, docPpal.BuscarACT(codigo_to_id(nombre_aux)), nodo_editar, docPpal);
                    jfActor.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nuevo_actor.png")).getImage());
                    jfActor.setLocationRelativeTo(null);
                    jfActor.setVisible(true);
                    this.setEnabled(false);
                }else if((nombre_aux.startsWith("[IMG]"))) {
                    jfrmImagen jfImg = new jfrmImagen (this, docPpal.BuscarIMG(codigo_to_id(nombre_aux)), nodo_editar, docPpal);
                    jfImg.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nueva_imagen.png")).getImage());
                    jfImg.setLocationRelativeTo(null);
                    jfImg.setVisible(true);
                    this.setEnabled(false);
                }else if((nombre_aux.startsWith("[OBJ]"))) {
                    jfrmObjetivo jfObj;
                    if (nombre_padre.startsWith("[OBJ]")) {
                        jfObj = new jfrmObjetivo (this, docPpal.BuscarOBJ(codigo_to_id(nombre_padre)).BuscarOBJ(codigo_to_id(nombre_aux)), nodo_editar, docPpal.BuscarOBJ(codigo_to_id(nombre_padre)), getDocPpal());    
                    }
                    else {
                        jfObj = new jfrmObjetivo (this, docPpal.BuscarOBJ(codigo_to_id(nombre_aux)), nodo_editar, docPpal);
                    }
                    jfObj.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nuevo_objetivo.png")).getImage());
                    jfObj.setLocationRelativeTo(null);
                    jfObj.setVisible(true);
                    this.setEnabled(false);
                }else if((nombre_aux.startsWith("[ORG]"))) {
                    jfrmOrganizacion jfOrg = new jfrmOrganizacion (this, docPpal.BuscarORG(codigo_to_id(nombre_aux)), nodo_editar, docPpal);
                    jfOrg.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nueva_organizacion.png")).getImage());
                    jfOrg.setLocationRelativeTo(null);
                    jfOrg.setVisible(true);
                    this.setEnabled(false);
                }else if((nombre_aux.startsWith("[PRF]"))) {
                    jfrmParrafo jfPrf = new jfrmParrafo (this, docPpal.BuscarPRF(codigo_to_id(nombre_aux)), nodo_editar, docPpal);
                    jfPrf.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nuevo_parrafo.png")).getImage());
                    jfPrf.setLocationRelativeTo(null);
                    jfPrf.setVisible(true);
                    this.setEnabled(false);
                }else if((nombre_aux.startsWith("[SEC]"))) {
                    jfrmSeccion jfSec = new jfrmSeccion (this, docPpal.BuscarSEC(codigo_to_id(nombre_aux)), nodo_editar, docPpal);
                    jfSec.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nueva_seccion.png")).getImage());
                    jfSec.setLocationRelativeTo(null);
                    jfSec.setVisible(true);
                    this.setEnabled(false);
                }else if((nombre_aux.startsWith("[REU]"))) {
                    jfrmReunion jfReu = new jfrmReunion (this, docPpal.BuscarREU(codigo_to_id(nombre_aux)), nodo_editar, docPpal);
                    jfReu.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nueva_reunion.png")).getImage());
                    jfReu.setLocationRelativeTo(null);
                    jfReu.setVisible(true);
                    this.setEnabled(false);
                }else if((nombre_aux.startsWith("[RRE]"))) {
                    jfrmReqRestriccion jfRRE = new jfrmReqRestriccion (this, docPpal.BuscarRRE(codigo_to_id(nombre_aux)), nodo_editar, docPpal);
                    jfRRE.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/req_restriccion.png")).getImage());
                    jfRRE.setLocationRelativeTo(null);
                    jfRRE.setVisible(true);
                    this.setEnabled(false);
                }else if((nombre_aux.startsWith("[RNF]"))) {
                    jfrmReqNoFuncional jfRNF = new jfrmReqNoFuncional (this, docPpal.BuscarRNF(codigo_to_id(nombre_aux)), nodo_editar, docPpal);
                    jfRNF.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/req_nofuncional.png")).getImage());
                    jfRNF.setLocationRelativeTo(null);
                    jfRNF.setVisible(true);
                    this.setEnabled(false);
                }else if((nombre_aux.startsWith("[RFU]"))) {
                    jfrmReqFuncional jfRFU = new jfrmReqFuncional (this, docPpal.BuscarRFU(codigo_to_id(nombre_aux)), nodo_editar, docPpal);
                    jfRFU.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/req_funcional.png")).getImage());
                    jfRFU.setLocationRelativeTo(null);
                    jfRFU.setVisible(true);
                    this.setEnabled(false);
                }else if((nombre_aux.startsWith("[RIN]"))) {
                    jfrmReqInformacion jfRIN = new jfrmReqInformacion (this, docPpal.BuscarRIN(codigo_to_id(nombre_aux)), nodo_editar, docPpal);
                    jfRIN.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/req_informacion.png")).getImage());
                    jfRIN.setLocationRelativeTo(null);
                    jfRIN.setVisible(true);
                    this.setEnabled(false);
                }else if((nombre_aux.startsWith("[PAS]"))) {
                    jfrmPaso jfPAS = new jfrmPaso (this, docPpal.BuscarPAS(codigo_to_id(nombre_aux)), nodo_editar, docPpal);
                    jfPAS.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nuevo_paso.png")).getImage());
                    jfPAS.setLocationRelativeTo(null);
                    jfPAS.setVisible(true);
                    this.setEnabled(false);
                }else if((nombre_aux.startsWith("[EXC]"))) {
                    jfrmExcepcion jfExc = new jfrmExcepcion (this, docPpal.BuscarEXC(codigo_to_id(nombre_aux)), nodo_editar, docPpal);
                    jfExc.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nueva_excepcion.png")).getImage());
                    jfExc.setLocationRelativeTo(null);
                    jfExc.setVisible(true);
                    this.setEnabled(false);
                }else if((nombre_aux.startsWith("[PAR]"))) {
                    jfrmParticipante jfPar = new jfrmParticipante (this, docPpal.BuscarPAR(codigo_to_id(nombre_aux)), nodo_editar, docPpal);
                    jfPar.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/nuevo_participante.png")).getImage());
                    jfPar.setLocationRelativeTo(null);
                    jfPar.setVisible(true);
                    this.setEnabled(false);
                }else if((nombre_aux.startsWith("[MAT]"))) {
                    jfrmMatriz jfMat = new jfrmMatriz (this, docPpal.BuscarMAT(codigo_to_id(nombre_aux)), nodo_editar, docPpal);
                    jfMat.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/matriz.png")).getImage());
                    jfMat.setLocationRelativeTo(null);
                    jfMat.setVisible(true);
                    this.setEnabled(false);
                }
                
                jlblMensaje.setText("Nodo "+nombre_aux+" editado correctamente.");
            }
        }
        else {
            jlblMensaje.setText("Error: Ningun nodo seleccionado. Seleccione el nodo que desea editar.");
        }
    }//GEN-LAST:event_jMenuItemEditarActionPerformed

    private void jMenuItemEliminarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemEliminarActionPerformed
        TreePath tp = getJtreDocumento().getSelectionPath();
        
        if(tp!=null) {
            DefaultMutableTreeNode nodo_eliminar = (DefaultMutableTreeNode) tp.getLastPathComponent();
            String nombre_aux = (String) nodo_eliminar.getUserObject();
            if((nombre_aux.startsWith("[DOC]"))) {
                jlblMensaje.setText("Error: No se puede eliminar el Documento de Requisitos.");
            }
            else {
                //Eliminar del Jtree
                DefaultTreeModel model = (DefaultTreeModel) this.jtreDocumento.getModel();
                model.removeNodeFromParent(nodo_eliminar);
                
                //Eliminar del ArrayList
                String identificador = nombre_aux;
                int inicio = identificador.indexOf("-");
                int fin = identificador.indexOf(" ");
                String id=identificador.substring(inicio +1, fin);
                
                if (identificador.startsWith("[CDU]")) {
                    docPpal.getmCasodeUso().remove(docPpal.BuscarCU(id));
                }
                else if (identificador.startsWith("[PAS]")) {
                    for (int i=0; i<docPpal.getmCasodeUso().size(); i++) {
                        if (docPpal.getmCasodeUso().get(i).getPasoCU().contains(docPpal.BuscarPAS(id))) {
                            docPpal.getmCasodeUso().get(i).getPasoCU().remove(docPpal.BuscarPAS(id));
                        }
                    }
                }
                else if (identificador.startsWith("[EXC]")) {
                    for (int i=0; i<docPpal.getmCasodeUso().size(); i++) {
                        for (int j=0; j<docPpal.getmCasodeUso().get(i).getPasoCU().size(); j++) {
                            if (docPpal.getmCasodeUso().get(i).getPasoCU().get(j).getExcepcionCU().contains(docPpal.BuscarPAS(id))) {
                                docPpal.getmCasodeUso().get(i).getPasoCU().get(j).getExcepcionCU().remove(docPpal.BuscarPAS(id));
                            } 
                        }
                        
                    }
                }
                
                else if (identificador.startsWith("[REU]")) {
                    docPpal.getmReunion().remove(docPpal.BuscarREU(id));
                }
                else if (identificador.startsWith("[ORG]")) {
                    docPpal.getmOrganizacion().remove(docPpal.BuscarORG(id));
                }
                else if (identificador.startsWith("[PAR]")) {
                    for (int i=0; i<docPpal.getmOrganizacion().size(); i++) {
                        if (docPpal.getmOrganizacion().get(i).getParticipantes().contains(docPpal.BuscarPAR(id))) {
                            docPpal.getmOrganizacion().get(i).getParticipantes().remove(docPpal.BuscarPAR(id));
                        }
                    }
                }
                else if (identificador.startsWith("[OBJ]")) {
                    docPpal.getmObjetivo().remove(docPpal.BuscarOBJ(id));
                }
                else if (identificador.startsWith("[RFU]")) {
                    docPpal.getmRequisito().remove(docPpal.BuscarRFU(id));
                }
                else if (identificador.startsWith("[RNF]")) {
                    docPpal.getmRequisito().remove(docPpal.BuscarRNF(id));
                }
                else if (identificador.startsWith("[RIN]")) {
                    docPpal.getmRequisito().remove(docPpal.BuscarRIN(id));
                }
                else if (identificador.startsWith("[RRE]")) {
                   docPpal.getmRequisito().remove(docPpal.BuscarRRE(id));
                }
                else if (identificador.startsWith("[IMG]")) {
                    docPpal.getmImagen().remove(docPpal.BuscarIMG(id));
                }
                else if (identificador.startsWith("[SEC]")) {
                    docPpal.getmSeccion().remove(docPpal.BuscarSEC(id));
                }
                else if (identificador.startsWith("[PRF]")) {
                    docPpal.getmParrafo().remove(docPpal.BuscarPRF(id));
                }
                else if (identificador.startsWith("[ACT]")) {
                    docPpal.getmActor().remove(docPpal.BuscarACT(id));
                }
                else if (identificador.startsWith("[MAT]")) {
                    docPpal.getmMatriz().remove(docPpal.BuscarMAT(id));
                }
                docPpal.actualizar();
                jlblMensaje.setText("Nodo "+nombre_aux+" eliminado correctamente.");
            }
        }
        else {
            jlblMensaje.setText("Error: Ningun nodo seleccionado. Seleccione el nodo que desea eliminar.");
        }
    }//GEN-LAST:event_jMenuItemEliminarActionPerformed

    private void jbtnMatrizActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnMatrizActionPerformed
        TreePath tp = getJtreDocumento().getSelectionPath();
        
        if(tp!=null) {
            DefaultMutableTreeNode nodo_aux = (DefaultMutableTreeNode) tp.getLastPathComponent();
            String nombre_aux = (String) nodo_aux.getUserObject();
            if(!(nombre_aux.startsWith("[DOC]") || nombre_aux.startsWith("[SEC]"))) {
                jlblMensaje.setText("Error: No se ha seleccionado una sección [SEC] o un documento [DOC]");
            }
            else {
                MutableTreeNode insertNode= (MutableTreeNode) tp.getLastPathComponent();
                int insertIndex=0;

                if(insertNode.getChildCount()!=0) {
                    insertIndex=insertNode.getChildCount();
                }

                jfrmMatriz jfMatriz=new jfrmMatriz(this, getDocPpal(), insertNode, insertIndex);
                jfMatriz.setIconImage(new ImageIcon(getClass().getResource("/vista/arbolico/matriz.png")).getImage());
                jfMatriz.setLocationRelativeTo(null);
                jfMatriz.setVisible(true);
                this.setEnabled(false);
            }
        }
        else {
            jlblMensaje.setText("Error: Ningun nodo seleccionado");
        }
    }//GEN-LAST:event_jbtnMatrizActionPerformed

    private void jmniGuardarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmniGuardarActionPerformed
        //Filtramos por archivos con extension HTML
        FileNameExtensionFilter filter = new FileNameExtensionFilter ("Archivo HTML","html");

        //se crea el fileChooser
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.addChoosableFileFilter(filter);
        //se añade el filtro
        fileChooser.setFileFilter(filter);
        //titulo de la ventana
        fileChooser.setDialogTitle("Guardar HTML");
        
        int result = fileChooser.showSaveDialog(null);
        if (result == JFileChooser.APPROVE_OPTION)
        {
            String ruta = fileChooser.getSelectedFile().getAbsolutePath();
            if(new File(ruta).exists()==false) { 
                try {
                    PrintWriter aux = new PrintWriter(ruta+".html");
                    aux.print(jtxpDocumento.getText());
                    aux.close();
                }
                catch(Exception e) {}
            }
            
            else {
                if(JOptionPane.OK_OPTION == JOptionPane.showConfirmDialog(this,"El fichero seleccionado ya existe. ¿Deseas reemplazarlo?", "Advertencia", JOptionPane.YES_NO_OPTION)) {
                    try {
                        File file = fileChooser.getSelectedFile();
                        PrintWriter writer = new PrintWriter(file);
                        writer.print(jtxpDocumento.getText());
                        writer.close();
                    } catch(Exception e) {}
                }
            }     
        }
    }//GEN-LAST:event_jmniGuardarActionPerformed

    private void jmniPreferenciasActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmniPreferenciasActionPerformed
        jfrmPreferencias jfPreferencias=new jfrmPreferencias(this, getDocPpal());
        jfPreferencias.setLocationRelativeTo(null);
        jfPreferencias.setVisible(true);
        this.setEnabled(false);
    }//GEN-LAST:event_jmniPreferenciasActionPerformed
    
//    private void myPopupEvent(MouseEvent e) {
//            int x = e.getX();
//            int y = e.getY();
//            JTree tree = (JTree)e.getSource();
//            TreePath path = tree.getPathForLocation(x, y);
//            if (path != null) { 
//                tree.setSelectionPath(path);
//                String label = "Editar" ;
//                String label2 = "Elimnar";
//                JPopupMenu popup = new JPopupMenu();
//                popup.add(new JMenuItem(label));
//                popup.add(new JMenuItem(label2));
//                popup.show(tree, x, y);
//            }
//    }
    
    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        jfrmPrincipal principal = new jfrmPrincipal();
        principal.getDocPpal().addObserver(principal);
        principal.setLocationRelativeTo(null);
        principal.getJtreDocumento().setCellRenderer(new RendererArbol());
        principal.setVisible(true);
        
        
//        java.awt.EventQueue.invokeLater(new Runnable() {
//            public void run() {
//                new jfrmPrincipal().setVisible(true);
//                
//            }
//        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenuItem jMenuItemEditar;
    private javax.swing.JMenuItem jMenuItemEliminar;
    private javax.swing.JPopupMenu jPopupMenu1;
    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.JToolBar jToolBar1;
    private javax.swing.JButton jbtnAñadirExcepcion;
    private javax.swing.JButton jbtnAñadirParticipante;
    private javax.swing.JButton jbtnAñadirPaso;
    private javax.swing.JButton jbtnMatriz;
    private javax.swing.JButton jbtnNuevaImagen;
    private javax.swing.JButton jbtnNuevaOrg;
    private javax.swing.JButton jbtnNuevaReunion;
    private javax.swing.JButton jbtnNuevaSeccion;
    private javax.swing.JButton jbtnNuevoActor;
    private javax.swing.JButton jbtnNuevoCU;
    private javax.swing.JButton jbtnNuevoObjetivo;
    private javax.swing.JButton jbtnParrafo;
    private javax.swing.JButton jbtnReq_Informacion;
    private javax.swing.JButton jbtnReq_NoFuncional;
    private javax.swing.JButton jbtnReq_Restriccion;
    private javax.swing.JButton jbtnrReqFuncional;
    private javax.swing.JLabel jlblMensaje;
    private javax.swing.JMenu jmnAyuda;
    private javax.swing.JMenuItem jmniAcercaDe;
    private javax.swing.JMenuItem jmniGuardar;
    private javax.swing.JMenuItem jmniPreferencias;
    private javax.swing.JMenuItem jmniSalir;
    private javax.swing.JMenuBar jmnuBarraPpal;
    private javax.swing.JMenu jmnuProyecto;
    private javax.swing.JMenu jmnuSalir;
    private javax.swing.JTree jtreDocumento;
    private javax.swing.JTextPane jtxpDocumento;
    // End of variables declaration//GEN-END:variables

    /**
     * @return the jtreDocumento
     */
    public javax.swing.JTree getJtreDocumento() {
        return jtreDocumento;
    }

    /**
     * @param jtreDocumento the jtreDocumento to set
     */
    public void setJtreDocumento(javax.swing.JTree jtreDocumento) {
        this.jtreDocumento = jtreDocumento;
    }

    protected void mostrarMensaje(String mensaje) {
                JOptionPane.showMessageDialog(this, mensaje, "Advertencia",
                                JOptionPane.WARNING_MESSAGE);
    }
    
    //Se encarga de actualizar la informacion del TextPanel cuando se añade un nuevo nodo
    //o se modifica uno de los anteriores (Por hacer lo segundo).
    public void update(Observable o, Object arg) {
        jlblMensaje.setText("");
        nueva_version=true;
        DefaultTreeModel model=(DefaultTreeModel) this.getJtreDocumento().getModel();
        DefaultMutableTreeNode root=(DefaultMutableTreeNode) model.getRoot();
        imprimirNodos(root);
//        System.out.println("Update");
        
    }

    /**
     * @return the docPpal
     */
    public DocumentoReq getDocPpal() {
        return docPpal;
    }
    
    public String codigo_to_id (String codigo) {
        String identificador = codigo;
        int inicio = identificador.indexOf("-");
        int fin = identificador.indexOf(" ");
        String id=identificador.substring(inicio +1, fin);
        return id;
    }

}
