package uk.ac.reload.editor.style;

//M:

import java.awt.Component;
import javax.swing.JTable;

public class PreferencesCellEditor extends javax.swing.AbstractCellEditor implements javax.swing.table.TableCellEditor{

      private java.util.HashMap<Class, javax.swing.table.TableCellEditor> oEditors;
       private javax.swing.table.TableCellEditor oDelegado;
      
    public PreferencesCellEditor() {
          oEditors = new java.util.HashMap<Class, javax.swing.table.TableCellEditor>();
          
          //Image Editor
          ImageEditor imageeditor = new ImageEditor();
          imageeditor.setDelegation(this);
          oEditors.put(imageeditor.getTypeEditor(), imageeditor);
          
          //Music Editor
           MusicEditor musiceditor = new MusicEditor();
           musiceditor.setDelegation(this);
          oEditors.put(musiceditor.getTypeEditor(), musiceditor);
          
          //Font Editor
           FontEditor fonteditor = new FontEditor();
           fonteditor.setDelegation(this);
          oEditors.put(fonteditor.getTypeEditor(), fonteditor);
          
          //Color Editor
           ColorEditor coloreditor = new ColorEditor();
           coloreditor.setDelegation(this);
          oEditors.put(coloreditor.getTypeEditor(), coloreditor);
    }

    public Object getCellEditorValue() {
        return oDelegado.getCellEditorValue();
    }

    public Component getTableCellEditorComponent(JTable table, Object valueToAssign, boolean isSelected, int iRow, int iColumn) {
        Value value = ((PreferencesTableModel) table.getModel()).getValue(iRow);
        if (value.getName().contains("Font")) oDelegado = oEditors.get(value.getValueClass()); //editor font o color
        else if (value.getName().contains("music")) oDelegado = oEditors.get(MusicEditor.class); //editor music
        else oDelegado = oEditors.get(ImageEditor.class); //editor image
        //Llamamos al editor delegado
         java.awt.Component oComponent = oDelegado.getTableCellEditorComponent(table, valueToAssign, isSelected, iRow, iColumn);
        return (oComponent);
      
    }
    
    //Este método es usado por el editor delegado para notificar que
    //ya ha finalizado la edición de la propiedad.
    public void vEditado() {
        fireEditingStopped();
    }

    //Este método es usado por el editor delegado para notificar que
    //no se pueden llevar a cabo los cambios en la propiedad.
    public void vCancel() {
        fireEditingCanceled();
    }

}
