It was left that way to provide identical backward compatible behavior.
However, you should be able to subclass (or use) BaseSortableModel
instead of the default sortable model.
On 11/27/07, CatalinPetrisor <[EMAIL PROTECTED]> wrote:
>
> That's a very good idea. However, in the latest svn sources the HtmlDataTable
> component still uses SortableModel class to set the current sort column.
> Wouldn't be normal to use BaseSortableModel class to allow extensibility?
>
> Thanks.
>
>
> Mike Kienenberger wrote:
> >
> > As a first step in this process, I've separated SortableDataModel into
> > SortableDataModel (current behavior, final, subclass of
> > BaseSortableDataModel) and BaseSortableDataModel (extendable, works on
> > Comparators).
> >
> > I tested all of the simple examples involving dataTable at one point,
> > but it's possible that something may have slipped by me that I didn't
> > notice.
> >
> >
> > On 3/14/07, Mike Kienenberger <[EMAIL PROTECTED]> wrote:
> >> I took a look at SortableModel and t:dataTable sorting again last
> >> night. My requirements in most cases are to simply specify a sort
> >> order in the page code, not to allow end-users to manipulate the sort
> >> order. From what I can tell, there's no easy way to do this. I
> >> documented the most effective method I could find on the wiki under a
> >> "static sorting" subheading, but even that method leaves unnecessary
> >> links in the column headers.
> >>
> >> At the same time, I looked into what it would take to make sorting
> >> cleaner and more user-friendly.
> >>
> >> I came up with a subclass of extended dataTable and a replacement
> >> SortableModel that did what I wanted for the most part:
> >>
> >> <my:sortableDataTable
> >> preserveDataModel="true"
> >> value="#{bean.carList}"
> >> var="car"
> >> >
> >> <f:facet name="comparator">
> >> <my:propertyComparator
> >> property="style.color"
> >> descending="true" />
> >> </f:facet>
> >> </my:sortableDataTable>
> >>
> >> This is based in part on reusing my components for sorting selectItem
> >> lists. For some reason, couldn't make this work without using
> >> preserveDataModel. [Strangely enough, doing the same thing with the
> >> current t:dataTable sort attributes didn't require preserveDataModel.]
> >>
> >> In any case, a comparator component can be any UIComponent that
> >> implements a ComparatorSource interface (ie, public Comparator
> >> getComparator()), which provides a great deal of flexibility.
> >>
> >> The propertyComparator implementation basically does the same thing as
> >> the internal guts of the current SortableModel, but is pluggable. I
> >> used beanutils in my comparator rather than EL to process the property
> >> expression, which also eliminates the "rowObjectGet" hack. An "EL
> >> comparator" could be implemented if the EL processing features were
> >> needed.
> >>
> >> I think it would be worthwhile to replace the current SortableModel
> >> with a more generic pluggable one. A good start would be to pull all
> >> of the property-resolving/comparison out of it, and stick it into a
> >> comparator like I did. setSortCriteria(List criteria) appears to be
> >> misnomer since only the first item in the list is used -- using a
> >> comparator would also solve that issue as you can create
> >> MultipleComparator that takes a list of other comparators and goes
> >> through them in order.
> >>
> >> Following is what DataTable looks like to make this work. Note that
> >> this doesn't handle the current sorting options.
> >>
> >> protected DataModel createDataModel()
> >> {
> >> DataModel dataModel = super.createDataModel();
> >>
> >> UIComponent comparatorUIComponent = getComparator();
> >> Comparator comparator = null;
> >> if (null != comparatorUIComponent)
> >> {
> >> if (comparatorUIComponent instanceof ComparatorSource)
> >> {
> >> comparator =
> >> ((ComparatorSource)comparatorUIComponent).getComparator();
> >> }
> >> else
> >> {
> >> // TODO: need log error instead
> >> throw new RuntimeException("comparatorUIComponent
> >> should
> >> implement ComparatorSource");
> >> }
> >> }
> >>
> >> boolean isSortable = null != comparator;
> >>
> >> if (isSortable)
> >> {
> >> if (!(dataModel instanceof BaseSortableModel))
> >> {
> >> dataModel = new BaseSortableModel(dataModel);
> >> }
> >>
> >> ((BaseSortableModel)dataModel).setComparator(comparator);
> >> }
> >>
> >> return dataModel;
> >> }
> >>
> >> After stripping out the comparator stuff from SortableModel, these are
> >> the major changes:
> >>
> >> public void setComparator(Comparator _comparator) {
> >> this._comparator = _comparator;
> >> _sort();
> >> }
> >>
> >>
> >> private void _sort()
> >> {
> >> if (null == _comparator)
> >> {
> >> // restore unsorted order:
> >> _baseIndicesList = _sortedIndicesList = null;
> >> return;
> >> }
> >>
> >> //TODO: support -1 for rowCount:
> >> int sz = getRowCount();
> >> if ((_baseIndicesList == null) || (_baseIndicesList.size() !=
> >> sz))
> >> {
> >> // we do not want to mutate the original data.
> >> // however, instead of copying the data and sorting the copy,
> >> // we will create a list of indices into the original data,
> >> and
> >> // sort the indices. This way, when certain rows are made
> >> current
> >> // in this Collection, we can make them current in the
> >> underlying
> >> // DataModel as well.
> >> _baseIndicesList = new IntList(sz);
> >> }
> >>
> >> final int rowIndex = _model.getRowIndex();
> >>
> >> _model.setRowIndex(0);
> >> // Make sure the model has that row 0! (It could be empty.)
> >> if (_model.isRowAvailable())
> >> {
> >> Collections.sort(_baseIndicesList, new
> >> RowDataComparator(_comparator, _model));
> >> _sortedIndicesList = null;
> >> }
> >>
> >> _model.setRowIndex(rowIndex);
> >> }
> >>
> >> protected class RowDataComparator implements Comparator
> >> {
> >> private Comparator dataComparator = null;
> >> private DataModel dataModel = null;
> >>
> >> public RowDataComparator(Comparator comparator, DataModel
> >> model)
> >> {
> >> this.dataComparator = comparator;
> >> this.dataModel = model;
> >> }
> >>
> >> public int compare(Object arg1, Object arg2) {
> >> Integer r1 = (Integer)arg1;
> >> Integer r2 = (Integer)arg2;
> >> dataModel.setRowIndex(r1.intValue());
> >> Object rowData1 = _model.getRowData();
> >> dataModel.setRowIndex(r2.intValue());
> >> Object rowData2 = _model.getRowData();
> >>
> >> return dataComparator.compare(rowData1, rowData2);
> >> }
> >> }
> >>
> >>
> >> Also, here's how I'd like to improve t:selectItems. I've had a custom
> >> subclass of f:selectItems of this working for awhile. Notice how we
> >> can reuse the same propertyComparator component. This particular
> >> implementation can take a list of comparator children and implicitly
> >> wraps them in a MultipleComparator. That's not really possible with
> >> a dataTable facet, so we'd want to provide a MultipleComparator
> >> component.
> >>
> >> <my:orderedSelectItems value="#{bean.carList}">
> >> <my:propertyComparator
> >> property="style.color"
> >> descending="false" />
> >> </my:orderedSelectItems>
> >>
> >
> >
>
> --
> View this message in context:
> http://www.nabble.com/SortableModel-and-t%3AdataTable-changes-improvements-tf3403639.html#a13967432
> Sent from the My Faces - Dev mailing list archive at Nabble.com.
>
>