/*
 * FontEditor.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 com.uvigo.tMaestro.SCOCreator.tool.Capsula;
import com.uvigo.tMaestro.SCOCreator.tool.properties.cellEditors.complements.FontChooser;
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 FontEditor extends javax.swing.AbstractCellEditor implements CellEditor,java.awt.event.ActionListener {
    
    /**
     * 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 FontEditor() {};
    
    
    /**
     * Metodo que devuelve el editor para su presentacion en la tabla.
     * Es un panel con un boton para lanzar un FontChooser.
     */
    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.JLabel oJLabel= new javax.swing.JLabel();
        if (oValue!=null) {
            this.oValue=oValue;
            java.awt.Font oFont = (java.awt.Font) oValue;
            String sStyle=null;
            switch(oFont.getStyle()) {
                case 0: sStyle="plain";
                break;
                case 1: sStyle="bold";
                break;
                case 2: sStyle="italic";
                break;
                case 3: sStyle="bold + italic";
                break;
            }
            
            oJLabel.setText(oFont.getFamily()+" "+sStyle+" "+oFont.getSize());
        }
        javax.swing.JButton oButton = new javax.swing.JButton("E");
        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());
        oJLabel.setSize(oRect.width-20,oRect.height);
        oJLabel.setMinimumSize(oJLabel.getSize());
        oPanel.add(oJLabel);
        oPanel.add(oButton);
        return oPanel;
        
    }
    
    /**
     * Devuelve la clase correspondiente
     * a java.awt.Font. Es decir, el tipo
     * de propiedad para el que se usara este editor.
     * @return El objeto Class correspondiente a java.awt.Font
     */
    public Class getTypeEditor() {
        return java.awt.Font.class;
    }
    
    /**
     * La funcion devuelve el valor seleccionado a trav�s 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 Font.
     * 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
     * fuente (lanza un FontChooser)
     * @param oEvento El evento que provoca la llamada a esta funcion.
     */
    public void actionPerformed(java.awt.event.ActionEvent oEvento) {
        if (oEvento.getActionCommand().equals("E")) { //Si el usuario ha pulsado el bot�n
            FontChooser oFontChooser = new FontChooser(MainFrame.oMainFrame,(java.awt.Font)oValue);
            oFontChooser.setTitle(MainFrame.oMainFrame.getMessage("Title31"));
            oFontChooser.setSize(550, 400);
            oFontChooser.setLocation(MainFrame.oMainFrame.getX()+(MainFrame.oMainFrame.getWidth()-oFontChooser.getWidth())/2,MainFrame.oMainFrame.getY()+(MainFrame.oMainFrame.getHeight()-oFontChooser.getHeight())/2);
            oFontChooser.setVisible(true);
            java.awt.Font oFont = oFontChooser.getFont();
            if (oFont == null) oEditor.vCancel();
            else { //Si el usuario ha elegido una fuente
                oValue = oFont;
                oEditor.vEditado();
                //Debemos saber si esta fuente que se ha cambiado es la fuente
                //de un HMultipanel. Si es asi ha cambiado la posicion
                //de todos los elementos de dicho multipanel --> es necesario actualizar las capsulas.
                if (MainFrame.oMainFrame.oGetCapsulaActiva().oGetBean() instanceof com.uvigo.mhp.ui.HMultiPanel) {
                    java.awt.Container oPanel = (java.awt.Container) MainFrame.oMainFrame.oGetCapsulaActiva().oGetBean();
                    java.awt.Insets oInsets = oPanel.getInsets();
                    for (int i=0;i<MainFrame.oMainFrame.oGetCapsulaActiva().iGetNumHijos();i++) {
                        Capsula oCapsula = (Capsula) MainFrame.oMainFrame.oGetCapsulaActiva().oGetHijo(i);
                        oCapsula.oGetBean().setSize(oPanel.getSize().width-oInsets.left-oInsets.right, oPanel.getSize().height-oInsets.top-oInsets.bottom);
                        oCapsula.oGetBean().setLocation(oInsets.left, oInsets.top);
                        oCapsula.setSize(oCapsula.oGetBean().getSize());
                        oCapsula.setLocation(oCapsula.oGetBean().getLocation());
                        oCapsula.setX(MainFrame.oMainFrame.getPSheet().getSelectedOption(), oCapsula.oGetBean().getX());
                        oCapsula.setY(MainFrame.oMainFrame.getPSheet().getSelectedOption(), oCapsula.oGetBean().getY());
                        oCapsula.setWidth(MainFrame.oMainFrame.getPSheet().getSelectedOption(), oCapsula.oGetBean().getWidth());
                        oCapsula.setHeight(MainFrame.oMainFrame.getPSheet().getSelectedOption(), oCapsula.oGetBean().getHeight());
                    }
                }
            }
        }
    }
}
