#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管理器
|
|
/// <summary>
|
/// 模块管理器
|
/// </summary>
|
public class ModuleManager
|
{
|
/// <summary>
|
/// 程序目录下面搜索到的模块列表
|
/// </summary>
|
private static IList<ModuleInfo> _Modules;
|
|
private NavigatorBase _CurrentNavigator; //跟据用户选择样式创建不同类型的
|
|
/// <summary>
|
/// MDI主窗体对象引用
|
/// </summary>
|
private Form _MDIMainForm;
|
|
private List<Form> _ModuleMainForms;
|
|
/// <summary>
|
/// 已加载成功的模块
|
/// </summary>
|
private IList<IModuleBase>
|
_ModulesLoadSucceed = new List<IModuleBase>();
|
|
private NavBarControl _NavBarControl; //导航组件
|
private XtraTabControl _tabControlModules; //模块主窗体容器
|
|
/// <summary>
|
/// 构造器
|
/// </summary>
|
/// <param name="mdiMainForm">MDI主窗体</param>
|
/// <param name="tabControlModules">主窗体的XtraTabControl控件</param>
|
public ModuleManager(Form mdiMainForm, XtraTabControl tabControlModules)
|
{
|
_tabControlModules = tabControlModules;
|
_MDIMainForm = mdiMainForm;
|
_ModuleMainForms = new List<Form>();
|
}
|
|
/// <summary>
|
/// 当前显示的模块主菜单名称
|
/// </summary>
|
public string ActiveModuleMainMenu { get; set; }
|
|
/// <summary>
|
/// 当前显示的模块名称
|
/// </summary>
|
public string ActiveModuleName { get; set; }
|
|
public NavigatorBase CurrentNavigator => _CurrentNavigator;
|
|
/// <summary>
|
/// 已加载模块的主窗体
|
/// </summary>
|
public List<Form> ModuleMainForms => _ModuleMainForms;
|
|
/// <summary>
|
/// 已加载成功的模块
|
/// </summary>
|
public IList<IModuleBase> ModulesLoadSucceed => _ModulesLoadSucceed;
|
|
public NavBarControl NavBarControl => _NavBarControl;
|
|
/// <summary>
|
/// 主窗体的XtraTabControl控件, 用于集成模块的主窗体
|
/// </summary>
|
public XtraTabControl TabControlModules => _tabControlModules;
|
|
/// <summary>
|
/// 显示指定的模块窗体
|
/// </summary>
|
/// <param name="moduleDisplayName">模块名称</param>
|
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;
|
}
|
|
/// <summary>
|
/// 跟据菜单创建导航组件
|
/// </summary>
|
/// <param name="navBarControl">导航控件</param>
|
/// <param name="mainMenu">主菜单</param>
|
/// <param name="style">导航控件的自定义显示类型</param>
|
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
|
/// <summary>
|
/// 创建Ribbon样式的模块功能按钮展示区
|
/// </summary>
|
/// <param name="ribbon">RibbonControl组件</param>
|
/// <param name="ilModule32">主界面的模块图标</param>
|
/// <param name="moduleMainMenu">系统菜单</param>
|
public void CreateRibbonButtons(RibbonControl ribbon,
|
ImageCollection ilModule32, MenuStrip moduleMainMenu)
|
{
|
new RibbonModuleLoader(this, ribbon, ilModule32)
|
.CreateRibbonButtons(moduleMainMenu);
|
}
|
|
/// <summary>
|
/// 跟据菜单创建Bar按钮
|
/// </summary>
|
/// <param name="menuBar">Bar容器</param>
|
/// <param name="mainMenu">主菜单(各模块主菜单的组合)</param>
|
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);
|
}
|
}
|
}
|
}
|
|
/// <summary>
|
/// 跟据窗体的名字空间查询类型信息
|
/// </summary>
|
/// <param name="formFullName"></param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 跟据窗体的名字空间查询所在的模块
|
/// </summary>
|
/// <param name="formFullName">窗体的名字空间</param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 程序目录下面搜索到的模块列表
|
/// </summary>
|
public static IList<ModuleInfo> GetAvailableModules()
|
{
|
return _Modules;
|
}
|
|
/// <summary>
|
/// 将菜单项转换为BarButtonItem对象
|
/// </summary>
|
/// <param name="owner">按钮的父级拥有者</param>
|
/// <param name="item">当前菜单项,每个菜单项对应一个BarButtonItem对象</param>
|
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);
|
}
|
|
/// <summary>
|
/// 将菜单项转换为BarButtonItem对象
|
/// </summary>
|
/// <param name="itemOwner">按钮的父级拥有者</param>
|
/// <param name="menuItem"></param>
|
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);
|
}
|
}
|
}
|
|
/// <summary>
|
/// 加载我的自定义功能
|
/// </summary>
|
public void LoadCustomFunction()
|
{
|
foreach (var module in _ModulesLoadSucceed)
|
module.LoadCustomFunction();
|
}
|
|
/// <summary>
|
/// 加载模块方法
|
/// </summary>
|
/// <param name="msg">加载进度</param>
|
/// <param name="moduleMenus">模块的菜单</param>
|
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();
|
}
|
|
/// <summary>
|
/// BarButtonItem对象的Click事件
|
/// </summary>
|
/// <param name="sender">BarButtonItem对象</param>
|
/// <param name="e">参数</param>
|
private void OnBarButtonItemClick(object sender, ItemClickEventArgs e)
|
{
|
if (e.Item.Tag != null && e.Item.Tag is ToolStripItem)
|
(e.Item.Tag as ToolStripItem).PerformClick();
|
}
|
|
/// <summary>
|
/// 点击导航分组按钮时触发该事件
|
/// </summary>
|
/// <param name="sender"></param>
|
/// <param name="e"></param>
|
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);
|
}
|
}
|
|
/// <summary>
|
/// 设置模块的权限
|
/// </summary>
|
/// <param name="menuStrip">系统主菜单</param>
|
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
|
}
|