Class DefaultSortController<M>

  • All Implemented Interfaces:
    SortController<M>
    Direct Known Subclasses:
    ListSortController, TableSortController

    public abstract class DefaultSortController<M>
    extends javax.swing.DefaultRowSorter<M,​java.lang.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.

    • Field Detail

      • COMPARABLE_COMPARATOR

        public static final java.util.Comparator COMPARABLE_COMPARATOR
        Comparator that uses compareTo on the contents.
      • DEFAULT_CYCLE

        private static final javax.swing.SortOrder[] DEFAULT_CYCLE
      • sortCycle

        private java.util.List<javax.swing.SortOrder> sortCycle
      • sortable

        private boolean sortable
      • 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()
      • setSortable

        public void setSortable​(int column,
                                boolean sortable)
        Sets whether or not the specified column is sortable.

        The default is true.

        PENDING JW: define behaviour if sortable is disabled while has sortOrders. In this case JXTable removes the sort of the column.

        PENDING JW: decide whether or not this method should trigger a resort DefaultRowSorter explicitly doesn't, JXTable does.

        Specified by:
        setSortable in interface SortController<M>
        Overrides:
        setSortable in class javax.swing.DefaultRowSorter<M,​java.lang.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:
        SortController.isSortable(int), SortController.toggleSortOrder(int), SortController.setSortOrder(int, SortOrder)
      • isSortable

        public boolean isSortable​(int column)
        Returns true if the specified column is sortable.

        This returns true if both the controller's sortable property and the column's sortable property is true. Returns false if any of them is false.

        Specified by:
        isSortable in interface SortController<M>
        Overrides:
        isSortable in class javax.swing.DefaultRowSorter<M,​java.lang.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 of the specified column. The exact behaviour is up to implementations.

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

        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 javax.swing.DefaultRowSorter<M,​java.lang.Integer>
        Parameters:
        column - the model index of the column to toggle
        See Also:
        SortController.isSortable(int), SortController.isSortable()
      • getNextInCycle

        private javax.swing.SortOrder getNextInCycle​(javax.swing.SortOrder current)
        Returns the next SortOrder relative to the current, or null if the sort order cycle is empty.
        Parameters:
        current - the current SortOrder
        Returns:
        the next SortOrder to use, may be null if the cycle is empty.
      • getFirstInCycle

        private javax.swing.SortOrder getFirstInCycle()
        Returns the first SortOrder in the sort order cycle, or null if empty.
        Returns:
        the first SortOrder in the sort order cycle or null if empty.
      • checkColumn

        private void checkColumn​(int column)
      • setSortOrder

        public void setSortOrder​(int column,
                                 javax.swing.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 javax.swing.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 javax.swing.SortOrder[] getSortOrderCycle()
        Returns the cycle of sort orders to cycle through.

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

        public void setSortOrderCycle​(javax.swing.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.
      • getDefaultSortOrderCycle

        public static javax.swing.SortOrder[] getDefaultSortOrderCycle()
        Returns the default cycle.
        Returns:
        default sort order cycle.
      • convertRowIndexToModel

        public int convertRowIndexToModel​(int viewIndex)

        Overridden to use check against getViewRowCount for validity.

        Overrides:
        convertRowIndexToModel in class javax.swing.DefaultRowSorter<M,​java.lang.Integer>
        See Also:
        getViewRowCount()
      • convertRowIndexToView

        public int convertRowIndexToView​(int modelIndex)

        Overridden to use check against getModelRowCount for validity.

        Overrides:
        convertRowIndexToView in class javax.swing.DefaultRowSorter<M,​java.lang.Integer>
        See Also:
        getModelRowCount()
      • getModelRowCount

        public int getModelRowCount()

        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 javax.swing.DefaultRowSorter<M,​java.lang.Integer>
      • getViewRowCount

        public int getViewRowCount()

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

        Overrides:
        getViewRowCount in class javax.swing.DefaultRowSorter<M,​java.lang.Integer>
        See Also:
        getModelRowCount()
      • hasRowFilter

        private boolean hasRowFilter()
        Returns:
      • allRowsChanged

        public void allRowsChanged()
        Overrides:
        allRowsChanged in class javax.swing.DefaultRowSorter<M,​java.lang.Integer>
      • modelStructureChanged

        public void modelStructureChanged()
        Overrides:
        modelStructureChanged in class javax.swing.DefaultRowSorter<M,​java.lang.Integer>
      • rowsDeleted

        public void rowsDeleted​(int firstRow,
                                int endRow)
        Overrides:
        rowsDeleted in class javax.swing.DefaultRowSorter<M,​java.lang.Integer>
      • rowsInserted

        public void rowsInserted​(int firstRow,
                                 int endRow)
        Overrides:
        rowsInserted in class javax.swing.DefaultRowSorter<M,​java.lang.Integer>