To me it sounds like you need to change how your data model is provided to your table.
I think the most reasonable approach is to set the backing model of the table to only include your current scroll set, then you can use a "standard" sorting model for your table. So each change of the scroll set would reset the table model to a new subset of the full data set. Otherwise, you have to make your Sort model aware of the current scroll set, which sounds like a much more difficult problem. By the way, there's a Comparator-driven BaseSortableDataModel in MyFaces that you might find useful. I suspect it's similar to the sort model class you have below. http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/component/html/ext/BaseSortableModel.java?view=markup http://mail-archives.apache.org/mod_mbox/myfaces-dev/200703.mbox/[EMAIL PROTECTED] On 8/23/07, Julien Martin <[EMAIL PROTECTED]> wrote: > Hello, > > I need help in order to implement a scrolling [b]combined with a[/b] sorting > strategy for a datatable. > > Here is the behaviour I need: > > A user should be able to scroll a datatable in steps of [b]N[/b] records. > He/she should then be able to sort that [b]N[/b] records and not the whole > of the resultset. > > My problem is that I copied and pasted code in order to implement the > sorting strategy and then copied and pasted code in order to implement the > scrolling strategy and now I have the following behavior: the user can > scroll but when he/she attempts to sort, the whole of the resultset is > sorted and records not belonging to the "page" (of N records) are displayed. > > Here is the Datamodel: > > [code] > package com.calyonfinancial.protide; > > import com.calyonfinancial.protide.entities.Protide01p; > import java.util.Arrays; > import java.util.Comparator; > import java.util.List ; > import javax.faces.model.DataModel; > import javax.faces.model.DataModelListener; > > /** > * > * @author Julien Martin > */ > public class SortFilterModel extends DataModel{ > private DataModel model; > private Row[] rows; > > public SortFilterModel() { > this((List<Protide01p>)null); > } > public SortFilterModel(List<Protide01p> list){ > setWrappedData(list); > } > public SortFilterModel(DataModel model){ > this.model = model; > initializeRows(); > } > > public void setRowIndex(int rowIndex) { > if(rowIndex == -1||rowIndex>= model.getRowCount()){ > model.setRowIndex(rowIndex); > } else{ > model.setRowIndex(rows[rowIndex].row); > } > } > > > public int getRowCount() { > return model.getRowCount(); > } > > public Object getRowData() { > return model.getRowData(); > } > > public int getRowIndex() { > return model.getRowIndex(); > } > > public Object getWrappedData() { > return model.getWrappedData(); > } > > public boolean isRowAvailable() { > return model.isRowAvailable(); > } > > public void setWrappedData(Object object) { > model.setWrappedData(object); > } > > public void addDataModelListener(DataModelListener > listener){ > model.addDataModelListener(listener); > } > > public DataModelListener[] getDataModelListeners(){ > return model.getDataModelListeners(); > } > > public void removeDataModelListener(DataModelListener > listener){ > model.removeDataModelListener(listener); > } > > private void initializeRows(){ > int rowCnt = model.getRowCount(); > if(rowCnt!=-1){ > rows = new Row[rowCnt]; > for(int i = 0; i< rowCnt; ++i){ > rows[i]= new Row(i); > } > } > } > > public String sortByID(){ > Arrays.sort(rows,byID); > return null; > } > > public String sortByIsin(){ > Arrays.sort(rows,byISIN); > return null; > } > > public String sortByEquityDate(){ > Arrays.sort(rows,byEquityDate); > return null; > } > > private static Comparator<Row> byID = new Comparator<Row>(){ > public int compare(Row r1, Row r2){ > Protide01p p1 = (Protide01p) r1.getData(); > Protide01p p2 = (Protide01p) r2.getData(); > return new Integer(p1.getTrOrderid()).compareTo(new Integer( > p2.getTrOrderid())); > } > }; > > private static Comparator<Row> byISIN = new Comparator<Row>(){ > public int compare(Row r1, Row r2){ > Protide01p p1 = (Protide01p) r1.getData(); > Protide01p p2 = (Protide01p) r2.getData(); > return p1.getIsin().compareTo(p2.getIsin()); > } > }; > > private static Comparator<Row> byEquityDate = new Comparator<Row>(){ > public int compare(Row r1, Row r2){ > Protide01p p1 = (Protide01p) r1.getData(); > Protide01p p2 = (Protide01p) r2.getData(); > return p1.getEquityDate().compareTo(p2.getEquityDate ()); > } > }; > > private class Row{ > private int row; > public Row(int row){ > this.row = row; > } > public Object getData(){ > int originalIndex = model.getRowIndex(); > model.setRowIndex(row); > Object thisRowData = model.getRowData(); > model.setRowIndex(originalIndex); > return thisRowData; > } > } > } > [/code] > > The code for the managed bean is as follows: > [code] > package com.calyonfinancial.protide; > > import com.calyonfinancial.protide.entities.Protide01p; > import com.calyonfinancial.protide.persistence.PopulateUtil > ; > import java.util.List; > import javax.faces.model.DataModel; > import javax.faces.model.ListDataModel; > import org.apache.log4j.Logger; > > /** > * > * @author Julien Martin > */ > public class Protide01pManagedBean { > > private static Logger log = > Logger.getLogger("com.calyonfinancial.protide"); > private PopulateUtil pu = new PopulateUtil(); > > private List<Protide01p> lines; > private int lineCount; > private int firstRowIndex; > private int numberOfRows = 10; > > private SortFilterModel protide01pModel = null; > > public Protide01pManagedBean() { > setLines(pu.populateLinesOfProtide01p ());//todo! might not need > mutator for lines > setLineCount(lines.size()); > protide01pModel = new SortFilterModel(new ListDataModel(lines)); > } > > // public List<Protide01p> getLines() { > // return lines; > // } > > public SortFilterModel getLines(){ > return protide01pModel; > } > > public void setLines(List<Protide01p> lines) { > this.lines = lines; > } > > public int getLineCount() { > return lineCount; > } > > public void setLineCount(int lineCount) { > this.lineCount = lineCount; > } > > public int getFirstRowIndex() { > return firstRowIndex; > } > > public void setFirstRowIndex(int firstRowIndex) { > this.firstRowIndex = firstRowIndex; > } > > public int getNumberOfRows() { > return numberOfRows; > } > > public void setNumberOfRows(int numberOfRows) { > this.numberOfRows = numberOfRows; > } > > public String scrollNext(){ > firstRowIndex += numberOfRows; > if (firstRowIndex >= protide01pModel.getRowCount()){ > firstRowIndex = protide01pModel.getRowCount() - numberOfRows; > if(firstRowIndex<0){ > firstRowIndex = 0; > } > } > return null; > } > > public String scrollPrevious(){ > firstRowIndex -= numberOfRows; > if(firstRowIndex<0){ > firstRowIndex = 0; > } > return null; > } > > } > [/code] > > > Here are the relevant snippets from my JSPs: > > [code] > <h:dataTable id="protidedatatable" > first="#{Protide01pManagedBean.firstRowIndex}" > rows="#{Protide01pManagedBean.numberOfRows }" > value="#{Protide01pManagedBean.lines}" var="line" styleClass="table" > headerClass="th" columnClasses="td" rowClasses="whiteRow,greyRow" > width="100%" binding="#{ ContractManagedBean.protide01p}"> > > ... > > > <h:commandButton value="previous" immediate="true" > action="#{Protide01pManagedBean.scrollPrevious}"/> > <h:commandButton value="next" immediate="true" action="#{ > Protide01pManagedBean.scrollNext}"/> > [/code] > > I am at a loss on how to proceed in order to make it work. > > Can anyone help please? > > Thanks in advance, > > Julien. > >

