public void RenderAreaContainer(AreaContainer area) { int saveY = this.currentYPosition; int saveX = this.currentAreaContainerXPosition; if (area.getPosition() == Position.ABSOLUTE) { // XPosition and YPosition give the content rectangle position this.currentYPosition = area.GetYPosition(); this.currentAreaContainerXPosition = area.getXPosition(); } else if (area.getPosition() == Position.RELATIVE) { this.currentYPosition -= area.GetYPosition(); this.currentAreaContainerXPosition += area.getXPosition(); } else if (area.getPosition() == Position.STATIC) { this.currentYPosition -= area.getPaddingTop() + area.getBorderTopWidth(); } this.currentXPosition = this.currentAreaContainerXPosition; DoFrame(area); foreach (Box b in area.getChildren()) { b.render(this); } // Restore previous origin this.currentYPosition = saveY; this.currentAreaContainerXPosition = saveX; if (area.getPosition() == Position.STATIC) { this.currentYPosition -= area.GetHeight(); } }
public override Status Layout(Area area) { if (this.marker == MarkerBreakAfter) { return new Status(Status.OK); } if (this.marker == MarkerStart) { if (!setup) { DoSetup(area); } if (cellArray == null) { InitCellArray(); area.getIDReferences().CreateID(id); } this.marker = 0; int breakStatus = propMgr.CheckBreakBefore(area); if (breakStatus != Status.OK) { return new Status(breakStatus); } } if (marker == 0) { area.getIDReferences().ConfigureID(id, area); } int spaceLeft = area.spaceLeft(); this.areaContainer = new AreaContainer(propMgr.GetFontState(area.getFontInfo()), 0, 0, area.getContentWidth(), spaceLeft, Position.RELATIVE); areaContainer.foCreator = this; areaContainer.setPage(area.getPage()); areaContainer.setParent(area); areaContainer.setBackground(propMgr.GetBackgroundProps()); areaContainer.start(); areaContainer.setAbsoluteHeight(area.getAbsoluteHeight()); areaContainer.setIDReferences(area.getIDReferences()); largestCellHeight = minHeight; bool someCellDidNotLayoutCompletely = false; int offset = 0; int iColIndex = 0; foreach (TableColumn tcol in columns) { TableCell cell; ++iColIndex; int colWidth = tcol.GetColumnWidth(); if (cellArray.GetCellType(iColIndex) == CellArray.CELLSTART) { cell = cellArray.GetCell(iColIndex); } else { if (rowSpanMgr.IsInLastRow(iColIndex)) { int h = rowSpanMgr.GetRemainingHeight(iColIndex); if (h > largestCellHeight) { largestCellHeight = h; } } offset += colWidth; continue; } cell.SetStartOffset(offset); offset += colWidth; int rowSpan = cell.GetNumRowsSpanned(); Status status; if ((status = cell.Layout(areaContainer)).isIncomplete()) { if ((keepTogether.GetKeepType() == KeepValue.KEEP_WITH_ALWAYS) || (status.getCode() == Status.AREA_FULL_NONE) || rowSpan > 1) { this.ResetMarker(); this.RemoveID(area.getIDReferences()); return new Status(Status.AREA_FULL_NONE); } else if (status.getCode() == Status.AREA_FULL_SOME) { someCellDidNotLayoutCompletely = true; } } int hi = cell.GetHeight(); if (rowSpan > 1) { rowSpanMgr.AddRowSpan(cell, iColIndex, cell.GetNumColumnsSpanned(), hi, rowSpan); } else if (hi > largestCellHeight) { largestCellHeight = hi; } } area.setMaxHeight(area.getMaxHeight() - spaceLeft + this.areaContainer.getMaxHeight()); for (int iCol = 1; iCol <= columns.Count; iCol++) { if (cellArray.GetCellType(iCol) == CellArray.CELLSTART && rowSpanMgr.IsSpanned(iCol) == false) { cellArray.GetCell(iCol).SetRowHeight(largestCellHeight); } } rowSpanMgr.FinishRow(largestCellHeight); area.addChild(areaContainer); areaContainer.SetHeight(largestCellHeight); areaAdded = true; areaContainer.end(); area.addDisplaySpace(largestCellHeight + areaContainer.getPaddingTop() + areaContainer.getBorderTopWidth() + areaContainer.getPaddingBottom() + areaContainer.getBorderBottomWidth()); if (someCellDidNotLayoutCompletely) { return new Status(Status.AREA_FULL_SOME); } else { if (rowSpanMgr.HasUnfinishedSpans()) { return new Status(Status.KEEP_WITH_NEXT); } if (breakAfter == BreakAfter.PAGE) { this.marker = MarkerBreakAfter; return new Status(Status.FORCE_PAGE_BREAK); } if (breakAfter == BreakAfter.ODD_PAGE) { this.marker = MarkerBreakAfter; return new Status(Status.FORCE_PAGE_BREAK_ODD); } if (breakAfter == BreakAfter.EVEN_PAGE) { this.marker = MarkerBreakAfter; return new Status(Status.FORCE_PAGE_BREAK_EVEN); } if (breakAfter == BreakAfter.COLUMN) { this.marker = MarkerBreakAfter; return new Status(Status.FORCE_COLUMN_BREAK); } if (keepWithNext.GetKeepType() != KeepValue.KEEP_WITH_AUTO) { return new Status(Status.KEEP_WITH_NEXT); } return new Status(Status.OK); } }