/*
 * PropertiesCellRenderer.java
 *
 */

package com.uvigo.tMaestro.SCOCreator.tool.properties;
import com.uvigo.tMaestro.SCOCreator.tool.*;
import java.net.URL;

/**
 * Esta clase es la encargada de llamar al CellRenderer adecuado de acuerdo
 * con el tipo de objeto que se le pasa.
 * Averigua la clase de la propiedad y busca si tiene alg�n TableCellRenderer
 * para ese tipo de propiedad.  Si no lo tiene usa el DefaultTableRenderer
 * Esta clase carga dinamicamente del paquete
 * com.uvigo.tMaestro.SCOCreator.tool.properties.cellRenders todos los renders que
 * se deseen utilizar.
 * Los renders que se encuentren en dicho paquete deben implementar la interfaz
 * CellRender.
 * Nota: no osbtante, esta aplicaci�n, en principio, est� dise�ada para funcionar
 * con las clases del paquete com.uvigo.mhp, con lo que diferenciaremos las propiedades
 * no s�lo por su tipo, sino por su nombre
 * @author raul
 * @version 0.1
 */
public class PropertiesCellRenderer extends javax.swing.table.DefaultTableCellRenderer {
    
    /**
     * Esta variable guarda una relaci�n entre las clases de una propiedad y los
     * TableCellRenderes adecuados para su presentaci�n en la celda de una JTable
     */
    private java.util.HashMap<Class,javax.swing.table.TableCellRenderer> oRenders;
    
    /**
     * El render por defecto que proporciona Java.
     */
    private  javax.swing.table.DefaultTableCellRenderer oDefecto;
    
    /**
     * Constructor de la clase. Carga los renders del paquete de renders
     */
    public PropertiesCellRenderer() {
        oRenders = new java.util.HashMap<Class,javax.swing.table.TableCellRenderer>();
        oDefecto = new javax.swing.table.DefaultTableCellRenderer();
        //Cargamos din�micamente los renders del directorio de cellRenders
        try {
            //Directorio com.uvigo.tMaestro.SCOCreator.tool.properties
            
            //Buscamos los ficheros .class que sean CellRenders
            //Programamos dos comportamientos: si la aplicaci�n se ejecuta desde
            //un jar o desde el �rbol de directorios
            java.net.URI oURI = (this.getClass().getResource("")).toURI();
            java.util.ArrayList<String> oClasses = new java.util.ArrayList<String>();
            if (oURI.getScheme().equals("jar")) { //La aplicaci�n se ejecuta desde el jar
                //SSSS cambiamos SCOCreator.jar
                //TODO cambiamos JarFile por JarInputStream
                //java.util.jar.JarFile oJarFile = new java.util.jar.JarFile("ReloadTotalv4.jar", false);
                String packageUrl = this.getClass().getClassLoader().getResource(this.getClass().getPackage().getName().replace(".", "/")).toString();
                String reloadUrl = packageUrl.substring(packageUrl.indexOf(":") + 1, packageUrl.indexOf("!"));
                java.util.jar.JarInputStream oJarInputStream = new java.util.jar.JarInputStream(new URL(reloadUrl).openStream(), false);
                //String[] aRenders = oJarFile.getManifest().getMainAttributes().getValue("CellRenders").split(" ");
                String[] aRenders = oJarInputStream.getManifest().getMainAttributes().getValue("CellRenders").split(" ");
                oClasses.addAll(java.util.Arrays.asList(aRenders));
            } else { // La aplicaci�n se ejecuta desde el �rbol de directorios
                java.io.File oProperties=new java.io.File((this.getClass().getResource("")).toURI());
                MyDirectoryFilter oFiltro= new MyDirectoryFilter();
                oFiltro.vAddName("cellRenders");
                java.io.File oCellRenders= oProperties.listFiles(oFiltro)[0]; //Directorio cellRenders
                java.io.File[] oNombres= oCellRenders.listFiles();
                int i=0;
                for (i=0;i<oNombres.length;i++) oClasses.add(oNombres[i].getName());
            }
            
            
            int i=0;
            for (i=0;i<oClasses.size();i++) { //Cargamos cada una de las classes correspondientes a un CellRender
                //Descargamos los ficheros que no sean .class
                if (!oClasses.get(i).contains(".class")) continue;
                String sNombre=(oClasses.get(i).split(".class"))[0]; //Nos quedamos con el nombre de la clase
                Class oClase=Class.forName("com.uvigo.tMaestro.SCOCreator.tool.properties.cellRenders."+sNombre);
                //Instanciamos el CellRenderer y lo a�adimos a la hastable
                CellRender oInstancia=(CellRender) oClase.newInstance();
                oRenders.put(oInstancia.getTypeRender(),oInstancia);
            }
            
        } catch(Exception oE) {
            oE.printStackTrace();
            java.awt.Toolkit.getDefaultToolkit().beep();
            MyOptionPane.showMessageDialog(this,MainFrame.oMainFrame.getMessage("Error4"),MainFrame.oMainFrame.getMessage("Title2"),javax.swing.JOptionPane.WARNING_MESSAGE);
            System.exit(-1);
        }
    }
    
    
    /**
     * M�todo que devuelve el componente adecuadamente renderizado para su
     * presentaci�n en la tabla. Realiza toda la l�gica explicada en los comentarios
     * de esta clase.
     */
    public java.awt.Component getTableCellRendererComponent(javax.swing.JTable oTable,Object oValue,boolean isSelected,boolean hasFocus,int iRow,int iColumn) {
        //Averiguamos el render para la clase a la que pertenece esta propiedad
        Propiedad oPropiedad = ((PropertiesTableModel)oTable.getModel()).oGetPropiedad(iRow);
        javax.swing.table.TableCellRenderer oRender = oRenders.get(oPropiedad.oGetClase());
        
        //Ahora vemos si la propiedad es una propiedad especial de las clases de com.uvigo.mhp
        if (oPropiedad.oGetClase()!=null) {
            if ((oPropiedad.oGetClase().equals(String.class))) {
                if ((oPropiedad.getBean().getClass().getPackage().getName().contains("com.uvigo.mhp"))||(oPropiedad.getBean() instanceof com.uvigo.mhp.Page)) {
                    if (oPropiedad.oGetName().toLowerCase().contains("imageurl") ||
                            (oPropiedad.oGetName().toLowerCase().contains("file"))) oRender = oRenders.get(com.uvigo.tMaestro.SCOCreator.tool.properties.cellRenders.FileRender.class);
                }
            } else if (oPropiedad.oGetClase().equals(com.uvigo.mhp.looks.HPanelLook.class)) oRender = oRenders.get(org.havi.ui.HLook.class);
            
        }
        
        java.awt.Component oComponent;
        if (oRender!=null) {
            oComponent = oRender.getTableCellRendererComponent(oTable,oValue,isSelected,hasFocus,iRow,iColumn);
        } else {  //Si no hay un render para este tipo usamos el render por defecto.
            oRender=oDefecto;
            //Hay que tener en cuenta que si la
            //propiedad presenta un PropertyEditor proporcionado por el creador del Bean
            //este puede asignar "Strings" a valores de la propiedad. Es conveniente
            //pasar estos strings al renderer en lugar de los valores
            java.beans.PropertyEditor oEditor = oPropiedad.oGetEditor();
            if (oEditor!=null && oEditor.getAsText()!=null) {
                oEditor.setValue(oValue);
                oValue=oEditor.getAsText();
            }
            oComponent = oRender.getTableCellRendererComponent(oTable,oValue,isSelected,hasFocus,iRow,iColumn);
            if (oValue!=null) ((javax.swing.JLabel)oComponent).setToolTipText(oValue.toString());
        }
        
        
        return(oComponent);
    }
}
