package uk.ac.reload.editor.style;

import java.io.File;
import javax.swing.JOptionPane;
import uk.ac.reload.diva.util.FileUtils;
import uk.ac.reload.editor.contentpackaging.editor.resourceview.CP_ResourcesPanel;



/**
 * 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 MusicEditor extends javax.swing.AbstractCellEditor implements CellEditor,java.awt.event.ActionListener {
    
    
    /**
     * El editor que delega en este la responsabilidad
     * de realizar la edici�n.
     */
    private PreferencesCellEditor oEditor;
    
    
    /**
     * Variable que almacena el valor editado.
     */
    private Object oValue;
    
    /**
     * Crea una nuevas instancia de la clase
     */
    public MusicEditor() {
    };
    
    /**
     * M�todo que devuelve el editor para su presentaci�n en la tabla.
     * Es un panel con un TextField y un bot�n 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;
           oJLabel.setText(((File)oValue).getName());
        }
        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 MusicEditor.class;
    }
    
    /**
     * La funci�n devuelve el valor seleccionado a trav�s de este editor.
     * @return El valo editado.
     */
    public Object getCellEditorValue() {
        return oValue;
    }
    
    /**
     * Esta funci�n establece cual es el editor que ha delegado
     * en este la edici�n.
     * Se utiliza la referencia a este editor para avisarlo de que una propiedad
     * ha concluido o cancelado su edici�n
     * @param oEditor El PropertiesCellEditor que ha delegado la edici�n.
     */
    public void setDelegation(PreferencesCellEditor oEditor) {
        this.oEditor = oEditor;
    }
    
    /**
     * M�todo que es llamado cuando el usuario pulsa sobre el bot�n de elecci�n de
     * URL (lanza un JFileChooser)
     * @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
            File pf = StylePreferences_EditorDialog.getInstance().getActualProjectFolder();
            javax.swing.JFileChooser oChooser = new javax.swing.JFileChooser();
            MyFileFilter oFilter = new MyFileFilter();
            oFilter.vAddExtension("mp3");
            oFilter.vSetDescripcion(".mp3");
            oChooser.addChoosableFileFilter(oFilter);
            oFilter = new MyFileFilter();
            oFilter.vAddExtension("mp2");
            oFilter.vSetDescripcion(".mp2");
            oChooser.addChoosableFileFilter(oFilter);
             oFilter = new MyFileFilter();
              oFilter.vAddExtension("mp3");
            oFilter.vAddExtension("mp2");
            oFilter.vSetDescripcion(".mp3 .mp2");
            oChooser.addChoosableFileFilter(oFilter);
            //oChooser.setCurrentDirectory();
            boolean bExit=false;
            while (!bExit) {
                int option = oChooser.showOpenDialog(uk.ac.reload.editor.EditorFrame.getInstance());
                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(pf, oFile.getName()).exists()) {
                        int iOption = JOptionPane.showConfirmDialog(uk.ac.reload.editor.EditorFrame.getInstance(),"You already have assigned this file name to the proyect. if you continue you will overwrite it. ¿do you want to continue?","Warning",javax.swing.JOptionPane.YES_NO_OPTION,javax.swing.JOptionPane.WARNING_MESSAGE);
                        if (iOption==javax.swing.JOptionPane.NO_OPTION) continue;
                    }
                    bExit=true;
                    
                    try {
                        //Copiamos la música al directorio del proyecto, y la apuntamos
                        //..pero no borramos la anterior (por si cancel o x)
                        //.. ni hacemos refresh (para que no se vean todas- no es definitivo)
//                         File oValueAnt = (File) oValue; 
                          oValue = new File(pf,oFile.getName());
                         FileUtils.copyFile(oFile, (File) oValue);
//                         oValueAnt.delete(); //una vez copiamos la nueva, borramos la anterior
//                          //Hacemos refresh del arbol de recursos
//                        CP_ResourcesPanel.getInstance().refreshResourceTree();
                         
                        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
    }
}
