ObjectsToolbar.Mono.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows.Forms;
  4. using System.Drawing;
  5. using FastReport.Utils;
  6. using FastReport.Forms;
  7. namespace FastReport.Design
  8. {
  9. internal class ObjectsToolbar : ToolStrip, IDesignerPlugin
  10. {
  11. #region Fields
  12. private Size buttonSize;
  13. private Report currentReport;
  14. private PageBase currentPage;
  15. private ObjectInfo nowInserting;
  16. public ToolStripButton btnSelect;
  17. private Dictionary<Type, List<ToolStripItem>> cachedButtons = new Dictionary<Type, List<ToolStripItem>>();
  18. #endregion
  19. #region Properties
  20. internal Designer Designer { get; }
  21. /// <inheritdoc/>
  22. public string PluginName => Name;
  23. #endregion
  24. #region Private Methods
  25. private void DoCreateButtons(ObjectInfo rootItem, bool forceCreate)
  26. {
  27. var pageType = rootItem.Object;
  28. if (!forceCreate && cachedButtons.ContainsKey(pageType))
  29. {
  30. GetCachedButtons(pageType);
  31. }
  32. else
  33. {
  34. DoCreateButtons(rootItem);
  35. CacheButtons(pageType);
  36. }
  37. }
  38. private void DoCreateButtons(ObjectInfo rootItem)
  39. {
  40. foreach (ObjectInfo item in rootItem.Items)
  41. {
  42. if (item.Items.Count == 0)
  43. {
  44. // it's an object
  45. ToolStripButton button = new ToolStripButton();
  46. button.AutoSize = false;
  47. button.Size = buttonSize;
  48. button.Image = this.GetImage(item.ImageIndex);
  49. button.ToolTipText = Res.TryGet(item.Text);
  50. button.Tag = item;
  51. button.Click += button_Click;
  52. Items.Add(button);
  53. }
  54. else
  55. {
  56. // it's a category
  57. ToolStripDropDownButton button = new ToolStripDropDownButton();
  58. button.Image = this.GetImage(item.ImageIndex);
  59. button.ToolTipText = Res.TryGet(item.Text);
  60. button.Tag = item;
  61. button.ShowDropDownArrow = false;
  62. button.AutoSize = false;
  63. button.Size = buttonSize;
  64. DoCreateMenus(item, button.DropDownItems);
  65. Items.Add(button);
  66. }
  67. }
  68. SortButtons(Items);
  69. }
  70. private void DoCreateMenus(ObjectInfo rootItem, ToolStripItemCollection items)
  71. {
  72. foreach (ObjectInfo item in rootItem.Items)
  73. {
  74. ToolStripMenuItem menuItem = new ToolStripMenuItem();
  75. menuItem.Image = this.GetImage(item.ImageIndex);
  76. menuItem.Text = Res.TryGet(item.Text);
  77. menuItem.Tag = item;
  78. menuItem.Font = DrawUtils.DefaultFont;
  79. items.Add(menuItem);
  80. if (item.Items.Count != 0)
  81. {
  82. // it's a category
  83. DoCreateMenus(item, menuItem.DropDownItems);
  84. }
  85. else
  86. {
  87. menuItem.Click += button_Click;
  88. }
  89. }
  90. SortButtons(items);
  91. }
  92. private void CreateSelectBtn()
  93. {
  94. btnSelect = new ToolStripButton();
  95. btnSelect.AutoSize = false;
  96. btnSelect.Size = buttonSize;
  97. btnSelect.Image = this.GetImage(100);
  98. btnSelect.ToolTipText = Res.Get("Designer,Toolbar,Objects,Select");
  99. btnSelect.Click += btnSelect_Click;
  100. Items.Add(btnSelect);
  101. }
  102. private void SortButtons(ToolStripItemCollection root)
  103. {
  104. List<ToolStripItem> tempItems = new List<ToolStripItem>();
  105. List<ToolStripItem> lastItems = new List<ToolStripItem>();
  106. tempItems.Add(root[0]);
  107. for (int i = 1; i < root.Count; i++)
  108. {
  109. for (int j = 1; j < root.Count; j++)
  110. {
  111. ObjectInfo objInfo = (root[j] as ToolStripItem).Tag as ObjectInfo;
  112. if (objInfo != null)
  113. {
  114. if (objInfo.ButtonIndex == i)
  115. {
  116. tempItems.Add(root[j]);
  117. }
  118. if (objInfo.ButtonIndex < 0 || objInfo.ButtonIndex >= root.Count)
  119. {
  120. lastItems.Add(root[j]);
  121. }
  122. }
  123. }
  124. }
  125. root.Clear();
  126. root.AddRange(tempItems.ToArray());
  127. root.AddRange(lastItems.ToArray());
  128. }
  129. private void CacheButtons(Type pageType)
  130. {
  131. var dictEntry = new List<ToolStripItem>();
  132. foreach (ToolStripItem item in Items)
  133. {
  134. if (item != btnSelect)
  135. dictEntry.Add(item);
  136. }
  137. cachedButtons[pageType] = dictEntry;
  138. }
  139. private void GetCachedButtons(Type pageType)
  140. {
  141. var dictEntry = cachedButtons[pageType];
  142. foreach (var item in dictEntry)
  143. {
  144. Items.Add(item);
  145. }
  146. }
  147. private void CreateButtons(bool forceCreate = false)
  148. {
  149. if (!forceCreate && Designer.ActiveReport != null &&
  150. Designer.ActiveReport == currentReport &&
  151. Designer.ActiveReportTab.ActivePage == currentPage)
  152. return;
  153. currentReport = Designer.ActiveReport;
  154. if (Designer.ActiveReportTab != null)
  155. currentPage = Designer.ActiveReportTab.ActivePage;
  156. else
  157. currentPage = null;
  158. // delete all buttons except btnSelect
  159. int i = 0;
  160. while (i < Items.Count)
  161. {
  162. if (!forceCreate && Items[i] == btnSelect)
  163. i++;
  164. else
  165. {
  166. Items.RemoveAt(i);
  167. }
  168. }
  169. if (forceCreate)
  170. CreateSelectBtn();
  171. // create object buttons
  172. ObjectInfo pageItem = RegisteredObjects.FindObject(currentPage);
  173. if (pageItem != null)
  174. {
  175. DoCreateButtons(pageItem, forceCreate);
  176. }
  177. }
  178. private void button_Click(object sender, EventArgs e)
  179. {
  180. Designer.FormatPainter = false;
  181. if (!Designer.cmdInsert.Enabled)
  182. return;
  183. ResetButtons();
  184. if (sender is ToolStripButton btn)
  185. btn.Checked = true;
  186. nowInserting = (sender as ToolStripItem).Tag as ObjectInfo;
  187. Designer.InsertObject(nowInserting, InsertFrom.NewObject);
  188. }
  189. private void btnSelect_Click(object sender, EventArgs e)
  190. {
  191. Designer.FormatPainter = false;
  192. if (Designer.ActiveReportTab == null)
  193. return;
  194. DoClickSelectButton(true);
  195. }
  196. private void DoClickSelectButton(bool ignoreMultiInsert)
  197. {
  198. if (!btnSelect.Checked)
  199. {
  200. if (nowInserting != null && nowInserting.MultiInsert && !ignoreMultiInsert)
  201. {
  202. Designer.InsertObject(nowInserting, InsertFrom.NewObject);
  203. }
  204. else
  205. {
  206. ResetButtons();
  207. btnSelect.Checked = true;
  208. Designer.CancelPaste();
  209. }
  210. }
  211. }
  212. private void ResetButtons()
  213. {
  214. foreach (ToolStripItem item in Items)
  215. {
  216. if (item is ToolStripButton btn)
  217. btn.Checked = false;
  218. }
  219. }
  220. #endregion
  221. #region Public Methods
  222. public void ClickSelectButton(bool ignoreMultiInsert)
  223. {
  224. DoClickSelectButton(ignoreMultiInsert);
  225. }
  226. #endregion
  227. #region IDesignerPlugin
  228. /// <inheritdoc/>
  229. public void SaveState()
  230. {
  231. }
  232. /// <inheritdoc/>
  233. public void RestoreState()
  234. {
  235. }
  236. /// <inheritdoc/>
  237. public void SelectionChanged()
  238. {
  239. CreateButtons();
  240. }
  241. /// <inheritdoc/>
  242. public void UpdateContent()
  243. {
  244. CreateButtons();
  245. }
  246. /// <inheritdoc/>
  247. public void Lock()
  248. {
  249. }
  250. /// <inheritdoc/>
  251. public void Unlock()
  252. {
  253. UpdateContent();
  254. }
  255. /// <inheritdoc/>
  256. public void Localize()
  257. {
  258. MyRes res = new MyRes("Designer,Toolbar,Objects");
  259. Text = res.Get("");
  260. btnSelect.ToolTipText = res.Get("Select");
  261. }
  262. /// <inheritdoc/>
  263. public DesignerOptionsPage GetOptionsPage()
  264. {
  265. return null;
  266. }
  267. /// <inheritdoc/>
  268. public void UpdateUIStyle()
  269. {
  270. Renderer = UIStyleUtils.GetToolStripRenderer(Designer.UIStyle);
  271. }
  272. /// <inheritdoc/>
  273. public void UpdateDpiDependencies()
  274. {
  275. Font = this.LogicalToDevice(DrawUtils.DefaultFont);
  276. Width = Designer.LogicalToDevice(30);
  277. CreateButtons(true);
  278. }
  279. #endregion
  280. public ObjectsToolbar(Designer designer) : base()
  281. {
  282. Designer = designer;
  283. Name = "ObjectsToolbar";
  284. Dock = DockStyle.Left;
  285. GripStyle = ToolStripGripStyle.Hidden;
  286. AutoSize = false;
  287. // WPF specific: button size with the default dpi setting.
  288. // On a multi-monitor system buttons will scale automatically
  289. buttonSize = this.LogicalToDevice(new Size(23, 23));
  290. if (Config.IsRunningOnMono)
  291. Padding = new Padding(1, 0, 0, 0);
  292. #if (WPF || AVALONIA)
  293. BorderThickness = new Padding(0, 0, 1, 0);
  294. #endif
  295. Parent = Designer;
  296. UpdateDpiDependencies();
  297. Localize();
  298. }
  299. }
  300. }