[Oops -- I forgot to hit send....]
If you're trying to say that the current sorting code is a bit odd, I'd agree :-) I think it needs to be rethought and rewritten. Some of the things I suspect: - You cannot have a sorted display without creating user-clickable sortable headers. - You cannot specify a list of sort criteria, even though the API indicates it takes a list. On 3/30/07, Zdeněk Sochor <[EMAIL PROTECTED]> wrote:
Not a problem having discussion here, Mike ;) By looking on HtmlDataTable i found weird thing dealing with sorting: setSortProperty method is NOT called with sortColumn property -> if (isSortable && getSortProperty() != null) fails for table w/o column with defaultSorted [line 877]-> NO SortCriterion ever made -> NOT SORTED data in model :( The same goes for iteration in encodeBegin(FacesContext). Zdenek Mike Kienenberger napsal(a): > If possible, let's talk about the general concept on the existing > MyFaces-dev thread. Discussions in JIRA clog up the issue and have a > much lower visibility than the dev mailing list. I'd like to keep the > JIRA issue focused on the changes (we can add summaries of any > discussion points as well if they seem relevent). > > On 3/30/07, Zdenek Sochor (JIRA) <[email protected]> wrote: > >> >> [ >> https://issues.apache.org/jira/browse/TOMAHAWK-952?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12485561 >> ] >> >> Zdenek Sochor commented on TOMAHAWK-952: >> ---------------------------------------- >> >> Hi, >> do u really have to set sort order in JSF (if only read-only)? >> I think it's way too slower to do sorting in dataTable's internal >> model than using custom comparator on collection in backing bean. >> We're using Collections.sort(List, Comparator) method in bean to >> achieve sorted data in table. >> >> Regards, >> Zdenek >> >> > Provide cleaner, consistent sorting for dataTable and selectItems >> > ----------------------------------------------------------------- >> > >> > Key: TOMAHAWK-952 >> > URL: >> https://issues.apache.org/jira/browse/TOMAHAWK-952 >> > Project: MyFaces Tomahawk >> > Issue Type: New Feature >> > Components: Extended Datatable, Extended SelectItems, New >> Component >> > Affects Versions: 1.1.6-SNAPSHOT >> > Reporter: Mike Kienenberger >> > Assigned To: Mike Kienenberger >> > Priority: Minor >> > >> > My requirements in most cases are to 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> >> >> -- >> This message is automatically generated by JIRA. >> - >> You can reply to this email to add a comment to the issue online. >> >> > >
