For a simple way of testing this, I edited the component-showcase's dataTable-dataScrolling.jspx, and inserted two lines. This way, using the dataPaginator, I could change the dataTable's first property, which would then properly test the varStatus fields.
<ice:dataTable id="data"
var="employee"
>>>>> varStatus="markVarStatus"
value="#
{dataScrollingModel.employees}
"
rows="#
{dataScrollingModel.selectedDataScrollModes[dataScrollingModel.selectedDataScrollMode].rows}
"
scrollable="#
{dataScrollingModel.selectedDataScrollModes[dataScrollingModel.selectedDataScrollMode].scrollingEnabled}
"
scrollHeight="250px"
style="float:left"
columnWidths="100px,100px,100px,100px"
styleClass="dataPaginatorDataTable"
cellpadding="0">
<ice:column>
<f:facet name="header">
<ice:outputText id="column1"
value="#
{msgs['page.dataTable.column1']}
"/>
</f:facet>
<ice:outputText id="number"
value="#
{employee.id}
"/>
>>>>> <ice:outputText value="first: #
{markVarStatus.first}
last: #
{markVarStatus.last}
begin: #
{markVarStatus.begin}
end: #
{markVarStatus.end}
index: #
{markVarStatus.index}
"/>
</ice:column>
The Facelets c:forEach varStatus docs:
Variable to bind an Object that describes the current indexed state. The Object has the following properties: first[boolean], last[boolean], begin[int], end[int], index[int], step[int].
Since PanelSeries is a UIData, it has "first", "rows", and "rowIndex", with no concept of stepping. One complication is that, while we theoretically can calculate what the last row will be, from the "first" and "rows" values, isRowAvailable() may return false in any intervening row, ending the iteration. So, accurate values for "end" and "last" is not something that can be guaranteed, without scanning ahead, which isn't really an option with the limitations of paged data models and UIData iteration overhead. Still, in typical cases, we could provide those.