/*
 * PropertiesTableModel.java
 *
 */

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

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

/**
 * Esta clase se encarga del almacenamiento y presentacion de los nombres y
 * valores de las propiedades de los beans. Las JTables son la "vista" de los
 * datos que almacena esta clase.
 * Existe uno de estos ejemplares por cada una de las tablas de las diferentes
 * opciones que se presentan en el Editor de propiedades.
 * Ademas un objeto de esta clase se encarga de obrar en consecuencia ante un
 * cambio en uno de sus valores, realizado por el usuario mediante un cambio
 * en la JTable correspodiente a este TableModel.
 * @author raul
 * @version 0.2
 */
public class PropertiesTableModel extends javax.swing.table.AbstractTableModel implements javax.swing.event.TableModelListener,javax.swing.event.ListSelectionListener {
    
    /**
     * Un Array de objetos de la clase Propiedad. Representan las propiedades
     * del bean para las diferentes opciones contempladas.
     * @see Propiedad
     */
    private java.util.ArrayList<Propiedad> oPropiedades;
    
    
    /**
     * La Opcion que representa este TableModel. Es decir, cada bean presenta
     * tantos TableModel (y por tanto JTables) como opciones se han definido
     * en el entorno de la herramienta.
     */
    private int iOpcion;
    
    
    /**
     * Contructor de la clase.
     * @param oPropiedades El Array con los objetos de clase Propiedad del Bean
     * @param iOpcion La Opcion que representara este TableModel
     */
    public PropertiesTableModel(java.util.ArrayList<Propiedad> oPropiedades,int iOpcion) {
        this.oPropiedades=oPropiedades;
        this.iOpcion=iOpcion;
    }
    
    
    /**
     * Devuelve el objeto que debe presentarse en la fila y columna indicadas
     * @param iRow La fila
     * @param iColumn La Columna
     * @return El objeto de fila iRow y columna iColumn
     */
    public Object getValueAt(int iRow,int iColumn){
        if (iColumn==0) {
            return oPropiedades.get(iRow).oGetName(); //Nombre de la propiedad
        }
        
        //devolvemos el valor de la propiedad para la opcion que representa este TableModel
        else
            return (oPropiedades.get(iRow).oGetOptionValue(iOpcion));
        
    }
    
    
    /**
     * Permite cambiar un valor en el TableModel. Es importante darse cuenta,
     * que este cambio no se refleja en el Bean, de ello se encargara
     * (si procede) el TableModelListener (que es este mismo objeto, pero se
     * hara en la funcion tableChanged)
     * @param oValue El nuevo valor
     * @param iRow La fila del nuevo valor
     * @param iColumn La columna del nuevo valor
     */
    public void setValueAt(Object oValue,int iRow,int iColumn) {
        if (iColumn==1) {
            oPropiedades.get(iRow).vSetOptionValue(oValue, iOpcion);
            fireTableCellUpdated(iRow,iColumn); // Avisa a los posibles Listeners
        }
    }
    
    
    
    /**
     * Devuelve el numero de propiedades del bean.
     * @return El numero de filas de la tabla
     */
    public int getRowCount(){
        return oPropiedades.size();
    }
    
    
    /**
     * Devuelve el numero de columnas de la JTable
     * @return Siempre un 2.
     */
    public int getColumnCount(){
        return 2;
    }
    
    
    /**
     * Devuelve el nombre de la columna cuyo �ndice se pasa como argumento
     * @param iColumn El indice de la columna
     * @return El nombre de la columna
     */
    public String getColumnName(int iColumn) {
        if (iColumn==0) return MainFrame.oMainFrame.getMessage("Title6");
        else return MainFrame.oMainFrame.getMessage("Title7");
    }
    
    
    /**
     * Dice si una celda es o no editable
     * @param iRow La fila de la celda
     * @param iColumn La columna de la celda
     * @return True si la celda es editable
     */
    public boolean isCellEditable(int iRow,int iColumn) {
        
        //S�lo es editable la columna de propiedades
        if (iColumn==0) return false;
        else {
            if (oPropiedades.get(iRow).isRedOnly()) return false;
            else return true;
        }
    }
    
    
    
    /**
     * Esta funcion es llamada cuando se detecta un cambio en el TableModel,
     * lo que en este caso, solo se producira cuando se cambia un valor de una
     * propiedad en la JTable de la opcion que representa este TableModel.
     * @param oEvento El evento que describe el cambio que se ha producido
     */
    public void tableChanged(javax.swing.event.TableModelEvent oEvento) {
        // Si la opcion que esta presentando la herramienta es la misma
        // en la que hemos hecho el cambio debemos reflejarlo en el bean
        if (oEvento.getType()==oEvento.UPDATE) {
            MainFrame.oMainFrame.valueChanged();
            int iProp = oEvento.getFirstRow();
            if (MainFrame.oMainFrame.iGetOpcion()==iOpcion) {
                oPropiedades.get(iProp).vWriteValue(iOpcion);
                if (oPropiedades.get(iProp).oGetName().equals("name")) { //Hay que actualizar donde aparezca el nombre de la propiedad
                    MainFrame.oMainFrame.getPSheet().setLabelCapsula((String) oPropiedades.get(iProp).oGetValue());
                    MainFrame.oMainFrame.getHSeet().vActiva();
                    MainFrame.oMainFrame.oGetCapsulaActiva().vActivar();
                }
            }
            if (MainFrame.oMainFrame.oGetCapsulaActiva().oGetBean() instanceof com.uvigo.mhp.ui.HSwitch && oPropiedades.get(iProp).oGetName().equals("switchableState")) {
                com.uvigo.mhp.ui.HSwitch oSwitch = (com.uvigo.mhp.ui.HSwitch) MainFrame.oMainFrame.oGetCapsulaActiva().oGetBean();
                boolean bState =(Boolean) oPropiedades.get(iProp).oGetOptionValue(iOpcion);
                if (bState) {
                    java.util.ArrayList<Capsula> oCapsulas= new java.util.ArrayList<Capsula>();
                    Capsula.getCapsulas(oCapsulas, MainFrame.oMainFrame.oGetPlantilla());
                    for (Capsula oCapsula:oCapsulas) {
                        if (oCapsula.oGetBean() instanceof com.uvigo.mhp.ui.HSwitch && oCapsula.oGetBean() != oSwitch) {
                            Propiedad oProperty=oCapsula.getProperty("switchableState");
                            oProperty.vSetOptionValue(false, MainFrame.oMainFrame.getPSheet().getSelectedOption());
                            if (MainFrame.oMainFrame.iGetOpcion()==iOpcion) oProperty.oReadCurrentValue();
                        }
                    }
                }
            }
        }
        
    }
    
    /**
     * Devuelve la propiedad cuyo indice se pasa por parametro.
     * @return La propiedad
     */
    public Propiedad oGetPropiedad(int iIndice) {
        return oPropiedades.get(iIndice);
    }
    
    /**
     * Devuelve la fila de la tabla correspondiente
     * a la propiedad de de nombre sName
     * @param sName El nombre de la propiedad
     * @return La columna en la tabla, cero si no la encuentra
     */
    public int getPropertyRow(String sName) {
        int iRow=0;
        int i=0;
        for (Propiedad oPropiedad:oPropiedades) {
            if (oPropiedad.oGetName().equals(sName)) {
                iRow=i;
                break;
            }
            i++;
        }
        return iRow;
    }
    
    /**
     * Este metodo es llamado cuando el usuario selecciona una fila en la tabla.
     */
    public void valueChanged(javax.swing.event.ListSelectionEvent oE) {
        if (oE.getValueIsAdjusting()) return;
        
        javax.swing.ListSelectionModel oLSM = (javax.swing.ListSelectionModel) oE.getSource();
        if (oLSM.isSelectionEmpty()) MainFrame.oMainFrame.getPSheet().setContextHelp(null,null);
        else {
            int iSelectedRow = oLSM.getMinSelectionIndex();
            MainFrame.oMainFrame.getPSheet().setContextHelp((java.awt.Component)oPropiedades.get(iSelectedRow).getBean(), oPropiedades.get(iSelectedRow).oGetName());
        }
    }
    
    
}
