AdvMatrixObject.DesignExt.cs 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. using System;
  2. using System.ComponentModel;
  3. using System.Windows.Forms;
  4. using FastReport.Controls;
  5. using FastReport.Design.PageDesigners.Page;
  6. using FastReport.Table;
  7. using FastReport.Utils;
  8. namespace FastReport.AdvMatrix
  9. {
  10. public partial class AdvMatrixObject
  11. {
  12. #region Fields
  13. private bool descriptorsUpdated;
  14. #endregion
  15. #region Properties
  16. /// <summary>
  17. /// This property is not relevant to this class.
  18. /// </summary>
  19. [Browsable(false)]
  20. public override int ColumnCount
  21. {
  22. get { return base.ColumnCount; }
  23. set { base.ColumnCount = value; }
  24. }
  25. /// <summary>
  26. /// This property is not relevant to this class.
  27. /// </summary>
  28. [Browsable(false)]
  29. public override int RowCount
  30. {
  31. get { return base.RowCount; }
  32. set { base.RowCount = value; }
  33. }
  34. /// <summary>
  35. /// This property is not relevant to this class.
  36. /// </summary>
  37. [Browsable(false)]
  38. public new int FixedRows
  39. {
  40. get { return base.FixedRows; }
  41. set { base.FixedRows = value; }
  42. }
  43. /// <summary>
  44. /// This property is not relevant to this class.
  45. /// </summary>
  46. [Browsable(false)]
  47. public new int FixedColumns
  48. {
  49. get { return base.FixedColumns; }
  50. set { base.FixedColumns = value; }
  51. }
  52. /// <summary>
  53. /// This property is not relevant to this class.
  54. /// </summary>
  55. [Browsable(false)]
  56. public new bool CanBreak
  57. {
  58. get { return base.CanBreak; }
  59. set { base.CanBreak = value; }
  60. }
  61. /// <summary>
  62. /// This property is not relevant to this class.
  63. /// </summary>
  64. [Browsable(false)]
  65. public new bool GrowToBottom
  66. {
  67. get { return base.GrowToBottom; }
  68. set { base.GrowToBottom = value; }
  69. }
  70. /// <summary>
  71. /// This property is not relevant to this class.
  72. /// </summary>
  73. [Browsable(false)]
  74. public new string EvenStyle
  75. {
  76. get { return base.EvenStyle; }
  77. set { base.EvenStyle = value; }
  78. }
  79. #endregion
  80. #region Public Methods
  81. internal void UpdateDescriptors(bool forceUpdate = false)
  82. {
  83. if (forceUpdate || !descriptorsUpdated)
  84. {
  85. TemplateBuilder.UpdateDescriptors(this);
  86. descriptorsUpdated = true;
  87. }
  88. }
  89. internal void SwapColumnsRows()
  90. {
  91. AdvMatrixObject matrix = new AdvMatrixObject();
  92. matrix.AssignAll(this, true);
  93. Clear();
  94. ColumnCount = matrix.RowCount;
  95. RowCount = matrix.ColumnCount;
  96. for (int x = 0; x < ColumnCount; x++)
  97. {
  98. Columns[x].CreateUniqueName();
  99. }
  100. for (int y = 0; y < RowCount; y++)
  101. {
  102. Rows[y].CreateUniqueName();
  103. }
  104. for (int x = 0; x < matrix.ColumnCount; x++)
  105. {
  106. for (int y = 0; y < matrix.RowCount; y++)
  107. {
  108. this[y, x].AssignAll(matrix[x, y], true);
  109. this[y, x].ColSpan = matrix[x, y].RowSpan;
  110. this[y, x].RowSpan = matrix[x, y].ColSpan;
  111. }
  112. }
  113. Data.Columns.Assign(matrix.Data.Rows);
  114. Data.Rows.Assign(matrix.Data.Columns);
  115. matrix.Dispose();
  116. UpdateDescriptors(true);
  117. BuildTemplate();
  118. FixParentHeight();
  119. }
  120. /// <inheritdoc/>
  121. public override void OnBeforeInsert(int flags)
  122. {
  123. BuildTemplate();
  124. float width;
  125. if (Page is ReportPage && (Page as ReportPage).IsImperialUnitsUsed)
  126. width = Units.Inches * 1;
  127. else
  128. width = Units.Centimeters * 2.5f;
  129. Columns[0].Width = width;
  130. Columns[1].Width = Columns[0].Width;
  131. }
  132. // fix matrix parent height on matrix change
  133. internal void FixParentHeight()
  134. {
  135. if (!IsDesigning)
  136. return;
  137. // get the matrix height. Height property may not be updated yet.
  138. float height = 0;
  139. foreach (TableRow row in Rows)
  140. height += row.Height;
  141. if (Top + height > (Parent as ComponentBase).Height)
  142. {
  143. (Parent as ComponentBase).Height = Top + height;
  144. (Report.Designer.ActiveReportTab.ActivePageDesigner as Design.PageDesigners.Page.ReportPageDesigner).Workspace.UpdateBands();
  145. }
  146. }
  147. /// <inheritdoc/>
  148. public override ContextMenuBase GetContextMenu()
  149. {
  150. return new MatrixObjectMenu(Report.Designer);
  151. }
  152. internal override ContextMenuBase GetCellContextMenu(TableCell cell)
  153. {
  154. switch (cell.GetMatrixElement())
  155. {
  156. case MatrixElement.Corner:
  157. return new MatrixCellMenuBase(this);
  158. case MatrixElement.Cell:
  159. return new MatrixCellMenu(this);
  160. case MatrixElement.Column:
  161. case MatrixElement.Row:
  162. return new MatrixHeaderMenu(this);
  163. }
  164. return new MatrixCellMenuBase(this);
  165. }
  166. internal override SmartTagBase GetCellSmartTag(TableCell cell)
  167. {
  168. return new MatrixCellSmartTag(this, cell);
  169. }
  170. internal override void HandleCellDoubleClick(TableCell cell)
  171. {
  172. if (cell == null)
  173. return;
  174. MatrixElement el = cell.GetMatrixElement();
  175. if (el == MatrixElement.Column || el == MatrixElement.Row)
  176. {
  177. HeaderDescriptor descr = cell.GetHeaderDescriptor();
  178. if (descr != null)
  179. {
  180. using (MatrixHeaderEditorForm form = new MatrixHeaderEditorForm(descr))
  181. {
  182. if (form.ShowDialog() == DialogResult.OK)
  183. {
  184. BuildTemplate();
  185. FixParentHeight();
  186. Report.Designer.SetModified(cell, "Change");
  187. }
  188. }
  189. }
  190. else
  191. {
  192. // probably bad-formed template. Rebuild it
  193. BuildTemplate();
  194. FixParentHeight();
  195. Report.Designer.SetModified(cell, "Change");
  196. }
  197. }
  198. else
  199. {
  200. if (cell.HasFlag(Flags.CanEdit) && !cell.HasRestriction(Restrictions.DontEdit) && cell.InvokeEditor())
  201. Report.Designer.SetModified(cell, "Change");
  202. }
  203. }
  204. /// <inheritdoc/>
  205. public override void HandleKeyDown(Control sender, KeyEventArgs e)
  206. {
  207. bool myKey = false;
  208. TableCell cell = Report.Designer.SelectedObjects[0] as TableCell;
  209. if (!IsSelected || cell == null)
  210. return;
  211. switch (e.KeyCode)
  212. {
  213. case Keys.Delete:
  214. bool deleted = false;
  215. foreach (Base c in Report.Designer.SelectedObjects)
  216. {
  217. cell = c as TableCell;
  218. if (cell != null)
  219. {
  220. MatrixElement element = cell.GetMatrixElement();
  221. if (element == MatrixElement.Column || element == MatrixElement.Row)
  222. {
  223. HeaderDescriptor descr = cell.GetHeaderDescriptor();
  224. if (descr != null && !descr.IsTopNItem)
  225. {
  226. descr.DeleteTopNItems();
  227. descr.DeleteThis();
  228. deleted = true;
  229. }
  230. }
  231. else
  232. {
  233. cell.Text = "";
  234. deleted = true;
  235. }
  236. }
  237. }
  238. if (deleted)
  239. {
  240. if (!Report.Designer.IsPreviewPageDesigner)
  241. {
  242. BuildTemplate();
  243. Report.Designer.ActiveReportTab.ActivePageDesigner.FillObjects(false);
  244. Report.Designer.SelectedObjects.Clear();
  245. Report.Designer.SelectedObjects.Add(this);
  246. Report.Designer.SelectionChanged(null);
  247. }
  248. Report.Designer.SetModified(this, "Change");
  249. }
  250. myKey = true;
  251. break;
  252. case Keys.Enter:
  253. HandleCellDoubleClick(cell);
  254. myKey = true;
  255. break;
  256. }
  257. if (myKey)
  258. e.Handled = true;
  259. else
  260. base.HandleKeyDown(sender, e);
  261. }
  262. internal override string GetCellDisplayText(TableCell cell, string defaultText)
  263. {
  264. return cell.GetDisplayText(defaultText);
  265. }
  266. internal override void ProvideCustomItems(TableCell cell, DataTreeView tree)
  267. {
  268. cell.ProvideMatrixItems(tree);
  269. }
  270. #endregion
  271. }
  272. }