TableObject.DesignExt.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  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 ExpandingTag expandingTag;
  24. private TableCell dragCell;
  25. private SelectedObjectCollection itemsBeforeMDown;
  26. private bool isResizing;
  27. #endregion
  28. #region Public Methods
  29. /// <inheritdoc/>
  30. public override void Draw(FRPaintEventArgs e)
  31. {
  32. base.Draw(e);
  33. if (dragCell != null)
  34. dragCell.DrawDragAcceptFrame(e, Color.Silver);
  35. DrawDesign(e);
  36. }
  37. /// <inheritdoc/>
  38. public override void HandleKeyDown(Control sender, KeyEventArgs e)
  39. {
  40. base.HandleKeyDown(sender, e);
  41. if (IsSelected && IsDesigning)
  42. foreach (KeyValuePair<string, Keys> shorcut in Config.Shortcuts)
  43. {
  44. if (shorcut.Value == e.KeyData)
  45. {
  46. switch (shorcut.Key)
  47. {
  48. case "Editing,Cut":
  49. Clipboard.CutCells(GetSelectionRect());
  50. CreateUniqueNames();
  51. Report.Designer.SetModified(null, "Change");
  52. break;
  53. case "Editing,Copy":
  54. Clipboard.CopyCells(GetSelectionRect());
  55. Report.Designer.SetModified(null, "Change");
  56. break;
  57. case "Editing,Paste":
  58. Clipboard.PasteCells((Report.Designer.SelectedObjects[0] as TableCell).Address);
  59. CreateUniqueNames();
  60. Report.Designer.SelectedObjects.Clear();
  61. Report.Designer.SelectedObjects.Add(this);
  62. Report.Designer.SetModified(null, "Change");
  63. break;
  64. }
  65. }
  66. }
  67. }
  68. /// <inheritdoc/>
  69. public override void HandleDragOver(FRMouseEventArgs e)
  70. {
  71. dragCell = null;
  72. if (!(e.DragSource is TextObject))
  73. return;
  74. for (int y = 0; y < Rows.Count; y++)
  75. {
  76. for (int x = 0; x < Columns.Count; x++)
  77. {
  78. TableCell cell = this[x, y];
  79. if (!IsInsideSpan(cell) && cell.PointInObject(new PointF(e.x, e.y)))
  80. {
  81. dragCell = cell;
  82. e.handled = true;
  83. break;
  84. }
  85. }
  86. }
  87. }
  88. /// <inheritdoc/>
  89. public override void HandleMouseDown(FRMouseEventArgs e)
  90. {
  91. base.HandleMouseDown(e);
  92. HandleMouseHover(e);
  93. if (IsSelected)
  94. {
  95. if (new RectangleF(AbsRight + 1, AbsBottom + 1, 16, 16).Contains(new PointF(e.x, e.y)))
  96. {
  97. e.handled = true;
  98. e.mode = WorkspaceMode2.Size;
  99. if (itemsBeforeMDown == null)
  100. itemsBeforeMDown = new SelectedObjectCollection();
  101. Report.Designer.SelectedObjects.CopyTo(itemsBeforeMDown);
  102. Report.Designer.SelectedObjects.Clear();
  103. foreach (ComponentBase line in ChildObjects)
  104. {
  105. if (line is TableColumn)
  106. Report.Designer.SelectedObjects.Add(line);
  107. }
  108. e.activeObject = this.Rows[0].ChildObjects[0] as TableCell;
  109. isResizing = true;
  110. e.cursor = Cursors.PanSW;
  111. }
  112. expandingTag.OnClick(e);
  113. }
  114. }
  115. /// <inheritdoc/>
  116. public override void HandleMouseUp(FRMouseEventArgs e)
  117. {
  118. base.HandleMouseUp(e);
  119. if (itemsBeforeMDown != null && itemsBeforeMDown.Count != 0)
  120. {
  121. Report.Designer.SelectedObjects.Clear();
  122. foreach (ComponentBase item in itemsBeforeMDown)
  123. {
  124. if (AllObjects.Contains(item))
  125. Report.Designer.SelectedObjects.Add(item);
  126. }
  127. if (Report.Designer.SelectedObjects.Count == 0)
  128. Report.Designer.SelectedObjects.Add(this);
  129. itemsBeforeMDown.Clear();
  130. }
  131. isResizing = false;
  132. }
  133. /// <inheritdoc/>
  134. public override void HandleMouseMove(FRMouseEventArgs e)
  135. {
  136. base.HandleMouseMove(e);
  137. if (IsSelected)
  138. {
  139. if (new RectangleF(AbsRight + 2, AbsBottom + 3, 16, 16).Contains(new PointF(e.x, e.y)))
  140. {
  141. e.cursor = Cursors.PanSE;
  142. e.handled = true;
  143. }
  144. expandingTag.OnMove(e);
  145. }
  146. if (!(e.mode == WorkspaceMode2.Size && e.activeObject == this.Rows[0].ChildObjects[0] as TableCell && isResizing))
  147. return;
  148. float longestHeigh = (Rows.ToArray().ToList().Last() as TableRow).ChildObjects.ToArray().ToList().Max((x => (x as TableCell).Height));
  149. float longestWidth = (Rows.ToArray().ToList().Last() as TableRow).ChildObjects.ToArray().ToList().Max((x => (x as TableCell).Width));
  150. bool wasChanged = false;
  151. if (e.y > AbsBottom + 19)
  152. {
  153. TableRow row = new TableRow();
  154. Rows.Insert(Rows.Count, row);
  155. CreateUniqueNames();
  156. wasChanged = true;
  157. }
  158. else if (e.y < AbsBottom - longestHeigh && Rows.Count > 1)
  159. {
  160. wasChanged = true;
  161. Rows.RemoveAt(Rows.Count - 1);
  162. }
  163. if (e.x > AbsRight + longestWidth)
  164. {
  165. TableColumn column = new TableColumn();
  166. Columns.Insert(Columns.Count, column);
  167. CreateUniqueNames();
  168. wasChanged = true;
  169. }
  170. else if (e.x < AbsRight - longestWidth && Columns.Count > 1)
  171. {
  172. wasChanged = true;
  173. Columns.RemoveAt(Columns.Count - 1);
  174. }
  175. if (wasChanged)
  176. {
  177. Report.Designer.SelectedObjects.Clear();
  178. foreach (ComponentBase line in ChildObjects)
  179. {
  180. if (line is TableColumn)
  181. Report.Designer.SelectedObjects.Add(line);
  182. }
  183. }
  184. }
  185. /// <inheritdoc/>
  186. public override void HandleDragDrop(FRMouseEventArgs e)
  187. {
  188. dragCell.Text = (e.DragSource as TextObject).Text;
  189. dragCell = null;
  190. }
  191. internal override ContextMenuBase GetColumnContextMenu(TableColumn column)
  192. {
  193. return new TableColumnMenu(Report.Designer);
  194. }
  195. internal override ContextMenuBase GetRowContextMenu(TableRow row)
  196. {
  197. return new TableRowMenu(Report.Designer);
  198. }
  199. internal override ContextMenuBase GetCellContextMenu(TableCell cell)
  200. {
  201. return new TableCellMenu(Report.Designer);
  202. }
  203. internal override SmartTagBase GetCellSmartTag(TableCell cell)
  204. {
  205. return new TextObjectSmartTag(cell);
  206. }
  207. internal override void HandleCellDoubleClick(TableCell cell)
  208. {
  209. if (!cell.HasRestriction(Restrictions.DontEdit) && cell.InvokeEditor())
  210. Report.Designer.SetModified(this, "Change");
  211. }
  212. #endregion
  213. #region private methods
  214. partial void InitTag()
  215. {
  216. expandingTag = new ExpandingTag(this);
  217. }
  218. private void DrawDesign(FRPaintEventArgs e)
  219. {
  220. if (IsDesigning && IsSelected)
  221. {
  222. e.Graphics.DrawImage(Report.Designer.GetImage(152), (int)(AbsRight * e.ScaleX + 2), (int)(AbsBottom * e.ScaleY + 3));
  223. expandingTag.Draw(e);
  224. }
  225. }
  226. #endregion
  227. /// <summary>
  228. /// Represent expanding tags for add a new row/column.
  229. /// </summary>
  230. partial class ExpandingTag
  231. {
  232. internal enum TriggeredRegion
  233. {
  234. None,
  235. NewColumn,
  236. NewRow,
  237. ActiveNewColumn,
  238. ActiveNewRow
  239. }
  240. private TableObject table;
  241. internal TriggeredRegion region;
  242. private TriggeredRegion prevRegion;
  243. internal int section;
  244. public void OnClick(FRMouseEventArgs e)
  245. {
  246. if (region == TriggeredRegion.ActiveNewColumn)
  247. {
  248. TableColumn column = new TableColumn();
  249. table.Columns.Insert(section + 1, column);
  250. table.CreateUniqueNames();
  251. table.Report.Designer.SelectedObjects.Clear();
  252. table.Report.Designer.SelectedObjects.Add(column);
  253. prevRegion = region;
  254. region = TriggeredRegion.None;
  255. e.handled = true;
  256. e.activeObject = column;
  257. table.Report.Designer.SetModified(null, "Change");
  258. }
  259. else if (region == TriggeredRegion.ActiveNewRow)
  260. {
  261. TableRow row = new TableRow();
  262. table.Rows.Insert(section + 1, row);
  263. table.CreateUniqueNames();
  264. table.Report.Designer.SelectedObjects.Clear();
  265. table.Report.Designer.SelectedObjects.Add(row);
  266. prevRegion = region;
  267. region = TriggeredRegion.None;
  268. e.handled = true;
  269. e.activeObject = row;
  270. table.FixParentHeight();
  271. table.Report.Designer.SetModified(null, "Change");
  272. }
  273. }
  274. public void OnMove(FRMouseEventArgs e)
  275. {
  276. if (table.IsSelected)
  277. {
  278. if (table.Parent is ReportComponentBase parent && (parent.AbsBottom < e.y || parent.AbsRight < e.x))
  279. {
  280. if (region != TriggeredRegion.None)
  281. prevRegion = region;
  282. region = TriggeredRegion.None;
  283. }
  284. else if (table.AbsTop > e.y && table.AbsTop - 16 < e.y)
  285. {
  286. for (int i = 0; i < table.ColumnCount; i++)
  287. {
  288. if (Math.Abs(table.Columns[i].AbsRight - e.x) < 16)
  289. {
  290. prevRegion = region;
  291. if (Math.Abs(table.Columns[i].AbsRight - e.x) < 8)
  292. {
  293. region = TriggeredRegion.ActiveNewColumn;
  294. e.cursor = Cursors.Default;
  295. }
  296. else
  297. region = TriggeredRegion.NewColumn;
  298. section = i;
  299. e.handled = true;
  300. break;
  301. }
  302. else
  303. {
  304. if (region != TriggeredRegion.None)
  305. prevRegion = region;
  306. region = TriggeredRegion.None;
  307. }
  308. }
  309. }
  310. else if (table.AbsLeft > e.x && table.AbsLeft - 16 < e.x)
  311. {
  312. for (int i = 0; i < table.RowCount; i++)
  313. {
  314. if (Math.Abs(table.Rows[i].AbsBottom - e.y) < 16)
  315. {
  316. if (Math.Abs(table.Rows[i].AbsBottom - e.y) < 8)
  317. {
  318. region = TriggeredRegion.ActiveNewRow;
  319. e.cursor = Cursors.Default;
  320. }
  321. else
  322. region = TriggeredRegion.NewRow;
  323. section = i;
  324. e.handled = true;
  325. break;
  326. }
  327. else
  328. {
  329. if (region != TriggeredRegion.None)
  330. prevRegion = region;
  331. region = TriggeredRegion.None;
  332. }
  333. }
  334. }
  335. else
  336. {
  337. prevRegion = region;
  338. region = TriggeredRegion.None;
  339. }
  340. if (region != prevRegion)
  341. (table.Report.Designer.ActiveReportTab.ActivePageDesigner as ReportPageDesigner).Workspace.Refresh();
  342. }
  343. }
  344. /// <summary>
  345. /// Draw expanding tag.
  346. /// </summary>
  347. /// <param name="e"></param>
  348. public void Draw(FRPaintEventArgs e)
  349. {
  350. if (table.IsDesigning && table.IsSelected)
  351. {
  352. if (region == TriggeredRegion.NewColumn || region == TriggeredRegion.ActiveNewColumn)
  353. {
  354. using (Pen pen = new Pen(region == TriggeredRegion.ActiveNewColumn ? Color.CornflowerBlue : Color.LightGray))
  355. {
  356. using (SolidBrush brush = new SolidBrush(Color.White))
  357. {
  358. float right = table.Columns[section].AbsRight;
  359. RectangleF rect = new RectangleF(
  360. (float)Math.Round((right - 8) * e.ScaleX),
  361. (float)Math.Round((table.AbsTop - 16) * e.ScaleY),
  362. (float)Math.Ceiling(16 * e.ScaleX),
  363. (float)Math.Ceiling(16 * e.ScaleY)
  364. );
  365. e.Graphics.FillAndDrawEllipse(pen, brush, rect);
  366. e.Graphics.FillRectangle(brush, (right - 2) * e.ScaleX, (table.AbsTop - 2) * e.ScaleY, 4 * e.ScaleX, (table.Height + 2) * e.ScaleY);
  367. e.Graphics.DrawLine(pen, (right - 2) * e.ScaleX, (table.AbsTop) * e.ScaleY, (right - 2) * e.ScaleX, (table.AbsBottom + 1) * e.ScaleY);
  368. e.Graphics.DrawLine(pen, (right + 2) * e.ScaleX, (table.AbsTop) * e.ScaleY, (right + 2) * e.ScaleX, (table.AbsBottom + 1) * e.ScaleY);
  369. pen.Width = 2 * e.ScaleY;
  370. e.Graphics.DrawLine(pen, rect.Left + 2 * e.ScaleX, (rect.Top + rect.Bottom) / 2, rect.Right - 2 * e.ScaleX, (rect.Top + rect.Bottom) / 2);
  371. e.Graphics.DrawLine(pen, (rect.Right + rect.Left) / 2, rect.Top + 2 * e.ScaleY, (rect.Right + rect.Left) / 2, rect.Bottom - 2 * e.ScaleY);
  372. }
  373. }
  374. }
  375. else if (region == TriggeredRegion.NewRow || region == TriggeredRegion.ActiveNewRow)
  376. {
  377. using (Pen pen = new Pen(region == TriggeredRegion.ActiveNewRow ? Color.CornflowerBlue : Color.LightGray))
  378. {
  379. using (SolidBrush brush = new SolidBrush(Color.White))
  380. {
  381. float bottom = table.Rows[section].AbsBottom;
  382. RectangleF rect = new RectangleF(
  383. (float)Math.Round((table.AbsLeft - 16) * e.ScaleX),
  384. (float)Math.Round((bottom - 8) * e.ScaleY),
  385. (float)Math.Ceiling(16 * e.ScaleX),
  386. (float)Math.Ceiling(16 * e.ScaleY)
  387. );
  388. e.Graphics.FillAndDrawEllipse(pen, brush, rect);
  389. e.Graphics.FillRectangle(brush, (table.AbsLeft - 2) * e.ScaleX, (bottom - 2) * e.ScaleY, (table.Width + 2) * e.ScaleX, 4 * e.ScaleY);
  390. e.Graphics.DrawLine(pen, (table.AbsLeft) * e.ScaleX, (bottom - 2) * e.ScaleY, (table.AbsRight + 1) * e.ScaleX, (bottom - 2) * e.ScaleY);
  391. e.Graphics.DrawLine(pen, (table.AbsLeft) * e.ScaleX, (bottom + 2) * e.ScaleY, (table.AbsRight + 1) * e.ScaleX, (bottom + 2) * e.ScaleY);
  392. pen.Width = 2 * e.ScaleY;
  393. e.Graphics.DrawLine(pen, rect.Left + 2 * e.ScaleX, (rect.Top + rect.Bottom) / 2, rect.Right - 2 * e.ScaleX, (rect.Top + rect.Bottom) / 2);
  394. e.Graphics.DrawLine(pen, (rect.Right + rect.Left) / 2, rect.Top + 2 * e.ScaleY, (rect.Right + rect.Left) / 2, rect.Bottom - 2 * e.ScaleY);
  395. }
  396. }
  397. }
  398. }
  399. }
  400. public ExpandingTag(TableObject table)
  401. {
  402. this.table = table;
  403. }
  404. }
  405. }
  406. }