TableObject.DesignExt.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. using System.Drawing;
  6. using System.ComponentModel;
  7. using System.Drawing.Drawing2D;
  8. using System.Windows.Forms;
  9. using FastReport.Design;
  10. using FastReport.Utils;
  11. using FastReport.Engine;
  12. using FastReport.Preview;
  13. using FastReport.Design.PageDesigners.Page;
  14. using FastReport.Data;
  15. using FastReport.Controls;
  16. using System.Linq;
  17. using System.Runtime.CompilerServices;
  18. namespace FastReport.Table
  19. {
  20. partial class TableObject
  21. {
  22. #region Fields
  23. private TableCell dragCell;
  24. private SelectedObjectCollection itemsBeforeMDown;
  25. private bool isResizing;
  26. #endregion
  27. #region Public Methods
  28. /// <inheritdoc/>
  29. public override void Draw(FRPaintEventArgs e)
  30. {
  31. base.Draw(e);
  32. if (dragCell != null)
  33. dragCell.DrawDragAcceptFrame(e, Color.Silver);
  34. DrawDesign(e);
  35. }
  36. /// <inheritdoc/>
  37. public override void HandleDragOver(FRMouseEventArgs e)
  38. {
  39. dragCell = null;
  40. if (!(e.DragSource is TextObject))
  41. return;
  42. for (int y = 0; y < Rows.Count; y++)
  43. {
  44. for (int x = 0; x < Columns.Count; x++)
  45. {
  46. TableCell cell = this[x, y];
  47. if (!IsInsideSpan(cell) && cell.PointInObject(new PointF(e.x, e.y)))
  48. {
  49. dragCell = cell;
  50. e.handled = true;
  51. break;
  52. }
  53. }
  54. }
  55. }
  56. /// <inheritdoc/>
  57. public override void HandleMouseDown(FRMouseEventArgs e)
  58. {
  59. base.HandleMouseDown(e);
  60. HandleMouseHover(e);
  61. if (IsSelected && new RectangleF(AbsRight + 1, AbsBottom + 1, 16, 16).Contains(new PointF(e.x, e.y)))
  62. {
  63. e.handled = true;
  64. e.mode = WorkspaceMode2.Size;
  65. if (itemsBeforeMDown == null)
  66. itemsBeforeMDown = new SelectedObjectCollection();
  67. Report.Designer.SelectedObjects.CopyTo(itemsBeforeMDown);
  68. Report.Designer.SelectedObjects.Clear();
  69. foreach (ComponentBase line in ChildObjects)
  70. {
  71. if (line is TableColumn)
  72. Report.Designer.SelectedObjects.Add(line);
  73. }
  74. e.activeObject = this.Rows[0].ChildObjects[0] as TableCell;
  75. isResizing = true;
  76. e.cursor = Cursors.PanSW;
  77. }
  78. }
  79. /// <inheritdoc/>
  80. public override void HandleMouseUp(FRMouseEventArgs e)
  81. {
  82. base.HandleMouseUp(e);
  83. if (itemsBeforeMDown != null && itemsBeforeMDown.Count != 0)
  84. {
  85. Report.Designer.SelectedObjects.Clear();
  86. foreach(ComponentBase item in itemsBeforeMDown)
  87. {
  88. if (AllObjects.Contains(item))
  89. Report.Designer.SelectedObjects.Add(item);
  90. }
  91. if (Report.Designer.SelectedObjects.Count == 0)
  92. Report.Designer.SelectedObjects.Add(this);
  93. itemsBeforeMDown.Clear();
  94. }
  95. isResizing = false;
  96. }
  97. /// <inheritdoc/>
  98. public override void HandleMouseMove(FRMouseEventArgs e)
  99. {
  100. base.HandleMouseMove(e);
  101. if (IsSelected && new RectangleF(AbsRight + 2, AbsBottom + 3, 16, 16).Contains(new PointF(e.x, e.y)))
  102. {
  103. e.cursor = Cursors.PanSE;
  104. e.handled = true;
  105. }
  106. if (!(e.mode == WorkspaceMode2.Size && e.activeObject == this.Rows[0].ChildObjects[0] as TableCell && isResizing))
  107. return;
  108. float longestHeigh = (Rows.ToArray().ToList().Last() as TableRow).ChildObjects.ToArray().ToList().Max((x => (x as TableCell).Height));
  109. float longestWidth = (Rows.ToArray().ToList().Last() as TableRow).ChildObjects.ToArray().ToList().Max((x => (x as TableCell).Width));
  110. System.Diagnostics.Debug.WriteLine(longestHeigh);
  111. bool wasChanged = false;
  112. if (e.y > AbsBottom + 19)
  113. {
  114. TableRow row = new TableRow();
  115. Rows.Insert(Rows.Count, row);
  116. CreateUniqueNames();
  117. wasChanged = true;
  118. }
  119. else if (e.y < AbsBottom - longestHeigh && Rows.Count > 1)
  120. {
  121. wasChanged = true;
  122. Rows.RemoveAt(Rows.Count - 1);
  123. }
  124. if (e.x > AbsRight + longestWidth)
  125. {
  126. TableColumn column = new TableColumn();
  127. Columns.Insert(Columns.Count, column);
  128. CreateUniqueNames();
  129. wasChanged = true;
  130. }
  131. else if (e.x < AbsRight - longestWidth && Columns.Count > 1)
  132. {
  133. wasChanged = true;
  134. Columns.RemoveAt(Columns.Count - 1);
  135. }
  136. if (wasChanged)
  137. {
  138. Report.Designer.SelectedObjects.Clear();
  139. foreach (ComponentBase line in ChildObjects)
  140. {
  141. if (line is TableColumn)
  142. Report.Designer.SelectedObjects.Add(line);
  143. }
  144. }
  145. }
  146. /// <inheritdoc/>
  147. public override void HandleDragDrop(FRMouseEventArgs e)
  148. {
  149. dragCell.Text = (e.DragSource as TextObject).Text;
  150. dragCell = null;
  151. }
  152. internal override ContextMenuBase GetColumnContextMenu(TableColumn column)
  153. {
  154. return new TableColumnMenu(Report.Designer);
  155. }
  156. internal override ContextMenuBase GetRowContextMenu(TableRow row)
  157. {
  158. return new TableRowMenu(Report.Designer);
  159. }
  160. internal override ContextMenuBase GetCellContextMenu(TableCell cell)
  161. {
  162. return new TableCellMenu(Report.Designer);
  163. }
  164. internal override SmartTagBase GetCellSmartTag(TableCell cell)
  165. {
  166. return new TextObjectSmartTag(cell);
  167. }
  168. internal override void HandleCellDoubleClick(TableCell cell)
  169. {
  170. if (!cell.HasRestriction(Restrictions.DontEdit) && cell.InvokeEditor())
  171. Report.Designer.SetModified(this, "Change");
  172. }
  173. #endregion
  174. #region private methods
  175. private void DrawDesign(FRPaintEventArgs e)
  176. {
  177. if (IsDesigning && IsSelected)
  178. e.Graphics.DrawImage(Report.Designer.GetImage(152), (int)(AbsRight * e.ScaleX + 2), (int)(AbsBottom * e.ScaleY + 3));
  179. }
  180. #endregion
  181. }
  182. }