/*
 * URLEditor.java
 */

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

import com.uvigo.tMaestro.SCOCreator.tool.MyOptionPane;
import com.uvigo.tMaestro.SCOCreator.tool.properties.Propiedad;
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.MyFileFilter;
import com.uvigo.tMaestro.SCOCreator.tool.ImageView;
import com.uvigo.tMaestro.SCOCreator.tool.MyOptionPane;


/**
 * Esta clase es el TableCellEditor proporcionado para editar los objetos (propiedades)
 * de la clase String cuyo nombre contenga las letras ImageURL. Es decir propiedades (imagenes) que denoten URL's
 * @author raul
 * @version 0.1
 */
public class URLEditor 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 URLEditor() {
    };
    
    /**
     * Metodo que devuelve el editor para su presentacion en la tabla.
     * Es un panel con un TextField y un boton para lanzar un JFileChooser
     */
    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;
            String[] sWords = oValue.toString().split("/");
            oJLabel.setText(sWords[sWords.length-1]);
        }
        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 este editor
     * @return El objeto Class correspondiente a com.uvigo.tMaestro.SCOCreator.tool.properties.cellEditors.URLEditor
     */
    public Class getTypeEditor() {
        return com.uvigo.tMaestro.SCOCreator.tool.properties.cellEditors.URLEditor.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.
     * 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
     * URL (lanza un JFileChooser)
     * @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 boton
            String sDir = new String("TEMP/COMPONENTS/");//M: carpeta COMPONENTS
            javax.swing.JFileChooser oChooser = new javax.swing.JFileChooser();
            MyFileFilter oFilter = new MyFileFilter();
            oFilter.vAddExtension("jpeg");
            oFilter.vAddExtension("jpg");
            oFilter.vSetDescripcion(".jpeg");
            oChooser.addChoosableFileFilter(oFilter);
            oFilter = new MyFileFilter();
            oFilter.vAddExtension("gif");
            oFilter.vSetDescripcion(".gif");
            oChooser.addChoosableFileFilter(oFilter);
            oFilter = new MyFileFilter();
            oFilter.vAddExtension("png");
            oFilter.vSetDescripcion(".png");
            oChooser.addChoosableFileFilter(oFilter);
            oFilter = new MyFileFilter();
            oFilter.vAddExtension("tif");
            oFilter.vAddExtension("tiff");
            oFilter.vSetDescripcion(".tiff");
            oChooser.addChoosableFileFilter(oFilter);
            oFilter = new MyFileFilter();
            oFilter.vAddExtension("tif");
            oFilter.vAddExtension("tiff");
            oFilter.vAddExtension("jpeg");
            oFilter.vAddExtension("jpg");
            oFilter.vAddExtension("png");
            oFilter.vAddExtension("gif");
            oFilter.vSetDescripcion(".jpeg .tiff .gif .png");
            oChooser.addChoosableFileFilter(oFilter);
            oChooser.setAccessory(new ImageView(oChooser));
            oChooser.setCurrentDirectory(MainFrame.oMainFrame.getLastDir());
            boolean bExit=false;
            while (!bExit) {
                int option = oChooser.showOpenDialog(MainFrame.oMainFrame);
                if (option == javax.swing.JFileChooser.APPROVE_OPTION) {
                    java.io.File oFile = oChooser.getSelectedFile();
                    //Si existe un fichero con el mismo nombre entre los elementos que el usuario ha configurado, lo avisamos
                    if (new java.io.File(sDir, oFile.getName()).exists()) {
                        int iOption = MyOptionPane.showConfirmDialog(MainFrame.oMainFrame,MainFrame.oMainFrame.getMessage("Question4"),MainFrame.oMainFrame.getMessage("Title2"),javax.swing.JOptionPane.YES_NO_OPTION,javax.swing.JOptionPane.WARNING_MESSAGE);
                        if (iOption==javax.swing.JOptionPane.NO_OPTION) continue;
                    }
                    bExit=true;
                    
                    try {
                        //Copiamos la imagen al directorio del proyecto, y la apuntamos
                        java.util.ArrayList<java.io.File> oFiles = new java.util.ArrayList<java.io.File>();
                        Propiedad oProperty = MainFrame.oMainFrame.getEditionProperty();
                        MainFrame.oMainFrame.setLastDir(oFile.getParentFile());
                        java.io.File oDirComponent = new java.io.File(sDir);
                        oDirComponent.mkdir();
                        java.io.File oCopyFile = new java.io.File(oDirComponent,oFile.getName());
                        MainFrame.copyFile(oFile, oCopyFile);
                        oFiles.add(oCopyFile);
                        oValue = new String("TEMP/COMPONENTS/"+oFile.getName());
                        MainFrame.oMainFrame.getEditionProperty().putOptionFiles(oFiles, MainFrame.oMainFrame.getPSheet().getSelectedOption());
                        oEditor.vEditado();
                    } catch (Exception oE) { // Si no es posible copiar la imagen abortamos el proceso
                        oE.printStackTrace();
                        oEditor.vCancel();
                        return;
                    }
                } else  {
                    bExit = true;
                    oEditor.vCancel();
                }
                
            }
        } // Si el usuario ha cambiado el texto del JTextField
    }
}
