package net.vhati.modmanager.ui.table;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DropMode;
import javax.swing.ListSelectionModel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import net.vhati.modmanager.core.ModFileInfo;
import net.vhati.modmanager.ui.table.ChecklistTableModel;
import net.vhati.modmanager.ui.table.TableRowTransferHandler;
public class ChecklistTablePanel<T> extends JPanel {
protected ChecklistTableModel<T>tableModel;
protected JTable table;
public ChecklistTablePanel() {
super( new BorderLayout() );
tableModel = new ChecklistTableModel<T>();
table = new JTable( tableModel );
table.setFillsViewportHeight( true );
table.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
table.setTableHeader( null );
table.getColumnModel().getColumn(0).setMinWidth(30);
table.getColumnModel().getColumn(0).setMaxWidth(30);
table.getColumnModel().getColumn(0).setPreferredWidth(30);
JScrollPane scrollPane = new JScrollPane( null, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER );
scrollPane.setViewportView( table );
//scrollPane.setColumnHeaderView( null ); // Counterpart to setTableHeader().
scrollPane.setPreferredSize( new Dimension(Integer.MIN_VALUE, Integer.MIN_VALUE) );
this.add( scrollPane, BorderLayout.CENTER );
// Double-click toggles checkboxes.
table.addMouseListener(new MouseAdapter() {
int prevRow = -1;
int streak = 0;
@Override
public void mouseClicked( MouseEvent e ) {
if ( e.getSource() != table ) return;
int thisRow = table.rowAtPoint( e.getPoint() );
// Reset on first click and when no longer on that row.
if ( e.getClickCount() == 1 ) prevRow = -1;
if ( thisRow != prevRow || thisRow == -1 ) {
streak = 1;
prevRow = thisRow;
return;
} else {
streak++;
}
if ( streak % 2 != 0 ) return; // Respond only to click pairs.
// Don't further toggle a multi-clicked checkbox.
int viewCol = table.columnAtPoint( e.getPoint() );
int modelCol = table.getColumnModel().getColumn(viewCol).getModelIndex();
if ( modelCol == 0 ) return;
int selRow = table.getSelectedRow();
if ( selRow != -1 ) {
boolean selected = tableModel.isSelected( selRow );
tableModel.setSelected( selRow, !selected );
}
}
});
table.setTransferHandler( new TableRowTransferHandler( table ) );
table.setDropMode( DropMode.INSERT ); // Drop between rows, not on them.
table.setDragEnabled( true );
}
public void clear() {
tableModel.removeAllItems();
}
public List<T> getAllItems() {
List<T> results = new ArrayList<T>();
for ( int i=0; i < tableModel.getRowCount(); i++ ) {
results.add( tableModel.getItem(i) );
}
return results;
}
public List<T> getSelectedItems() {
List<T> results = new ArrayList<T>();
for ( int i=0; i < tableModel.getRowCount(); i++ ) {
if ( tableModel.isSelected(i) ) {
results.add( tableModel.getItem(i) );
}
}
return results;
}
public void toggleAllItemSelection() {
int selectedCount = 0;
for ( int i = tableModel.getRowCount()-1; i >= 0; i-- ) {
if ( tableModel.isSelected(i) ) selectedCount++;
}
boolean b = ( selectedCount != tableModel.getRowCount() );
for ( int i = tableModel.getRowCount()-1; i >= 0; i-- ) {
tableModel.setSelected( i, b );
}
}
public ChecklistTableModel<T> getTableModel() {
return tableModel;
}
public JTable getTable() {
return table;
}
}