#region using System; using System.Collections.Generic; using System.Windows.Forms; using CSFrameworkV5.Business; using CSFrameworkV5.Common; using CSFrameworkV5.Core; using CSFrameworkV5.Core.SystemSecurity; using CSFrameworkV5.Interfaces; using CSFrameworkV5.Language; using CSFrameworkV5.Models; using DevExpress.Utils; using DevExpress.XtraBars; using DevExpress.XtraBars.Ribbon; using DevExpress.XtraNavBar; using DevExpress.XtraTab; ///*************************************************************************/ ///* ///* 文件名 :ModuleManager.cs ///* 程序说明 : 模块管理器 ///* 原创作者 :www.csframework.com ///* ///* Copyright 2006-2021 wwww.csframework.com, 保留所有权利. ///* ///**************************************************************************/ #endregion namespace CSFrameworkV5.Library.CommonClass { #region NavigatorBar管理器 /// /// 模块管理器 /// public class ModuleManager { /// /// 程序目录下面搜索到的模块列表 /// private static IList _Modules; private NavigatorBase _CurrentNavigator; //跟据用户选择样式创建不同类型的 /// /// MDI主窗体对象引用 /// private Form _MDIMainForm; private List
_ModuleMainForms; /// /// 已加载成功的模块 /// private IList _ModulesLoadSucceed = new List(); private NavBarControl _NavBarControl; //导航组件 private XtraTabControl _tabControlModules; //模块主窗体容器 /// /// 构造器 /// /// MDI主窗体 /// 主窗体的XtraTabControl控件 public ModuleManager(Form mdiMainForm, XtraTabControl tabControlModules) { _tabControlModules = tabControlModules; _MDIMainForm = mdiMainForm; _ModuleMainForms = new List(); } /// /// 当前显示的模块主菜单名称 /// public string ActiveModuleMainMenu { get; set; } /// /// 当前显示的模块名称 /// public string ActiveModuleName { get; set; } public NavigatorBase CurrentNavigator => _CurrentNavigator; /// /// 已加载模块的主窗体 /// public List ModuleMainForms => _ModuleMainForms; /// /// 已加载成功的模块 /// public IList ModulesLoadSucceed => _ModulesLoadSucceed; public NavBarControl NavBarControl => _NavBarControl; /// /// 主窗体的XtraTabControl控件, 用于集成模块的主窗体 /// public XtraTabControl TabControlModules => _tabControlModules; /// /// 显示指定的模块窗体 /// /// 模块名称 public void ActiveModule(string moduleDisplayName, string moduleMainMenu) { //显示模块容器窗体 (_MDIMainForm as IMdiForm).ActiveModule(moduleDisplayName, moduleMainMenu); ActiveModuleName = moduleDisplayName; ActiveModuleMainMenu = moduleMainMenu; //定位焦点 var G = FindNavBarGroup(moduleDisplayName); if (G != null && G.Caption != _NavBarControl.ActiveGroup.Caption) _NavBarControl.ActiveGroup = G; } /// /// 跟据菜单创建导航组件 /// /// 导航控件 /// 主菜单 /// 导航控件的自定义显示类型 public void CreateNavBarButtons(NavBarControl navBarControl, MenuStrip mainMenu, NavigatorStyle style) { _NavBarControl = navBarControl; //支持两种策略 if (NavigatorStyle.BarItem == style) _CurrentNavigator = new NavigatorBarList(this); //NavigatorStyle.BarItem else _CurrentNavigator = new NavigatorTreeView(this); //NavigatorStyle.BarContainer navBarControl.BeginUpdate(); _CurrentNavigator.CreateNavigator(mainMenu, navBarControl); navBarControl.EndUpdate(); //避免重复添加事件 _NavBarControl.MouseClick -= OnNavBar_MouseClick; _NavBarControl.MouseClick += OnNavBar_MouseClick; } //new 20200202 /// /// 创建Ribbon样式的模块功能按钮展示区 /// /// RibbonControl组件 /// 主界面的模块图标 /// 系统菜单 public void CreateRibbonButtons(RibbonControl ribbon, ImageCollection ilModule32, MenuStrip moduleMainMenu) { new RibbonModuleLoader(this, ribbon, ilModule32) .CreateRibbonButtons(moduleMainMenu); } /// /// 跟据菜单创建Bar按钮 /// /// Bar容器 /// 主菜单(各模块主菜单的组合) public void CreateToolButtons(Bar menuBar, ToolStrip moduleMainMenu) { BarItemLink current = null; var index = 0; foreach (ToolStripMenuItem moduleTopMenu in moduleMainMenu.Items) { if (!moduleTopMenu.Enabled) continue; //顶级菜单荐是禁用状态表示无权限,不创建 //模块主菜单名称(一级菜单) var menuOwner = new BarSubItem(menuBar.Manager, moduleTopMenu.Text); menuOwner.PaintStyle = BarItemPaintStyle.CaptionGlyph; menuOwner.Glyph = moduleTopMenu.Image; menuOwner.Tag = moduleTopMenu; //设置标记 menuOwner.ItemClick += menuOwner_ItemClick; if (current == null) //第一个BarItem { current = menuBar.ItemLinks.Insert(index, menuOwner); current.BeginGroup = true; //第一个菜单项设置分组(小竖线) index++; } else { current = menuBar.ItemLinks.Insert(index, menuOwner); index++; } //递归加载 foreach (ToolStripItem item in moduleTopMenu.DropDownItems) { if (item is ToolStripSeparator) continue; //分隔符菜单项,不加载 if (!item.Enabled) continue; //菜单是禁止使用状态,无权限,不加载 if (item is ToolStripMenuItem && (item as ToolStripMenuItem).DropDownItems.Count > 0) { //创建子级 var itemOwner = new BarSubItem(menuBar.Manager, item.Text); menuOwner.ItemLinks.Add(itemOwner); LoadBarSubItems(itemOwner, item as ToolStripMenuItem); } else { LoadBarButtonItem(menuOwner, item); } } } } /// /// 跟据窗体的名字空间查询类型信息 /// /// /// public Type FindFormType(string formFullName) { Type formType; foreach (var module in _ModulesLoadSucceed) { formType = module.GetType().Assembly.GetType(formFullName); if (formType != null) return formType; } return null; } /// /// 跟据窗体的名字空间查询所在的模块 /// /// 窗体的名字空间 /// public IModuleBase FindModule(string formFullName) { Type formType; foreach (var module in _ModulesLoadSucceed) { formType = module.GetType().Assembly.GetType(formFullName); if (formType != null) return module; } return null; } public Control FindModuleButtonByMenu(string menuName) { Control btn = null; foreach (var module in _ModulesLoadSucceed) { btn = module.GetModuleMainFormButtonByMenuName(menuName); if (btn != null) return btn; } return null; } public NavBarGroup FindNavBarGroup(string caption) { foreach (NavBarGroup G in _NavBarControl.Groups) if (G.Caption == caption) return G; return null; } /// /// 程序目录下面搜索到的模块列表 /// public static IList GetAvailableModules() { return _Modules; } /// /// 将菜单项转换为BarButtonItem对象 /// /// 按钮的父级拥有者 /// 当前菜单项,每个菜单项对应一个BarButtonItem对象 private void LoadBarButtonItem(BarSubItem owner, ToolStripItem item) { var button = new BarButtonItem(); button.Caption = item.Text; button.Tag = item; button.ItemClick += OnBarButtonItemClick; owner.ItemLinks.Add(button); } /// /// 将菜单项转换为BarButtonItem对象 /// /// 按钮的父级拥有者 /// private void LoadBarSubItems(BarSubItem itemOwner, ToolStripMenuItem menuItem) { foreach (ToolStripItem item in menuItem.DropDownItems) { if (item is ToolStripSeparator) continue; if (!item.Enabled) continue; //菜单是禁止使用状态,无权限 if (item is ToolStripMenuItem && (item as ToolStripMenuItem).DropDownItems.Count > 0) { var subItem = new BarSubItem(itemOwner.Manager, item.Text); itemOwner.ItemLinks.Add(subItem); LoadBarSubItems(subItem, item as ToolStripMenuItem); } else { LoadBarButtonItem(itemOwner, item); } } } /// /// 加载我的自定义功能 /// public void LoadCustomFunction() { foreach (var module in _ModulesLoadSucceed) module.LoadCustomFunction(); } /// /// 加载模块方法 /// /// 加载进度 /// 模块的菜单 public void LoadModules(IMsg msg, MenuStrip moduleMenus, string searchPattern = "") { try { //加载Dev组件 var loader = new ModuleLoadDevComponent(); //**************************************************************** //开发框架提供两个方案加载业务模块: // //1.从帐套库的sys_ModuleFileList表获取模块文件清单表 //2.枚举程序目录下所有DLL文件 //**************************************************************** if (SystemSettings.Current.ModuleLoadType == ModuleLoadType.ByModuleFileTable) { //1.从帐套库的sys_ModuleFileList表获取模块文件清单表 var fileList = CommonData.GetDataDict( Loginer.CurrentUser.DBID, sys_ModuleFileList.__TableName); _Modules = loader.GetModuleList(fileList); //从运行目录中搜索模块文件 } if (SystemSettings.Current.ModuleLoadType == ModuleLoadType.SearchAppDir) { if (string.IsNullOrWhiteSpace(searchPattern)) searchPattern = Globals.DEF_SYS_MODULE; //2.枚举程序目录下所有DLL文件 _Modules = loader.GetModuleList(searchPattern); } if (_Modules == null) throw new CustomException("获取模块清单文件失败!"); foreach (var m in _Modules) //枚举模块文件 { if (!loader.LoadModule(m)) continue; //加载失败,继续Load下一个模块 //当前模块是否分配了权限.(当前用户是否有这个模块的权限). //没有权限继续Load下一个模块 if (!loader.CanAccessModule(SystemAuthentication .UserAuthorities)) { loader.ClearAssemble(); continue; } _ModuleMainForms.Add(loader.ModuleMainForm as Form); _ModulesLoadSucceed.Add(loader.ModuleMainForm); //保存已加载的模块 msg.UpdateMessage(LanLib.Get("正在加载:") + loader.GetCurrentModuleName( loader.ModuleAssembly)); //显示加载进度 loader.LoadGUI( _tabControlModules); //将模块的功能按钮容器集成到主窗体的TabControl内 loader.LoadMenu( moduleMenus); //加载模块的菜单,集成到主窗体的主菜单内 (loader.ModuleMainForm as Form).MdiParent = _MDIMainForm; //模块的主窗体也作为一个子窗体, 设置父窗体. } GC.Collect(); //加载模块消耗内存,及时回收部分内存 } catch (Exception ex) { Msg.ShowException(ex); } } //模块顶级菜单的Click事件 private void menuOwner_ItemClick(object sender, ItemClickEventArgs e) { if (e.Item.Tag != null && e.Item.Tag is ToolStripItem) (e.Item.Tag as ToolStripItem).PerformClick(); } /// /// BarButtonItem对象的Click事件 /// /// BarButtonItem对象 /// 参数 private void OnBarButtonItemClick(object sender, ItemClickEventArgs e) { if (e.Item.Tag != null && e.Item.Tag is ToolStripItem) (e.Item.Tag as ToolStripItem).PerformClick(); } /// /// 点击导航分组按钮时触发该事件 /// /// /// protected void OnNavBar_MouseClick(object sender, MouseEventArgs e) { var nav = sender as NavBarControl; //取到NavBarControl对象引用 var hit = nav.CalcHitInfo(e.Location); //计算点击区域的对象 if (hit.InGroup && hit.InGroupCaption && e.Button == MouseButtons.Left) //点击导航分组按钮 try { nav.ActiveGroup = hit.Group; //立即设置为激活的组 var menu = (ToolStripItem)hit.Group.Tag; //模块的主菜单 ActiveModule(nav.ActiveGroup.Caption, menu.Name); //激活显示模块 } catch (Exception ex) { Msg.ShowException(ex); } } /// /// 设置模块的权限 /// /// 系统主菜单 public void SetModuleSecurity(MenuStrip menuStrip) { try { foreach (XtraTabPage page in _tabControlModules.TabPages) { var activeForm = (Form)page.Tag; if (null != activeForm) (activeForm as IModuleBase) .SetSecurity(menuStrip); //处理权限 } } catch (Exception ex) { Msg.ShowException(ex); } } } #endregion }