MatrixHeader.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. using System;
  2. using System.Collections.Generic;
  3. using FastReport.Code;
  4. using FastReport.Utils;
  5. namespace FastReport.AdvMatrix
  6. {
  7. /// <summary>
  8. /// Represents the storage of header descriptors and its values.
  9. /// </summary>
  10. public class MatrixHeader : IFRSerializable
  11. {
  12. private AdvMatrixObject matrix;
  13. private string name;
  14. private int runningIndex;
  15. /// <summary>
  16. /// Gets the root header descriptor.
  17. /// </summary>
  18. public HeaderDescriptor Descriptor { get; private set; }
  19. /// <summary>
  20. /// Gets the size of this header.
  21. /// </summary>
  22. public int Size { get { return GetSize(Descriptor); } }
  23. internal HeaderData Data { get; private set; }
  24. internal int NextIndex
  25. {
  26. get
  27. {
  28. runningIndex++;
  29. return runningIndex;
  30. }
  31. }
  32. private void FillData(HeaderDescriptor descr, HeaderData data, List<HeaderData> activeItems)
  33. {
  34. foreach (HeaderDescriptor d in descr.Items)
  35. {
  36. if (!String.IsNullOrEmpty(d.Filter))
  37. {
  38. if ((dynamic)matrix.Report.Calc(d.Filter) == false)
  39. continue;
  40. }
  41. if (!String.IsNullOrEmpty(d.VisibleExpression))
  42. {
  43. d.Visible = (dynamic)matrix.Report.Calc(d.VisibleExpression);
  44. }
  45. HeaderData dataItem = data.Add(d);
  46. activeItems.Add(dataItem);
  47. if (matrix.DataSource != null)
  48. dataItem.DataRowNo = matrix.DataSource.CurrentRowNo;
  49. // set index for the newly added items
  50. if (dataItem.Index == 0)
  51. dataItem.Index = NextIndex;
  52. if (d.SortAggregate != null)
  53. d.SortAggregate.ProcessDataRow(dataItem.Index, 0, matrix.Report.Calc(d.SortAggregate.Expression));
  54. FillData(d, dataItem, activeItems);
  55. }
  56. }
  57. private int GetSize(HeaderDescriptor root)
  58. {
  59. int maxSize = -1;
  60. foreach (HeaderDescriptor d in root.Items)
  61. {
  62. int size = GetSize(d);
  63. if (size > maxSize)
  64. maxSize = size;
  65. }
  66. return maxSize + (root.Stepped && root.Items.Count > 0 ? 0 : 1);
  67. }
  68. private void GetExpressions(HeaderDescriptor root, List<string> expressions)
  69. {
  70. foreach (HeaderDescriptor d in root.Items)
  71. {
  72. if (!String.IsNullOrEmpty(d.Expression))
  73. expressions.Add(d.Expression);
  74. if (!String.IsNullOrEmpty(d.DisplayText))
  75. expressions.AddRange(CodeUtils.GetExpressions(d.DisplayText, "[", "]"));
  76. if (!String.IsNullOrEmpty(d.Filter))
  77. expressions.Add(d.Filter);
  78. if (!String.IsNullOrEmpty(d.VisibleExpression))
  79. expressions.Add(d.VisibleExpression);
  80. if (d.SortAggregate != null)
  81. expressions.Add(d.SortAggregate.Expression);
  82. // we don't need to add InteractiveSortAggregate expression because it's a reference to existing cell aggregate
  83. GetExpressions(d, expressions);
  84. }
  85. }
  86. private void InitAggregates(HeaderDescriptor root)
  87. {
  88. root.InitAggregates();
  89. foreach (HeaderDescriptor d in root.Items)
  90. {
  91. InitAggregates(d);
  92. }
  93. }
  94. internal void GetExpressions(List<string> expressions)
  95. {
  96. InitAggregates(Descriptor);
  97. GetExpressions(Descriptor, expressions);
  98. }
  99. internal void Init()
  100. {
  101. runningIndex = 0;
  102. Data.Clear();
  103. }
  104. internal List<HeaderData> ProcessDataRow()
  105. {
  106. List<HeaderData> activeItems = new List<HeaderData>();
  107. FillData(Descriptor, Data, activeItems);
  108. return activeItems;
  109. }
  110. /// <inheritdoc/>
  111. public void Serialize(FRWriter writer)
  112. {
  113. writer.ItemName = name;
  114. // do not write root item
  115. foreach (HeaderDescriptor d in Descriptor.Items)
  116. writer.Write(d);
  117. }
  118. /// <inheritdoc/>
  119. public void Deserialize(FRReader reader)
  120. {
  121. reader.Read(Descriptor);
  122. }
  123. internal void Assign(MatrixHeader src)
  124. {
  125. Descriptor = src.Descriptor;
  126. }
  127. /// <summary>
  128. /// Initializes a new instance of the <see cref="MatrixHeader"/> class.
  129. /// </summary>
  130. public MatrixHeader(AdvMatrixObject matrix, string name)
  131. {
  132. this.matrix = matrix;
  133. this.name = name;
  134. Descriptor = new HeaderDescriptor();
  135. Data = new HeaderData(null, null);
  136. }
  137. }
  138. }