package info.opencards.ui.table;
import info.opencards.core.CardFile;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
/**
* Lists a set of card-sets including their properties.
*
* @author Holger Brandl
*/
public class CardSetTable extends JTable {
private final CardTableModel cardTableModel;
public CardSetTable() {
cardTableModel = new CardTableModel(this);
setModel(cardTableModel);
// define sorting behavior
setAutoCreateRowSorter(true);
setRowSorter(new CardTableRowSorter(cardTableModel));
setTransferHandler(new CardFileDragHandler(this));
setDragEnabled(true);
getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
List<CardFile> selFiles = new ArrayList<CardFile>();
for (int rowIndex : getSelectedRows())
selFiles.add(getSortedRowFile(rowIndex));
cardTableModel.tableSelectionedChanged(selFiles);
if (cardTableModel.getRowCount() > 0) {
cardTableModel.fireTableRowsUpdated(0, cardTableModel.getRowCount() - 1);
}
}
});
// final int[][] lastSelection = new int[1][1];
//// Save selected row table
// getSelectionModel().addListSelectionListener(new ListSelectionListener() {
// @Override
// public void valueChanged(ListSelectionEvent e) {
// lastSelection[0] = getSelectedRows();
// }
// });
//
//// Restore selected raw table
// cardTableModel.addTableModelListener(new TableModelListener() {
// @Override
// public void tableChanged(TableModelEvent e) {
// SwingUtilities.invokeLater(new Runnable() {
// @Override
// public void run() {
// if(lastSelection.length==0) return;
// for (int selRow : lastSelection[0]) {
//// setRowSelectionInterval(selRow, selRow);
// addRowSelectionInterval(selRow, selRow);
// }
// }
// });
// }
// });
// Set the first visible column to 100 pixels wide
// setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
// int vColIndex = 0;
// TableColumn col = getColumnModel().getColumn(vColIndex);
// col.setPreferredWidth(100);
}
public CardFile getSortedRowFile(int rowIndex) {
return cardTableModel.getRowFile(getRowSorter().convertRowIndexToModel(rowIndex));
}
public String getToolTipText(MouseEvent event) {
java.awt.Point p = event.getPoint();
int colIndex = columnAtPoint(p);
int realColumnIndex = convertColumnIndexToModel(colIndex);
int rowIndex = rowAtPoint(p);
CardFile cardFile = getSortedRowFile(rowIndex);
return cardFile != null && realColumnIndex == 0 ? cardFile.getFileLocation().getAbsolutePath() : super.getToolTipText(event);
}
// see See http://stackoverflow.com/questions/254212/preserve-jtable-selection-across-tablemodel-change
public void rebuildWithSelectionRestore() {
// preserve selection calling fireTableDataChanged()
final int[] sel = getSelectedRows();
final int numRowsBefore = getRowCount();
((CardTableModel) getModel()).fireTableDataChanged();
if (numRowsBefore == cardTableModel.getRowCount()) {
for (int aSel : sel) {
getSelectionModel().addSelectionInterval(aSel, aSel);
}
}
}
}