/*
 * HLookEditor.java
 */

package com.uvigo.tMaestro.SCOCreator.tool.properties.cellEditors;
import com.uvigo.tMaestro.SCOCreator.tool.properties.CellEditor;
import com.uvigo.tMaestro.SCOCreator.tool.properties.PropertiesCellEditor;
import com.uvigo.tMaestro.SCOCreator.tool.MainFrame;


/**
 * Esta clase es el TableCellEditor proporcionado para editar los objetos (propiedades)
 * de com.uvigo.mhp que implementen la interfaz org.havi.ui.HLook
 * @author raul
 * @version 0.1
 */
public class HLookEditor extends javax.swing.AbstractCellEditor implements CellEditor,java.awt.event.ActionListener {
    
    
    
    /**
     * Clases de los TextLooks
     */
    private final static Class[] oTextClasses = {com.uvigo.mhp.looks.HTextLook1.class,com.uvigo.mhp.looks.HTextLook2.class};
    
    /**
     * Nombres de los TextLooks
     */
    private final static String[] oTextNames = {"HTextLook1","HTextLook2"};
    
    
    /**
     * Clases de los GraphicsLooks
     */
    private final static Class[] oGraphicClasses = {com.uvigo.mhp.looks.HGraphicLook1.class,com.uvigo.mhp.looks.HGraphicLook2.class};
    
    /**
     * Nombres de los GraphicLooks
     */
    private final static String[] oGraphicNames = {"HGraphicLook1","HGarphiclLook2"};
    
    
    /**
     * Clases de los RangeLooks
     */
    private final static Class[] oRangeClasses = {com.uvigo.mhp.looks.HRangeLook1.class,com.uvigo.mhp.looks.HRangeLook2.class};
    
    /**
     * Nombres de los RangeLooks
     */
    private final static String[] oRangeNames = {"HRangeLook1","HRangeLook2"};
    
    /**
     * El tipo de look que estamos editando
     */
    private int type;
    
    private final static int TEXT=0;
    private final static int GRAPHIC=1;
    private final static int RANGE=2;
    
    /**
     * El editor que delega en este la responsabilidad
     * de realizar la edicion.
     */
    private PropertiesCellEditor oEditor;
    
    
    /**
     * Variable que almacena el valor editado.
     */
    private Object oValue;
    
    /**
     * Crea una nuevas instancia de la clase
     */
    public HLookEditor() {};
    
    
    /**
     * Esta funcion es llamanda cuando se produce un cambio en el ComboBox
     * que se utiliza para la eleccion del look. La funcion lee
     * el valor actual del ComboBox y lo establece como nuevo valor
     * de la propiedad.
     * @param oCombo El combobox
     */
    private void vComboSelected(javax.swing.JComboBox oCombo) {
        try {
            switch (type) {
                case TEXT: oValue = oTextClasses[oCombo.getSelectedIndex()].newInstance();
                break;
                case GRAPHIC: oValue = oGraphicClasses[oCombo.getSelectedIndex()].newInstance();
                break;
                case RANGE: oValue = oRangeClasses[oCombo.getSelectedIndex()].newInstance();
                
            }
            oEditor.vEditado();
        } catch(Exception oE) {
            //No deberia pasar esto.
        }
    }
    
    
    /**
     * Metodo que devuelve el editor para su presentacion en la tabla.
     * Es un panel con un ComboBox.
     */
    public java.awt.Component getTableCellEditorComponent(javax.swing.JTable oTable,Object oValue,boolean isSelected,int iRow,int iColumn) {
        //Suponemos que oValue es siempre distinto de null. Esto tiene sentido porque todo elemento debe tener siempre un look.
        javax.swing.JComboBox oCombo=null;
        if (oValue instanceof org.havi.ui.HTextLook) {
            type = TEXT;
            oCombo = new javax.swing.JComboBox(oTextNames);
            if (oValue instanceof com.uvigo.mhp.looks.HTextLook1) oCombo.setSelectedIndex(0);
            else oCombo.setSelectedIndex(1);
        } else if (oValue instanceof org.havi.ui.HGraphicLook) {
            type = GRAPHIC;
            oCombo = new javax.swing.JComboBox(oGraphicNames);
            if (oValue instanceof com.uvigo.mhp.looks.HGraphicLook1) oCombo.setSelectedIndex(0);
            else oCombo.setSelectedIndex(1);
        } else if (oValue instanceof org.havi.ui.HRangeLook) {
            type = RANGE;
            oCombo = new javax.swing.JComboBox(oRangeNames);
            if (oValue instanceof com.uvigo.mhp.looks.HRangeLook1) oCombo.setSelectedIndex(0);
            else oCombo.setSelectedIndex(1);
        }
        
        oCombo.addActionListener(this);
        return oCombo;
        
    }
    
    /**
     * Devuelve la clase correspondiente
     * a HLook. Es decir, el tipo
     * de propiedad para el que se usara este editor.
     * @return El objeto Class correspondiente a org.havi.ui.HLook
     */
    public Class getTypeEditor() {
        return org.havi.ui.HLook.class;
    }
    
    /**
     * La funcion devuelve el valor seleccionado a traves de este editor.
     * @return El valo editado.
     */
    public Object getCellEditorValue() {
        return oValue;
    }
    
    /**
     * Esta funcion establece cual es el editor que ha delegado
     * en este la edicion de una propiedad de tipo Color.
     * Se utiliza la referencia a este editor para avisarlo de que una propiedad
     * ha concluido o cancelado su edicion
     * @param oEditor El PropertiesCellEditor que ha delegado la edicion.
     */
    public void setDelegation(PropertiesCellEditor oEditor) {
        this.oEditor = oEditor;
    }
    
    /**
     * Metodo que es llamado cuando el usuario pulsa sobre el bot�n de eleccion de
     * color (lanza un JColorChooser) o cuando selecciona un color en el JComboBox
     * @param oEvento El evento que provoca la llamada a esta funci�n.
     */
    public void actionPerformed(java.awt.event.ActionEvent oEvento) {
        // El usuario ha seleccionado un elemento en el combobox
        vComboSelected((javax.swing.JComboBox)oEvento.getSource());
    }
}
