1
yhj
2024-07-24 5e5d945e91568b973faa27d8ab0bcef99fc4a6c5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
#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
}