/**
* Created at 22.03.2007
*
* @author Hans Bickel
*/
package de.muntjak.tinylookandfeel.table;
import javax.swing.JTable;
/**
* <code>TableModel</code>s which want to make use of TinyLaF's table
* headers for sortable table data must implement this interface.
* <p>
* See the example implementation in de.muntjak.tinylaf.controlpanel.TinyTableModel.
*
* @author Hans Bickel
*
*/
public interface SortableTableData {
/** value of <code>sortingDirection</code> property: column data sorted in ascending order */
static final int SORT_ASCENDING = 1;
/** value of <code>sortingDirection</code> property: column data sorted in descending order */
static final int SORT_DESCENDING = 2;
/**
* Returns <code>true</code> if the specified column
* is sortable, <code>false</code> otherwise. Non-sortable
* column headers will not react to mouse clicks or rollovers.
* @param column a column index
* @return <code>true</code> if the specified column
* is sortable, <code>false</code> otherwise
*/
boolean isColumnSortable(int column);
/**
* Returns <code>true</code> if the table model supports
* multiple sorted columns, <code>false</code> otherwise.
* (Supporting multi column sort makes sense only with columns
* containing some equal values.)
* <p>
* The TinyLaF user gestures concerning multi column sort are:
* <ul>
* <li><code>Ctrl-Click</code>: If clicked column was already sorted,
* change sorting direction, else add clicked column to sorted columns.
* <li><code>Alt-Click</code>: If clicked column was already sorted,
* remove from sorted columns. Ignore if clicked column was not sorted.
* <li><code>Click</code> (without <code>Ctrl</code> or <code>Alt</code>):
* The clicked column becomes the only sorted column. If the clicked column
* already was sorted, change sorting direction.
* </ul>
*
* @return <code>true</code> if the table model supports
* multiple sorted columns, <code>false</code> otherwise
*/
boolean supportsMultiColumnSort();
/**
* Sorts the data according to the given arguments. If argument arrays
* are empty, the original state of the data will be restored, if there
* is no original state then no action will be performed.
* <p>
* Note for implementors: If your data is dynamically changing you
* should think about storing copies of the arguments so
* you can re-sort data after each change. It may also be
* a good idea to call <code>fireTableDataChanged()</code> after sorting
* (this makes sure that the table is updated).
* @param columns array of column indices sorted by priority
* (highest priority first)
* @param sortingDirections array containing the sorting direction
* for each sorted column. Values are either
* <ul>
* <li><code>SORT_ASCENDING</code> - sort column data in ascending order, or
* <li><code>SORT_DESCENDING</code> - sort column data in descending order
* </ul>
* @param table the table displaying the data. Might be useful, for example,
* to restore selected cells after sorting.
*/
void sortColumns(int[] columns, int[] sortingDirections, JTable table);
}