ObjectsToolbar.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows.Forms;
  4. using System.Drawing;
  5. using System.ComponentModel;
  6. using FastReport.Utils;
  7. using FastReport.Forms;
  8. #if !MONO
  9. using FastReport.DevComponents.DotNetBar;
  10. #endif
  11. namespace FastReport.Design
  12. {
  13. #if !MONO
  14. #if !DEBUG
  15. [DesignTimeVisible(false)]
  16. #endif
  17. internal class ObjectsToolbar : Bar, IDesignerPlugin
  18. #else
  19. internal class ObjectsToolbar : ToolStrip, IDesignerPlugin
  20. #endif
  21. {
  22. #region Fields
  23. private Designer designer;
  24. private Report currentReport;
  25. private PageBase currentPage;
  26. private ObjectInfo nowInserting;
  27. #if !MONO
  28. public ButtonItem btnSelect;
  29. #else
  30. public ToolStripButton btnSelect;
  31. #endif
  32. #endregion
  33. #region Properties
  34. internal Designer Designer
  35. {
  36. get { return designer; }
  37. }
  38. /// <inheritdoc/>
  39. public string PluginName
  40. {
  41. get { return Name; }
  42. }
  43. #endregion
  44. #region Private Methods
  45. #if !MONO
  46. private void DoCreateButtons(ObjectInfo rootItem, SubItemsCollection items)
  47. {
  48. foreach (ObjectInfo item in rootItem.Items)
  49. {
  50. if (!item.Enabled)
  51. continue;
  52. ButtonItem button = new ButtonItem();
  53. button.Image = Designer.GetImage(item.ImageIndex);
  54. int buttonSize = Designer.LogicalToDevice(25);
  55. string text = Res.TryGet(item.Text);
  56. if (items == Items)
  57. {
  58. button.Tooltip = text;
  59. button.FixedSize = new Size(buttonSize, buttonSize);
  60. }
  61. else
  62. {
  63. button.Text = text;
  64. button.ButtonStyle = eButtonStyle.ImageAndText;
  65. }
  66. if (item.Items.Count > 0)
  67. {
  68. // it's a category
  69. DoCreateButtons(item, button.SubItems);
  70. button.PopupSide = ePopupSide.Right;
  71. button.AutoExpandOnClick = true;
  72. button.FixedSize = new Size(buttonSize, Designer.LogicalToDevice(32));
  73. button.Tag = item;
  74. }
  75. else
  76. {
  77. button.Tag = item;
  78. button.Click += button_Click;
  79. }
  80. items.Add(button);
  81. }
  82. SortButtons(items);
  83. }
  84. private void CreateSelectBtn()
  85. {
  86. btnSelect = new ButtonItem();
  87. btnSelect.Image = Designer.GetImage(100);
  88. btnSelect.Click += btnSelect_Click;
  89. btnSelect.FixedSize = Designer.LogicalToDevice(new Size(25, 25));
  90. btnSelect.Tooltip = Res.Get("Designer,Toolbar,Objects,Select");
  91. Items.Add(btnSelect);
  92. }
  93. private void SortButtons(SubItemsCollection root)
  94. {
  95. List<BaseItem> tempItems = new List<BaseItem>();
  96. List<BaseItem> lastItems = new List<BaseItem>();
  97. tempItems.Add(root[0]);
  98. for (int i = 1; i < root.Count; i++)
  99. {
  100. for (int j = 1; j < root.Count; j++)
  101. {
  102. ObjectInfo objInfo = (root[j] as ButtonItem).Tag as ObjectInfo;
  103. if (objInfo != null)
  104. {
  105. if (objInfo.ButtonIndex == i)
  106. {
  107. tempItems.Add(root[j]);
  108. }
  109. if (objInfo.ButtonIndex < 0 || objInfo.ButtonIndex >= root.Count)
  110. {
  111. lastItems.Add(root[j]);
  112. }
  113. }
  114. }
  115. }
  116. root.Clear();
  117. root.AddRange(tempItems.ToArray());
  118. root.AddRange(lastItems.ToArray());
  119. }
  120. #else
  121. private void DoCreateButtons(ObjectInfo rootItem)
  122. {
  123. foreach (ObjectInfo item in rootItem.Items)
  124. {
  125. if (item.Items.Count == 0)
  126. {
  127. // it's an object
  128. ToolStripButton button = new ToolStripButton();
  129. button.AutoSize = false;
  130. button.Size = new Size(22, 23);
  131. button.Image = this.GetImage(item.ImageIndex);
  132. button.ToolTipText = Res.TryGet(item.Text);
  133. button.Tag = item;
  134. button.Click += button_Click;
  135. Items.Add(button);
  136. }
  137. else
  138. {
  139. // it's a category
  140. ToolStripDropDownButton button = new ToolStripDropDownButton();
  141. button.Image = this.GetImage(item.ImageIndex);
  142. button.ToolTipText = Res.TryGet(item.Text);
  143. button.Tag = item;
  144. button.ShowDropDownArrow = false;
  145. button.AutoSize = false;
  146. button.Size = new Size(22, 23);
  147. DoCreateMenus(item, button.DropDownItems);
  148. Items.Add(button);
  149. }
  150. }
  151. SortButtons(Items);
  152. }
  153. private void DoCreateMenus(ObjectInfo rootItem, ToolStripItemCollection items)
  154. {
  155. foreach (ObjectInfo item in rootItem.Items)
  156. {
  157. ToolStripMenuItem menuItem = new ToolStripMenuItem();
  158. menuItem.Image = this.GetImage(item.ImageIndex);
  159. menuItem.Text = Res.TryGet(item.Text);
  160. menuItem.Tag = item;
  161. menuItem.Font = DrawUtils.DefaultFont;
  162. items.Add(menuItem);
  163. if (item.Items.Count != 0)
  164. {
  165. // it's a category
  166. DoCreateMenus(item, menuItem.DropDownItems);
  167. }
  168. else
  169. {
  170. menuItem.Click += button_Click;
  171. }
  172. }
  173. SortButtons(items);
  174. }
  175. private void CreateSelectBtn()
  176. {
  177. btnSelect = new ToolStripButton();
  178. btnSelect.Image = this.GetImage(100);
  179. btnSelect.AutoSize = false;
  180. btnSelect.Size = new Size(22, 23);
  181. btnSelect.ToolTipText = Res.Get("Designer,Toolbar,Objects,Select");
  182. btnSelect.Click += btnSelect_Click;
  183. Items.Add(btnSelect);
  184. }
  185. private void SortButtons(ToolStripItemCollection root)
  186. {
  187. List<ToolStripItem> tempItems = new List<ToolStripItem>();
  188. List<ToolStripItem> lastItems = new List<ToolStripItem>();
  189. tempItems.Add(root[0]);
  190. for (int i = 1; i < root.Count; i++)
  191. {
  192. for (int j = 1; j < root.Count; j++)
  193. {
  194. ObjectInfo objInfo = (root[j] as ToolStripItem).Tag as ObjectInfo;
  195. if (objInfo != null)
  196. {
  197. if (objInfo.ButtonIndex == i)
  198. {
  199. tempItems.Add(root[j]);
  200. }
  201. if (objInfo.ButtonIndex < 0 || objInfo.ButtonIndex >= root.Count)
  202. {
  203. lastItems.Add(root[j]);
  204. }
  205. }
  206. }
  207. }
  208. root.Clear();
  209. root.AddRange(tempItems.ToArray());
  210. root.AddRange(lastItems.ToArray());
  211. }
  212. #endif
  213. private void CreateButtons(bool forceCreate = false)
  214. {
  215. if (!forceCreate &&
  216. Designer.ActiveReport != null && Designer.ActiveReport == currentReport &&
  217. Designer.ActiveReportTab.ActivePage == currentPage)
  218. return;
  219. currentReport = Designer.ActiveReport;
  220. if (Designer.ActiveReportTab != null)
  221. currentPage = Designer.ActiveReportTab.ActivePage;
  222. else
  223. currentPage = null;
  224. // delete all buttons except btnSelect
  225. int i = 0;
  226. while (i < Items.Count)
  227. {
  228. if (!forceCreate && Items[i] == btnSelect)
  229. i++;
  230. else
  231. {
  232. Items[i].Dispose();
  233. #if !MONO
  234. Items.RemoveAt(i);
  235. #endif
  236. }
  237. }
  238. #if !MONO
  239. if (forceCreate)
  240. CreateSelectBtn();
  241. if (currentPage == null)
  242. {
  243. RecalcLayout();
  244. return;
  245. }
  246. // create object buttons
  247. ObjectInfo pageItem = RegisteredObjects.FindObject(currentPage);
  248. if (pageItem != null)
  249. {
  250. DoCreateButtons(pageItem, Items);
  251. }
  252. RecalcLayout();
  253. #else
  254. if (forceCreate)
  255. CreateSelectBtn();
  256. // create object buttons
  257. ObjectInfo pageItem = new ObjectInfo();
  258. ObjectInfo info = RegisteredObjects.FindObject(currentPage);
  259. bool contain = true;
  260. if (info != null)
  261. {
  262. foreach(ObjectInfo item in info.Items)
  263. {
  264. contain = true;
  265. if (pageItem.Items.Count != 0)
  266. {
  267. foreach (ObjectInfo obj_item in pageItem.Items)
  268. {
  269. if (item.Text == obj_item.Text)
  270. {
  271. contain = false;
  272. break;
  273. }
  274. }
  275. }
  276. if (contain)
  277. {
  278. pageItem.Items.Add(item);
  279. }
  280. }
  281. DoCreateButtons(pageItem);
  282. }
  283. #endif
  284. }
  285. private void button_Click(object sender, EventArgs e)
  286. {
  287. Designer.FormatPainter = false;
  288. if (!Designer.cmdInsert.Enabled)
  289. return;
  290. ResetButtons();
  291. #if !MONO
  292. if (sender is ButtonItem && (sender as ButtonItem).IsOnBar)
  293. (sender as ButtonItem).Checked = true;
  294. nowInserting = (sender as ButtonItem).Tag as ObjectInfo;
  295. #else
  296. if (sender is ToolStripButton)
  297. (sender as ToolStripButton).Checked = true;
  298. nowInserting = (sender as ToolStripItem).Tag as ObjectInfo;
  299. #endif
  300. Designer.InsertObject(nowInserting, InsertFrom.NewObject);
  301. }
  302. private void btnSelect_Click(object sender, EventArgs e)
  303. {
  304. Designer.FormatPainter = false;
  305. if (Designer.ActiveReportTab == null)
  306. return;
  307. DoClickSelectButton(true);
  308. }
  309. private void DoClickSelectButton(bool ignoreMultiInsert)
  310. {
  311. if (!btnSelect.Checked)
  312. {
  313. if (nowInserting != null && nowInserting.MultiInsert && !ignoreMultiInsert)
  314. {
  315. Designer.InsertObject(nowInserting, InsertFrom.NewObject);
  316. }
  317. else
  318. {
  319. ResetButtons();
  320. btnSelect.Checked = true;
  321. Designer.CancelPaste();
  322. }
  323. }
  324. }
  325. private void ResetButtons()
  326. {
  327. #if !MONO
  328. foreach (BaseItem item in Items)
  329. {
  330. if (item is ButtonItem)
  331. (item as ButtonItem).Checked = false;
  332. }
  333. #else
  334. foreach (ToolStripItem item in Items)
  335. {
  336. if (item is ToolStripButton)
  337. (item as ToolStripButton).Checked = false;
  338. }
  339. #endif
  340. }
  341. #endregion
  342. #region Public Methods
  343. public void ClickSelectButton(bool ignoreMultiInsert)
  344. {
  345. DoClickSelectButton(ignoreMultiInsert);
  346. }
  347. #endregion
  348. #region IDesignerPlugin
  349. /// <inheritdoc/>
  350. public void SaveState()
  351. {
  352. }
  353. /// <inheritdoc/>
  354. public void RestoreState()
  355. {
  356. }
  357. /// <inheritdoc/>
  358. public void SelectionChanged()
  359. {
  360. CreateButtons();
  361. }
  362. /// <inheritdoc/>
  363. public void UpdateContent()
  364. {
  365. CreateButtons();
  366. }
  367. /// <inheritdoc/>
  368. public void Lock()
  369. {
  370. }
  371. /// <inheritdoc/>
  372. public void Unlock()
  373. {
  374. UpdateContent();
  375. }
  376. /// <inheritdoc/>
  377. public void Localize()
  378. {
  379. MyRes res = new MyRes("Designer,Toolbar,Objects");
  380. Text = res.Get("");
  381. #if !MONO
  382. btnSelect.Tooltip = res.Get("Select");
  383. #else
  384. btnSelect.ToolTipText = res.Get("Select");
  385. #endif
  386. }
  387. /// <inheritdoc/>
  388. public DesignerOptionsPage GetOptionsPage()
  389. {
  390. return null;
  391. }
  392. /// <inheritdoc/>
  393. public void UpdateUIStyle()
  394. {
  395. #if MONO
  396. Renderer = UIStyleUtils.GetToolStripRenderer(Designer.UIStyle);
  397. #endif
  398. }
  399. /// <inheritdoc/>
  400. public new void UpdateDpiDependencies()
  401. {
  402. SuspendLayout();
  403. Font = this.LogicalToDevice(DrawUtils.DefaultFont);
  404. #if !MONO
  405. base.UpdateDpiDependencies();
  406. #endif
  407. CreateButtons(true);
  408. ResumeLayout();
  409. }
  410. #endregion
  411. public ObjectsToolbar(Designer designer)
  412. : base()
  413. {
  414. this.designer = designer;
  415. Name = "ObjectsToolbar";
  416. Dock = DockStyle.Left;
  417. #if !MONO
  418. DockOrientation = eOrientation.Vertical;
  419. RoundCorners = false;
  420. #else
  421. GripStyle = ToolStripGripStyle.Hidden;
  422. AutoSize = false;
  423. Width = 26;
  424. if (Config.IsRunningOnMono)
  425. Padding = new Padding(1, 0, 0, 0);
  426. #endif
  427. #if !MONO
  428. Parent = Designer.DotNetBarManager.ToolbarLeftDockSite;
  429. #else
  430. Parent = Designer;
  431. #endif
  432. UpdateDpiDependencies();
  433. Localize();
  434. }
  435. }
  436. }