package org.basex.gui.layout;
import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import org.basex.gui.dialog.Dialog;
import org.basex.util.Table;
import org.basex.util.Token;
/**
* Project specific CheckBox implementation.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class BaseXTable extends JTable {
/** Table data. */
public Table data;
/** Dialog instance. */
final Dialog dialog;
/** Table model. */
private final TableModel model;
/**
* Default constructor.
* @param t table input
* @param d dialog reference
*/
public BaseXTable(final Table t, final Dialog d) {
data = t;
dialog = d;
model = new TableModel();
setDefaultRenderer(Boolean.class, new CellRenderer());
setModel(model);
getTableHeader().setReorderingAllowed(false);
getTableHeader().setResizingAllowed(false);
BaseXLayout.addInteraction(this, d);
getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(final ListSelectionEvent e) {
if(!e.getValueIsAdjusting() && getSelectedColumn() != -1) {
dialog.action(e.getSource());
}
}
});
}
/**
* Updates the table.
* @param t table;
*/
public void update(final Table t) {
data = t;
model.fireTableChanged(null);
for(int i = 1; i < data.cols(); ++i) {
final TableColumn tc = getColumnModel().getColumn(i);
tc.setResizable(false);
tc.setPreferredWidth(30);
}
}
/**
* Dialog specific table model.
*/
final class TableModel extends AbstractTableModel {
@Override
public int getColumnCount() {
return data.cols();
}
@Override
public int getRowCount() {
return data.rows();
}
@Override
public String getColumnName(final int col) {
return Token.string(data.header.get(col));
}
@Override
public Object getValueAt(final int row, final int col) {
final String o = data.value(row, col);
return o.isEmpty() ? Boolean.FALSE : o.equals("X") ? Boolean.TRUE : o;
}
@Override
public Class<?> getColumnClass(final int c) {
return getValueAt(0, c).getClass();
}
@Override
public boolean isCellEditable(final int row, final int col) {
return col != 0 && !data.value(row, 0).equals("admin");
}
@Override
public void setValueAt(final Object value, final int row, final int col) {
dialog.action(new Object[] { value, row, col });
}
}
/**
* Own Renderer for cells.
*/
final class CellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(final JTable tab,
final Object val, final boolean sel, final boolean foc,
final int row, final int col) {
if(val instanceof Boolean) {
final JCheckBox box = new JCheckBox();
box.setHorizontalAlignment(SwingConstants.CENTER);
box.setSelected((Boolean) val);
box.setEnabled(isCellEditable(row, col));
box.setOpaque(false);
return box;
}
return super.getTableCellRendererComponent(tab, val, sel, foc, row, col);
}
}
}