TableCellMenu.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. using FastReport.Design;
  2. using FastReport.Forms;
  3. using FastReport.Utils;
  4. using System;
  5. using System.Drawing;
  6. using System.Windows.Forms;
  7. namespace FastReport.Table
  8. {
  9. internal class TableCellMenu : TableMenuBase
  10. {
  11. #region Fields
  12. private SelectedObjectCollection selection;
  13. private TableBase table;
  14. private TableCell topCell;
  15. private ContextMenuItem miFormat;
  16. private ContextMenuItem miMergeSplit;
  17. private ContextMenuItem miClear;
  18. private ContextMenuItem miCut;
  19. private ContextMenuItem miCopy;
  20. private ContextMenuItem miPaste;
  21. private ContextMenuItem miInsert;
  22. private ContextMenuItem miRemove;
  23. private ContextMenuItem miAddColumnLeft;
  24. private ContextMenuItem miAddColumnRight;
  25. private ContextMenuItem miAddRowTop;
  26. private ContextMenuItem miAddRowBottom;
  27. private ContextMenuItem miRemoveRow;
  28. private ContextMenuItem miRemoveColumn;
  29. private ContextMenuItem miStyle;
  30. #endregion
  31. #region Private Methods
  32. private void miFormat_Click(object sender, EventArgs e)
  33. {
  34. using (FormatEditorForm form = new FormatEditorForm())
  35. {
  36. form.TextObject = topCell;
  37. if (form.ShowDialog() == DialogResult.OK)
  38. {
  39. SelectedTextBaseObjects components = new SelectedTextBaseObjects(Designer);
  40. components.Update();
  41. components.SetFormat(form.Formats);
  42. Change();
  43. }
  44. }
  45. }
  46. private void miMergeSplit_Click(object sender, EventArgs e)
  47. {
  48. if (miMergeSplit.Checked)
  49. {
  50. Rectangle rect = table.GetSelectionRect();
  51. // reset spans inside selection
  52. for (int x = 0; x < rect.Width; x++)
  53. {
  54. for (int y = 0; y < rect.Height; y++)
  55. {
  56. TableCell cell = table[x + rect.X, y + rect.Y];
  57. cell.ColSpan = 1;
  58. cell.RowSpan = 1;
  59. if (cell != topCell)
  60. cell.Text = "";
  61. }
  62. }
  63. topCell.ColSpan = rect.Width;
  64. topCell.RowSpan = rect.Height;
  65. selection.Clear();
  66. selection.Add(topCell);
  67. }
  68. else
  69. {
  70. topCell.ColSpan = 1;
  71. topCell.RowSpan = 1;
  72. }
  73. Change();
  74. }
  75. private void miClear_Click(object sender, EventArgs e)
  76. {
  77. foreach (Base c in selection)
  78. {
  79. if (c is TableCell)
  80. (c as TableCell).Text = "";
  81. }
  82. Change();
  83. }
  84. private void miCut_Click(object sender, EventArgs e)
  85. {
  86. table.Clipboard.CutCells(table.GetSelectionRect());
  87. table.CreateUniqueNames();
  88. Change();
  89. }
  90. private void miCopy_Click(object sender, EventArgs e)
  91. {
  92. table.Clipboard.CopyCells(table.GetSelectionRect());
  93. }
  94. private void miPaste_Click(object sender, EventArgs e)
  95. {
  96. table.Clipboard.PasteCells(topCell.Address);
  97. table.CreateUniqueNames();
  98. selection.Clear();
  99. selection.Add(table);
  100. Change();
  101. }
  102. private void miAddColumnLeft_Click(object sender, EventArgs e)
  103. {
  104. Rectangle rect = table.GetSelectionRect();
  105. int pos = rect.Left;
  106. int countNewColumns = rect.Width;
  107. selection.Clear();
  108. for (int i = 0; i < countNewColumns; i++)
  109. {
  110. TableColumn column = new TableColumn();
  111. table.Columns.Insert(pos, column);
  112. table.CreateUniqueNames();
  113. selection.Add(column);
  114. }
  115. Change();
  116. }
  117. private void miAddColumnRight_Click(object sender, EventArgs e)
  118. {
  119. Rectangle rect = table.GetSelectionRect();
  120. int pos = rect.Right;
  121. int countNewColumns = rect.Width;
  122. selection.Clear();
  123. for (int i = 0; i < countNewColumns; i++)
  124. {
  125. TableColumn column = new TableColumn();
  126. table.Columns.Insert(pos, column);
  127. table.CreateUniqueNames();
  128. selection.Add(column);
  129. }
  130. Change();
  131. }
  132. private void miAddRowTop_Click(object sender, EventArgs e)
  133. {
  134. Rectangle rect = table.GetSelectionRect();
  135. int pos = rect.Top;
  136. int countNewRows = rect.Height;
  137. selection.Clear();
  138. for (int i = 0; i < countNewRows; i++)
  139. {
  140. TableRow row = new TableRow();
  141. table.Rows.Insert(pos, row);
  142. table.CreateUniqueNames();
  143. selection.Add(row);
  144. }
  145. Change();
  146. }
  147. private void miAddRowBottom_Click(object sender, EventArgs e)
  148. {
  149. Rectangle rect = table.GetSelectionRect();
  150. int pos = rect.Bottom;
  151. int countNewRows = rect.Height;
  152. selection.Clear();
  153. for (int i = 0; i < countNewRows; i++)
  154. {
  155. TableRow row = new TableRow();
  156. table.Rows.Insert(pos, row);
  157. table.CreateUniqueNames();
  158. selection.Add(row);
  159. }
  160. Change();
  161. }
  162. private void miRemoveColumn_Click(object sender, EventArgs e)
  163. {
  164. Rectangle rect = table.GetSelectionRect();
  165. int pos = rect.Left;
  166. for (int i = 0; i < rect.Width; i++)
  167. {
  168. if (table.Columns[pos].IsAncestor)
  169. {
  170. FRMessageBox.Error(String.Format(Res.Get("Messages,DeleteAncestor"), table.Columns[pos].Name));
  171. break;
  172. }
  173. else
  174. table.Columns.RemoveAt(pos);
  175. }
  176. selection.Clear();
  177. selection.Add(table);
  178. Change();
  179. }
  180. private void miRemoveRow_Click(object sender, EventArgs e)
  181. {
  182. Rectangle rect = table.GetSelectionRect();
  183. int pos = rect.Top;
  184. for (int i = 0; i < rect.Height; i++)
  185. {
  186. if (table.Rows[pos].IsAncestor)
  187. {
  188. FRMessageBox.Error(String.Format(Res.Get("Messages,DeleteAncestor"), table.Rows[pos].Name));
  189. break;
  190. }
  191. else
  192. table.Rows.RemoveAt(pos);
  193. }
  194. selection.Clear();
  195. selection.Add(table);
  196. Change();
  197. }
  198. private void miStyle_Click(object sender, EventArgs e)
  199. {
  200. if (sender is ContextMenuItem menuItem)
  201. Designer.SelectedReportComponents.SetStyle(menuItem.Text);
  202. }
  203. #endregion
  204. public TableCellMenu(Designer designer) : base(designer)
  205. {
  206. selection = Designer.SelectedObjects;
  207. topCell = selection[0] as TableCell;
  208. table = topCell.Parent.Parent as TableBase;
  209. miFormat = CreateMenuItem(168, Res.Get("ComponentMenu,TextObject,Format"), new EventHandler(miFormat_Click));
  210. miMergeSplit = CreateMenuItem(217, Res.Get("ComponentMenu,TableCell,Merge"), new EventHandler(miMergeSplit_Click));
  211. miMergeSplit.CheckOnClick = true;
  212. miClear = CreateMenuItem(82, Res.Get("ComponentMenu,TextObject,Clear"), new EventHandler(miClear_Click));
  213. miCut = CreateMenuItem(5, Res.Get("Designer,Menu,Edit,Cut"), new EventHandler(miCut_Click));
  214. miCut.BeginGroup = true;
  215. miCopy = CreateMenuItem(6, Res.Get("Designer,Menu,Edit,Copy"), new EventHandler(miCopy_Click));
  216. miPaste = CreateMenuItem(7, Res.Get("Designer,Menu,Edit,Paste"), new EventHandler(miPaste_Click));
  217. miAddColumnLeft = CreateMenuItem(220, Res.Get("ComponentMenu,TableColumn,InsertToLeft"), new EventHandler(miAddColumnLeft_Click));
  218. miAddColumnRight = CreateMenuItem(221, Res.Get("ComponentMenu,TableColumn,InsertToRight"), new EventHandler(miAddColumnRight_Click));
  219. miAddRowTop = CreateMenuItem(218, Res.Get("ComponentMenu,TableRow,InsertAbove"), new EventHandler(miAddRowTop_Click));
  220. miAddRowBottom = CreateMenuItem(219, Res.Get("ComponentMenu,TableRow,InsertBelow"), new EventHandler(miAddRowBottom_Click));
  221. miInsert = CreateMenuItem(Res.Get("ComponentMenu,TableCell,Insert"));
  222. miInsert.DropDownItems.AddRange(new ContextMenuItem[] {
  223. miAddColumnLeft, miAddColumnRight, miAddRowTop, miAddRowBottom });
  224. miRemoveRow = CreateMenuItem(Res.Get("ComponentMenu,TableCell,RemoveRow"), new EventHandler(miRemoveRow_Click));
  225. miRemoveColumn = CreateMenuItem(Res.Get("ComponentMenu,TableCell,RemoveColumn"), new EventHandler(miRemoveColumn_Click));
  226. miRemove = CreateMenuItem(51, Res.Get("ComponentMenu,TableCell,Remove"), null);
  227. miRemove.DropDownItems.AddRange(new ContextMenuItem[] {
  228. miRemoveRow, miRemoveColumn });
  229. miStyle = CreateMenuItem(87, Res.Get("ComponentMenu,TableCell,Styles"), null);
  230. miStyle.Visible = table.Report.Styles.Count > 0;
  231. miStyle.BeginGroup = true;
  232. foreach (Style style in table.Report.Styles)
  233. {
  234. miStyle.DropDownItems.Add(CreateMenuItem(style.Name, new EventHandler(miStyle_Click)));
  235. }
  236. // QAT items
  237. miCut.QatItem = miCopy.QatItem = miPaste.QatItem = true;
  238. bool canJoin = selection.Count > 1;
  239. bool canSplit = selection.Count == 1 && topCell != null && (topCell.ColSpan > 1 || topCell.RowSpan > 1);
  240. miMergeSplit.Enabled = canJoin || canSplit;
  241. miMergeSplit.Checked = canSplit;
  242. if (miMergeSplit.Checked)
  243. miMergeSplit.Text = Res.Get("ComponentMenu,TableCell,Split");
  244. miPaste.Enabled = table.Clipboard.CanPasteCells;
  245. Items.AddRange(new ContextMenuItem[] {
  246. miFormat, miMergeSplit, miClear, miInsert, miRemove, miStyle,
  247. miCut, miCopy, miPaste });
  248. }
  249. }
  250. }