DescriptorExt.DesignExt.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections;
  4. namespace FastReport.AdvMatrix
  5. {
  6. // header descriptor extension methods
  7. internal static partial class DescriptorExt
  8. {
  9. public static bool IsEmpty(this HeaderDescriptor descr)
  10. {
  11. descr = descr.Root;
  12. return descr.AllItems.Count == 1 && !descr.Items[0].IsGroup && String.IsNullOrEmpty(descr.Items[0].DisplayText);
  13. }
  14. public static string[] GetAvailableCollapseButtons(this HeaderDescriptor descr)
  15. {
  16. List<string> list = new List<string>();
  17. Action<HeaderDescriptor> func = (root) =>
  18. {
  19. if (root == null)
  20. return;
  21. foreach (HeaderDescriptor d in root.Items)
  22. {
  23. if (d != descr && d.TemplateCell != null)
  24. {
  25. MatrixCollapseButton b = d.TemplateCell.GetCollapseButton();
  26. if (b != null)
  27. list.Add(b.Name);
  28. }
  29. }
  30. };
  31. func(descr.Parent);
  32. if (descr.Parent != null)
  33. func(descr.Parent.Parent);
  34. return list.ToArray();
  35. }
  36. public static string[] GetAvailableSortButtons(this HeaderDescriptor descr)
  37. {
  38. List<string> list = new List<string>();
  39. foreach (Base c in descr.Matrix.Report.AllObjects)
  40. {
  41. MatrixSortButton btn = c as MatrixSortButton;
  42. if (btn != null)
  43. {
  44. if (btn.Cell == null || (btn.Cell.Table == descr.Matrix && btn.Cell.GetMatrixElement() == MatrixElement.Corner))
  45. list.Add(btn.Name);
  46. }
  47. }
  48. return list.ToArray();
  49. }
  50. public static string[] GetAvailableTotals(this HeaderDescriptor descr)
  51. {
  52. List<string> list = new List<string>();
  53. foreach (AggregateExpressionPair ag in descr.Matrix.Data.CellData.SharedAggregates)
  54. list.Add(ag.ToString());
  55. return list.ToArray();
  56. }
  57. public static string CreateUniqueName(this HeaderDescriptor descr, string baseName)
  58. {
  59. Hashtable t = new Hashtable();
  60. foreach (HeaderDescriptor d in descr.Root.AllItems)
  61. {
  62. t[d.Name] = 1;
  63. }
  64. int num = 1;
  65. while (true)
  66. {
  67. string name = baseName + num.ToString();
  68. if (!t.ContainsKey(name))
  69. {
  70. descr.Name = name;
  71. return name;
  72. }
  73. num++;
  74. }
  75. }
  76. public static void CreateTopNItems(this HeaderDescriptor descr)
  77. {
  78. HeaderDescriptor totalItem = new HeaderDescriptor() { Visible = descr.TopN.Total.Visible, DisplayText = descr.TopN.Total.Text };
  79. HeaderDescriptor othersItem = new HeaderDescriptor() { Visible = descr.TopN.Others.Visible };
  80. HeaderDescriptor othersTotalItem = new HeaderDescriptor() { Visible = descr.TopN.OthersTotal.Visible, DisplayText = descr.TopN.OthersTotal.Text };
  81. descr.InsertAfter(totalItem).InsertAfter(othersItem).InsertAfter(othersTotalItem);
  82. descr.TopN.Total.Name = totalItem.CreateUniqueName("TotalItem");
  83. descr.TopN.Others.Name = othersItem.CreateUniqueName("OthersItem");
  84. descr.TopN.OthersTotal.Name = othersTotalItem.CreateUniqueName("OthersTotalItem");
  85. }
  86. public static bool TopNItemsPresent(this HeaderDescriptor descr)
  87. {
  88. return descr.TopN.Total.Descriptor != null &&
  89. descr.TopN.Others.Descriptor != null &&
  90. descr.TopN.OthersTotal.Descriptor != null;
  91. }
  92. private static void DeleteTopNItem(TopNInfo.ItemInfo itemInfo)
  93. {
  94. HeaderDescriptor descr = itemInfo.Descriptor;
  95. if (descr != null)
  96. descr.DeleteThis();
  97. itemInfo.Name = "";
  98. }
  99. public static void DeleteTopNItems(this HeaderDescriptor descr)
  100. {
  101. DeleteTopNItem(descr.TopN.Total);
  102. DeleteTopNItem(descr.TopN.Others);
  103. DeleteTopNItem(descr.TopN.OthersTotal);
  104. }
  105. public static bool HasParent(this HeaderDescriptor descr, HeaderDescriptor parent)
  106. {
  107. while (descr.Parent != null)
  108. {
  109. descr = descr.Parent;
  110. if (descr == parent)
  111. return true;
  112. }
  113. return false;
  114. }
  115. private static void UpdateTemplateItems(HeaderDescriptor descr, HeaderDescriptor newItem)
  116. {
  117. if (newItem.TemplateColumn == null || newItem.TemplateRow == null)
  118. {
  119. newItem.TemplateColumn = descr.TemplateColumn;
  120. newItem.TemplateRow = descr.TemplateRow;
  121. }
  122. }
  123. public static HeaderDescriptor InsertAfter(this HeaderDescriptor descr, HeaderDescriptor newItem)
  124. {
  125. HeaderDescriptor parent = descr.Parent;
  126. newItem.SetParent(parent);
  127. parent.Items.Insert(parent.Items.IndexOf(descr) + 1, newItem);
  128. UpdateTemplateItems(descr, newItem);
  129. return newItem;
  130. }
  131. public static HeaderDescriptor InsertBefore(this HeaderDescriptor descr, HeaderDescriptor newItem)
  132. {
  133. HeaderDescriptor parent = descr.Parent;
  134. newItem.SetParent(parent);
  135. parent.Items.Insert(parent.Items.IndexOf(descr), newItem);
  136. UpdateTemplateItems(descr, newItem);
  137. return newItem;
  138. }
  139. public static HeaderDescriptor InsertParent(this HeaderDescriptor descr, HeaderDescriptor newItem)
  140. {
  141. HeaderDescriptor parent = descr.Parent;
  142. newItem.SetParent(parent);
  143. parent.Items.Insert(parent.Items.IndexOf(descr), newItem);
  144. parent.Items.Remove(descr);
  145. descr.SetParent(newItem);
  146. newItem.Items.Add(descr);
  147. UpdateTemplateItems(descr, newItem);
  148. return newItem;
  149. }
  150. public static HeaderDescriptor InsertChild(this HeaderDescriptor descr, HeaderDescriptor newItem)
  151. {
  152. newItem.SetParent(descr);
  153. foreach (HeaderDescriptor d in descr.Items)
  154. {
  155. d.SetParent(newItem);
  156. newItem.Items.Add(d);
  157. }
  158. descr.Items.Clear();
  159. descr.Items.Add(newItem);
  160. UpdateTemplateItems(descr, newItem);
  161. return newItem;
  162. }
  163. public static void DeleteThis(this HeaderDescriptor descr)
  164. {
  165. HeaderDescriptor parent = descr.Parent;
  166. foreach (HeaderDescriptor d in descr.Items)
  167. {
  168. d.SetParent(parent);
  169. }
  170. parent.Items.InsertRange(parent.Items.IndexOf(descr), descr.Items);
  171. parent.Items.Remove(descr);
  172. descr.Items.Clear();
  173. }
  174. public static void DeleteTree(this HeaderDescriptor descr)
  175. {
  176. descr.Parent.Items.Remove(descr);
  177. }
  178. }
  179. }