/*
 * HierarchySheet.java
 *
 */

package com.uvigo.tMaestro.SCOCreator.tool.hierarchy;
import com.uvigo.tMaestro.SCOCreator.tool.*;

/**
 * Esta clase es el JDialog sobre el que se asienta el �rbol de jerarquia.
 * Basicamente es un panel en el que se muestra un arbol (JTree) representando
 * la estructura de la plantilla. Permite la seleccion de elementos que no
 * no son facilmente seleccionables a traves del entorno.
 * @author  raul
 * @version 0.1
 */
public class HierarchySheet extends javax.swing.JDialog implements javax.swing.event.TreeSelectionListener{
    
    /**
     * Referencia al frame principal de la herramienta.
     */
    private MainFrame oMainFrame;
    
    /**
     * Contructor del dialogo.
     * @parent El frame padre de este dialogo.
     */
    public HierarchySheet(java.awt.Frame parent) {
        super(parent, false);
        oMainFrame = (MainFrame) parent;
        this.addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent oEvento){
                JDialogClosing();
            }
        });
        initComponents();
        //Anadimos el soporte de PopUpMenus en el JTree
        oJTree1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent oEvt) {
                if (oEvt.isPopupTrigger()) { //Si es una solicitud de PopUpMenu
                    mouse(oEvt);
                }
            }
        });
        oJTree1.setCellRenderer(new HierarchyTreeCellRender()); //El Renderer que entre otras cosas, muestra los ToolTips
        oJTree1.setEditable(true);
        oJTree1.setCellEditor(new HierarchyTreeCellEditor(oJTree1,(javax.swing.tree.DefaultTreeCellRenderer) oJTree1.getCellRenderer()));
        oJTree1.getSelectionModel().setSelectionMode(javax.swing.tree.TreeSelectionModel.SINGLE_TREE_SELECTION);
        oJTree1.addTreeSelectionListener(this);
        javax.swing.ToolTipManager.sharedInstance().registerComponent(oJTree1); //Para mostrar los ToolTips en el JTree
    }
    
    /** 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.
     */
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        oJScrollPane1 = new javax.swing.JScrollPane();
        oJTree1 = new javax.swing.JTree();

        getContentPane().setLayout(new java.awt.GridBagLayout());

        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        oJScrollPane1.setViewportView(oJTree1);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.weighty = 1.0;
        getContentPane().add(oJScrollPane1, gridBagConstraints);

        pack();
    }
    // </editor-fold>//GEN-END:initComponents
    
    
    /**
     * Este metodo es llamado cuando el usuario solicita un PopUpMenu
     * sobre uno de los elementos del JTree1
     */
    private void mouse(java.awt.event.MouseEvent oEvt) {
        java.awt.Point oPoint = oEvt.getPoint();
        //Averiguamos sobre que objeto grafico ha pinchado el usuario
        Object oObject = oJTree1.getComponentAt(oPoint);
        if (oObject != null) {
            //Si el usuario ha pinchado fuera de algun elemento lo ignoramos
            if (oJTree1.getPathForLocation(oPoint.x, oPoint.y)==null) return;
            //Seleccionamos el nodo si no esta seleccionado
            if (oJTree1.getSelectionPath() != oJTree1.getPathForLocation(oPoint.x, oPoint.y)) 
                oJTree1.setSelectionPath(oJTree1.getPathForLocation(oPoint.x, oPoint.y)); 
            MainFrame.oMainFrame.popUpRequired((java.awt.Component) oObject, (Capsula) oJTree1.getSelectionPath().getLastPathComponent(),oPoint.x,oPoint.y);
        }
    }
    
    /**
     * Esta funcion permite desactivar
     * este JDialog (visor de jerarquia)
     */
    public void vDesactiva() {
        oJScrollPane1.setEnabled(false);
        oJTree1.setVisible(false);
    }
    
    /**
     * Esta funcion permite activar
     * la hoja de jerarquia
     */
    public void vActiva() {
        oJScrollPane1.setEnabled(true);
        oJTree1.setModel(new HierarchyTreeModel(oMainFrame.oGetPlantilla()));
        oJTree1.setVisible(true);
    }
    
    /**
     * Esta funcion es llamada cuando el usuario pulse la aspa
     * de cerrar la ventana.
     */
    public void JDialogClosing(){
        oMainFrame.oGetCheckHierarchySheet().setSelected(false);
        this.setVisible(false);
    }
    
    /**
     * Esta funcion es llamada cuando el susuario selecciona
     * un elemento en el JTree o cuando se edita un elemento de dicho JTree.
     * Averigua que elemento ha seleccionado el usuario y
     * lo activa a traves del MainFrame.
     */
    public void valueChanged(javax.swing.event.TreeSelectionEvent oEvent) {
        if (this.isActive()) {
            javax.swing.tree.TreePath oPath= oJTree1.getSelectionModel().getSelectionPath();
            if (oPath==null)  {
                // si el path es null es que no hay elemento seleccionado, cuando se entra
                // en esta funcion y se da el caso, entonces es que se ha cambiado el nombre de un elemento del tree
                // Nota: No entiendo muy bien este comportamiento, pero con el return basta y la cosa funciona!!!
                // Imagino que no hay un SelectionPath porque el nodo no esta estrictamente seleccionado, sino se esta editando o ha sido editado
                return;
            }
            
            Capsula oNuevoActivo=(Capsula) oPath.getLastPathComponent();
            Capsula oActivo;
            if (!(oActivo=oMainFrame.oGetCapsulaActiva()).equals(oNuevoActivo)) {
                oActivo.vDesactivar();
                oNuevoActivo.vActivar();
            }
        }
    }
    
    
    /**
     * Selecciona el nodo indicado por el TreePath
     */
    public void setNode(javax.swing.tree.TreePath oPath) {
        oJTree1.setSelectionPath(oPath);
        oJTree1.scrollPathToVisible(oPath);
    }
    
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JScrollPane oJScrollPane1;
    private javax.swing.JTree oJTree1;
    // End of variables declaration//GEN-END:variables
    
}
