/* ===================================================================== JSortTable.java Created by Claude Duguay Copyright (c) 2002 ===================================================================== */ package com.glub.gui.table; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.table.*; public class JSortTable extends JTable implements MouseListener { protected static final long serialVersionUID = 1L; protected int sortedColumnIndex = -1; protected boolean sortedColumnAscending = true; public JSortTable() { this(new DefaultSortTableModel()); } public JSortTable(int rows, int cols) { this(new DefaultSortTableModel(rows, cols)); } public JSortTable(Object[][] data, Object[] names) { this(new DefaultSortTableModel(data, names)); } public JSortTable(Vector data, Vector names) { this(new DefaultSortTableModel(data, names)); } public JSortTable(SortTableModel model) { super(model); initSortHeader(); } public JSortTable(SortTableModel model, TableColumnModel colModel) { super(model, colModel); initSortHeader(); } public JSortTable(SortTableModel model, TableColumnModel colModel, ListSelectionModel selModel) { super(model, colModel, selModel); initSortHeader(); } /* public boolean getScrollableTracksViewportHeight() { if ( getParent() instanceof JViewport ) { return (((JViewport)getParent()).getHeight() > getPreferredSize().height); } return false; } */ protected void initSortHeader() { JTableHeader header = getTableHeader(); header.setDefaultRenderer(new SortHeaderRenderer()); header.addMouseListener(this); } public int getSortedColumnIndex() { return sortedColumnIndex; } public boolean isSortedColumnAscending() { return sortedColumnAscending; } public void mouseReleased(MouseEvent event) { TableColumnModel colModel = getColumnModel(); int index = colModel.getColumnIndexAtX(event.getX()); int modelIndex = colModel.getColumn(index).getModelIndex(); SortTableModel model = (SortTableModel)getModel(); if (model.isSortable(modelIndex)) { // set to false, because it will get flipped lower down if ( sortedColumnIndex != modelIndex ) { sortedColumnAscending = false; } boolean forceSelection = false; ArrayList itemsToSelect = new ArrayList(); // toggle ascension, if already sorted if (0 == sortedColumnIndex && sortedColumnIndex == index) { forceSelection = false; sortedColumnAscending = !sortedColumnAscending; int[] selectedRows = getSelectedRows(); int rowCount = getRowCount(); clearSelection(); for ( int i = 0; i < selectedRows.length; i++ ) { int selectedRow = rowCount - selectedRows[i]; if ( selectedRow == rowCount ) { addRowSelectionInterval( 0, 0 ); } else { addRowSelectionInterval( selectedRow, selectedRow ); } } } else { forceSelection = true; sortedColumnAscending = !sortedColumnAscending; int[] selectedRows = getSelectedRows(); int rowCount = getRowCount(); clearSelection(); for ( int i = 0; i < selectedRows.length; i++ ) { String selectedRowItem = getValueAt(selectedRows[i], 0).toString(); int selectedRow = rowCount - selectedRows[i]; if ( selectedRow == rowCount ) { addRowSelectionInterval( 0, 0 ); } else { itemsToSelect.add( selectedRowItem ); } } //sortedColumnAscending = true; } model.sortColumn(modelIndex, sortedColumnAscending); // if we are switching columns we need to hunt for the old selection if (forceSelection || sortedColumnIndex != index) { int rowCount = getRowCount(); for ( int j = 0; j < rowCount; j++ ) { for ( int k = 0; k < itemsToSelect.size(); k++ ) { String itemToSelect = itemsToSelect.get(k).toString(); if ( itemToSelect.equals(getValueAt(j, 0).toString()) ) { addRowSelectionInterval( j, j ); } } } } sortedColumnIndex = index; } } public void mousePressed(MouseEvent event) {} public void mouseClicked(MouseEvent event) {} public void mouseEntered(MouseEvent event) {} public void mouseExited(MouseEvent event) {} }