The class UICellSetTable will implement the
renderer independent part of the cellSetTable Facelet
tag. Extends from UIComponentBase and implements NamingContainer.
It must have three children components, one
for each cellSetTable area (column axis, row axis and data cells). This class specializes
the processDecodes(), processValidators() and processUpdates() methods to call setCurrentArea to establish de proper area before calling the corresponding method
on each children.
This class also specializes getClientId to create
area independent identifiers for child controls. It specializes queueEvent to wrap
any bubbled up event with a wrapper event identifying the area where the event
was produced. Specializes broadcastEvent to unwrap any wrapped event and set the current area before
dispatching it.
The classes UICellSetAxis and UICellSetCells will
implement the renderer independent part of the children of UICellSetTable: the
former will implement the components for both query axis (rows and columns) and
the later will implement the table of data cells.
Both classes have a setCellIndex method
that parallel the setRowIndex method of the standard component UIData; saves the state of the
current cell and sets the cell (i,j) as the current cell. The meaning of cell
depends on the component class:
·
For UICellSetCells it’s the CellSet data cell cs.getCell(Arrays.asList(j,i)), where cs is the CellSet bound to the component.
·
For UICellSetAxis it’s the i-esim member at position j csa.getPositions().get(i).getMembers().get(j) where csa is the CellSetAxis instance bound to the component.
As the UIData component these classes specialize
the processDecodes, processValidators and processUpdates to iterate over every cell in its bound data set and call setCellIndex before
call the corresponding method on its children.
So, our Facelet sample in the previous post
must be slightly modified to fit into this design
<olap:cellSetTable
value=”…”>
<olap:cellSetAxis for=”columns” var=”m”>
<f:facet name=”header”>
…
</f:facet>
…
</olap:cellSetAxis>
<olap:cellSetAxis for=”rows” var=”m”>
<f:facet name=”header”>
…
</f:facet>
…
</olap:cellSetAxis>
<olap:cellSetCells var=”cell”>
…
</olap:cellSetCells>
</olap:cellSetTable>