Пример #1
0
        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());
        }
Пример #3
0
 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);
 }
Пример #4
0
 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);
             }
         }
     }
 }
Пример #5
0
        // 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);
        }