using System;
using System.Windows.Forms;
using System.ComponentModel;
using FastReport.Utils;
using FastReport.Design.ToolWindows;
using FastReport.Design.Toolbars;
using FastReport.Forms;
using FastReport.DevComponents.DotNetBar;
namespace FastReport.Design.StandardDesigner
{
///
/// Represents the designer's main menu.
///
///
/// To get this menu, use the following code:
///
/// Designer designer;
/// DesignerMenu menu = designer.Plugins.FindType("DesignerMenu") as DesignerMenu;
///
///
[ToolboxItem(false)]
public class DesignerMenu : Bar, IDesignerPlugin
{
#region Fields
private Designer designer;
///
/// The "File" menu.
///
public ButtonItem miFile;
///
/// The "File|New..." menu.
///
public ButtonItem miFileNew;
///
/// The "File|Open..." menu.
///
public ButtonItem miFileOpen;
///
/// The "File|Close" menu.
///
public ButtonItem miFileClose;
///
/// The "File|Save" menu.
///
public ButtonItem miFileSave;
///
/// The "File|Save as..." menu.
///
public ButtonItem miFileSaveAs;
///
/// The "File|Save with random data..." menu.
///
public ButtonItem miFileSaveWithRandomData;
///
/// The "File|Save All" menu.
///
public ButtonItem miFileSaveAll;
///
/// The "File|Page Setup..." menu.
///
public ButtonItem miFilePageSetup;
///
/// The "File|Printer Setup..." menu.
///
public ButtonItem miFilePrinterSetup;
///
/// The "File|Preview..." menu.
///
public ButtonItem miFilePreview;
///
/// The "File|Select Language" menu.
///
public ButtonItem miFileSelectLanguage;
///
/// The "File|Exit" menu.
///
public ButtonItem miFileExit;
///
/// The "Edit" menu.
///
public ButtonItem miEdit;
///
/// The "Edit|Undo" menu.
///
public ButtonItem miEditUndo;
///
/// The "Edit|Redo" menu.
///
public ButtonItem miEditRedo;
///
/// The "Edit|Cut" menu.
///
public ButtonItem miEditCut;
///
/// The "Edit|Copy" menu.
///
public ButtonItem miEditCopy;
///
/// The "Edit|Paste" menu.
///
public ButtonItem miEditPaste;
///
/// The "Edit|Delete" menu.
///
public ButtonItem miEditDelete;
///
/// The "Edit|NewPage" menu.
///
public ButtonItem miEditNewPage;
///
/// The "Edit|Copy Page" menu.
///
public ButtonItem miEditCopyPage;
///
/// The "Edit|Delete Page" menu.
///
public ButtonItem miEditDeletePage;
///
/// The "Edit|Select All" menu.
///
public ButtonItem miEditSelectAll;
///
/// The "Edit|Group" menu.
///
public ButtonItem miEditGroup;
///
/// The "Edit|Ungroup" menu.
///
public ButtonItem miEditUngroup;
///
/// The "Edit|Find..." menu.
///
public ButtonItem miEditFind;
///
/// The "Edit|Replace..." menu.
///
public ButtonItem miEditReplace;
///
/// The "View" menu.
///
public ButtonItem miView;
///
/// The "View|Toolbars" menu.
///
public ButtonItem miViewToolbars;
///
/// The "View|Start Page" menu.
///
public ButtonItem miViewStartPage;
///
/// The "View|Options..." menu.
///
public ButtonItem miViewOptions;
///
/// The "Insert" menu.
///
public ButtonItem miInsert;
///
/// The "Report" menu.
///
public ButtonItem miReport;
///
/// The "Report|Options..." menu.
///
public ButtonItem miReportOptions;
///
/// The "Data" menu.
///
public ButtonItem miData;
///
/// The "Data|Choose Report Data..." menu.
///
public ButtonItem miDataChoose;
///
/// The "Data|Add Data Source..." menu.
///
public ButtonItem miDataAdd;
///
/// The "Data|Show Data Dictionary" menu.
///
public ButtonItem miDataShowData;
///
/// The "Window" menu.
///
public ButtonItem miWindow;
///
/// The "Window|Close All" menu.
///
public ButtonItem miWindowCloseAll;
///
/// The "Help" menu.
///
public ButtonItem miHelp;
///
/// The "Help|Help Contents..." menu.
///
public ButtonItem miHelpContents;
public ButtonItem miHelpAccount;
///
/// The "Help|About..." menu.
///
public ButtonItem miHelpAbout;
#endregion
#region Properties
internal Designer Designer
{
get { return designer; }
}
///
public string PluginName
{
get { return Name; }
}
#endregion
#region Protected Methods
///
protected override bool ProcessShortcut(eShortcut key)
{
if (!Config.DisableHotkeys)
return base.ProcessShortcut(key);
return false;
}
#endregion
#region Private Methods
private void UpdateControls()
{
miFileNew.Enabled = Designer.cmdNew.Enabled;
miFileOpen.Enabled = Designer.cmdOpen.Enabled;
miFileClose.Enabled = Designer.cmdClose.Enabled;
miFileClose.Visible = Designer.MdiMode;
miFileSave.Enabled = Designer.cmdSave.Enabled;
miFileSaveAs.Enabled = Designer.cmdSaveAs.Enabled;
miFileSaveWithRandomData.Enabled = Designer.cmdSaveWithRandomData.Enabled;
miFileSaveAll.Visible = Designer.MdiMode;
miFileSaveAll.Enabled = Designer.cmdSaveAll.Enabled;
miFilePageSetup.Enabled = Designer.cmdPageSetup.Enabled;
miFilePrinterSetup.Enabled = Designer.cmdPrinterSetup.Enabled;
miFilePreview.Enabled = Designer.cmdPreview.Enabled;
miEditUndo.Enabled = Designer.cmdUndo.Enabled;
miEditRedo.Enabled = Designer.cmdRedo.Enabled;
miEditCut.Enabled = Designer.cmdCut.Enabled;
miEditCopy.Enabled = Designer.cmdCopy.Enabled;
miEditNewPage.Enabled = Designer.cmdNewPage.Enabled;
miEditCopyPage.Enabled = Designer.cmdCopyPage.Enabled;
miEditDeletePage.Enabled = Designer.cmdDeletePage.Enabled;
miEditDelete.Enabled = Designer.cmdDelete.Enabled;
miEditSelectAll.Enabled = Designer.cmdSelectAll.Enabled;
miEditGroup.Enabled = Designer.cmdGroup.Enabled;
miEditUngroup.Enabled = Designer.cmdUngroup.Enabled;
miEditFind.Enabled = Designer.cmdFind.Enabled;
miEditReplace.Enabled = Designer.cmdReplace.Enabled;
miInsert.Visible = Designer.cmdInsert.Enabled;
miDataChoose.Enabled = Designer.cmdChooseData.Enabled;
miDataAdd.Enabled = Designer.cmdAddData.Enabled;
miReportOptions.Enabled = Designer.cmdReportSettings.Enabled;
miViewStartPage.Visible = Designer.MdiMode;
miWindow.Visible = Designer.MdiMode;
miHelpContents.Enabled = Designer.cmdHelpContents.Enabled;
miHelpAccount.Enabled = Designer.cmdAccount.Enabled;
Refresh();
}
private void InsertMenuCreateMenus(ObjectInfo rootItem, SubItemsCollection rootMenu)
{
foreach (ObjectInfo item in rootItem.Items)
{
ButtonItem menuItem = new ButtonItem();
menuItem.Text = Res.TryGet(item.Text);
menuItem.Tag = item;
rootMenu.Add(menuItem);
if (item.Items.Count > 0)
{
// it's a category
InsertMenuCreateMenus(item, menuItem.SubItems);
}
else
{
menuItem.ImageIndex = item.ImageIndex;
menuItem.Image = this.GetImage(item.ImageIndex);
menuItem.Click += insertMenu_Click;
}
}
}
private void CreateInsertMenu()
{
if (Designer.ActiveReportTab != null && Designer.ActiveReportTab.ActivePage != null)
{
ObjectInfo pageItem = RegisteredObjects.FindObject(Designer.ActiveReportTab.ActivePage);
if (pageItem != null)
{
InsertMenuCreateMenus(pageItem, miInsert.SubItems);
}
}
}
private void miFile_PopupOpen(object sender, PopupOpenEventArgs e)
{
// clear existing recent items
int i = miFile.SubItems.IndexOf(miFileSelectLanguage) + 1;
while (miFile.SubItems[i] != miFileExit)
{
miFile.SubItems[i].Dispose();
miFile.SubItems.RemoveAt(i);
}
// add new items
if (Designer.cmdRecentFiles.Enabled && Designer.RecentFiles.Count > 0)
{
foreach (string s in Designer.RecentFiles)
{
ButtonItem menuItem = new ButtonItem();
menuItem.Text = s;
menuItem.Click += recentFile_Click;
miFile.SubItems.Insert(i, menuItem);
}
// make the first item separator
i = miFile.SubItems.IndexOf(miFileSelectLanguage) + 1;
(miFile.SubItems[i] as ButtonItem).BeginGroup = true;
}
}
private void miEdit_PopupOpen(object sender, PopupOpenEventArgs e)
{
miEditPaste.Enabled = Designer.cmdPaste.Enabled;
}
private void miInsert_PopupOpen(object sender, PopupOpenEventArgs e)
{
miInsert.SubItems.Clear();
CreateInsertMenu();
}
private void miDataShowDataSources_Click(object sender, EventArgs e)
{
ToolWindowBase window = Designer.Plugins.Find("DictionaryWindow") as ToolWindowBase;
window.Show();
}
private void miView_PopupOpen(object sender, PopupOpenEventArgs e)
{
// delete list of toolwindows
while (miView.SubItems[0] != miViewStartPage)
{
miView.SubItems[0].Dispose();
miView.SubItems.RemoveAt(0);
}
// create list of toolwindows
foreach (IDesignerPlugin plugin in Designer.Plugins)
{
if (plugin is ToolWindowBase)
{
ButtonItem menuItem = new ButtonItem();
menuItem.Text = (plugin as ToolWindowBase).Text;
menuItem.ImageIndex = (plugin as ToolWindowBase).ImageIndex;
menuItem.Image = (plugin as ToolWindowBase).Image;
eShortcut shortcut = (plugin as ToolWindowBase).Shortcut;
if (shortcut != eShortcut.None)
menuItem.Shortcuts.Add(shortcut);
menuItem.Tag = plugin;
menuItem.Click += toolWindow_Click;
miView.SubItems.Insert(0, menuItem);
}
}
// delete list of toolbars
miViewToolbars.SubItems.Clear();
// create list of toolbars
foreach (IDesignerPlugin plugin in Designer.Plugins)
{
if (plugin is ToolbarBase)
{
ButtonItem menuItem = new ButtonItem();
menuItem.Text = (plugin as ToolbarBase).Text;
menuItem.Tag = plugin;
menuItem.Checked = (plugin as ToolbarBase).Visible;
menuItem.AutoCheckOnClick = true;
menuItem.Click += toolbar_Click;
miViewToolbars.SubItems.Add(menuItem);
}
}
}
private void miWindow_PopupOpen(object sender, PopupOpenEventArgs e)
{
// delete list of windows
while (miWindow.SubItems[0] != miWindowCloseAll)
{
miWindow.SubItems[0].Dispose();
miWindow.SubItems.RemoveAt(0);
}
// create list of windows
int i = 0;
foreach (DocumentWindow c in Designer.Documents)
{
ButtonItem menuItem = new ButtonItem();
menuItem.Text = (i + 1).ToString() + " " + c.Text;
menuItem.Tag = c;
menuItem.Checked = c == Designer.ActiveReportTab;
menuItem.Click += window_Click;
miWindow.SubItems.Insert(i, menuItem);
i++;
}
}
private void toolWindow_Click(object sender, EventArgs e)
{
ToolWindowBase window = (sender as ButtonItem).Tag as ToolWindowBase;
window.Show();
}
private void toolbar_Click(object sender, EventArgs e)
{
ToolbarBase toolbar = (sender as ButtonItem).Tag as ToolbarBase;
toolbar.Visible = !toolbar.Visible;
}
private void recentFile_Click(object sender, EventArgs e)
{
Designer.UpdatePlugins(null);
Designer.cmdOpen.LoadFile((sender as ButtonItem).Text);
}
private void window_Click(object sender, EventArgs e)
{
DocumentWindow window = (sender as ButtonItem).Tag as DocumentWindow;
window.Activate();
}
private void insertMenu_Click(object sender, EventArgs e)
{
ObjectInfo info = (sender as ButtonItem).Tag as ObjectInfo;
Designer.InsertObject(info, InsertFrom.NewObject);
}
#endregion
#region IDesignerPlugin
///
public void SaveState()
{
}
///
public void RestoreState()
{
}
///
public void SelectionChanged()
{
UpdateControls();
}
///
public void UpdateContent()
{
UpdateControls();
}
///
public void Lock()
{
}
///
public void Unlock()
{
UpdateContent();
}
///
public void Localize()
{
MyRes res = new MyRes("Designer,Menu");
miFile.Text = res.Get("File");
miFileNew.Text = res.Get("File,New");
miFileOpen.Text = res.Get("File,Open");
miFileClose.Text = res.Get("File,Close");
miFileSave.Text = res.Get("File,Save");
miFileSaveAs.Text = res.Get("File,SaveAs");
miFileSaveWithRandomData.Text = res.Get("File,SaveWithRandomData");
miFileSaveAll.Text = res.Get("File,SaveAll");
miFilePageSetup.Text = res.Get("File,PageSetup");
miFilePrinterSetup.Text = res.Get("File,PrinterSetup");
miFilePreview.Text = res.Get("File,Preview");
miFileSelectLanguage.Text = res.Get("File,SelectLanguage");
miFileExit.Text = res.Get("File,Exit");
miEdit.Text = res.Get("Edit");
miEditUndo.Text = res.Get("Edit,Undo");
miEditRedo.Text = res.Get("Edit,Redo");
miEditCut.Text = res.Get("Edit,Cut");
miEditCopy.Text = res.Get("Edit,Copy");
miEditPaste.Text = res.Get("Edit,Paste");
miEditDelete.Text = res.Get("Edit,Delete");
miEditNewPage.Text = res.Get("Edit,NewPage");
miEditCopyPage.Text = res.Get("Edit,CopyPage");
miEditDeletePage.Text = res.Get("Edit,DeletePage");
miEditSelectAll.Text = res.Get("Edit,SelectAll");
miEditGroup.Text = res.Get("Edit,Group");
miEditUngroup.Text = res.Get("Edit,Ungroup");
miEditFind.Text = res.Get("Edit,Find");
miEditReplace.Text = res.Get("Edit,Replace");
miInsert.Text = res.Get("Insert");
miReport.Text = res.Get("Report");
miReportOptions.Text = res.Get("Report,Options");
miData.Text = res.Get("Data");
miDataChoose.Text = res.Get("Data,Choose");
miDataAdd.Text = res.Get("Data,Add");
miDataShowData.Text = res.Get("Data,ShowData");
miView.Text = res.Get("View");
miViewToolbars.Text = res.Get("View,Toolbars");
miViewStartPage.Text = res.Get("View,StartPage");
miViewOptions.Text = res.Get("View,Options");
miWindow.Text = res.Get("Window");
miWindowCloseAll.Text = res.Get("Window,CloseAll");
miHelp.Text = res.Get("Help");
miHelpContents.Text = res.Get("Help,Contents");
miHelpAccount.Text = res.Get("Help,Account");
miHelpAbout.Text = res.Get("Help,About");
}
///
public virtual DesignerOptionsPage GetOptionsPage()
{
return null;
}
///
public void UpdateUIStyle()
{
Style = UIStyleUtils.GetDotNetBarStyle(Designer.UIStyle);
}
private void UpdateMenuDpiDependencies(SubItemsCollection items)
{
foreach (BaseItem item in items)
{
ButtonItem b = item as ButtonItem;
if (b != null && b.ImageIndex != -1)
b.Image = Designer.GetImage(b.ImageIndex);
UpdateMenuDpiDependencies(item.SubItems);
}
}
///
public new void UpdateDpiDependencies()
{
base.UpdateDpiDependencies();
SuspendLayout();
Font = Designer.LogicalToDevice(DrawUtils.DefaultFont);
UpdateMenuDpiDependencies(Items);
ResumeLayout();
RecalcLayout();
}
#endregion
#region Public Methods
///
/// Creates a new menu item.
///
/// New menu item.
public ButtonItem CreateMenuItem()
{
return CreateMenuItem(null);
}
///
/// Creates a new menu item.
///
/// Click handler.
/// New menu item.
public ButtonItem CreateMenuItem(EventHandler click)
{
return CreateMenuItem(-1, "", click);
}
///
/// Creates a new menu item.
///
/// Item's image index.
/// Click handler.
/// New menu item.
public ButtonItem CreateMenuItem(int imageIndex, EventHandler click)
{
return CreateMenuItem(imageIndex, "", click);
}
///
/// Creates a new menu item.
///
/// Item's text.
/// Click handler.
/// New menu item.
public ButtonItem CreateMenuItem(string text, EventHandler click)
{
return CreateMenuItem(-1, text, click);
}
///
/// Creates a new menu item.
///
/// Item's image index.
/// Item's text.
/// Click handler.
/// New menu item.
public ButtonItem CreateMenuItem(int imageIndex, string text, EventHandler click)
{
ButtonItem item = new ButtonItem();
item.ImageIndex = imageIndex;
item.Image = this.GetImage(imageIndex);
item.Text = text;
if (click != null)
item.Click += click;
return item;
}
#endregion
///
/// Initializes a new instance of the class with default settings.
///
/// The report designer.
public DesignerMenu(Designer designer) : base()
{
this.designer = designer;
Name = "MainMenu";
MenuBar = true;
BarType = eBarType.MenuBar;
Dock = DockStyle.Top;
// create menu items
miFile = CreateMenuItem();
miFileNew = CreateMenuItem(Designer.cmdNew.Invoke);
miFileOpen = CreateMenuItem(1, Designer.cmdOpen.Invoke);
miFileClose = CreateMenuItem(Designer.cmdClose.Invoke);
miFileSave = CreateMenuItem(2, Designer.cmdSave.Invoke);
miFileSave.BeginGroup = true;
miFileSaveAs = CreateMenuItem(Designer.cmdSaveAs.Invoke);
miFileSaveWithRandomData = CreateMenuItem(Designer.cmdSaveWithRandomData.Invoke);
miFileSaveAll = CreateMenuItem(178, Designer.cmdSaveAll.Invoke);
miFilePageSetup = CreateMenuItem(Designer.cmdPageSetup.Invoke);
miFilePageSetup.BeginGroup = true;
miFilePrinterSetup = CreateMenuItem(Designer.cmdPrinterSetup.Invoke);
miFilePreview = CreateMenuItem(3, Designer.cmdPreview.Invoke);
miFileSelectLanguage = CreateMenuItem(Designer.cmdSelectLanguage.Invoke);
miFileSelectLanguage.BeginGroup = true;
miFileExit = CreateMenuItem(Designer.Exit);
miFileExit.BeginGroup = true;
miEdit = CreateMenuItem();
miEditUndo = CreateMenuItem(8, Designer.cmdUndo.Invoke);
miEditRedo = CreateMenuItem(9, Designer.cmdRedo.Invoke);
miEditCut = CreateMenuItem(5, Designer.cmdCut.Invoke);
miEditCut.BeginGroup = true;
miEditCopy = CreateMenuItem(6, Designer.cmdCopy.Invoke);
miEditPaste = CreateMenuItem(7, Designer.cmdPaste.Invoke);
miEditDelete = CreateMenuItem(51, Designer.cmdDelete.Invoke);
miEditNewPage = CreateMenuItem(Designer.cmdNewPage.Invoke);
miEditCopyPage = CreateMenuItem(6, Designer.cmdCopyPage.Invoke);
miEditDeletePage = CreateMenuItem(12, Designer.cmdDeletePage.Invoke);
miEditSelectAll = CreateMenuItem(Designer.cmdSelectAll.Invoke);
miEditGroup = CreateMenuItem(17, Designer.cmdGroup.Invoke);
miEditGroup.BeginGroup = true;
miEditUngroup = CreateMenuItem(16, Designer.cmdUngroup.Invoke);
miEditFind = CreateMenuItem(181, Designer.cmdFind.Invoke);
miEditFind.BeginGroup = true;
miEditReplace = CreateMenuItem(Designer.cmdReplace.Invoke);
miView = CreateMenuItem();
miViewStartPage = CreateMenuItem(179, Designer.cmdViewStartPage.Invoke);
miViewToolbars = CreateMenuItem();
miViewToolbars.BeginGroup = true;
miViewOptions = CreateMenuItem(Designer.cmdOptions.Invoke);
miViewOptions.BeginGroup = true;
miInsert = CreateMenuItem();
miReport = CreateMenuItem();
miReportOptions = CreateMenuItem(Designer.cmdReportSettings.Invoke);
miReportOptions.BeginGroup = true;
miData = CreateMenuItem();
miDataChoose = CreateMenuItem(Designer.cmdChooseData.Invoke);
miDataAdd = CreateMenuItem(137, Designer.cmdAddData.Invoke);
miDataShowData = CreateMenuItem(72, miDataShowDataSources_Click);
miWindow = CreateMenuItem();
miWindowCloseAll = CreateMenuItem(202, Designer.cmdCloseAll.Invoke);
miWindowCloseAll.BeginGroup = true;
miHelp = CreateMenuItem();
miHelpContents = CreateMenuItem(90, Designer.cmdHelpContents.Invoke);
miHelpAccount = CreateMenuItem(257, Designer.cmdAccount.Invoke);
miHelpAbout = CreateMenuItem(Designer.cmdAbout.Invoke);
miHelpAbout.BeginGroup = true;
// create menu structure
Items.AddRange(new BaseItem[] {
miFile, miEdit, miView, miInsert, miReport, miData, miWindow, miHelp });
miFile.SubItems.AddRange(new BaseItem[] {
miFileNew, miFileOpen, miFileClose,
miFileSave, miFileSaveAs, miFileSaveWithRandomData, miFileSaveAll,
miFilePageSetup, miFilePrinterSetup, miFilePreview,
miFileSelectLanguage,
miFileExit });
miEdit.SubItems.AddRange(new BaseItem[] {
miEditUndo, miEditRedo,
miEditCut, miEditCopy, miEditPaste, miEditDelete, miEditNewPage, miEditCopyPage, miEditDeletePage, miEditSelectAll,
miEditGroup, miEditUngroup,
miEditFind, miEditReplace });
miView.SubItems.AddRange(new BaseItem[] {
miViewStartPage,
miViewToolbars,
miViewOptions });
miInsert.SubItems.Add(new ButtonItem()); // allow to catch PopupOpen
miReport.SubItems.Add(miReportOptions);
miData.SubItems.AddRange(new BaseItem[] {
miDataChoose, miDataAdd, miDataShowData });
miWindow.SubItems.Add(miWindowCloseAll);
miHelp.SubItems.AddRange(new BaseItem[] {
miHelpContents,
miHelpAccount,
miHelpAbout });
// shortcuts
miFileOpen.Shortcuts.Add(eShortcut.CtrlO);
miFileSave.Shortcuts.Add(eShortcut.CtrlS);
miFileSaveAll.Shortcuts.Add(eShortcut.CtrlShiftS);
miFilePreview.Shortcuts.Add(eShortcut.CtrlP);
miEditUndo.Shortcuts.Add(eShortcut.CtrlZ);
miEditRedo.Shortcuts.Add(eShortcut.CtrlY);
miEditCut.AlternateShortCutText = "Ctrl+X";
miEditCopy.AlternateShortCutText = "Ctrl+C";
miEditPaste.AlternateShortCutText = "Ctrl+V";
miEditNewPage.Shortcuts.Add(eShortcut.CtrlN);
miEditFind.Shortcuts.Add(eShortcut.CtrlF);
miEditReplace.Shortcuts.Add(eShortcut.CtrlH);
miHelpContents.Shortcuts.Add(eShortcut.F1);
// events
miFile.PopupOpen += miFile_PopupOpen;
miEdit.PopupOpen += miEdit_PopupOpen;
miInsert.PopupOpen += miInsert_PopupOpen;
miView.PopupOpen += miView_PopupOpen;
miWindow.PopupOpen += miWindow_PopupOpen;
Localize();
Designer.Controls.Add(this);
}
}
}