protected boolean startTableCellBox(final TableCellRenderBox box) {
    if (currentTable == null) {
      return false;
    }
    if (currentTable.getSectionRenderBox() == null) {
      return false;
    }
    final int rowSpan = box.getRowSpan();
    final int colSpan = box.getColSpan();

    final int startPos = currentTable.increaseCellPosition(colSpan, rowSpan);
    while (currentTable.columnModel.getColumnCount() <= startPos) {
      currentTable.columnModel.addAutoColumn();
    }

    box.setColumnIndex(startPos);
    box.setBodySection(currentTable.isBodySection());

    final BoxDefinition boxDefinition = box.getBoxDefinition();
    final long preferredHeight = boxDefinition.getPreferredHeight().resolve(0);
    final long minHeight = boxDefinition.getMinimumHeight().resolve(0);
    final long maxHeight = boxDefinition.getMaximumHeight().resolve(0, MAX_AUTO);

    final long preferredSize = ProcessUtility.computeLength(minHeight, maxHeight, preferredHeight);
    currentTable.updateDefinedSize(rowSpan, preferredSize);
    return true;
  }
  protected boolean startTableRowBox(final TableRowRenderBox box) {
    if (currentTable == null) {
      return false;
    }
    if (currentTable.getSectionRenderBox() == null) {
      return false;
    }

    currentTable.resetCellPosition();
    box.setBodySection(currentTable.isBodySection());

    // check if this is the first row ...
    if (currentTable.rowCount == -1) {
      if (box.getRowIndex() != -1) {
        currentTable.rowCount = box.getRowIndex();
        return true;
      }
    }

    currentTable.rowCount += 1;
    box.setRowIndex(currentTable.rowCount);
    if (currentTable.rowCount <= currentTable.rowModel.getRowCount()) {
      currentTable.rowModel.addRow();
    }
    return true;
  }
  protected boolean startTableSectionBox(final TableSectionRenderBox box) {
    if (currentTable == null) {
      return false;
    }
    if (currentTable.getSectionRenderBox() != null) {
      return true;
    }

    currentTable.setSectionRenderBox(box);
    box.getRowModel().initialize(currentTable.getTable());
    return true;
  }
  protected void finishTableBox(final TableRenderBox table) {
    final long changeTracker = table.getChangeTracker();
    final long age = table.getTableValidationAge();
    if (changeTracker == age) {
      return;
    }

    //  currentTable.columnModel.validateSizes(table);
    table.setTableValidationAge(age);
    table.setPredefinedColumnsValidated(true);
    currentTable = currentTable.pop();
  }
  protected void finishTableSectionBox(final TableSectionRenderBox box) {
    if (currentTable == null) {
      return;
    }
    if (currentTable.getSectionRenderBox() != box) {
      return;
    }

    final IntList rowSpans = currentTable.rowSpans;
    int missingRows = 0;
    for (int i = 0; i < rowSpans.size(); i++) {
      final int value = rowSpans.get(i);
      if (missingRows < value) {
        missingRows = value;
      }
    }

    for (int i = 0; i < missingRows; i += 1) {
      currentTable.rowModel.addRow();
    }

    box.getRowModel().validateSizes(box);
    currentTable.setSectionRenderBox(null);
  }
  protected void finishTableRowBox(final TableRowRenderBox box) {
    if (currentTable == null) {
      return;
    }
    if (currentTable.getSectionRenderBox() == null) {
      return;
    }

    final IntList rowSpans = currentTable.rowSpans;
    int maxRowSpan = 0;
    for (int i = 0; i < rowSpans.size(); i++) {
      final int value = rowSpans.get(i);
      maxRowSpan = Math.max(maxRowSpan, value);
    }

    for (int i = 0; i < rowSpans.size(); i++) {
      final int value = rowSpans.get(i);
      rowSpans.set(i, Math.max(0, value - 1));
    }
  }