/// <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); }
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; }