package org.limewire.ui.swing.library.table; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.EventObject; import java.util.List; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.table.TableCellEditor; import org.limewire.core.api.library.LocalFileItem; import org.limewire.ui.swing.library.navigator.LibraryNavItem; import org.limewire.ui.swing.library.navigator.LibraryNavigatorPanel; import com.google.inject.Inject; class RemoveEditor extends JPanel implements TableCellEditor { private final List<CellEditorListener> listeners = new ArrayList<CellEditorListener>(); private LocalFileItem currentEditingItem; @Inject public RemoveEditor(RemoveButton removeButton, final LibraryNavigatorPanel libraryNavigatorPanel) { add(removeButton); removeButton.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { //TODO: there has to be a cleaner way of handling actions in tables // performing the function on stopCellEditing within the table seems just as // hacky. Maybe inject everything into the buttonAction and handle it there along // with a mouselistener for selecting the correct row. if(currentEditingItem != null) { LibraryNavItem item = libraryNavigatorPanel.getSelectedNavItem(); item.getLocalFileList().removeFile(currentEditingItem.getFile()); currentEditingItem = null; } stopCellEditing(); } }); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { if(value instanceof LocalFileItem) currentEditingItem = (LocalFileItem) value; else currentEditingItem = null; return this; } @Override public void addCellEditorListener(CellEditorListener lis) { synchronized (listeners) { if (!listeners.contains(lis)) listeners.add(lis); } } @Override public void cancelCellEditing() { synchronized (listeners) { for (int i = 0, N = listeners.size(); i < N; i++) { listeners.get(i).editingCanceled(new ChangeEvent(this)); } } } @Override public Object getCellEditorValue() { return null; } @Override public boolean isCellEditable(EventObject anEvent) { return true; } @Override public void removeCellEditorListener(CellEditorListener lis) { synchronized (listeners) { if (listeners.contains(lis)) listeners.remove(lis); } } @Override public boolean shouldSelectCell(EventObject anEvent) { return false; } @Override public boolean stopCellEditing() { synchronized (listeners) { for (int i = 0, N = listeners.size(); i < N; i++) { listeners.get(i).editingStopped(new ChangeEvent(this)); } } return true; } }