/*
 * HierarchyTreeModel.java
 *
 */

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

import com.uvigo.tMaestro.SCOCreator.tool.properties.PropertiesTableModel;
import com.uvigo.tMaestro.SCOCreator.tool.*;

/**
 * Esta clase es utilizada para obtener los nombres (de las clases)
 * que forman parte de la jerarquia de la plantilla. Como es un TreeModel
 * se utiliza para su presentacion en el JTree de jerarquia.
 * @author raul
 * @version 0.1
 */
public class HierarchyTreeModel implements javax.swing.tree.TreeModel {
    
    /**
     * Referncia a la plantilla
     */
    private Capsula oPlantilla;
    
    
    /**
     * Constructor del TreeModel.
     * @param oPlantilla Referencia a la plantilla (como  Capsula)
     * que va a ser representada jerarquicamente a traves de un JTree
     */
    public HierarchyTreeModel(Capsula oPlantilla) {
        this.oPlantilla=oPlantilla;
    }
    
    
    /**
     * Devuelve el hijo del parametro que se pasa como padre.
     * @param oParent El padre
     * @param iIndex El indice del hijo en el padre
     * @return El hijo (null si el indice esta fuera de rango)
     */
    public Object getChild(Object oParent,int iIndex) {
        try {
            return ((Capsula) oParent).oGetHijo(iIndex);
        } catch(Exception oE) {
            return (null);
        }
    }
    
    /**
     * La funcion devuelve el numero de hijos del padre
     * @param oParent El padre
     * @return El numero de hijos.
     */
    public int getChildCount(Object oParent) {
        return ((Capsula) oParent).iGetNumHijos();
    }
    
    /**
     * La funcion devuelve el indice del hijo en el padre. -1 si no lo encuentra
     * @param oParent El padre
     * @param oChild El hijo
     * @return El indice.
     */
    public int getIndexOfChild(Object oParent, Object oChild) {
        int i=0;
        Capsula oCapsula = (Capsula) oParent;
        for (i=0;i<oCapsula.iGetNumHijos();i++) {
            if (oCapsula.oGetHijo(i).equals(oChild)) return i;
            i++;
        }
        return -1;
    }
    
    /**
     * La funcion devuelve el nodo raiz
     * @return El nodo raiz
     */
    public Object getRoot() {
        return oPlantilla;
    }
    
    /**
     * La funcion dice si el nodo es una hoja en el arbol o no.
     * @param oNode El nodo del cual se quiere saber si es una hoja
     * @return True si oNode es una hoja.
     */
    public boolean isLeaf(Object oNode) {
        return (((Capsula) oNode).iGetNumHijos()==0);
    }
    
    
    
    public void addTreeModelListener(javax.swing.event.TreeModelListener oListener) {};
    public void removeTreeModelListener(javax.swing.event.TreeModelListener oListener) {};
    
    /**
     * Notifica de un cambio en el elemento denotado por TreePath, el nuevo valor es oNewValue.
     * @param oPath El TreePath que identifica al nodo cuyo valor ha cambiado
     * @param oNewValue El nuevo valor
     */
    public void valueForPathChanged(javax.swing.tree.TreePath oPath,Object oNewValue) {
        
        PropertiesTableModel oModelo = MainFrame.oMainFrame.getPSheet().getTableModel();
        int iRow = oModelo.getPropertyRow("name");
        //Actualizammos el valor de la propiedad
        oModelo.setValueAt(oNewValue,iRow,1);
        
        
        
    
        
    };
    
}
