예제 #1
0
 public void SetLayout(LayoutResult layout)
 {
 }
예제 #2
0
        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);
                }
            }
        }
예제 #3
0
 protected internal abstract LayoutArea UpdateCurrentArea(LayoutResult overflowResult);
예제 #4
0
        /* (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));
        }
예제 #5
0
 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
 }
예제 #7
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);
        }
예제 #8
0
        /* (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)));
        }
예제 #9
0
            public override LayoutResult Layout(LayoutContext layoutContext)
            {
                LayoutResult result = base.Layout(layoutContext);

                return(result);
            }
예제 #10
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);
         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);
             }
         }
     }
 }
예제 #11
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);
 }
예제 #12
0
        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;
        }