ReportEngine.Break.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows.Forms;
  4. namespace FastReport.Engine
  5. {
  6. public partial class ReportEngine
  7. {
  8. #region Private Methods
  9. private void BreakBand(BandBase band)
  10. {
  11. BandBase cloneBand = Activator.CreateInstance(band.GetType()) as BandBase;
  12. cloneBand.Assign(band);
  13. cloneBand.SetRunning(true);
  14. cloneBand.FlagMustBreak = band.FlagMustBreak;
  15. // clone band objects:
  16. // - remove bands that can break, convert them to Text objects if necessary
  17. // - skip subreports
  18. foreach (Base c in band.Objects)
  19. {
  20. if (c is BandBase && (c as BandBase).CanBreak)
  21. {
  22. BandBase b = c as BandBase;
  23. if (b.HasBorder || b.HasFill)
  24. {
  25. TextObject textObj = new TextObject();
  26. textObj.Bounds = b.Bounds;
  27. textObj.Border = b.Border.Clone();
  28. textObj.Fill = b.Fill.Clone();
  29. cloneBand.Objects.Add(textObj);
  30. }
  31. foreach (ReportComponentBase obj in b.Objects)
  32. {
  33. if (!(obj is BandBase))
  34. {
  35. ReportComponentBase cloneObj = Activator.CreateInstance(obj.GetType()) as ReportComponentBase;
  36. cloneObj.AssignAll(obj);
  37. cloneObj.Anchor = AnchorStyles.Left | AnchorStyles.Top;
  38. cloneObj.Dock = DockStyle.None;
  39. cloneObj.Left = obj.AbsLeft - band.AbsLeft;
  40. cloneObj.Top = obj.AbsTop - band.AbsTop;
  41. if (cloneObj is TextObject)
  42. (cloneObj as TextObject).Highlight.Clear();
  43. cloneBand.Objects.Add(cloneObj);
  44. }
  45. }
  46. }
  47. else if (!(c is SubreportObject))
  48. {
  49. Base cloneObj = Activator.CreateInstance(c.GetType()) as Base;
  50. cloneObj.AssignAll(c);
  51. cloneObj.Parent = cloneBand;
  52. }
  53. }
  54. BandBase breakTo = Activator.CreateInstance(band.GetType()) as BandBase;
  55. breakTo.Assign(band);
  56. breakTo.SetRunning(true);
  57. breakTo.Child = null;
  58. breakTo.CanGrow = true;
  59. breakTo.StartNewPage = false;
  60. breakTo.OutlineExpression = "";
  61. breakTo.BeforePrintEvent = "";
  62. breakTo.BeforeLayoutEvent = "";
  63. breakTo.AfterPrintEvent = "";
  64. breakTo.AfterLayoutEvent = "";
  65. // breakTo must be breaked because it will print on a new page.
  66. breakTo.FlagMustBreak = true;
  67. // to allow clone and breaked bands to access Report
  68. cloneBand.SetReport(Report);
  69. breakTo.SetReport(Report);
  70. try
  71. {
  72. // (case: object with Anchor = bottom on a breakable band)
  73. // disable re-layout
  74. cloneBand.SetUpdatingLayout(true);
  75. cloneBand.Height = FreeSpace;
  76. cloneBand.SetUpdatingLayout(false);
  77. if (cloneBand.Break(breakTo))
  78. {
  79. AddToPreparedPages(cloneBand);
  80. EndColumn();
  81. // CalcHeight fixes the height of objects in the remaining part
  82. breakTo.CalcHeight();
  83. AddToPreparedPages(breakTo);
  84. }
  85. else
  86. {
  87. if (cloneBand.FlagMustBreak)
  88. {
  89. // show band as is
  90. breakTo.FlagCheckFreeSpace = false;
  91. AddToPreparedPages(breakTo);
  92. }
  93. else
  94. {
  95. EndColumn();
  96. breakTo.CalcHeight();
  97. AddToPreparedPages(breakTo);
  98. }
  99. }
  100. }
  101. finally
  102. {
  103. cloneBand.Dispose();
  104. breakTo.Dispose();
  105. }
  106. }
  107. private bool BandHasHardPageBreaks(BandBase band)
  108. {
  109. foreach (var obj in band.Objects)
  110. {
  111. if ((obj as ReportComponentBase).PageBreak)
  112. return true;
  113. }
  114. return false;
  115. }
  116. private BandBase[] SplitHardPageBreaks(BandBase band)
  117. {
  118. List<BandBase> parts = new List<BandBase>();
  119. BandBase cloneBand = null;
  120. float offsetY = 0;
  121. foreach (ReportComponentBase c in band.Objects)
  122. {
  123. if (c.PageBreak)
  124. {
  125. if (cloneBand != null)
  126. cloneBand.Height = c.Top - offsetY;
  127. cloneBand = null;
  128. offsetY = c.Top;
  129. }
  130. if (cloneBand == null)
  131. {
  132. cloneBand = Activator.CreateInstance(band.GetType()) as BandBase;
  133. cloneBand.Assign(band);
  134. cloneBand.SetRunning(true);
  135. if (c.PageBreak)
  136. {
  137. cloneBand.StartNewPage = true;
  138. cloneBand.FirstRowStartsNewPage = true;
  139. }
  140. parts.Add(cloneBand);
  141. }
  142. ReportComponentBase cloneObj = Activator.CreateInstance(c.GetType()) as ReportComponentBase;
  143. cloneObj.AssignAll(c);
  144. cloneObj.Top = c.Top - offsetY;
  145. cloneObj.Parent = cloneBand;
  146. }
  147. if (cloneBand != null)
  148. cloneBand.Height = band.Height - offsetY;
  149. return parts.ToArray();
  150. }
  151. #endregion Private Methods
  152. }
  153. }