package com.link_intersystems.swing;
import javax.swing.DefaultListSelectionModel;
import javax.swing.ListSelectionModel;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
public class SelectionTableModel extends AbstractTableModel {
private static final long serialVersionUID = -1771060206519204339L;
private static final TableModel EMPTY_TABLE_MODEL = new DefaultTableModel();
private static final ListSelectionModel EMPTY_LIST_SELECTION_MODEL = new DefaultListSelectionModel();
private TableModelSynchronization tableModelSynchronization = new TableModelSynchronization();
private TableModel tableModel = EMPTY_TABLE_MODEL;
private ListSelectionModel listSelectionModel = EMPTY_LIST_SELECTION_MODEL;
public SelectionTableModel() {
}
public void setSelectionTable(TableModel tableModel,
ListSelectionModel listSelectionModel) {
if (this.tableModel != null) {
this.tableModel.removeTableModelListener(tableModelSynchronization);
}
this.tableModel = tableModel;
if (this.tableModel != null) {
this.tableModel.addTableModelListener(tableModelSynchronization);
this.listSelectionModel = listSelectionModel;
} else {
this.tableModel = EMPTY_TABLE_MODEL;
this.listSelectionModel = EMPTY_LIST_SELECTION_MODEL;
}
fireTableStructureChanged();
}
@Override
public int getRowCount() {
return tableModel.getRowCount();
}
@Override
public int getColumnCount() {
int columnCount = tableModel.getColumnCount();
return columnCount + 1;
}
@Override
public String getColumnName(int column) {
if (column == 0) {
return "Selected";
} else {
return tableModel.getColumnName(column - 1);
}
}
@Override
public Class<?> getColumnClass(int columnIndex) {
if (columnIndex == 0) {
return Boolean.class;
} else {
return tableModel.getColumnClass(columnIndex - 1);
}
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if (columnIndex == 0) {
boolean selectedIndex = listSelectionModel
.isSelectedIndex(rowIndex);
return Boolean.valueOf(selectedIndex);
} else {
return tableModel.getValueAt(rowIndex, columnIndex - 1);
}
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == 0;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
if (columnIndex == 0) {
Boolean selected = (Boolean) aValue;
if (selected) {
listSelectionModel.addSelectionInterval(rowIndex, rowIndex);
} else {
listSelectionModel.removeSelectionInterval(rowIndex, rowIndex);
}
}
}
private class TableModelSynchronization implements TableModelListener {
@Override
public void tableChanged(TableModelEvent e) {
fireTableStructureChanged();
}
}
}