DesignerMenu.cs 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904
  1. using System;
  2. using System.Windows.Forms;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using FastReport.Utils;
  6. using FastReport.Design.ToolWindows;
  7. using FastReport.Design.Toolbars;
  8. using FastReport.Forms;
  9. using FastReport.DevComponents.DotNetBar;
  10. namespace FastReport.Design.StandardDesigner
  11. {
  12. /// <summary>
  13. /// Represents the designer's main menu.
  14. /// </summary>
  15. /// <remarks>
  16. /// To get this menu, use the following code:
  17. /// <code>
  18. /// Designer designer;
  19. /// DesignerMenu menu = designer.Plugins.FindType("DesignerMenu") as DesignerMenu;
  20. /// </code>
  21. /// </remarks>
  22. [ToolboxItem(false)]
  23. public class DesignerMenu : Bar, IDesignerPlugin
  24. {
  25. #region Fields
  26. private Designer designer;
  27. /// <summary>
  28. /// The "File" menu.
  29. /// </summary>
  30. public ButtonItem miFile;
  31. /// <summary>
  32. /// The "File|New..." menu.
  33. /// </summary>
  34. public ButtonItem miFileNew;
  35. /// <summary>
  36. /// The "File|Open..." menu.
  37. /// </summary>
  38. public ButtonItem miFileOpen;
  39. /// <summary>
  40. /// The "File|Open page..." menu.
  41. /// </summary>
  42. public ButtonItem miFileOpenPage;
  43. /// <summary>
  44. /// The "File|Open via Cloud..." menu.
  45. /// </summary>
  46. public ButtonItem miFileOpenViaCloud;
  47. /// <summary>
  48. /// The "File|Recent Files" menu.
  49. /// </summary>
  50. public ButtonItem miFileRecentFiles;
  51. /// <summary>
  52. /// The "File|Close" menu.
  53. /// </summary>
  54. public ButtonItem miFileClose;
  55. /// <summary>
  56. /// The "File|Save" menu.
  57. /// </summary>
  58. public ButtonItem miFileSave;
  59. /// <summary>
  60. /// The "File|Save as..." menu.
  61. /// </summary>
  62. public ButtonItem miFileSaveAs;
  63. /// <summary>
  64. /// The "File|Save with random data..." menu.
  65. /// </summary>
  66. public ButtonItem miFileSaveWithRandomData;
  67. /// <summary>
  68. /// The "File|Save All" menu.
  69. /// </summary>
  70. public ButtonItem miFileSaveAll;
  71. /// <summary>
  72. /// The "File|Save to Cloud..." menu.
  73. /// </summary>
  74. public ButtonItem miFileSaveToCloud;
  75. /// <summary>
  76. /// The "File|Page Setup..." menu.
  77. /// </summary>
  78. public ButtonItem miFilePageSetup;
  79. /// <summary>
  80. /// The "File|Printer Setup..." menu.
  81. /// </summary>
  82. public ButtonItem miFilePrinterSetup;
  83. /// <summary>
  84. /// The "File|Preview..." menu.
  85. /// </summary>
  86. public ButtonItem miFilePreview;
  87. /// <summary>
  88. /// The "File|Web preview..." menu.
  89. /// </summary>
  90. public ButtonItem miFileCloudPreview;
  91. /// <summary>
  92. /// The "File|Select Language" menu.
  93. /// </summary>
  94. public ButtonItem miFileSelectLanguage;
  95. /// <summary>
  96. /// The "File|Exit" menu.
  97. /// </summary>
  98. public ButtonItem miFileExit;
  99. /// <summary>
  100. /// The "Edit" menu.
  101. /// </summary>
  102. public ButtonItem miEdit;
  103. /// <summary>
  104. /// The "Edit|Undo" menu.
  105. /// </summary>
  106. public ButtonItem miEditUndo;
  107. /// <summary>
  108. /// The "Edit|Redo" menu.
  109. /// </summary>
  110. public ButtonItem miEditRedo;
  111. /// <summary>
  112. /// The "Edit|Cut" menu.
  113. /// </summary>
  114. public ButtonItem miEditCut;
  115. /// <summary>
  116. /// The "Edit|Copy" menu.
  117. /// </summary>
  118. public ButtonItem miEditCopy;
  119. /// <summary>
  120. /// The "Edit|Paste" menu.
  121. /// </summary>
  122. public ButtonItem miEditPaste;
  123. /// <summary>
  124. /// The "Edit|Delete" menu.
  125. /// </summary>
  126. public ButtonItem miEditDelete;
  127. /// <summary>
  128. /// The "Edit|NewPage" menu.
  129. /// </summary>
  130. public ButtonItem miEditNewPage;
  131. /// <summary>
  132. /// The "Edit|Copy Page" menu.
  133. /// </summary>
  134. public ButtonItem miEditCopyPage;
  135. /// <summary>
  136. /// The "Edit|Delete Page" menu.
  137. /// </summary>
  138. public ButtonItem miEditDeletePage;
  139. /// <summary>
  140. /// The "Edit|Select All" menu.
  141. /// </summary>
  142. public ButtonItem miEditSelectAll;
  143. /// <summary>
  144. /// The "Edit|Group" menu.
  145. /// </summary>
  146. public ButtonItem miEditGroup;
  147. /// <summary>
  148. /// The "Edit|Ungroup" menu.
  149. /// </summary>
  150. public ButtonItem miEditUngroup;
  151. /// <summary>
  152. /// The "Edit|Find..." menu.
  153. /// </summary>
  154. public ButtonItem miEditFind;
  155. /// <summary>
  156. /// The "Edit|Replace..." menu.
  157. /// </summary>
  158. public ButtonItem miEditReplace;
  159. /// <summary>
  160. /// The "View" menu.
  161. /// </summary>
  162. public ButtonItem miView;
  163. /// <summary>
  164. /// The "View|Toolbars" menu.
  165. /// </summary>
  166. public ButtonItem miViewToolbars;
  167. /// <summary>
  168. /// The "View|Start Page" menu.
  169. /// </summary>
  170. public ButtonItem miViewStartPage;
  171. /// <summary>
  172. /// The "View|Options..." menu.
  173. /// </summary>
  174. public ButtonItem miViewOptions;
  175. /// <summary>
  176. /// The "Insert" menu.
  177. /// </summary>
  178. public ButtonItem miInsert;
  179. /// <summary>
  180. /// The "Report" menu.
  181. /// </summary>
  182. public ButtonItem miReport;
  183. /// <summary>
  184. /// The "Report|Validation" menu.
  185. /// </summary>
  186. public ButtonItem miReportValidation;
  187. /// <summary>
  188. /// The "Report|Options..." menu.
  189. /// </summary>
  190. public ButtonItem miReportOptions;
  191. /// <summary>
  192. /// The "Data" menu.
  193. /// </summary>
  194. public ButtonItem miData;
  195. /// <summary>
  196. /// The "Data|Choose Report Data..." menu.
  197. /// </summary>
  198. public ButtonItem miDataChoose;
  199. /// <summary>
  200. /// The "Data|Add Data Source..." menu.
  201. /// </summary>
  202. public ButtonItem miDataAdd;
  203. /// <summary>
  204. /// The "Data|Show Data Dictionary" menu.
  205. /// </summary>
  206. public ButtonItem miDataShowData;
  207. /// <summary>
  208. /// The "Window" menu.
  209. /// </summary>
  210. public ButtonItem miWindow;
  211. /// <summary>
  212. /// The "Window|Close All" menu.
  213. /// </summary>
  214. public ButtonItem miWindowCloseAll;
  215. /// <summary>
  216. /// The "Help" menu.
  217. /// </summary>
  218. public ButtonItem miHelp;
  219. /// <summary>
  220. /// The "Help|Help Contents..." menu.
  221. /// </summary>
  222. public ButtonItem miHelpContents;
  223. public ButtonItem miHelpAccount;
  224. /// <summary>
  225. /// The "Help|About..." menu.
  226. /// </summary>
  227. public ButtonItem miHelpAbout;
  228. #endregion
  229. #region Properties
  230. internal Designer Designer
  231. {
  232. get { return designer; }
  233. }
  234. /// <inheritdoc/>
  235. public string PluginName
  236. {
  237. get { return Name; }
  238. }
  239. #endregion
  240. #region Protected Methods
  241. /// <inheritdoc/>
  242. protected override bool ProcessShortcut(eShortcut key)
  243. {
  244. if (!Config.DisableHotkeys)
  245. return base.ProcessShortcut(key);
  246. return false;
  247. }
  248. #endregion
  249. #region Private Methods
  250. private void UpdateControls()
  251. {
  252. miFileNew.Enabled = Designer.cmdNew.Enabled;
  253. miFileOpen.Enabled = Designer.cmdOpen.Enabled;
  254. #if !COMMUNITY
  255. miFileOpenPage.Enabled = Designer.cmdOpenPage.Enabled;
  256. #endif
  257. miFileOpenViaCloud.Enabled = Designer.cmdOpenViaCloud.Enabled;
  258. miFileClose.Enabled = Designer.cmdClose.Enabled;
  259. miFileClose.Visible = Designer.MdiMode;
  260. miFileSave.Enabled = Designer.cmdSave.Enabled;
  261. miFileSaveAs.Enabled = Designer.cmdSaveAs.Enabled;
  262. miFileSaveWithRandomData.Enabled = Designer.cmdSaveWithRandomData.Enabled;
  263. miFileSaveAll.Visible = Designer.MdiMode;
  264. miFileSaveAll.Enabled = Designer.cmdSaveAll.Enabled;
  265. miFileSaveToCloud.Enabled = Designer.cmdSaveToCloudCommand.Enabled;
  266. miFilePageSetup.Enabled = Designer.cmdPageSetup.Enabled;
  267. miFilePrinterSetup.Enabled = Designer.cmdPrinterSetup.Enabled;
  268. miFilePreview.Enabled = Designer.cmdPreview.Enabled;
  269. miFileCloudPreview.Enabled = Designer.cmdPreviewCloud.Enabled;
  270. miEditUndo.Enabled = Designer.cmdUndo.Enabled;
  271. miEditRedo.Enabled = Designer.cmdRedo.Enabled;
  272. miEditCut.Enabled = Designer.cmdCut.Enabled;
  273. miEditCopy.Enabled = Designer.cmdCopy.Enabled;
  274. miEditNewPage.Enabled = Designer.cmdNewPage.Enabled;
  275. miEditCopyPage.Enabled = Designer.cmdCopyPage.Enabled;
  276. miEditDeletePage.Enabled = Designer.cmdDeletePage.Enabled;
  277. miEditDelete.Enabled = Designer.cmdDelete.Enabled;
  278. miEditSelectAll.Enabled = Designer.cmdSelectAll.Enabled;
  279. miEditGroup.Enabled = Designer.cmdGroup.Enabled;
  280. miEditUngroup.Enabled = Designer.cmdUngroup.Enabled;
  281. miEditFind.Enabled = Designer.cmdFind.Enabled;
  282. miEditReplace.Enabled = Designer.cmdReplace.Enabled;
  283. miInsert.Visible = Designer.cmdInsert.Enabled;
  284. miDataChoose.Enabled = Designer.cmdChooseData.Enabled;
  285. miDataAdd.Enabled = Designer.cmdAddData.Enabled;
  286. miReportValidation.Enabled = Designer.cmdReportValidation.Enabled;
  287. miReportOptions.Enabled = Designer.cmdReportSettings.Enabled;
  288. miViewStartPage.Visible = Designer.MdiMode;
  289. miWindow.Visible = Designer.MdiMode;
  290. miHelpContents.Enabled = Designer.cmdHelpContents.Enabled;
  291. miHelpAccount.Enabled = Designer.cmdAccount.Enabled;
  292. Refresh();
  293. }
  294. private void InsertMenuCreateMenus(ObjectInfo rootItem, SubItemsCollection rootMenu)
  295. {
  296. foreach (ObjectInfo item in rootItem.Items)
  297. {
  298. ButtonItem menuItem = new ButtonItem();
  299. menuItem.Text = Res.TryGet(item.Text);
  300. menuItem.Tag = item;
  301. rootMenu.Add(menuItem);
  302. if (item.Items.Count > 0)
  303. {
  304. // it's a category
  305. InsertMenuCreateMenus(item, menuItem.SubItems);
  306. }
  307. else
  308. {
  309. menuItem.ImageIndex = item.ImageIndex;
  310. menuItem.Image = this.GetImage(item.ImageIndex);
  311. menuItem.Click += insertMenu_Click;
  312. }
  313. }
  314. }
  315. private void CreateInsertMenu()
  316. {
  317. if (Designer.ActiveReportTab != null && Designer.ActiveReportTab.ActivePage != null)
  318. {
  319. ObjectInfo pageItem = RegisteredObjects.FindObject(Designer.ActiveReportTab.ActivePage);
  320. if (pageItem != null)
  321. {
  322. InsertMenuCreateMenus(pageItem, miInsert.SubItems);
  323. }
  324. }
  325. }
  326. private void miFile_PopupOpen(object sender, PopupOpenEventArgs e)
  327. {
  328. // clear existing recent items
  329. miFileRecentFiles.SubItems.Clear();
  330. // add new items
  331. if (Designer.cmdRecentFiles.Enabled && Designer.RecentFiles.Count > 0)
  332. {
  333. foreach (string s in Designer.RecentFiles)
  334. {
  335. ButtonItem menuItem = new ButtonItem();
  336. menuItem.Text = s;
  337. if (Designer.cmdRecentFiles.IsCloudFile(s))
  338. menuItem.Image = Designer.GetImage(259);
  339. menuItem.Click += recentFile_Click;
  340. miFileRecentFiles.SubItems.Insert(0, menuItem);
  341. }
  342. }
  343. miFileRecentFiles.Enabled = miFileRecentFiles.SubItems.Count > 0;
  344. }
  345. private void miEdit_PopupOpen(object sender, PopupOpenEventArgs e)
  346. {
  347. miEditPaste.Enabled = Designer.cmdPaste.Enabled;
  348. }
  349. private void miInsert_PopupOpen(object sender, PopupOpenEventArgs e)
  350. {
  351. miInsert.SubItems.Clear();
  352. CreateInsertMenu();
  353. }
  354. private void miDataShowDataSources_Click(object sender, EventArgs e)
  355. {
  356. ToolWindowBase window = Designer.Plugins.Find("DictionaryWindow") as ToolWindowBase;
  357. window.Show();
  358. }
  359. private void miView_PopupOpen(object sender, PopupOpenEventArgs e)
  360. {
  361. // delete list of toolwindows
  362. while (miView.SubItems[0] != miViewStartPage)
  363. {
  364. miView.SubItems[0].Dispose();
  365. miView.SubItems.RemoveAt(0);
  366. }
  367. // create list of toolwindows
  368. foreach (IDesignerPlugin plugin in Designer.Plugins)
  369. {
  370. if (plugin is ToolWindowBase)
  371. {
  372. ButtonItem menuItem = new ButtonItem();
  373. menuItem.Text = (plugin as ToolWindowBase).Text;
  374. menuItem.ImageIndex = (plugin as ToolWindowBase).ImageIndex;
  375. menuItem.Image = (plugin as ToolWindowBase).Image;
  376. eShortcut shortcut = (plugin as ToolWindowBase).Shortcut;
  377. if (shortcut != eShortcut.None)
  378. menuItem.Shortcuts.Add(shortcut);
  379. menuItem.Tag = plugin;
  380. menuItem.Click += toolWindow_Click;
  381. miView.SubItems.Insert(0, menuItem);
  382. }
  383. }
  384. // delete list of toolbars
  385. miViewToolbars.SubItems.Clear();
  386. // create list of toolbars
  387. foreach (IDesignerPlugin plugin in Designer.Plugins)
  388. {
  389. if (plugin is DesignerToolbarBase)
  390. {
  391. ButtonItem menuItem = new ButtonItem();
  392. menuItem.Text = (plugin as DesignerToolbarBase).Text;
  393. menuItem.Tag = plugin;
  394. menuItem.Checked = (plugin as DesignerToolbarBase).Visible;
  395. menuItem.AutoCheckOnClick = true;
  396. menuItem.Click += toolbar_Click;
  397. miViewToolbars.SubItems.Add(menuItem);
  398. }
  399. }
  400. }
  401. private void miWindow_PopupOpen(object sender, PopupOpenEventArgs e)
  402. {
  403. // delete list of windows
  404. while (miWindow.SubItems[0] != miWindowCloseAll)
  405. {
  406. miWindow.SubItems[0].Dispose();
  407. miWindow.SubItems.RemoveAt(0);
  408. }
  409. // create list of windows
  410. int i = 0;
  411. foreach (DocumentWindow c in Designer.Documents)
  412. {
  413. ButtonItem menuItem = new ButtonItem();
  414. menuItem.Text = (i + 1).ToString() + " " + c.Text;
  415. menuItem.Tag = c;
  416. menuItem.Checked = c == Designer.ActiveReportTab;
  417. menuItem.Click += window_Click;
  418. miWindow.SubItems.Insert(i, menuItem);
  419. i++;
  420. }
  421. }
  422. private void toolWindow_Click(object sender, EventArgs e)
  423. {
  424. ToolWindowBase window = (sender as ButtonItem).Tag as ToolWindowBase;
  425. window.Show();
  426. }
  427. private void toolbar_Click(object sender, EventArgs e)
  428. {
  429. DesignerToolbarBase toolbar = (sender as ButtonItem).Tag as DesignerToolbarBase;
  430. toolbar.Visible = !toolbar.Visible;
  431. }
  432. private void recentFile_Click(object sender, EventArgs e)
  433. {
  434. Designer.cmdRecentFiles.LoadFile((sender as ButtonItem).Text);
  435. }
  436. private void window_Click(object sender, EventArgs e)
  437. {
  438. DocumentWindow window = (sender as ButtonItem).Tag as DocumentWindow;
  439. window.Activate();
  440. }
  441. private void insertMenu_Click(object sender, EventArgs e)
  442. {
  443. ObjectInfo info = (sender as ButtonItem).Tag as ObjectInfo;
  444. Designer.InsertObject(info, InsertFrom.NewObject);
  445. }
  446. #endregion
  447. #region IDesignerPlugin
  448. /// <inheritdoc/>
  449. public void SaveState()
  450. {
  451. }
  452. /// <inheritdoc/>
  453. public void RestoreState()
  454. {
  455. }
  456. /// <inheritdoc/>
  457. public void SelectionChanged()
  458. {
  459. UpdateControls();
  460. }
  461. /// <inheritdoc/>
  462. public void UpdateContent()
  463. {
  464. UpdateControls();
  465. }
  466. /// <inheritdoc/>
  467. public void Lock()
  468. {
  469. }
  470. /// <inheritdoc/>
  471. public void Unlock()
  472. {
  473. UpdateContent();
  474. }
  475. /// <inheritdoc/>
  476. public void Localize()
  477. {
  478. MyRes res = new MyRes("Designer,Menu");
  479. miFile.Text = res.Get("File");
  480. miFileNew.Text = res.Get("File,New");
  481. miFileOpen.Text = res.Get("File,Open");
  482. #if !COMMUNITY
  483. miFileOpenPage.Text = res.Get("File,OpenPage");
  484. #endif
  485. miFileOpenViaCloud.Text = res.Get("File,OpenViaCloud");
  486. miFileRecentFiles.Text = res.Get("File,RecentFiles");
  487. miFileClose.Text = res.Get("File,Close");
  488. miFileSave.Text = res.Get("File,Save");
  489. miFileSaveAs.Text = res.Get("File,SaveAs");
  490. miFileSaveWithRandomData.Text = res.Get("File,SaveWithRandomData");
  491. miFileSaveAll.Text = res.Get("File,SaveAll");
  492. miFileSaveToCloud.Text = res.Get("File,SaveToCloud");
  493. miFilePageSetup.Text = res.Get("File,PageSetup");
  494. miFilePrinterSetup.Text = res.Get("File,PrinterSetup");
  495. miFilePreview.Text = res.Get("File,Preview");
  496. miFileCloudPreview.Text = res.Get("File,PreviewCloud");
  497. miFileSelectLanguage.Text = res.Get("File,SelectLanguage");
  498. miFileExit.Text = res.Get("File,Exit");
  499. miEdit.Text = res.Get("Edit");
  500. miEditUndo.Text = res.Get("Edit,Undo");
  501. miEditRedo.Text = res.Get("Edit,Redo");
  502. miEditCut.Text = res.Get("Edit,Cut");
  503. miEditCopy.Text = res.Get("Edit,Copy");
  504. miEditPaste.Text = res.Get("Edit,Paste");
  505. miEditDelete.Text = res.Get("Edit,Delete");
  506. miEditNewPage.Text = res.Get("Edit,NewPage");
  507. miEditCopyPage.Text = res.Get("Edit,CopyPage");
  508. miEditDeletePage.Text = res.Get("Edit,DeletePage");
  509. miEditSelectAll.Text = res.Get("Edit,SelectAll");
  510. miEditGroup.Text = res.Get("Edit,Group");
  511. miEditUngroup.Text = res.Get("Edit,Ungroup");
  512. miEditFind.Text = res.Get("Edit,Find");
  513. miEditReplace.Text = res.Get("Edit,Replace");
  514. miInsert.Text = res.Get("Insert");
  515. miReport.Text = res.Get("Report");
  516. miReportValidation.Text = res.Get("Report,Validate");
  517. miReportOptions.Text = res.Get("Report,Options");
  518. miData.Text = res.Get("Data");
  519. miDataChoose.Text = res.Get("Data,Choose");
  520. miDataAdd.Text = res.Get("Data,Add");
  521. miDataShowData.Text = res.Get("Data,ShowData");
  522. miView.Text = res.Get("View");
  523. miViewToolbars.Text = res.Get("View,Toolbars");
  524. miViewStartPage.Text = res.Get("View,StartPage");
  525. miViewOptions.Text = res.Get("View,Options");
  526. miWindow.Text = res.Get("Window");
  527. miWindowCloseAll.Text = res.Get("Window,CloseAll");
  528. miHelp.Text = res.Get("Help");
  529. miHelpContents.Text = res.Get("Help,Contents");
  530. miHelpAccount.Text = res.Get("Help,Account");
  531. miHelpAbout.Text = res.Get("Help,About");
  532. }
  533. /// <inheritdoc/>
  534. public virtual DesignerOptionsPage GetOptionsPage()
  535. {
  536. return null;
  537. }
  538. /// <inheritdoc/>
  539. public void UpdateUIStyle()
  540. {
  541. Style = UIStyleUtils.GetDotNetBarStyle(Designer.UIStyle);
  542. }
  543. private void UpdateMenuDpiDependencies(SubItemsCollection items)
  544. {
  545. foreach (BaseItem item in items)
  546. {
  547. ButtonItem b = item as ButtonItem;
  548. if (b != null && b.ImageIndex != -1)
  549. b.Image = Designer.GetImage(b.ImageIndex);
  550. UpdateMenuDpiDependencies(item.SubItems);
  551. }
  552. }
  553. /// <inheritdoc/>
  554. public new void UpdateDpiDependencies()
  555. {
  556. base.UpdateDpiDependencies();
  557. SuspendLayout();
  558. Font = Designer.LogicalToDevice(DrawUtils.DefaultFont);
  559. UpdateMenuDpiDependencies(Items);
  560. ResumeLayout();
  561. RecalcLayout();
  562. }
  563. #endregion
  564. #region Public Methods
  565. /// <summary>
  566. /// Creates a new menu item.
  567. /// </summary>
  568. /// <returns>New menu item.</returns>
  569. public ButtonItem CreateMenuItem()
  570. {
  571. return CreateMenuItem(null);
  572. }
  573. /// <summary>
  574. /// Creates a new menu item.
  575. /// </summary>
  576. /// <param name="click">Click handler.</param>
  577. /// <returns>New menu item.</returns>
  578. public ButtonItem CreateMenuItem(EventHandler click)
  579. {
  580. return CreateMenuItem(-1, "", click);
  581. }
  582. /// <summary>
  583. /// Creates a new menu item.
  584. /// </summary>
  585. /// <param name="imageIndex">Item's image index.</param>
  586. /// <param name="click">Click handler.</param>
  587. /// <returns>New menu item.</returns>
  588. public ButtonItem CreateMenuItem(int imageIndex, EventHandler click)
  589. {
  590. return CreateMenuItem(imageIndex, "", click);
  591. }
  592. /// <summary>
  593. /// Creates a new menu item.
  594. /// </summary>
  595. /// <param name="text">Item's text.</param>
  596. /// <param name="click">Click handler.</param>
  597. /// <returns>New menu item.</returns>
  598. public ButtonItem CreateMenuItem(string text, EventHandler click)
  599. {
  600. return CreateMenuItem(-1, text, click);
  601. }
  602. /// <summary>
  603. /// Creates a new menu item.
  604. /// </summary>
  605. /// <param name="imageIndex">Item's image index.</param>
  606. /// <param name="text">Item's text.</param>
  607. /// <param name="click">Click handler.</param>
  608. /// <returns>New menu item.</returns>
  609. public ButtonItem CreateMenuItem(int imageIndex, string text, EventHandler click)
  610. {
  611. ButtonItem item = new ButtonItem();
  612. item.ImageIndex = imageIndex;
  613. item.Image = this.GetImage(imageIndex);
  614. item.Text = text;
  615. if (click != null)
  616. item.Click += click;
  617. return item;
  618. }
  619. #endregion
  620. /// <summary>
  621. /// Initializes a new instance of the <see cref="DesignerMenu"/> class with default settings.
  622. /// </summary>
  623. /// <param name="designer">The report designer.</param>
  624. public DesignerMenu(Designer designer) : base()
  625. {
  626. this.designer = designer;
  627. Name = "MainMenu";
  628. MenuBar = true;
  629. BarType = eBarType.MenuBar;
  630. Dock = DockStyle.Top;
  631. // create menu items
  632. miFile = CreateMenuItem();
  633. miFileNew = CreateMenuItem(Designer.cmdNew.Invoke);
  634. miFileOpen = CreateMenuItem(1, Designer.cmdOpen.Invoke);
  635. #if !COMMUNITY
  636. miFileOpenPage = CreateMenuItem(Designer.cmdOpenPage.Invoke);
  637. #endif
  638. miFileOpenViaCloud = CreateMenuItem(261, Designer.cmdOpenViaCloud.Invoke);
  639. miFileRecentFiles = CreateMenuItem();
  640. miFileRecentFiles.BeginGroup = true;
  641. miFileClose = CreateMenuItem(Designer.cmdClose.Invoke);
  642. miFileSave = CreateMenuItem(2, Designer.cmdSave.Invoke);
  643. miFileSave.BeginGroup = true;
  644. miFileSaveAs = CreateMenuItem(Designer.cmdSaveAs.Invoke);
  645. miFileSaveWithRandomData = CreateMenuItem(Designer.cmdSaveWithRandomData.Invoke);
  646. miFileSaveAll = CreateMenuItem(178, Designer.cmdSaveAll.Invoke);
  647. miFileSaveToCloud = CreateMenuItem(262, Designer.cmdSaveToCloudCommand.Invoke);
  648. miFilePageSetup = CreateMenuItem(Designer.cmdPageSetup.Invoke);
  649. miFilePageSetup.BeginGroup = true;
  650. miFilePrinterSetup = CreateMenuItem(Designer.cmdPrinterSetup.Invoke);
  651. miFilePreview = CreateMenuItem(3, Designer.cmdPreview.Invoke);
  652. miFileCloudPreview = CreateMenuItem(263, Designer.cmdPreviewCloud.Invoke);
  653. miFileSelectLanguage = CreateMenuItem(Designer.cmdSelectLanguage.Invoke);
  654. miFileSelectLanguage.BeginGroup = true;
  655. miFileExit = CreateMenuItem(Designer.Exit);
  656. miFileExit.BeginGroup = true;
  657. miEdit = CreateMenuItem();
  658. miEditUndo = CreateMenuItem(8, Designer.cmdUndo.Invoke);
  659. miEditRedo = CreateMenuItem(9, Designer.cmdRedo.Invoke);
  660. miEditCut = CreateMenuItem(5, Designer.cmdCut.Invoke);
  661. miEditCut.BeginGroup = true;
  662. miEditCopy = CreateMenuItem(6, Designer.cmdCopy.Invoke);
  663. miEditPaste = CreateMenuItem(7, Designer.cmdPaste.Invoke);
  664. miEditDelete = CreateMenuItem(51, Designer.cmdDelete.Invoke);
  665. miEditNewPage = CreateMenuItem(Designer.cmdNewPage.Invoke);
  666. miEditNewPage.BeginGroup = true;
  667. miEditCopyPage = CreateMenuItem(Designer.cmdCopyPage.Invoke);
  668. miEditDeletePage = CreateMenuItem(12, Designer.cmdDeletePage.Invoke);
  669. miEditSelectAll = CreateMenuItem(Designer.cmdSelectAll.Invoke);
  670. miEditSelectAll.BeginGroup = true;
  671. miEditGroup = CreateMenuItem(17, Designer.cmdGroup.Invoke);
  672. miEditGroup.BeginGroup = true;
  673. miEditUngroup = CreateMenuItem(16, Designer.cmdUngroup.Invoke);
  674. miEditFind = CreateMenuItem(181, Designer.cmdFind.Invoke);
  675. miEditFind.BeginGroup = true;
  676. miEditReplace = CreateMenuItem(Designer.cmdReplace.Invoke);
  677. miView = CreateMenuItem();
  678. miViewStartPage = CreateMenuItem(179, Designer.cmdViewStartPage.Invoke);
  679. miViewToolbars = CreateMenuItem();
  680. miViewToolbars.BeginGroup = true;
  681. miViewOptions = CreateMenuItem(Designer.cmdOptions.Invoke);
  682. miViewOptions.BeginGroup = true;
  683. miInsert = CreateMenuItem();
  684. miReport = CreateMenuItem();
  685. miReportValidation = CreateMenuItem(70, Designer.cmdReportValidation.Invoke);
  686. miReportValidation.BeginGroup = true;
  687. miReportOptions = CreateMenuItem(Designer.cmdReportSettings.Invoke);
  688. miData = CreateMenuItem();
  689. miDataChoose = CreateMenuItem(Designer.cmdChooseData.Invoke);
  690. miDataAdd = CreateMenuItem(137, Designer.cmdAddData.Invoke);
  691. miDataShowData = CreateMenuItem(72, miDataShowDataSources_Click);
  692. miWindow = CreateMenuItem();
  693. miWindowCloseAll = CreateMenuItem(202, Designer.cmdCloseAll.Invoke);
  694. miWindowCloseAll.BeginGroup = true;
  695. miHelp = CreateMenuItem();
  696. miHelpContents = CreateMenuItem(90, Designer.cmdHelpContents.Invoke);
  697. miHelpAccount = CreateMenuItem(259, Designer.cmdAccount.Invoke);
  698. miHelpAccount.BeginGroup = true;
  699. miHelpAbout = CreateMenuItem(Designer.cmdAbout.Invoke);
  700. miHelpAbout.BeginGroup = true;
  701. // create menu structure
  702. Items.AddRange(new BaseItem[] {
  703. miFile, miEdit, miView, miInsert, miReport, miData, miWindow, miHelp });
  704. miFile.SubItems.AddRange(new BaseItem[] {
  705. miFileNew,
  706. miFileOpen,
  707. #if !COMMUNITY
  708. miFileOpenPage,
  709. #endif
  710. miFileOpenViaCloud,
  711. miFileRecentFiles,
  712. miFileSave,
  713. miFileSaveAs,
  714. miFileSaveToCloud,
  715. miFileSaveAll, miFileSaveWithRandomData,
  716. miFileClose,
  717. miFilePageSetup, miFilePrinterSetup, miFilePreview,
  718. miFileCloudPreview,
  719. miFileSelectLanguage,
  720. miFileExit });
  721. miEdit.SubItems.AddRange(new BaseItem[] {
  722. miEditUndo, miEditRedo,
  723. miEditCut, miEditCopy, miEditPaste, miEditDelete, miEditNewPage, miEditCopyPage, miEditDeletePage, miEditSelectAll,
  724. miEditGroup, miEditUngroup,
  725. miEditFind, miEditReplace });
  726. miView.SubItems.AddRange(new BaseItem[] {
  727. miViewStartPage,
  728. miViewToolbars,
  729. miViewOptions });
  730. miInsert.SubItems.Add(new ButtonItem()); // allow to catch PopupOpen
  731. miReport.SubItems.Add(miReportValidation);
  732. miReport.SubItems.Add(miReportOptions);
  733. miData.SubItems.AddRange(new BaseItem[] {
  734. miDataChoose, miDataAdd, miDataShowData });
  735. miWindow.SubItems.Add(miWindowCloseAll);
  736. miHelp.SubItems.AddRange(new BaseItem[] {
  737. miHelpContents,
  738. miHelpAccount,
  739. miHelpAbout });
  740. // shortcuts
  741. System.Windows.Forms.Keys shortcut;
  742. if(Config.Shortcuts.TryGetValue("File,Open", out shortcut))
  743. miFileOpen.Shortcuts.Add((eShortcut)shortcut);
  744. if (Config.Shortcuts.TryGetValue("File,Save", out shortcut))
  745. miFileSave.Shortcuts.Add((eShortcut)shortcut);
  746. if (Config.Shortcuts.TryGetValue("File,SaveAs", out shortcut))
  747. miFileSaveAs.Shortcuts.Add((eShortcut)shortcut);
  748. if (Config.Shortcuts.TryGetValue("File,SaveAll", out shortcut))
  749. miFileSaveAll.Shortcuts.Add((eShortcut)shortcut);
  750. #if !COMMUNITY
  751. if (Config.Shortcuts.TryGetValue("File,Preview", out shortcut))
  752. miFilePreview.Shortcuts.Add((eShortcut)shortcut);
  753. #endif
  754. if (Config.Shortcuts.TryGetValue("Editing,Undo", out shortcut))
  755. miEditUndo.Shortcuts.Add((eShortcut)shortcut);
  756. if (Config.Shortcuts.TryGetValue("Editing,Redo", out shortcut))
  757. miEditRedo.Shortcuts.Add((eShortcut)shortcut);
  758. if (Config.Shortcuts.TryGetValue("Editing,Cut", out shortcut))
  759. miEditCut.Shortcuts.Add((eShortcut)shortcut);
  760. if (Config.Shortcuts.TryGetValue("Editing,Copy", out shortcut))
  761. miEditCopy.Shortcuts.Add((eShortcut)shortcut);
  762. if (Config.Shortcuts.TryGetValue("Editing,Paste", out shortcut))
  763. miEditPaste.Shortcuts.Add((eShortcut)shortcut);
  764. if (Config.Shortcuts.TryGetValue("Editing,NewPage", out shortcut))
  765. miEditNewPage.Shortcuts.Add((eShortcut)shortcut);
  766. if (Config.Shortcuts.TryGetValue("Editing,Find", out shortcut))
  767. miEditFind.Shortcuts.Add((eShortcut)shortcut);
  768. if (Config.Shortcuts.TryGetValue("Editing,SelectAll", out shortcut))
  769. miEditSelectAll.Shortcuts.Add((eShortcut)shortcut);
  770. if (Config.Shortcuts.TryGetValue("Editing,Replace", out shortcut))
  771. miEditReplace.Shortcuts.Add((eShortcut)shortcut);
  772. if (Config.Shortcuts.TryGetValue("Help,Contents", out shortcut))
  773. miHelpContents.Shortcuts.Add((eShortcut)shortcut);
  774. // events
  775. miFile.PopupOpen += miFile_PopupOpen;
  776. miEdit.PopupOpen += miEdit_PopupOpen;
  777. miInsert.PopupOpen += miInsert_PopupOpen;
  778. miView.PopupOpen += miView_PopupOpen;
  779. miWindow.PopupOpen += miWindow_PopupOpen;
  780. Localize();
  781. Designer.Controls.Add(this);
  782. }
  783. }
  784. }