public void SetLayout(LayoutResult layout) { }
public override void AddChild(IRenderer renderer) { LayoutTaggingHelper taggingHelper = this.GetProperty <LayoutTaggingHelper>(Property.TAGGING_HELPER); if (taggingHelper != null) { LayoutTaggingHelper.AddTreeHints(taggingHelper, renderer); } // Some positioned renderers might have been fetched from non-positioned child and added to this renderer, // so we use this generic mechanism of determining which renderers have been just added. int numberOfChildRenderers = childRenderers.Count; int numberOfPositionedChildRenderers = positionedRenderers.Count; base.AddChild(renderer); IList <IRenderer> addedRenderers = new List <IRenderer>(1); IList <IRenderer> addedPositionedRenderers = new List <IRenderer>(1); while (childRenderers.Count > numberOfChildRenderers) { addedRenderers.Add(childRenderers[numberOfChildRenderers]); childRenderers.JRemoveAt(numberOfChildRenderers); } while (positionedRenderers.Count > numberOfPositionedChildRenderers) { addedPositionedRenderers.Add(positionedRenderers[numberOfPositionedChildRenderers]); positionedRenderers.JRemoveAt(numberOfPositionedChildRenderers); } bool marginsCollapsingEnabled = true.Equals(GetPropertyAsBoolean(Property.COLLAPSING_MARGINS)); if (currentArea == null) { UpdateCurrentAndInitialArea(null); if (marginsCollapsingEnabled) { marginsCollapseHandler = new MarginsCollapseHandler(this, null); } } // Static layout for (int i = 0; currentArea != null && i < addedRenderers.Count; i++) { renderer = addedRenderers[i]; bool rendererIsFloat = FloatingHelper.IsRendererFloating(renderer); bool clearanceOverflowsToNextPage = FloatingHelper.IsClearanceApplied(waitingNextPageRenderers, renderer.GetProperty <ClearPropertyValue?>(Property.CLEAR)); if (rendererIsFloat && (floatOverflowedCompletely || clearanceOverflowsToNextPage)) { waitingNextPageRenderers.Add(renderer); floatOverflowedCompletely = true; continue; } ProcessWaitingKeepWithNextElement(renderer); IList <IRenderer> resultRenderers = new List <IRenderer>(); LayoutResult result = null; RootLayoutArea storedArea = null; RootLayoutArea nextStoredArea = null; MarginsCollapseInfo childMarginsInfo = null; if (marginsCollapsingEnabled && currentArea != null && renderer != null) { childMarginsInfo = marginsCollapseHandler.StartChildMarginsHandling(renderer, currentArea.GetBBox()); } while (clearanceOverflowsToNextPage || currentArea != null && renderer != null && (result = renderer.SetParent (this).Layout(new LayoutContext(currentArea.Clone(), childMarginsInfo, floatRendererAreas))).GetStatus () != LayoutResult.FULL) { bool currentAreaNeedsToBeUpdated = false; if (clearanceOverflowsToNextPage) { result = new LayoutResult(LayoutResult.NOTHING, null, null, renderer); currentAreaNeedsToBeUpdated = true; } if (result.GetStatus() == LayoutResult.PARTIAL) { if (rendererIsFloat) { waitingNextPageRenderers.Add(result.GetOverflowRenderer()); break; } else { ProcessRenderer(result.GetSplitRenderer(), resultRenderers); if (nextStoredArea != null) { currentArea = nextStoredArea; currentPageNumber = nextStoredArea.GetPageNumber(); nextStoredArea = null; } else { currentAreaNeedsToBeUpdated = true; } } } else { if (result.GetStatus() == LayoutResult.NOTHING && !clearanceOverflowsToNextPage) { if (result.GetOverflowRenderer() is ImageRenderer) { float imgHeight = ((ImageRenderer)result.GetOverflowRenderer()).GetOccupiedArea().GetBBox().GetHeight(); if (!floatRendererAreas.IsEmpty() || currentArea.GetBBox().GetHeight() < imgHeight && !currentArea.IsEmptyArea ()) { if (rendererIsFloat) { waitingNextPageRenderers.Add(result.GetOverflowRenderer()); floatOverflowedCompletely = true; break; } currentAreaNeedsToBeUpdated = true; } else { ((ImageRenderer)result.GetOverflowRenderer()).AutoScale(currentArea); result.GetOverflowRenderer().SetProperty(Property.FORCED_PLACEMENT, true); ILog logger = LogManager.GetLogger(typeof(RootRenderer)); logger.Warn(MessageFormatUtil.Format(iText.IO.LogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA, "")); } } else { if (currentArea.IsEmptyArea() && result.GetAreaBreak() == null) { if (true.Equals(result.GetOverflowRenderer().GetModelElement().GetProperty <bool?>(Property.KEEP_TOGETHER)) ) { result.GetOverflowRenderer().GetModelElement().SetProperty(Property.KEEP_TOGETHER, false); ILog logger = LogManager.GetLogger(typeof(RootRenderer)); logger.Warn(MessageFormatUtil.Format(iText.IO.LogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA, "KeepTogether property will be ignored." )); if (storedArea != null) { nextStoredArea = currentArea; currentArea = storedArea; currentPageNumber = storedArea.GetPageNumber(); } storedArea = currentArea; } else { if (null != result.GetCauseOfNothing() && true.Equals(result.GetCauseOfNothing().GetProperty <bool?>(Property .KEEP_TOGETHER))) { // set KEEP_TOGETHER false on the deepest parent (maybe the element itself) to have KEEP_TOGETHER == true IRenderer theDeepestKeptTogether = result.GetCauseOfNothing(); IRenderer parent; while (null == theDeepestKeptTogether.GetModelElement() || null == theDeepestKeptTogether.GetModelElement( ).GetOwnProperty <bool?>(Property.KEEP_TOGETHER)) { parent = ((AbstractRenderer)theDeepestKeptTogether).parent; if (parent == null) { break; } theDeepestKeptTogether = parent; } theDeepestKeptTogether.GetModelElement().SetProperty(Property.KEEP_TOGETHER, false); ILog logger = LogManager.GetLogger(typeof(RootRenderer)); logger.Warn(MessageFormatUtil.Format(iText.IO.LogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA, "KeepTogether property of inner element will be ignored." )); } else { if (!true.Equals(renderer.GetProperty <bool?>(Property.FORCED_PLACEMENT))) { result.GetOverflowRenderer().SetProperty(Property.FORCED_PLACEMENT, true); ILog logger = LogManager.GetLogger(typeof(RootRenderer)); logger.Warn(MessageFormatUtil.Format(iText.IO.LogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA, "")); } else { // FORCED_PLACEMENT was already set to the renderer and // LogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA message was logged. // This else-clause should never be hit, otherwise there is a bug in FORCED_PLACEMENT implementation. System.Diagnostics.Debug.Assert(false); // Still handling this case in order to avoid nasty infinite loops. break; } } } } else { storedArea = currentArea; if (nextStoredArea != null) { currentArea = nextStoredArea; currentPageNumber = nextStoredArea.GetPageNumber(); nextStoredArea = null; } else { if (rendererIsFloat) { waitingNextPageRenderers.Add(result.GetOverflowRenderer()); floatOverflowedCompletely = true; break; } currentAreaNeedsToBeUpdated = true; } } } } } renderer = result.GetOverflowRenderer(); if (marginsCollapsingEnabled) { marginsCollapseHandler.EndChildMarginsHandling(currentArea.GetBBox()); } if (currentAreaNeedsToBeUpdated) { UpdateCurrentAndInitialArea(result); } if (marginsCollapsingEnabled) { marginsCollapseHandler = new MarginsCollapseHandler(this, null); childMarginsInfo = marginsCollapseHandler.StartChildMarginsHandling(renderer, currentArea.GetBBox()); } clearanceOverflowsToNextPage = clearanceOverflowsToNextPage && FloatingHelper.IsClearanceApplied(waitingNextPageRenderers , renderer.GetProperty <ClearPropertyValue?>(Property.CLEAR)); } if (marginsCollapsingEnabled) { marginsCollapseHandler.EndChildMarginsHandling(currentArea.GetBBox()); } if (null != result && null != result.GetSplitRenderer()) { renderer = result.GetSplitRenderer(); } // Keep renderer until next element is added for future keep with next adjustments if (renderer != null && result != null) { if (true.Equals(renderer.GetProperty <bool?>(Property.KEEP_WITH_NEXT))) { if (true.Equals(renderer.GetProperty <bool?>(Property.FORCED_PLACEMENT))) { ILog logger = LogManager.GetLogger(typeof(RootRenderer)); logger.Warn(iText.IO.LogMessageConstant.ELEMENT_WAS_FORCE_PLACED_KEEP_WITH_NEXT_WILL_BE_IGNORED); ShrinkCurrentAreaAndProcessRenderer(renderer, resultRenderers, result); } else { keepWithNextHangingRenderer = renderer; keepWithNextHangingRendererLayoutResult = result; } } else { if (result.GetStatus() != LayoutResult.NOTHING) { ShrinkCurrentAreaAndProcessRenderer(renderer, resultRenderers, result); } } } } for (int i = 0; i < addedPositionedRenderers.Count; i++) { positionedRenderers.Add(addedPositionedRenderers[i]); renderer = positionedRenderers[positionedRenderers.Count - 1]; int?positionedPageNumber = renderer.GetProperty <int?>(Property.PAGE_NUMBER); if (positionedPageNumber == null) { positionedPageNumber = currentPageNumber; } LayoutArea layoutArea; // For position=absolute, if none of the top, bottom, left, right properties are provided, // the content should be displayed in the flow of the current content, not overlapping it. // The behavior is just if it would be statically positioned except it does not affect other elements if (Convert.ToInt32(LayoutPosition.ABSOLUTE).Equals(renderer.GetProperty <int?>(Property.POSITION)) && AbstractRenderer .NoAbsolutePositionInfo(renderer)) { layoutArea = new LayoutArea((int)positionedPageNumber, currentArea.GetBBox().Clone()); } else { layoutArea = new LayoutArea((int)positionedPageNumber, initialCurrentArea.GetBBox().Clone()); } Rectangle fullBbox = layoutArea.GetBBox().Clone(); PreparePositionedRendererAndAreaForLayout(renderer, fullBbox, layoutArea.GetBBox()); renderer.Layout(new PositionedLayoutContext(new LayoutArea(layoutArea.GetPageNumber(), fullBbox), layoutArea )); if (immediateFlush) { FlushSingleRenderer(renderer); positionedRenderers.JRemoveAt(positionedRenderers.Count - 1); } } }
protected internal abstract LayoutArea UpdateCurrentArea(LayoutResult overflowResult);
/* (non-Javadoc) * @see com.itextpdf.layout.renderer.DocumentRenderer#updateCurrentArea(com.itextpdf.layout.layout.LayoutResult) */ protected override LayoutArea UpdateCurrentArea(LayoutResult overflowResult) { AreaBreak areaBreak = overflowResult != null?overflowResult.GetAreaBreak() : null; if (areaBreak is HtmlPageBreak) { HtmlPageBreakType htmlPageBreakType = ((HtmlPageBreak)areaBreak).GetBreakType(); if (shouldTrimFirstBlankPagesCausedByBreakBeforeFirstElement && currentArea != null && overflowResult.GetStatus () == LayoutResult.NOTHING && currentArea.IsEmptyArea() && currentArea.GetPageNumber() == 1) { // Remove blank page that was added just to have area for elements to layout on. // Now we will add a page with dimensions and all the stuff that is requested by page-break-before document.GetPdfDocument().RemovePage(1); currentPageNumber = 0; overflowResult = null; currentArea = null; shouldTrimFirstBlankPagesCausedByBreakBeforeFirstElement = false; if (HtmlPageBreakType.LEFT.Equals(htmlPageBreakType) && !IsPageLeft(1) || HtmlPageBreakType.RIGHT.Equals(htmlPageBreakType ) && !IsPageRight(1)) { evenPagesAreLeft = !evenPagesAreLeft; } } // hack to change the "evenness" of the first page without adding an unnecessary blank page anythingAddedToCurrentArea = anythingAddedToCurrentArea || overflowResult != null && overflowResult.GetStatus () == LayoutResult.PARTIAL; if (HtmlPageBreakType.ALWAYS.Equals(htmlPageBreakType)) { LayoutArea nextArea = currentArea; if (anythingAddedToCurrentArea || currentArea == null) { nextArea = base.UpdateCurrentArea(overflowResult); } anythingAddedToCurrentArea = false; return(nextArea); } else { if (HtmlPageBreakType.LEFT.Equals(htmlPageBreakType)) { LayoutArea nextArea = currentArea; if (anythingAddedToCurrentArea || currentArea == null || !IsPageLeft(currentPageNumber)) { do { nextArea = base.UpdateCurrentArea(overflowResult); }while (!IsPageLeft(currentPageNumber)); } anythingAddedToCurrentArea = false; return(nextArea); } else { if (HtmlPageBreakType.RIGHT.Equals(htmlPageBreakType)) { LayoutArea nextArea = currentArea; if (anythingAddedToCurrentArea || currentArea == null || !IsPageRight(currentPageNumber)) { do { nextArea = base.UpdateCurrentArea(overflowResult); }while (!IsPageRight(currentPageNumber)); } anythingAddedToCurrentArea = false; return(nextArea); } } } } anythingAddedToCurrentArea = false; return(base.UpdateCurrentArea(overflowResult)); }
private void ProcessWaitingKeepWithNextElement(IRenderer renderer) { if (keepWithNextHangingRenderer != null) { LayoutArea rest = currentArea.Clone(); rest.GetBBox().SetHeight(rest.GetBBox().GetHeight() - keepWithNextHangingRendererLayoutResult.GetOccupiedArea ().GetBBox().GetHeight()); bool ableToProcessKeepWithNext = false; if (renderer.SetParent(this).Layout(new LayoutContext(rest)).GetStatus() != LayoutResult.NOTHING) { // The area break will not be introduced and we are safe to place everything as is ShrinkCurrentAreaAndProcessRenderer(keepWithNextHangingRenderer, new List <IRenderer>(), keepWithNextHangingRendererLayoutResult ); ableToProcessKeepWithNext = true; } else { float originalElementHeight = keepWithNextHangingRendererLayoutResult.GetOccupiedArea().GetBBox().GetHeight (); IList <float> trySplitHeightPoints = new List <float>(); float delta = 35; for (int i = 1; i <= 5 && originalElementHeight - delta * i > originalElementHeight / 2; i++) { trySplitHeightPoints.Add(originalElementHeight - delta * i); } for (int i = 0; i < trySplitHeightPoints.Count && !ableToProcessKeepWithNext; i++) { float curElementSplitHeight = trySplitHeightPoints[i]; RootLayoutArea firstElementSplitLayoutArea = (RootLayoutArea)currentArea.Clone(); firstElementSplitLayoutArea.GetBBox().SetHeight(curElementSplitHeight).MoveUp(currentArea.GetBBox().GetHeight () - curElementSplitHeight); LayoutResult firstElementSplitLayoutResult = keepWithNextHangingRenderer.SetParent(this).Layout(new LayoutContext (firstElementSplitLayoutArea.Clone())); if (firstElementSplitLayoutResult.GetStatus() == LayoutResult.PARTIAL) { RootLayoutArea storedArea = currentArea; UpdateCurrentAndInitialArea(firstElementSplitLayoutResult); LayoutResult firstElementOverflowLayoutResult = firstElementSplitLayoutResult.GetOverflowRenderer().Layout (new LayoutContext(currentArea.Clone())); if (firstElementOverflowLayoutResult.GetStatus() == LayoutResult.FULL) { LayoutArea secondElementLayoutArea = currentArea.Clone(); secondElementLayoutArea.GetBBox().SetHeight(secondElementLayoutArea.GetBBox().GetHeight() - firstElementOverflowLayoutResult .GetOccupiedArea().GetBBox().GetHeight()); LayoutResult secondElementLayoutResult = renderer.SetParent(this).Layout(new LayoutContext(secondElementLayoutArea )); if (secondElementLayoutResult.GetStatus() != LayoutResult.NOTHING) { ableToProcessKeepWithNext = true; currentArea = firstElementSplitLayoutArea; currentPageNumber = firstElementSplitLayoutArea.GetPageNumber(); ShrinkCurrentAreaAndProcessRenderer(firstElementSplitLayoutResult.GetSplitRenderer(), new List <IRenderer>( ), firstElementSplitLayoutResult); UpdateCurrentAndInitialArea(firstElementSplitLayoutResult); ShrinkCurrentAreaAndProcessRenderer(firstElementSplitLayoutResult.GetOverflowRenderer(), new List <IRenderer >(), firstElementOverflowLayoutResult); } } if (!ableToProcessKeepWithNext) { currentArea = storedArea; currentPageNumber = storedArea.GetPageNumber(); } } } } if (!ableToProcessKeepWithNext && !currentArea.IsEmptyArea()) { RootLayoutArea storedArea = currentArea; UpdateCurrentAndInitialArea(null); LayoutResult firstElementLayoutResult = keepWithNextHangingRenderer.SetParent(this).Layout(new LayoutContext (currentArea.Clone())); if (firstElementLayoutResult.GetStatus() == LayoutResult.FULL) { LayoutArea secondElementLayoutArea = currentArea.Clone(); secondElementLayoutArea.GetBBox().SetHeight(secondElementLayoutArea.GetBBox().GetHeight() - firstElementLayoutResult .GetOccupiedArea().GetBBox().GetHeight()); LayoutResult secondElementLayoutResult = renderer.SetParent(this).Layout(new LayoutContext(secondElementLayoutArea )); if (secondElementLayoutResult.GetStatus() != LayoutResult.NOTHING) { ableToProcessKeepWithNext = true; ShrinkCurrentAreaAndProcessRenderer(keepWithNextHangingRenderer, new List <IRenderer>(), keepWithNextHangingRendererLayoutResult ); } } if (!ableToProcessKeepWithNext) { currentArea = storedArea; currentPageNumber = storedArea.GetPageNumber(); } } if (!ableToProcessKeepWithNext) { ILog logger = LogManager.GetLogger(typeof(RootRenderer)); logger.Warn(iText.IO.LogMessageConstant.RENDERER_WAS_NOT_ABLE_TO_PROCESS_KEEP_WITH_NEXT); ShrinkCurrentAreaAndProcessRenderer(keepWithNextHangingRenderer, new List <IRenderer>(), keepWithNextHangingRendererLayoutResult ); } keepWithNextHangingRenderer = null; keepWithNextHangingRendererLayoutResult = null; } }
public void SetLayout(LayoutResult layout) { // NOP }
// TODO underlying should not be applied // https://jira.itextsupport.com/browse/SUP-952 public override LayoutResult Layout(LayoutContext layoutContext) { if (!HasOwnProperty(Property.LIST_SYMBOLS_INITIALIZED)) { IList <IRenderer> symbolRenderers = new List <IRenderer>(); int listItemNum = (int)this.GetProperty <int?>(Property.LIST_START, 1); for (int i = 0; i < childRenderers.Count; i++) { if (childRenderers[i].GetModelElement() is ListItem) { childRenderers[i].SetParent(this); IRenderer currentSymbolRenderer = MakeListSymbolRenderer(listItemNum++, childRenderers[i]); childRenderers[i].SetParent(null); symbolRenderers.Add(currentSymbolRenderer); LayoutResult listSymbolLayoutResult = currentSymbolRenderer.SetParent(this).Layout(layoutContext); currentSymbolRenderer.SetParent(null); if (listSymbolLayoutResult.GetStatus() != LayoutResult.FULL) { return(new LayoutResult(LayoutResult.NOTHING, null, null, this, listSymbolLayoutResult.GetCauseOfNothing() )); } } } float maxSymbolWidth = 0; foreach (IRenderer symbolRenderer in symbolRenderers) { maxSymbolWidth = Math.Max(maxSymbolWidth, symbolRenderer.GetOccupiedArea().GetBBox().GetWidth()); } float?symbolIndent = modelElement.GetProperty <float?>(Property.LIST_SYMBOL_INDENT); listItemNum = 0; foreach (IRenderer childRenderer in childRenderers) { childRenderer.DeleteOwnProperty(Property.MARGIN_LEFT); childRenderer.SetProperty(Property.MARGIN_LEFT, childRenderer.GetProperty(Property.MARGIN_LEFT, (float?)0f ) + maxSymbolWidth + (symbolIndent != null ? symbolIndent : 0f)); if (childRenderer.GetModelElement() is ListItem) { IRenderer symbolRenderer_1 = symbolRenderers[listItemNum++]; ((ListItemRenderer)childRenderer).AddSymbolRenderer(symbolRenderer_1, maxSymbolWidth); } } } LayoutResult result = base.Layout(layoutContext); // cannot place even the first ListItemRenderer if (true.Equals(GetPropertyAsBoolean(Property.FORCED_PLACEMENT)) && null != result.GetCauseOfNothing()) { if (LayoutResult.FULL == result.GetStatus()) { result = CorrectListSplitting(this, null, result.GetCauseOfNothing(), result.GetOccupiedArea()); } else { if (LayoutResult.PARTIAL == result.GetStatus()) { result = CorrectListSplitting(result.GetSplitRenderer(), result.GetOverflowRenderer(), result.GetCauseOfNothing (), result.GetOccupiedArea()); } } } return(result); }
/* (non-Javadoc) * @see com.itextpdf.layout.renderer.BlockRenderer#layout(com.itextpdf.layout.layout.LayoutContext) */ public override LayoutResult Layout(LayoutContext layoutContext) { childRenderers.Clear(); flatRenderer = null; float parentWidth = layoutContext.GetArea().GetBBox().GetWidth(); float parentHeight = layoutContext.GetArea().GetBBox().GetHeight(); IRenderer renderer = CreateFlatRenderer(); renderer.SetProperty(Property.OVERFLOW_X, OverflowPropertyValue.VISIBLE); renderer.SetProperty(Property.OVERFLOW_Y, OverflowPropertyValue.VISIBLE); AddChild(renderer); Rectangle bBox = layoutContext.GetArea().GetBBox().Clone().MoveDown(INF - parentHeight).SetHeight(INF); layoutContext.GetArea().SetBBox(bBox); LayoutResult result = base.Layout(layoutContext); if (!true.Equals(GetPropertyAsBoolean(Property.FORCED_PLACEMENT)) && (result.GetStatus() != LayoutResult.FULL )) { //@TODO investigate this tricky code a little more. FloatPropertyValue?floatPropertyValue = this.GetProperty <FloatPropertyValue?>(Property.FLOAT); if (floatPropertyValue == null || floatPropertyValue == FloatPropertyValue.NONE) { SetProperty(Property.FORCED_PLACEMENT, true); } else { flatRenderer = childRenderers[0]; ProcessLangAttribute(); childRenderers.Clear(); childRenderers.Add(flatRenderer); AdjustFieldLayout(layoutContext); if (IsLayoutBasedOnFlatRenderer()) { Rectangle fBox = flatRenderer.GetOccupiedArea().GetBBox(); occupiedArea.GetBBox().SetX(fBox.GetX()).SetY(fBox.GetY()).SetWidth(fBox.GetWidth()).SetHeight(fBox.GetHeight ()); ApplyPaddings(occupiedArea.GetBBox(), true); ApplyBorderBox(occupiedArea.GetBBox(), true); ApplyMargins(occupiedArea.GetBBox(), true); } } return(new MinMaxWidthLayoutResult(LayoutResult.NOTHING, occupiedArea, null, this, this).SetMinMaxWidth(new MinMaxWidth())); } if (!childRenderers.IsEmpty()) { flatRenderer = childRenderers[0]; ProcessLangAttribute(); childRenderers.Clear(); childRenderers.Add(flatRenderer); AdjustFieldLayout(layoutContext); if (IsLayoutBasedOnFlatRenderer()) { Rectangle fBox = flatRenderer.GetOccupiedArea().GetBBox(); occupiedArea.GetBBox().SetX(fBox.GetX()).SetY(fBox.GetY()).SetWidth(fBox.GetWidth()).SetHeight(fBox.GetHeight ()); ApplyPaddings(occupiedArea.GetBBox(), true); ApplyBorderBox(occupiedArea.GetBBox(), true); ApplyMargins(occupiedArea.GetBBox(), true); } } else { LogManager.GetLogger(GetType()).Error(iText.Html2pdf.LogMessageConstant.ERROR_WHILE_LAYOUT_OF_FORM_FIELD); occupiedArea.GetBBox().SetWidth(0).SetHeight(0); } if (!true.Equals(GetPropertyAsBoolean(Property.FORCED_PLACEMENT)) && !IsRendererFit(parentWidth, parentHeight )) { occupiedArea.GetBBox().SetWidth(0).SetHeight(0); return(new MinMaxWidthLayoutResult(LayoutResult.NOTHING, occupiedArea, null, this, this).SetMinMaxWidth(new MinMaxWidth())); } if (result.GetStatus() != LayoutResult.FULL || !IsRendererFit(parentWidth, parentHeight)) { LogManager.GetLogger(GetType()).Warn(iText.Html2pdf.LogMessageConstant.INPUT_FIELD_DOES_NOT_FIT); } return(new MinMaxWidthLayoutResult(LayoutResult.FULL, occupiedArea, this, null).SetMinMaxWidth(new MinMaxWidth (occupiedArea.GetBBox().GetWidth(), occupiedArea.GetBBox().GetWidth(), 0))); }
public override LayoutResult Layout(LayoutContext layoutContext) { LayoutResult result = base.Layout(layoutContext); return(result); }
public override void AddChild(IRenderer renderer) { base.AddChild(renderer); if (currentArea == null) { UpdateCurrentArea(null); } // Static layout if (currentArea != null && !childRenderers.IsEmpty() && childRenderers[childRenderers.Count - 1] == renderer ) { childRenderers.JRemoveAt(childRenderers.Count - 1); IList <IRenderer> resultRenderers = new List <IRenderer>(); LayoutResult result = null; LayoutArea storedArea = null; LayoutArea nextStoredArea = null; while (currentArea != null && renderer != null && (result = renderer.SetParent(this).Layout(new LayoutContext (currentArea.Clone()))).GetStatus() != LayoutResult.FULL) { if (result.GetStatus() == LayoutResult.PARTIAL) { if (result.GetOverflowRenderer() is ImageRenderer) { ((ImageRenderer)result.GetOverflowRenderer()).AutoScale(currentArea); } else { ProcessRenderer(result.GetSplitRenderer(), resultRenderers); if (nextStoredArea != null) { currentArea = nextStoredArea; currentPageNumber = nextStoredArea.GetPageNumber(); nextStoredArea = null; } else { UpdateCurrentArea(result); } } } else { if (result.GetStatus() == LayoutResult.NOTHING) { if (result.GetOverflowRenderer() is ImageRenderer) { if (currentArea.GetBBox().GetHeight() < ((ImageRenderer)result.GetOverflowRenderer()).imageHeight && !currentArea .IsEmptyArea()) { UpdateCurrentArea(result); } ((ImageRenderer)result.GetOverflowRenderer()).AutoScale(currentArea); } else { if (currentArea.IsEmptyArea() && !(renderer is AreaBreakRenderer)) { if (true.Equals(result.GetOverflowRenderer().GetModelElement().GetProperty <bool?>(Property.KEEP_TOGETHER)) ) { result.GetOverflowRenderer().GetModelElement().SetProperty(Property.KEEP_TOGETHER, false); ILogger logger = LoggerFactory.GetLogger(typeof(RootRenderer)); logger.Warn(String.Format(LogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA, "KeepTogether property will be ignored." )); if (storedArea != null) { nextStoredArea = currentArea; currentArea = storedArea; currentPageNumber = storedArea.GetPageNumber(); } storedArea = currentArea; } else { result.GetOverflowRenderer().SetProperty(Property.FORCED_PLACEMENT, true); ILogger logger = LoggerFactory.GetLogger(typeof(RootRenderer)); logger.Warn(String.Format(LogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA, "")); } renderer = result.GetOverflowRenderer(); continue; } storedArea = currentArea; if (nextStoredArea != null) { currentArea = nextStoredArea; currentPageNumber = nextStoredArea.GetPageNumber(); nextStoredArea = null; } else { UpdateCurrentArea(result); } } } } renderer = result.GetOverflowRenderer(); } if (currentArea != null) { System.Diagnostics.Debug.Assert(result != null && result.GetOccupiedArea() != null); currentArea.GetBBox().SetHeight(currentArea.GetBBox().GetHeight() - result.GetOccupiedArea().GetBBox().GetHeight ()); currentArea.SetEmptyArea(false); if (renderer != null) { ProcessRenderer(renderer, resultRenderers); } } if (!immediateFlush) { childRenderers.AddAll(resultRenderers); } } else { if (positionedRenderers.Count > 0 && positionedRenderers[positionedRenderers.Count - 1] == renderer) { int?positionedPageNumber = renderer.GetProperty <int?>(Property.PAGE_NUMBER); if (positionedPageNumber == null) { positionedPageNumber = currentPageNumber; } renderer.SetParent(this).Layout(new LayoutContext(new LayoutArea((int)positionedPageNumber, currentArea.GetBBox ().Clone()))); if (immediateFlush) { FlushSingleRenderer(renderer); positionedRenderers.JRemoveAt(positionedRenderers.Count - 1); } } } }
private LayoutResult InitializeListSymbols(LayoutContext layoutContext) { if (!HasOwnProperty(Property.LIST_SYMBOLS_INITIALIZED)) { IList <IRenderer> symbolRenderers = new List <IRenderer>(); int listItemNum = (int)this.GetProperty <int?>(Property.LIST_START, 1); for (int i = 0; i < childRenderers.Count; i++) { childRenderers[i].SetParent(this); listItemNum = (childRenderers[i].GetProperty <int?>(Property.LIST_SYMBOL_ORDINAL_VALUE) != null) ? (int)childRenderers [i].GetProperty <int?>(Property.LIST_SYMBOL_ORDINAL_VALUE) : listItemNum; IRenderer currentSymbolRenderer = MakeListSymbolRenderer(listItemNum, childRenderers[i]); if (BaseDirection.RIGHT_TO_LEFT.Equals(this.GetProperty <BaseDirection?>(Property.BASE_DIRECTION))) { currentSymbolRenderer.SetProperty(Property.BASE_DIRECTION, BaseDirection.RIGHT_TO_LEFT); } LayoutResult listSymbolLayoutResult = null; if (currentSymbolRenderer != null) { ++listItemNum; currentSymbolRenderer.SetParent(childRenderers[i]); listSymbolLayoutResult = currentSymbolRenderer.Layout(layoutContext); currentSymbolRenderer.SetParent(null); } childRenderers[i].SetParent(null); bool isForcedPlacement = true.Equals(GetPropertyAsBoolean(Property.FORCED_PLACEMENT)); bool listSymbolNotFit = listSymbolLayoutResult != null && listSymbolLayoutResult.GetStatus() != LayoutResult .FULL; // TODO DEVSIX-1001: partially not fitting list symbol not shown at all, however this might be improved if (listSymbolNotFit && isForcedPlacement) { currentSymbolRenderer = null; } symbolRenderers.Add(currentSymbolRenderer); if (listSymbolNotFit && !isForcedPlacement) { return(new LayoutResult(LayoutResult.NOTHING, null, null, this, listSymbolLayoutResult.GetCauseOfNothing() )); } } float maxSymbolWidth = 0; for (int i = 0; i < childRenderers.Count; i++) { IRenderer symbolRenderer = symbolRenderers[i]; if (symbolRenderer != null) { IRenderer listItemRenderer = childRenderers[i]; if ((ListSymbolPosition)GetListItemOrListProperty(listItemRenderer, this, Property.LIST_SYMBOL_POSITION) != ListSymbolPosition.INSIDE) { maxSymbolWidth = Math.Max(maxSymbolWidth, symbolRenderer.GetOccupiedArea().GetBBox().GetWidth()); } } } float?symbolIndent = this.GetPropertyAsFloat(Property.LIST_SYMBOL_INDENT); listItemNum = 0; foreach (IRenderer childRenderer in childRenderers) { childRenderer.SetParent(this); childRenderer.DeleteOwnProperty(Property.MARGIN_LEFT); UnitValue marginLeftUV = childRenderer.GetProperty(Property.MARGIN_LEFT, UnitValue.CreatePointValue(0f)); if (!marginLeftUV.IsPointValue()) { ILog logger = LogManager.GetLogger(typeof(iText.Layout.Renderer.ListRenderer)); logger.Error(MessageFormatUtil.Format(iText.IO.LogMessageConstant.PROPERTY_IN_PERCENTS_NOT_SUPPORTED, Property .MARGIN_LEFT)); } float calculatedMargin = marginLeftUV.GetValue(); if ((ListSymbolPosition)GetListItemOrListProperty(childRenderer, this, Property.LIST_SYMBOL_POSITION) == ListSymbolPosition .DEFAULT) { calculatedMargin += maxSymbolWidth + (float)(symbolIndent != null ? symbolIndent : 0f); } childRenderer.SetProperty(Property.MARGIN_LEFT, UnitValue.CreatePointValue(calculatedMargin)); IRenderer symbolRenderer = symbolRenderers[listItemNum++]; ((ListItemRenderer)childRenderer).AddSymbolRenderer(symbolRenderer, maxSymbolWidth); if (symbolRenderer != null) { LayoutTaggingHelper taggingHelper = this.GetProperty <LayoutTaggingHelper>(Property.TAGGING_HELPER); if (taggingHelper != null) { if (symbolRenderer is LineRenderer) { taggingHelper.SetRoleHint(symbolRenderer.GetChildRenderers()[1], StandardRoles.LBL); } else { taggingHelper.SetRoleHint(symbolRenderer, StandardRoles.LBL); } } } } } return(null); }
private void DrawElementInfo() { List <ElementAttribute> attributes = selectedElement.GetAttributes(); if (attributes != null) { DrawAttributes(attributes); } GUI.enabled = true; LayoutResult layoutResult = selectedElement.layoutResult; float labelWidth = EditorGUIUtility.labelWidth; EditorGUIUtility.labelWidth = 100; Rect contentRect = layoutResult.ContentRect; DrawLabel("Enabled", selectedElement.isEnabled.ToString()); if (selectedElement.isEnabled) { DrawLabel("Culled", selectedElement.layoutResult.isCulled.ToString()); DrawLabel("View", selectedElement.View.name); DrawLabel("Viewport", $"X: {selectedElement.View.Viewport.x}, Y: {selectedElement.View.Viewport.y}, W: {selectedElement.View.Viewport.width}, H: {selectedElement.View.Viewport.height}"); DrawVector2Value("Local Position", layoutResult.localPosition); DrawVector2Value("Screen Position", layoutResult.screenPosition); DrawVector2Value("Scale", layoutResult.scale); DrawSizeValue("Allocated Size", layoutResult.allocatedSize); DrawSizeValue("Actual Size", layoutResult.actualSize); DrawLabel("Rotation", layoutResult.rotation.ToString()); DrawLabel("Content Rect", $"X: {contentRect.x}, Y: {contentRect.y}, W: {contentRect.width}, H: {contentRect.height}"); DrawLabel("Render Layer", selectedElement.style.RenderLayer.ToString()); GUILayout.Space(16); DrawEnumWithValue <LayoutType>(selectedElement.style.GetComputedStyleProperty(StylePropertyId.LayoutType), false); DrawMeasurement(selectedElement.style.GetComputedStyleProperty(StylePropertyId.PreferredWidth), false); DrawMeasurement(selectedElement.style.GetComputedStyleProperty(StylePropertyId.PreferredHeight), false); DrawLabel("Block Width Provider:", selectedElement.layoutBox.GetBlockWidthProvider() + " size: " + selectedElement.layoutBox.ComputeBlockWidth(1)); DrawLabel("Block Height Provider:", selectedElement.layoutBox.GetBlockHeightProvider() + " size: " + selectedElement.layoutBox.ComputeBlockHeight(1)); GUILayout.Space(16); OffsetRect margin = selectedElement.layoutResult.margin; DrawLabel("Margin Top", margin.top.ToString()); DrawLabel("Margin Right", margin.right.ToString()); DrawLabel("Margin Bottom", margin.bottom.ToString()); DrawLabel("Margin Left", margin.left.ToString()); GUILayout.Space(16); OffsetRect border = selectedElement.layoutResult.border; DrawLabel("Border Top", border.top.ToString()); DrawLabel("Border Right", border.right.ToString()); DrawLabel("Border Bottom", border.bottom.ToString()); DrawLabel("Border Left", border.left.ToString()); GUILayout.Space(16); OffsetRect padding = selectedElement.layoutResult.padding; DrawLabel("Padding Top", padding.top.ToString()); DrawLabel("Padding Right", padding.right.ToString()); DrawLabel("Padding Bottom", padding.bottom.ToString()); DrawLabel("Padding Left", padding.left.ToString()); } EditorGUIUtility.labelWidth = labelWidth; }