package org.limewire.ui.swing.table; import java.awt.Component; 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 javax.swing.table.TableCellRenderer; import org.jdesktop.swingx.JXPanel; public abstract class TableRendererEditor extends JXPanel implements TableCellRenderer, TableCellEditor { private final List<CellEditorListener> listeners = new ArrayList<CellEditorListener>(); protected final JPanel emptyPanel = new JXPanel(); @Override public final void addCellEditorListener(CellEditorListener lis) { synchronized (listeners) { if (!listeners.contains(lis)) listeners.add(lis); } } @Override public final void cancelCellEditing() { synchronized (listeners) { for (int i = 0, N = listeners.size(); i < N; i++) { listeners.get(i).editingCanceled(new ChangeEvent(this)); } } } @Override public final Object getCellEditorValue() { return null; } @Override public boolean isCellEditable(EventObject e) { return true; } @Override public final void removeCellEditorListener(CellEditorListener lis) { synchronized (listeners) { if (listeners.contains(lis)) listeners.remove(lis); } } @Override public final Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (value == null) { return emptyPanel; } return doTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); } /** * Takes the place of the normal getTableCellRendererComponent(), which in this parent class performs a null check * for the cell value. */ protected abstract Component doTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column); @Override public final Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { if (value == null) { return emptyPanel; } return doTableCellEditorComponent(table, value, isSelected, row, column); } /** * Takes the place of the normal getTableCellEditorComponent(), which in * this parent class performs a null check for the cell value. */ protected abstract Component doTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column); @Override public boolean shouldSelectCell(EventObject e) { return false; } @Override public final boolean stopCellEditing() { synchronized (listeners) { for (int i = 0, N = listeners.size(); i < N; i++) { listeners.get(i).editingStopped(new ChangeEvent(this)); } } return true; } }