}
/* Process the marker children. */
for (int i = getProgress(); i < this.table.qtyMarkerChildren();
i++) {
final Fo fo = this.table.getChildAt(i);
if (fo instanceof Marker) {
final MarkerPL markerPL = (MarkerPL) getLayoutProxy(fo);
markerPL.layout(areaNode, graftingPoint);
this.setProgress(i);
} else {
throw new AreaTreeException("Marker object expected.");
}
}
}
/* For now, we bail out if the columns widths are not specified. */
if (this.table.numberOfColumns() == 0) {
getLayout().getLogger().warn("Current implementation of tables "
+ "requires a table-column for each column, "
+ "indicating column-width: "
+ this.table.getContextMessage());
return Status.OK;
}
final TableArea tableArea = bcArea.makeTableArea(this.table,
graftingPoint);
Status status = null;
/* Process the table header if we are on the first page/column, or if
* we are not to omit at breaks. */
if (tableArea.isFirstChildOfGeneratedBy()
|| ! this.table.traitTableOmitHeaderAtBreak(tableArea)) {
status = layoutTableHeader(tableArea, graftingPoint);
if (status.isIncomplete()) {
this.resetAll(tableArea);
return Status.AREA_FULL_NONE;
}
}
/* See if the table footer will fit.
* We don't really want the footer to come before the body, but the
* AreaTree is responsible to keep the order and position of the
* Areas correct. */
status = layoutTableFooter(tableArea, graftingPoint);
if (status.isIncomplete()) {
this.resetAll(tableArea);
return Status.AREA_FULL_NONE;
}
/* Process the table body(s). */
for (int i = getProgress(); i < this.table.getChildCount(); i++) {
final Fo fo = this.table.getChildAt(i);
if (fo instanceof TableBody) {
status = getLayoutProxy(fo).layout(tableArea,
graftingPoint);
if (status.isIncomplete()) {
setProgress(i);