package org.limewire.ui.swing.components; import java.awt.Color; import java.awt.Component; import java.util.ArrayList; import java.util.EventObject; import java.util.List; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.JTable; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; /** * Table cell renderer and editor that displays a hyperlink and handles the * hyperlink action. When installing HyperlinkCellEditorRenderer in a table, * it is customary to create separate instances for the renderer and editor - * this is because the renderer may receive paint requests while the editor is * active for another cell. */ public class HyperlinkCellEditorRenderer extends HyperlinkButton implements TableCellEditor, TableCellRenderer { /** List of cell editor listeners. */ private final List<CellEditorListener> listenerList = new ArrayList<CellEditorListener>(); /** * Constructs a HyperlinkCellEditorRenderer with no text or action. */ public HyperlinkCellEditorRenderer() { initialize(); } /** * Constructs a HyperlinkCellEditorRenderer with the specified action. */ public HyperlinkCellEditorRenderer(Action action) { super(action); initialize(); } /** * Constructs a HyperlinkCellEditorRenderer with the specified text. */ public HyperlinkCellEditorRenderer(String text) { super(text); initialize(); } /** * Constructs a HyperlinkCellEditorRenderer with the specified text and * action. */ public HyperlinkCellEditorRenderer(String text, Action action) { super(text, action); initialize(); } /** * Initializes the properties of this component. */ private void initialize() { setOpaque(true); setBorder(BorderFactory.createEmptyBorder(2, 4, 0, 4)); } /** * Overrides superclass method to ignore foreground color changes. */ @Override public void setForeground(Color c) { } /** * Returns this component as the cell renderer component. */ @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { return this; } /** * Returns this component as the cell editor component. */ @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { return this; } @Override public void addCellEditorListener(CellEditorListener l) { if (!listenerList.contains(l)) { listenerList.add(l); } } @Override public void removeCellEditorListener(CellEditorListener l) { listenerList.remove(l); } @Override public void cancelCellEditing() { ChangeEvent event = new ChangeEvent(this); for (int i = 0, size = listenerList.size(); i < size; i++) { listenerList.get(i).editingCanceled(event); } } @Override public Object getCellEditorValue() { return null; } @Override public boolean isCellEditable(EventObject anEvent) { return true; } @Override public boolean shouldSelectCell(EventObject anEvent) { return true; } @Override public boolean stopCellEditing() { cancelCellEditing(); return true; } }