Esempio n. 1
0
        /// <inheritdoc/>
        public override bool Break(BreakableComponent breakTo)
        {
            // first we find the break line. It's a minimum Top coordinate of the object that cannot break.
            float breakLine      = Height;
            bool  breakLineFound = true;

            do
            {
                breakLineFound = true;
                foreach (ReportComponentBase obj in Objects)
                {
                    bool canBreak = true;
                    if (obj.Top < breakLine && obj.Bottom > breakLine)
                    {
                        canBreak = false;
                        BreakableComponent breakable = obj as BreakableComponent;
                        if (breakable != null && breakable.CanBreak)
                        {
                            using (BreakableComponent clone = Activator.CreateInstance(breakable.GetType()) as BreakableComponent)
                            {
                                clone.AssignAll(breakable);
                                clone.Height = breakLine - clone.Top;
                                // to allow access to the Report
                                clone.Parent = breakTo;
                                canBreak     = clone.Break(null);
                            }
                        }
                    }

                    if (!canBreak)
                    {
                        breakLine = Math.Min(obj.Top, breakLine);
                        // enumerate objects again
                        breakLineFound = false;
                        break;
                    }
                }
            }while (!breakLineFound);

            // now break the components
            int i = 0;

            while (i < Objects.Count)
            {
                ReportComponentBase obj = Objects[i];
                if (obj.Bottom > breakLine)
                {
                    if (obj.Top < breakLine)
                    {
                        BreakableComponent breakComp = Activator.CreateInstance(obj.GetType()) as BreakableComponent;
                        breakComp.AssignAll(obj);
                        breakComp.Parent = breakTo;

                        breakComp.CanGrow   = true;
                        breakComp.CanShrink = false;
                        breakComp.Height   -= breakLine - obj.Top;
                        breakComp.Top       = 0;
                        obj.Height          = breakLine - obj.Top;
                        (obj as BreakableComponent).Break(breakComp);
                    }
                    else
                    {
                        obj.Top   -= breakLine;
                        obj.Parent = breakTo;
                        continue;
                    }
                }
                i++;
            }

            Height          = breakLine;
            breakTo.Height -= breakLine;
            return(Objects.Count > 0);
        }
Esempio n. 2
0
        public void AddLastToFooter(BreakableComponent breakTo)
        {
            float maxTop = (AllObjects[0] as ComponentBase).Top;

            foreach (ComponentBase obj in AllObjects)
            {
                if (obj.Top > maxTop && !(obj is DataFooterBand))
                {
                    maxTop = obj.Top;
                }
            }

            float breakLine = maxTop;

            List <ReportComponentBase> pasteList = new List <ReportComponentBase>();

            foreach (ReportComponentBase obj in Objects)
            {
                if (obj.Bottom > breakLine)
                {
                    pasteList.Add(obj);
                }
            }



            int itemsBefore = breakTo.AllObjects.Count;


            foreach (ReportComponentBase obj in pasteList)
            {
                if (obj.Top < breakLine)
                {
                    BreakableComponent breakComp = Activator.CreateInstance(obj.GetType()) as BreakableComponent;
                    breakComp.AssignAll(obj);
                    breakComp.Parent = breakTo;

                    breakComp.CanGrow   = true;
                    breakComp.CanShrink = false;
                    breakComp.Height   -= breakLine - obj.Top;
                    breakComp.Top       = 0;
                    obj.Height          = breakLine - obj.Top;
                    (obj as BreakableComponent).Break(breakComp);
                }
                else
                {
                    obj.Top   -= breakLine;
                    obj.Parent = breakTo;
                    continue;
                }
            }


            float minTop    = (breakTo.AllObjects[0] as ComponentBase).Top;
            float maxBottom = 0;

            for (int i = itemsBefore; i < breakTo.AllObjects.Count; i++)
            {
                if ((breakTo.AllObjects[i] as ComponentBase).Top < minTop && breakTo.AllObjects[i] is ReportComponentBase && !(breakTo.AllObjects[i] is Table.TableCell))
                {
                    minTop = (breakTo.AllObjects[i] as ComponentBase).Top;
                }
            }

            for (int i = itemsBefore; i < breakTo.AllObjects.Count; i++)
            {
                if ((breakTo.AllObjects[i] as ComponentBase).Bottom > maxBottom && breakTo.AllObjects[i] is ReportComponentBase && !(breakTo.AllObjects[i] is Table.TableCell))
                {
                    maxBottom = (breakTo.AllObjects[i] as ComponentBase).Bottom;
                }
            }

            for (int i = 0; i < itemsBefore; i++)
            {
                (breakTo.AllObjects[i] as ComponentBase).Top += maxBottom - minTop;
            }

            breakTo.Height += maxBottom - minTop;

            Height -= maxBottom - minTop;
        }