org.jdesktop.swingx.sort
Class DefaultSortController<M>

java.lang.Object
  extended by javax.swing.RowSorter<M>
      extended by javax.swing.DefaultRowSorter<M,Integer>
          extended by org.jdesktop.swingx.sort.DefaultSortController<M>
All Implemented Interfaces:
SortController<M>
Direct Known Subclasses:
ListSortController, TableSortController

public abstract class DefaultSortController<M>
extends DefaultRowSorter<M,Integer>
implements SortController<M>

A default SortController implementation used as parent class for concrete SortControllers in SwingX.

Additionally, this implementation contains a fix for core Issue 6894632. It guarantees to only touch the underlying model during sort/filter and during processing the notification methods. This implies that the conversion and size query methods are valid at all times outside the internal updates, including the critical period (in core with undefined behaviour) after the underlying model has changed and before this sorter has been notified.


Nested Class Summary
 
Nested classes/interfaces inherited from class javax.swing.DefaultRowSorter
DefaultRowSorter.ModelWrapper<M,I>
 
Nested classes/interfaces inherited from class javax.swing.RowSorter
RowSorter.SortKey
 
Field Summary
protected  int cachedModelRowCount
           
static Comparator COMPARABLE_COMPARATOR
          Comparator that uses compareTo on the contents.
 
Constructor Summary
DefaultSortController()
           
 
Method Summary
 void allRowsChanged()
          Invoked when the contents of the underlying model have completely changed.
 int convertRowIndexToModel(int viewIndex)
          Returns the location of index in terms of the underlying model.
 int convertRowIndexToView(int modelIndex)
          Returns the location of index in terms of the view.
static SortOrder[] getDefaultSortOrderCycle()
          Returns the default cycle.
 int getModelRowCount()
          Returns the number of rows in the underlying model.
 SortOrder getSortOrder(int column)
          Returns the sort order of the specified column.
 SortOrder[] getSortOrderCycle()
          Returns the cycle of sort orders to cycle through.
 StringValueProvider getStringValueProvider()
          Returns the registry of string values.
 int getViewRowCount()
          Returns the number of rows in the view.
 boolean isSortable()
          Returns true if this controller is sortable; otherwise, false.
 boolean isSortable(int column)
          Returns true if the specified column is sortable; otherwise, false.
 void modelStructureChanged()
          Invoked when the underlying model structure has completely changed.
 void resetSortOrders()
          Resets all interactive sorting.
 void rowsDeleted(int firstRow, int endRow)
          Invoked when rows have been deleted from the underlying model in the specified range (inclusive).
 void rowsInserted(int firstRow, int endRow)
          Invoked when rows have been inserted into the underlying model in the specified range (inclusive).
 void setSortable(boolean sortable)
          Sets whether or not this controller is sortable.
 void setSortable(int column, boolean sortable)
          Sets whether or not the specified column is sortable.
 void setSortOrder(int column, SortOrder sortOrder)
          Sets the sort order of the specified column.
 void setSortOrderCycle(SortOrder... cycle)
          Sets the cycle of sort ordes to toggle through.
 void setStringValueProvider(StringValueProvider registry)
          Sets the registry of string values.
 void toggleSortOrder(int column)
          Reverses the sort order from ascending to descending (or descending to ascending) if the specified column is already the primary sorted column; otherwise, makes the specified column the primary sorted column, with an ascending sort order.
 
Methods inherited from class javax.swing.DefaultRowSorter
getComparator, getMaxSortKeys, getModel, getModelWrapper, getRowFilter, getSortKeys, getSortsOnUpdates, rowsUpdated, rowsUpdated, setComparator, setMaxSortKeys, setModelWrapper, setRowFilter, setSortKeys, setSortsOnUpdates, sort, useToString
 
Methods inherited from class javax.swing.RowSorter
addRowSorterListener, fireRowSorterChanged, fireSortOrderChanged, removeRowSorterListener
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface org.jdesktop.swingx.sort.SortController
getComparator, getRowFilter, getSortsOnUpdates, setComparator, setRowFilter, setSortsOnUpdates
 

Field Detail

COMPARABLE_COMPARATOR

public static final Comparator COMPARABLE_COMPARATOR
Comparator that uses compareTo on the contents.


cachedModelRowCount

protected int cachedModelRowCount
Constructor Detail

DefaultSortController

public DefaultSortController()
Method Detail

setSortable

public void setSortable(boolean sortable)
Sets whether or not this controller is sortable.

The default is true.

PENDING JW: define behaviour if sortable is disabled while has sortOrders. In this case JXTable resets all sorts.

Specified by:
setSortable in interface SortController<M>
Parameters:
sortable - whether or not this controller is sortable
See Also:
SortController.isSortable()

isSortable

public boolean isSortable()
Returns true if this controller is sortable; otherwise, false.

Specified by:
isSortable in interface SortController<M>
Returns:
true if this controller is sortable
See Also:
SortController.isSortable()

setSortable

public void setSortable(int column,
                        boolean sortable)
Sets whether or not the specified column is sortable. The specified value is only checked when toggleSortOrder is invoked. It is still possible to sort on a column that has been marked as unsortable by directly setting the sort keys. The default is true.

Specified by:
setSortable in interface SortController<M>
Overrides:
setSortable in class DefaultRowSorter<M,Integer>
Parameters:
column - the column to enable or disable sorting on, in terms of the underlying model
sortable - whether or not the specified column is sortable
See Also:
DefaultRowSorter.toggleSortOrder(int), DefaultRowSorter.setSortKeys(java.util.List)

isSortable

public boolean isSortable(int column)
Returns true if the specified column is sortable; otherwise, false.

Specified by:
isSortable in interface SortController<M>
Overrides:
isSortable in class DefaultRowSorter<M,Integer>
Parameters:
column - the column to check sorting for, in terms of the underlying model
Returns:
true if the column is sortable
See Also:
SortController.isSortable(int)

toggleSortOrder

public void toggleSortOrder(int column)
Reverses the sort order from ascending to descending (or descending to ascending) if the specified column is already the primary sorted column; otherwise, makes the specified column the primary sorted column, with an ascending sort order. If the specified column is not sortable, this method has no effect.

Overridden - that is completely new implementation - to get first/next SortOrder from sort order cycle. Does nothing if the cycle is empty.

Specified by:
toggleSortOrder in interface SortController<M>
Overrides:
toggleSortOrder in class DefaultRowSorter<M,Integer>
Parameters:
column - index of the column to make the primary sorted column, in terms of the underlying model
See Also:
DefaultRowSorter.setSortable(int,boolean), DefaultRowSorter.setMaxSortKeys(int)

setSortOrder

public void setSortOrder(int column,
                         SortOrder sortOrder)
Sets the sort order of the specified column.

Implementations must respect the per-controller and per-column-sortable property.

PENDING JW: toggle has two effects: makes the column the primary sort column, and cycle through. So here we something similar. Should we?

Specified by:
setSortOrder in interface SortController<M>
Parameters:
column - the model index of the column to set
sortOrder - the SortOrder to set for the column
See Also:
SortController.isSortable(int), SortController.isSortable()

getSortOrder

public SortOrder getSortOrder(int column)
Returns the sort order of the specified column.

Specified by:
getSortOrder in interface SortController<M>
Returns:
one of SortOrder.ASCENDING, SortOrder.DESCENDING or SortOrder.UNSORTED.

resetSortOrders

public void resetSortOrders()
Resets all interactive sorting.

Implementations must respect the per-controller and per-column-sortable property.

Specified by:
resetSortOrders in interface SortController<M>

getSortOrderCycle

public SortOrder[] getSortOrderCycle()
Returns the cycle of sort orders to cycle through.

Specified by:
getSortOrderCycle in interface SortController<M>
Returns:

setSortOrderCycle

public void setSortOrderCycle(SortOrder... cycle)
Sets the cycle of sort ordes to toggle through. Zero or more SortOrders which must not be null.

Specified by:
setSortOrderCycle in interface SortController<M>
Parameters:
cycle - the SortOrders to cycle through, may be empty

setStringValueProvider

public void setStringValueProvider(StringValueProvider registry)
Sets the registry of string values. If null, the default provider is used.

Specified by:
setStringValueProvider in interface SortController<M>
Parameters:
registry - the registry to get StringValues for conversion.

getStringValueProvider

public StringValueProvider getStringValueProvider()
Returns the registry of string values.

Specified by:
getStringValueProvider in interface SortController<M>
Returns:
the registry of string converters, guaranteed to never be null.

getDefaultSortOrderCycle

public static SortOrder[] getDefaultSortOrderCycle()
Returns the default cycle.

Returns:
default sort order cycle.

convertRowIndexToModel

public int convertRowIndexToModel(int viewIndex)
Returns the location of index in terms of the underlying model. That is, for the row index in the coordinates of the view this returns the row index in terms of the underlying model.

Overridden to use check against getViewRowCount for validity.

Overrides:
convertRowIndexToModel in class DefaultRowSorter<M,Integer>
Parameters:
viewIndex - the row index in terms of the underlying view
Returns:
row index in terms of the view
See Also:
getViewRowCount()

convertRowIndexToView

public int convertRowIndexToView(int modelIndex)
Returns the location of index in terms of the view. That is, for the row index in the coordinates of the underlying model this returns the row index in terms of the view.

Overridden to use check against getModelRowCount for validity.

Overrides:
convertRowIndexToView in class DefaultRowSorter<M,Integer>
Parameters:
modelIndex - the row index in terms of the underlying model
Returns:
row index in terms of the view, or -1 if index has been filtered out of the view
See Also:
getModelRowCount()

getModelRowCount

public int getModelRowCount()
Returns the number of rows in the underlying model.

Overridden to return the model row count which corresponds to the currently mapped model instead of accessing the model directly (as super does). This may differ from the "real" current model row count if the model has changed but this sorter not yet notified.

Overrides:
getModelRowCount in class DefaultRowSorter<M,Integer>
Returns:
number of rows in the underlying model
See Also:
RowSorter.getViewRowCount()

getViewRowCount

public int getViewRowCount()
Returns the number of rows in the view. If the contents have been filtered this might differ from the row count of the underlying model.

Overridden to return the model row count if no filters installed, otherwise return super.

Overrides:
getViewRowCount in class DefaultRowSorter<M,Integer>
Returns:
number of rows in the view
See Also:
getModelRowCount()

allRowsChanged

public void allRowsChanged()
Description copied from class: javax.swing.DefaultRowSorter
Invoked when the contents of the underlying model have completely changed. The structure of the table is the same, only the contents have changed. This is typically sent when it is too expensive to characterize the change in terms of the other methods.

You normally do not call this method. This method is public to allow view classes to call it.

Overrides:
allRowsChanged in class DefaultRowSorter<M,Integer>

modelStructureChanged

public void modelStructureChanged()
Description copied from class: javax.swing.DefaultRowSorter
Invoked when the underlying model structure has completely changed. For example, if the number of columns in a TableModel changed, this method would be invoked.

You normally do not call this method. This method is public to allow view classes to call it.

Overrides:
modelStructureChanged in class DefaultRowSorter<M,Integer>

rowsDeleted

public void rowsDeleted(int firstRow,
                        int endRow)
Description copied from class: javax.swing.DefaultRowSorter
Invoked when rows have been deleted from the underlying model in the specified range (inclusive).

The arguments give the indices of the effected range and are in terms of the model before the change. For example, if you have a 5-row model and delete 3 items from the end of the model the indices are 2, 4.

You normally do not call this method. This method is public to allow view classes to call it.

Overrides:
rowsDeleted in class DefaultRowSorter<M,Integer>
Parameters:
firstRow - the first row
endRow - the last row

rowsInserted

public void rowsInserted(int firstRow,
                         int endRow)
Description copied from class: javax.swing.DefaultRowSorter
Invoked when rows have been inserted into the underlying model in the specified range (inclusive).

The arguments give the indices of the effected range. The first argument is in terms of the model before the change, and must be less than or equal to the size of the model before the change. The second argument is in terms of the model after the change and must be less than the size of the model after the change. For example, if you have a 5-row model and add 3 items to the end of the model the indices are 5, 7.

You normally do not call this method. This method is public to allow view classes to call it.

Overrides:
rowsInserted in class DefaultRowSorter<M,Integer>
Parameters:
firstRow - the first row
endRow - the last row