public override LayoutResult Layout(LayoutContext layoutContext) { LayoutResult errorResult = InitializeListSymbols(layoutContext); if (errorResult != null) { return(errorResult); } 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); }
public virtual void LayoutTest() { AreaBreakRenderer areaBreakRenderer = new AreaBreakRenderer(new AreaBreak()); LayoutResult layoutResult = areaBreakRenderer.Layout(new LayoutContext(null)); NUnit.Framework.Assert.AreEqual(LayoutResult.NOTHING, layoutResult.GetStatus()); NUnit.Framework.Assert.IsNull(layoutResult.GetOccupiedArea()); NUnit.Framework.Assert.IsNull(layoutResult.GetSplitRenderer()); NUnit.Framework.Assert.IsNull(layoutResult.GetOverflowRenderer()); NUnit.Framework.Assert.AreEqual(areaBreakRenderer, layoutResult.GetCauseOfNothing()); NUnit.Framework.Assert.AreEqual(areaBreakRenderer.areaBreak, layoutResult.GetAreaBreak()); }
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); }
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); ProcessWaitingKeepWithNextElement(renderer); 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); result.GetOverflowRenderer().SetProperty(Property.FORCED_PLACEMENT, true); } 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 { 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(); while (null == theDeepestKeptTogether.GetModelElement() || null == theDeepestKeptTogether.GetModelElement( ).GetOwnProperty <bool?>(Property.KEEP_TOGETHER)) { theDeepestKeptTogether = ((AbstractRenderer)theDeepestKeptTogether).parent; } theDeepestKeptTogether.GetModelElement().SetProperty(Property.KEEP_TOGETHER, false); ILogger logger = LoggerFactory.GetLogger(typeof(RootRenderer)); logger.Warn(String.Format(LogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA, "KeepTogether property of inner element will be ignored." )); } 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(); } // Keep renderer until next element is added for future keep with next adjustments if (renderer != null && true.Equals(renderer.GetProperty <bool?>(Property.KEEP_WITH_NEXT))) { if (true.Equals(renderer.GetProperty <bool?>(Property.FORCED_PLACEMENT))) { ILogger logger = LoggerFactory.GetLogger(typeof(RootRenderer)); logger.Warn(LogMessageConstant.ELEMENT_WAS_FORCE_PLACED_KEEP_WITH_NEXT_WILL_BE_IGNORED); UpdateCurrentAreaAndProcessRenderer(renderer, resultRenderers, result); } else { keepWithNextHangingRenderer = renderer; keepWithNextHangingRendererLayoutResult = result; } } else { UpdateCurrentAreaAndProcessRenderer(renderer, resultRenderers, result); } } 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); } } } }
// 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); }