啊鑫
2024-07-09 0552fcc8cb73fc3021e2915129f55a42ed3f20e5
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
#region
 
using System;
using System.Drawing;
using System.Windows.Forms;
using CSFrameworkV5.Common;
using CSFrameworkV5.Core;
using DevExpress.Utils;
using DevExpress.XtraBars;
using DevExpress.XtraBars.Ribbon;
using DevExpress.XtraEditors;
 
#endregion
 
//new 20200202
namespace CSFrameworkV5.Library.CommonClass
{
    /// <summary>
    ///     Ribbon样式的模块展示加载器
    /// </summary>
    public class RibbonModuleLoader
    {
        private ImageCollection _ilModule32;
        private ModuleManager _ModuleManager;
        private RibbonControl _Ribbon;
 
        /// <summary>
        ///     构造器
        /// </summary>
        /// <param name="moduleManager">模块加载器</param>
        /// <param name="ribbon">主界面的Ribbon组件实例</param>
        /// <param name="ilModule32">主界面的模块图标</param>
        public RibbonModuleLoader(ModuleManager moduleManager,
            RibbonControl ribbon, ImageCollection ilModule32)
        {
            _ModuleManager = moduleManager;
            _Ribbon = ribbon;
            _ilModule32 = ilModule32;
        }
 
        /// <summary>
        ///     BarButtonItem的点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_ItemClick(object sender, ItemClickEventArgs e)
        {
            if (e.Item.Tag != null && e.Item.Tag is ToolStripItem)
            {
                var menu = e.Item.Tag as ToolStripItem;
                menu.PerformClick();
            }
        }
 
        /// <summary>
        ///     创建BarButtonItem实例
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        private BarButtonItem CreateRibbonButtonItem(ToolStripItem item)
        {
            var btn = new BarButtonItem();
            btn.Name = item.Name;
            btn.Caption = item.Text;
            btn.ItemClick += Btn_ItemClick;
            btn.Tag = item;
            btn.Glyph = GetButtonImage(item.Name); //按钮图片
            _Ribbon.Items.Add(btn);
            return btn;
        }
 
        /// <summary>
        ///     创建Ribbon样式的模块展示区
        /// </summary>
        /// <param name="moduleMainMenu">系统菜单</param>
        public void CreateRibbonButtons(MenuStrip moduleMainMenu)
        {
            _Ribbon.SelectedPageChanging += Ribbon_SelectedPageChanging;
 
            foreach (ToolStripMenuItem moduleTopMenu in moduleMainMenu.Items)
            {
                if (!moduleTopMenu.Enabled) continue; //顶级菜单荐是禁用状态表示无权限,不创建
 
                //模块主菜单名称(一级菜单对应模块)
                var pageModule = new RibbonPage();
                pageModule.Text = moduleTopMenu.Text;
                pageModule.Image =
                    _ilModule32.Images[
                        moduleMainMenu.Items.IndexOf(moduleTopMenu)]; //图标顺序
                pageModule.Tag = moduleTopMenu; //关联菜单标记 
                _Ribbon.Pages.Add(pageModule);
 
                //增加组--红圈容器
                var group = new RibbonPageGroup();
                pageModule.Groups.Add(group);
 
                //递归加载
                foreach (ToolStripItem item in moduleTopMenu.DropDownItems)
                {
                    if (item is ToolStripSeparator) continue; //分隔符菜单项,不加载
 
                    if (!item.Enabled) continue; //菜单是禁止使用状态,无权限,不加载
 
                    if (moduleTopMenu.Text == "常用功能" &&
                        !HasModuleButton(item.Name)) continue; //常用功能特殊处理
 
                    //有2级菜单
                    if (item is ToolStripMenuItem &&
                        (item as ToolStripMenuItem).DropDownItems.Count > 0)
                    {
                        //创建2级菜单
                        var barListItem1 = new BarLinkContainerItem();
                        barListItem1.Name = item.Name;
                        barListItem1.Caption = item.Text;
                        group.ItemLinks.Add(barListItem1);
 
                        LoadRibbonSubItems(_Ribbon, barListItem1,
                            item as ToolStripMenuItem);
                    }
                    else //普通菜单
                    {
                        var btn = CreateRibbonButtonItem(item);
                        group.ItemLinks.Add(btn);
                    }
                }
            }
        }
 
        /// <summary>
        ///     获取常用功能的按钮图片
        /// </summary>
        /// <param name="menuName">功能菜单名称</param>
        /// <returns></returns>
        private Image GetButtonImage(string menuName)
        {
            //获取按钮实例
            var ctl = (MdiTools.MainForm as IMdiForm)
                .GetModuleMainFormButtonByMenuName("",
                    menuName.Replace("_SHORTCUT_", ""));
            if (ctl != null) return (ctl as SimpleButton).Image;
 
            return null;
        }
 
        /// <summary>
        ///     获取常用功能的按钮实例(null表示常用功能无效链接)
        /// </summary>
        /// <param name="menuName">功能菜单名称</param>
        /// <returns></returns>
        private bool HasModuleButton(string menuName)
        {
            //获取按钮实例
            var ctl = (MdiTools.MainForm as IMdiForm)
                .GetModuleMainFormButtonByMenuName("",
                    menuName.Replace("_SHORTCUT_", ""));
            return ctl != null;
        }
 
        /// <summary>
        ///     递归生成BarButtonItem
        /// </summary>
        /// <param name="ribbon"></param>
        /// <param name="itemOwner"></param>
        /// <param name="menuItem"></param>
        private void LoadRibbonSubItems(RibbonControl ribbon,
            BarLinkContainerItem 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)
                {
                    //创建2级菜单
                    var barListItem1 = new BarLinkContainerItem();
                    barListItem1.Name = item.Name;
                    barListItem1.Caption = item.Text;
                    itemOwner.ItemLinks.Add(barListItem1);
 
                    LoadRibbonSubItems(ribbon, barListItem1,
                        item as ToolStripMenuItem);
                }
                else
                {
                    var btn = CreateRibbonButtonItem(item);
                    itemOwner.ItemLinks.Add(btn);
                }
            }
        }
 
        /// <summary>
        ///     激活当前模块
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Ribbon_SelectedPageChanging(object sender,
            RibbonPageChangingEventArgs e)
        {
            try
            {
                var menu = (ToolStripItem)e.Page.Tag; //模块的主菜单
                if (menu != null)
                    _ModuleManager.ActiveModule(menu.Text,
                        menu.Name); //激活显示模块                   
            }
            catch (Exception ex)
            {
                Msg.ShowException(ex);
            }
        }
    }
}