/*
 * ColorEditor.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;
import java.awt.Color;

/**
 * Esta clase es el TableCellEditor proporcionado para editar los objetos (propiedades)
 * de la clase java.awt.Color;
 * @author raul
 * @version 0.1
 */
public class ColorEditor extends javax.swing.AbstractCellEditor implements CellEditor,java.awt.event.ActionListener {
    
    
    /**
     * Constantes con los colores que se pueden elegir en el ComboBox
     */
    private final static Color[] oColors = {Color.BLACK,Color.BLUE,Color.CYAN,Color.GRAY,Color.GREEN,Color.MAGENTA,Color.ORANGE,Color.PINK,Color.RED,Color.WHITE,Color.YELLOW};
    
    /**
     * Nombres de los colores. Estan en el mismo orden que los oColors.
     */
    private final static String[] oNames = {"black","blue","cyan","gray","green","magenta","orange","pink","red","white","yellow"};
    
    /**
     * 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 ColorEditor() {};
    
    
    /**
     * Esta funcion es llamanda cuando se produce un cambio en el ComboBox
     * que se utiliza para la eleccion del color. 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) {
        oValue = oColors[oCombo.getSelectedIndex()];
        oEditor.vEditado();
    }
    
    
    /**
     * Metodo que devuelve el editor para su presentacion en la tabla.
     * Es un panel con un ComboBox y un boton para lanzar un JColorChooser.
     */
    public java.awt.Component getTableCellEditorComponent(javax.swing.JTable oTable,Object oValue,boolean isSelected,int iRow,int iColumn) {
        javax.swing.JPanel oPanel = new javax.swing.JPanel();
        javax.swing.JComboBox oCombo = new javax.swing.JComboBox(oNames);
        if (oValue!=null) this.oValue=oValue;
        javax.swing.JButton oButton = new javax.swing.JButton("E");
        oCombo.addActionListener(this);
        oButton.addActionListener(this);
        oPanel.setLayout(new java.awt.GridBagLayout());
        java.awt.Rectangle oRect = oTable.getCellRect(iRow,iColumn,true);
        oButton.setSize(20, oRect.height);
        oButton.setMinimumSize(oButton.getSize());
        oCombo.setSize(oRect.width-20,oRect.height);
        oCombo.setMinimumSize(oCombo.getSize());
        oPanel.add(oCombo);
        oPanel.add(oButton);
        for (int i=0;i<oColors.length;i++) {
            if (oColors[i].equals((Color) oValue)) {
                oCombo.setSelectedIndex(i);
                break;
            }
        }
        return oPanel;
        
    }
    
    /**
     * Devuelve la clase correspondiente
     * a java.awt.Color. Es decir, el tipo
     * de propiedad para el que se usara este editor.
     * @return El objeto Class correspondiente a java.awt.Color
     */
    public Class getTypeEditor() {
        return Color.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 boton 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) {
        if (oEvento.getActionCommand().equals("E")) { //Si el usuario ha pulsado el bot�n
            java.awt.Color oColor=javax.swing.JColorChooser.showDialog(MainFrame.oMainFrame, MainFrame.oMainFrame.getMessage("Title9"),(java.awt.Color) oValue);
            if (oColor == null) oEditor.vCancel();
            else { //Si el usuario ha elegido un color
                oValue = oColor;
                oEditor.vEditado();
            }
        } // Si el usuario ha seleccionado un color en el combobox
        else vComboSelected((javax.swing.JComboBox)oEvento.getSource());
    }
}
