public override Status Layout(Area area, Region region) { int numChildren = this.children.Count; string regionClass = "none"; if (region != null) { regionClass = region.GetRegionClass(); } else { if (GetFlowName().Equals("xsl-region-before")) { regionClass = RegionBefore.REGION_CLASS; } else if (GetFlowName().Equals("xsl-region-after")) { regionClass = RegionAfter.REGION_CLASS; } else if (GetFlowName().Equals("xsl-region-start")) { regionClass = RegionStart.REGION_CLASS; } else if (GetFlowName().Equals("xsl-region-end")) { regionClass = RegionEnd.REGION_CLASS; } } if (area is AreaContainer) { ((AreaContainer)area).setAreaName(regionClass); } area.setAbsoluteHeight(0); SetContentWidth(area.getContentWidth()); for (int i = 0; i < numChildren; i++) { FObj fo = (FObj)children[i]; Status status; if ((status = fo.Layout(area)).isIncomplete()) { FonetDriver.ActiveDriver.FireFonetWarning( "Some static content could not fit in the area."); this.marker = i; if ((i != 0) && (status.getCode() == Status.AREA_FULL_NONE)) { status = new Status(Status.AREA_FULL_SOME); } return (status); } } ResetMarker(); return new Status(Status.OK); }
private void DoFrame(Area area) { int w, h; int rx = this.currentAreaContainerXPosition; w = area.getContentWidth(); if (area is BlockArea) { rx += ((BlockArea) area).getStartIndent(); } h = area.getContentHeight(); int ry = this.currentYPosition; rx = rx - area.getPaddingLeft(); ry = ry + area.getPaddingTop(); w = w + area.getPaddingLeft() + area.getPaddingRight(); h = h + area.getPaddingTop() + area.getPaddingBottom(); DoBackground(area, rx, ry, w, h); BorderAndPadding bp = area.GetBorderAndPadding(); int left = area.getBorderLeftWidth(); int right = area.getBorderRightWidth(); int top = area.getBorderTopWidth(); int bottom = area.getBorderBottomWidth(); // If style is solid, use filled rectangles if (top != 0) { AddFilledRect(rx, ry, w, top, new PdfColor(bp.getBorderColor(BorderAndPadding.TOP))); } if (left != 0) { AddFilledRect(rx - left, ry - h - bottom, left, h + top + bottom, new PdfColor(bp.getBorderColor(BorderAndPadding.LEFT))); } if (right != 0) { AddFilledRect(rx + w, ry - h - bottom, right, h + top + bottom, new PdfColor(bp.getBorderColor(BorderAndPadding.RIGHT))); } if (bottom != 0) { AddFilledRect(rx, ry - h - bottom, w, bottom, new PdfColor(bp.getBorderColor(BorderAndPadding.BOTTOM))); } }
public override Status Layout(Area area) { if (this.marker == MarkerBreakAfter) { return new Status(Status.OK); } if (this.marker == MarkerStart) { AccessibilityProps mAccProps = propMgr.GetAccessibilityProps(); AuralProps mAurProps = propMgr.GetAuralProps(); BorderAndPadding bap = propMgr.GetBorderAndPadding(); BackgroundProps bProps = propMgr.GetBackgroundProps(); RelativePositionProps mRelProps = propMgr.GetRelativePositionProps(); this.spaceBefore = this.properties.GetProperty("space-before.optimum").GetLength().MValue(); this.spaceAfter = this.properties.GetProperty("space-after.optimum").GetLength().MValue(); this.id = this.properties.GetProperty("id").GetString(); try { area.getIDReferences().CreateID(id); } catch (FonetException e) { throw e; } if (area is BlockArea) { area.end(); } if (rowSpanMgr == null) { rowSpanMgr = new RowSpanMgr(columns.Count); } this.marker = 0; } if ((spaceBefore != 0) && (this.marker == 0)) { area.increaseHeight(spaceBefore); } if (marker == 0) { area.getIDReferences().ConfigureID(id, area); } int spaceLeft = area.spaceLeft(); this.areaContainer = new AreaContainer(propMgr.GetFontState(area.getFontInfo()), 0, area.getContentHeight(), area.getContentWidth(), area.spaceLeft(), Position.RELATIVE); areaContainer.foCreator = this; areaContainer.setPage(area.getPage()); areaContainer.setParent(area); areaContainer.setBackground(propMgr.GetBackgroundProps()); areaContainer.setBorderAndPadding(propMgr.GetBorderAndPadding()); areaContainer.start(); areaContainer.setAbsoluteHeight(area.getAbsoluteHeight()); areaContainer.setIDReferences(area.getIDReferences()); Hashtable keepWith = new Hashtable(); int numChildren = this.children.Count; TableRow lastRow = null; bool endKeepGroup = true; for (int i = this.marker; i < numChildren; i++) { Object child = children[i]; if (child is Marker) { ((Marker)child).Layout(area); continue; } if (!(child is TableRow)) { throw new FonetException("Currently only Table Rows are supported in table body, header and footer"); } TableRow row = (TableRow)child; row.SetRowSpanMgr(rowSpanMgr); row.SetColumns(columns); row.DoSetup(areaContainer); if ((row.GetKeepWithPrevious().GetKeepType() != KeepValue.KEEP_WITH_AUTO || row.GetKeepWithNext().GetKeepType() != KeepValue.KEEP_WITH_AUTO || row.GetKeepTogether().GetKeepType() != KeepValue.KEEP_WITH_AUTO) && lastRow != null && !keepWith.Contains(lastRow)) { keepWith.Add(lastRow, null); } else { if (endKeepGroup && keepWith.Count > 0) { keepWith = new Hashtable(); } if (endKeepGroup && i > this.marker) { rowSpanMgr.SetIgnoreKeeps(false); } } bool bRowStartsArea = (i == this.marker); if (bRowStartsArea == false && keepWith.Count > 0) { if (children.IndexOf(keepWith[0]) == this.marker) { bRowStartsArea = true; } } row.setIgnoreKeepTogether(bRowStartsArea && startsAC(area)); Status status = row.Layout(areaContainer); if (status.isIncomplete()) { if (status.isPageBreak()) { this.marker = i; area.addChild(areaContainer); area.increaseHeight(areaContainer.GetHeight()); if (i == numChildren - 1) { this.marker = MarkerBreakAfter; if (spaceAfter != 0) { area.increaseHeight(spaceAfter); } } return status; } if ((keepWith.Count > 0) && (!rowSpanMgr.IgnoreKeeps())) { row.RemoveLayout(areaContainer); foreach (TableRow tr in keepWith.Keys) { tr.RemoveLayout(areaContainer); i--; } if (i == 0) { ResetMarker(); rowSpanMgr.SetIgnoreKeeps(true); return new Status(Status.AREA_FULL_NONE); } } this.marker = i; if ((i != 0) && (status.getCode() == Status.AREA_FULL_NONE)) { status = new Status(Status.AREA_FULL_SOME); } if (!((i == 0) && (areaContainer.getContentHeight() <= 0))) { area.addChild(areaContainer); area.increaseHeight(areaContainer.GetHeight()); } rowSpanMgr.SetIgnoreKeeps(true); return status; } else if (status.getCode() == Status.KEEP_WITH_NEXT || rowSpanMgr.HasUnfinishedSpans()) { keepWith.Add(row, null); endKeepGroup = false; } else { endKeepGroup = true; } lastRow = row; area.setMaxHeight(area.getMaxHeight() - spaceLeft + this.areaContainer.getMaxHeight()); spaceLeft = area.spaceLeft(); } area.addChild(areaContainer); areaContainer.end(); area.increaseHeight(areaContainer.GetHeight()); if (spaceAfter != 0) { area.increaseHeight(spaceAfter); area.setMaxHeight(area.getMaxHeight() - spaceAfter); } if (area is BlockArea) { area.start(); } return new Status(Status.OK); }
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); } }