package org.limewire.ui.swing.table;
import java.awt.event.KeyEvent;
import java.awt.event.MouseListener;
import java.util.Vector;
import javax.swing.Action;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import org.jdesktop.swingx.JXTable;
/**
* A JXTable with some default functionality removed.
* Specifically, this removes the 'Find' feature from the actionMap
* and changes the 'enter' key to not move down.
*/
public class BasicJXTable extends JXTable {
// DO NOT INITIALIZE proxyMouseListener!!!!!
// It is used in addMouseListener BEFORE the constuctor is run
// (called from the base class constructor). If it is set here
// or in the constructor, it will clobber the value set by the
// call from the base class constructor.
private AquaMouseListenerProxy proxyMouseListener;
public BasicJXTable() {
super();
initialize();
}
public BasicJXTable(int numRows, int numColumns) {
super(numRows, numColumns);
initialize();
}
public BasicJXTable(Object[][] rowData, Object[] columnNames) {
super(rowData, columnNames);
initialize();
}
public BasicJXTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) {
super(dm, cm, sm);
initialize();
}
public BasicJXTable(TableModel dm, TableColumnModel cm) {
super(dm, cm);
initialize();
}
public BasicJXTable(TableModel dm) {
super(dm);
initialize();
}
public BasicJXTable(Vector rowData, Vector columnNames) {
super(rowData, columnNames);
initialize();
}
private void initialize() {
getActionMap().remove("find");
//Default java behavior for the enter key is the same as the down arrow. We don't want this.
setEnterKeyAction(null);
}
/**
* This method has been overridden so that Apple's Aqua mouse listener objects are wrapped
* by a proxy before being added as a mouse listener. This is to prevent a bug with Aqua
* which causes items to be deselected when a user simulates a right mouse click with
* a CTRL click. See AquaMouseListenerProxy for more information.
*/
@Override
public synchronized void addMouseListener (MouseListener mouseListener) {
if ((proxyMouseListener == null) && AquaMouseListenerProxy.isAquaMouseListener(mouseListener)) {
proxyMouseListener = new AquaMouseListenerProxy(mouseListener);
super.addMouseListener(proxyMouseListener);
} else {
super.addMouseListener(mouseListener);
}
}
@Override
public synchronized void removeMouseListener (MouseListener mouseListener) {
if ((proxyMouseListener != null) && (mouseListener == proxyMouseListener.getPeer())) {
super.removeMouseListener(proxyMouseListener);
proxyMouseListener = null;
} else {
super.removeMouseListener(mouseListener);
}
}
/**
* @param action the action that occurs when the user presses the enter key on the table
*/
public void setEnterKeyAction(Action action){
getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), "launchAction");
getActionMap().put("launchAction", action);
}
}