You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

825 lines
30 KiB
C#

1 year ago
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Soap;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Data;
using ICSharpCode.Core;
using Mesnac.Core;
using Mesnac.Basic;
using Mesnac.Gui.Workbench;
namespace Mesnac.Gui.Run.Global
{
/// <summary>
/// 此类用于解析平台运行应用程序配置文件及保存全局变量
/// </summary>
public class AppConfigHandler
{
#region 字段定义
private static AppConfigHandler instance = null;
private string _mesnacPlugInPath = String.Empty; //自定义插件目录
private string _mcProjectPath = String.Empty; //组态工程目录
private string _sysConfigPath = String.Empty; //系统工程配置目录
private string _menuConfig = String.Empty; //系统自定义菜单配置文件
private string _toolStripConfig = String.Empty; //系统自定义工具栏配置文件
private string _sysMessageConfig = String.Empty; //系统国际化资源文件配置文件
#endregion
#region 单例实现
private AppConfigHandler()
{
this._mesnacPlugInPath = ConfigurationManager.AppSettings["MesnacPlugInPath"];
this._mcProjectPath = ConfigurationManager.AppSettings["MCProjectPath"];
this._sysConfigPath = ConfigurationManager.AppSettings["SysConfigPath"];
this._menuConfig = Path.Combine(Application.StartupPath, this._sysConfigPath, "MenuConfig.dat");
this._toolStripConfig = Path.Combine(Application.StartupPath, this._sysConfigPath, "ToolStripConfig.dat");
this._sysMessageConfig = Path.Combine(Application.StartupPath, this._sysConfigPath, "SysMessage.dat");
}
public static AppConfigHandler Instance
{
get
{
if (instance == null)
{
instance = new AppConfigHandler();
}
return instance;
}
}
#endregion
#region 属性定义
/// <summary>
/// 自定义插件目录
/// </summary>
public string MesnacPlugInPath
{
get
{
return this._mesnacPlugInPath;
}
}
/// <summary>
/// 组态工程目录
/// </summary>
public string MCProjectPath
{
get
{
return this._mcProjectPath;
}
}
/// <summary>
/// 系统工程配置目录
/// </summary>
public string SysConfigPath
{
get
{
return this._sysConfigPath;
}
}
/// <summary>
/// 系统自定义菜单配置文件
/// </summary>
public string MenuConfig
{
get
{
return this._menuConfig;
}
}
/// <summary>
/// 系统自定义工具栏配置文件
/// </summary>
public string ToolStripConfig
{
get
{
return this._toolStripConfig;
}
}
/// <summary>
/// 系统国际化资源文件配置文件
/// </summary>
public string SysMessageConfig
{
get
{
return this._sysMessageConfig;
}
}
#endregion
#region 公共方法
/// <summary>
/// 把树节点序列化至配置文件
/// </summary>
/// <param name="root">要序列化的树节点</param>
/// <param name="file">配置文件完整路径</param>
public void SerializeObject(object obj, string file)
{
FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write);
//SoapFormatter formatter = new SoapFormatter();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, obj);
fs.Flush();
fs.Close();
}
/// <summary>
/// 从配置文件反序列化树节点对象
/// </summary>
/// <param name="file">配置文件完整路径</param>
/// <returns>反序列化后的树节点对象</returns>
public object DeserializeObject(string file)
{
try
{
FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
//SoapFormatter formatter = new SoapFormatter();
BinaryFormatter formatter = new BinaryFormatter();
object obj = formatter.Deserialize(fs);
fs.Flush();
fs.Close();
return obj;
}
catch (Exception ex)
{
LoggingService<AppConfigHandler>.Error(ex.Message + "\r\n" + ex.StackTrace);
return null;
}
}
#region 重构系统主工具栏
/// <summary>
/// 重构系统主工具栏,目前只支持一级
/// </summary>
/// <param name="toolStrip">工具栏对象</param>
/// <param name="topMenu">主菜单对象</param>
/// <param name="toolButtons">设置的工具栏项集合</param>
public void ReBuilderToolStrip(ToolStrip toolStrip, MenuStrip topMenu, List<RunConfigMenuItem> toolButtons)
{
#region 删除工具栏中多余项
List<ToolStripItem> lst = new List<ToolStripItem>();
foreach (ToolStripItem item1 in toolStrip.Items)
{
if (item1 is IStatusUpdate) continue; //如果是系统工具栏则跳过
bool flag1 = false;
foreach (RunConfigMenuItem toolButton1 in toolButtons)
{
if (item1.Name == toolButton1.ID)
{
flag1 = true;
break;
}
}
if (!flag1)
{
lst.Add(item1);
}
}
foreach (ToolStripItem item2 in lst)
{
toolStrip.Items.Remove(item2);
}
#endregion
int index = 0;
foreach (RunConfigMenuItem toolButton in toolButtons)
{
bool flag = false;
ToolStripItem tsi = null;
foreach (ToolStripItem item in toolStrip.Items)
{
if (item is IStatusUpdate)
{
if ((item as IStatusUpdate).ID == toolButton.ID)
{
tsi = item;
flag = true;
break;
}
}
else
{
if (item.Name == toolButton.ID)
{
tsi = item;
flag = true;
break;
}
}
}
if (flag)
{
toolStrip.Items.Remove(tsi);
toolStrip.Items.Insert(index, tsi);
#region 国际化处理
if (!String.IsNullOrEmpty(toolButton.MsgId))
{
if (AppConfigHandler.Instance.SysMessages.Messages.ContainsKey(toolButton.MsgId))
{
if (AppConfigHandler.instance.SysMessages.Messages[toolButton.MsgId].ContainsKey(System.Threading.Thread.CurrentThread.CurrentUICulture.Name))
{
tsi.ToolTipText = AppConfigHandler.instance.SysMessages.Messages[toolButton.MsgId][System.Threading.Thread.CurrentThread.CurrentUICulture.Name].Value;
}
}
}
#endregion
}
else
{
if (toolButton.Text == "-")
{
tsi = new ToolStripSeparator();
}
else
{
tsi = new ToolStripButton();
tsi.Name = toolButton.ID;
#region 国际化处理
if (!String.IsNullOrEmpty(toolButton.MsgId))
{
if (AppConfigHandler.Instance.SysMessages.Messages.ContainsKey(toolButton.MsgId))
{
if (AppConfigHandler.instance.SysMessages.Messages[toolButton.MsgId].ContainsKey(System.Threading.Thread.CurrentThread.CurrentUICulture.Name))
{
tsi.ToolTipText = AppConfigHandler.instance.SysMessages.Messages[toolButton.MsgId][System.Threading.Thread.CurrentThread.CurrentUICulture.Name].Value;
}
else
{
tsi.ToolTipText = toolButton.Text;
}
}
else
{
tsi.ToolTipText = toolButton.Text;
}
}
else
{
tsi.ToolTipText = toolButton.Text;
}
#endregion
//tsi.ToolTipText = toolButton.Text;
tsi.Image = toolButton.Img == null ? ResourceService.GetImageResource("Icons_16X16_Default") as System.Drawing.Image : toolButton.Img;
tsi.Click += delegate(object sender, EventArgs e)
{
ToolStripItem menuItem = this.FindItemFromTopMenu((sender as ToolStripItem).Name, topMenu);
if (menuItem != null)
{
menuItem.PerformClick();
}
};
}
tsi.Name = toolButton.ID;
toolStrip.Items.Insert(index, tsi);
}
//权限处理
ToolStripItem menuItem1 = this.FindItemFromTopMenu(tsi.Name, topMenu);
if (menuItem1 != null)
{
tsi.Enabled = menuItem1.Enabled;
}
index++;
}
}
#endregion
#region 重构系统主菜单
/// <summary>
/// 以递归方式重构系统主菜单
/// </summary>
/// <param name="topMenu">原始菜单栏</param>
/// <param name="node">当前递归下要重构的目标节点</param>
/// <param name="root">要重构的目标菜单结构树根节点</param>
/// <param name="allFormPurview">所有权限列表</param>
/// <param name="PurviewList">当前用户具有的权限列表</param>
public void ReBuilderMenu(MenuStrip topMenu, TreeNode node, TreeNode root, List<string> allFormPurview, List<string> purviewList)
{
foreach (TreeNode tn in node.Nodes)
{
int index = tn.Index;
RunConfigMenuItem rcmi = tn.Tag as RunConfigMenuItem;
ToolStripItem tsItem = null;
ToolStripItem menuItem = this.FindItemFromTopMenu(rcmi.ID, topMenu);
if (menuItem != null)
{
#region 自定义菜单国际化处理
if (rcmi.Text != "-")
{
if (!String.IsNullOrEmpty(rcmi.MsgId))
{
if (AppConfigHandler.Instance.SysMessages.Messages.ContainsKey(rcmi.MsgId))
{
if (AppConfigHandler.instance.SysMessages.Messages[rcmi.MsgId].ContainsKey(System.Threading.Thread.CurrentThread.CurrentUICulture.Name))
{
menuItem.Text = AppConfigHandler.instance.SysMessages.Messages[rcmi.MsgId][System.Threading.Thread.CurrentThread.CurrentUICulture.Name].Value;
}
}
}
}
#endregion
#region 系统原有菜单处理,先移除,再添加至合适位置
if (menuItem.OwnerItem != null)
{
ToolStripMenuItem parentMenu = menuItem.OwnerItem as ToolStripMenuItem;
parentMenu.DropDownItems.Remove(menuItem);
if (index > parentMenu.DropDownItems.Count)
{
parentMenu.DropDownItems.Add(menuItem);
}
else
{
parentMenu.DropDownItems.Insert(index, menuItem);
}
}
else
{
topMenu.Items.Remove(menuItem);
if (index > topMenu.Items.Count)
{
topMenu.Items.Add(menuItem);
}
else
{
topMenu.Items.Insert(index, menuItem);
}
}
#endregion
}
else
{
#region 自定义菜单处理,添加至合适位置
if (rcmi.Text == "-")
{
tsItem = new ToolStripSeparator();
tsItem.Name = rcmi.ID;
}
else
{
menuItem = new ToolStripMenuItem();
menuItem.Name = rcmi.ID;
#region 自定义菜单国际化处理
if (!String.IsNullOrEmpty(rcmi.MsgId))
{
if (AppConfigHandler.Instance.SysMessages.Messages.ContainsKey(rcmi.MsgId))
{
if (AppConfigHandler.instance.SysMessages.Messages[rcmi.MsgId].ContainsKey(System.Threading.Thread.CurrentThread.CurrentUICulture.Name))
{
menuItem.Text = AppConfigHandler.instance.SysMessages.Messages[rcmi.MsgId][System.Threading.Thread.CurrentThread.CurrentUICulture.Name].Value;
}
else
{
menuItem.Text = rcmi.Text;
}
}
else
{
menuItem.Text = rcmi.Text;
}
}
else
{
menuItem.Text = rcmi.Text;
}
#endregion
menuItem.Image = rcmi.Img;
if (!String.IsNullOrEmpty(rcmi.ShortCut))
{
Keys keyValue = Mesnac.Core.MenuCommand.ParseShortcut(rcmi.ShortCut);
(menuItem as ToolStripMenuItem).ShortcutKeys = keyValue;
}
if (rcmi.CreateType == CreateType.Form && !String.IsNullOrEmpty(rcmi.FormFile))
{
//自定义菜单事件处理,打开组态画面
menuItem.Click += delegate(object sender, EventArgs e)
{
SysConfigMenuCommand.Instance.Run(rcmi.FormFile, rcmi.ShowType);
};
}
else if (rcmi.CreateType == CreateType.Command)
{
//自定义菜单事件处理,执行组态命令
menuItem.Click += delegate(object sender, EventArgs e)
{
Mesnac.ActionService.Service.Instance.Run(sender, rcmi.CommandValue);
};
}
}
if (tn.Parent != root)
{
ToolStripMenuItem parentMenu = this.FindItemFromTopMenu((tn.Parent.Tag as RunConfigMenuItem).ID, topMenu) as ToolStripMenuItem;
if (parentMenu != null)
{
if (tsItem == null)
{
parentMenu.DropDownItems.Insert(index, menuItem);
}
else
{
parentMenu.DropDownItems.Add(tsItem);
}
}
else
{
if (tsItem == null)
{
topMenu.Items.Insert(index, menuItem);
}
else
{
topMenu.Items.Insert(index, tsItem);
}
}
}
else
{
if (tsItem == null)
{
topMenu.Items.Insert(index, menuItem);
}
else
{
topMenu.Items.Insert(index, tsItem);
}
}
#endregion
}
//权限处理
if (rcmi.CreateType == CreateType.Form)
{
if (!UserInfo.Instance.RoleGUID.Equals("-99") && allFormPurview.Contains(rcmi.ID) && !purviewList.Contains(rcmi.ID))
{
menuItem.Enabled = false;
}
else
{
if (menuItem != null)
{
menuItem.Enabled = true;
if (rcmi.IsAutoLoad)
{
#region 如果是自动加载的项,则直接执行
if (!WorkbenchSingleton.Workbench.ViewContentDic.ContainsKey(rcmi.FormFile))
{
SysConfigMenuCommand.Instance.Run(rcmi.FormFile, rcmi.ShowType);
}
else
{
if (WorkbenchSingleton.Workbench.ViewContentDic[rcmi.FormFile].Visible == false)
{
SysConfigMenuCommand.Instance.Run(rcmi.FormFile, rcmi.ShowType);
}
}
#endregion
}
}
}
}
else if (rcmi.CreateType == CreateType.Command)
{
string formName = rcmi.ID.Split(new char[] { '_' })[1];
if (!UserInfo.Instance.RoleGUID.Equals("-99") && allFormPurview.Contains(formName) && !purviewList.Contains(formName))
{
menuItem.Enabled = false;
}
else
{
if (menuItem != null) menuItem.Enabled = true;
}
}
this.ReBuilderMenu(topMenu, tn, root, allFormPurview, purviewList);
}
}
/// <summary>
/// 以递归方式重构系统主菜单
/// </summary>
/// <param name="topMenu">原始菜单栏</param>
/// <param name="node">当前递归下要重构的目标节点</param>
/// <param name="root">要重构的目标菜单结构树根节点</param>
public void ReBuilderMenu(MenuStrip topMenu, TreeNode node, TreeNode root)
{
this.ReBuilderMenu(topMenu, node, root, UserInfo.Instance.AllFormPurview, UserInfo.Instance.PurviewList);
}
#region 自定义菜单处理辅助方法
/// <summary>
/// 在菜单栏中查找菜单项
/// </summary>
/// <param name="id">要查找的条件id</param>
/// <param name="topMenu">菜单栏</param>
/// <returns>如果找到则返回对应的菜单项如果找不到返回null</returns>
public ToolStripItem FindItemFromTopMenu(string id, MenuStrip topMenu)
{
ToolStripItem tsmi = null;
foreach (ToolStripMenuItem menuItem in topMenu.Items)
{
if (this.IsMatchById(menuItem, id))
{
return menuItem;
}
else
{
tsmi = this.FindItemById(menuItem, id);
if (tsmi != null)
{
break;
}
}
}
return tsmi;
}
/// <summary>
/// 以递归方式在指定菜单的子级菜单中查找对应id的菜单项
/// </summary>
/// <param name="parentMenu">指定的菜单项</param>
/// <param name="id">要匹配的id</param>
/// <returns>返回对应菜单项找不到返回null</returns>
private ToolStripItem FindItemById(ToolStripItem parentMenu, string id)
{
ToolStripItem tsmi = null;
ToolStripMenuItem pm = parentMenu as ToolStripMenuItem;
if (pm != null)
{
foreach (ToolStripItem menuItem in pm.DropDownItems)
{
if (this.IsMatchById(menuItem, id))
{
return menuItem;
}
else
{
tsmi = this.FindItemById(menuItem, id);
if (tsmi != null)
{
break;
}
}
}
}
return tsmi;
}
/// <summary>
/// 判断菜单与指定ID是否匹配
/// </summary>
/// <param name="menuItem">菜单项</param>
/// <param name="id">ID号</param>
/// <returns>如果匹配返回真,否则返回假</returns>
public bool IsMatchById(ToolStripItem menuItem, string id)
{
IStatusUpdate su = menuItem as IStatusUpdate;
if (su != null && su.ID == id)
{
return true;
}
else if (menuItem.Name == id)
{
return true;
}
return false;
}
/// <summary>
/// 把ToolStripItem转换为对应的TreeNode
/// </summary>
/// <param name="menuItem">菜单项</param>
/// <returns>树节点</returns>
public TreeNode ConvertToolStripItemToTreeNode(ToolStripItem menuItem)
{
RunConfigMenuItem rItem = new RunConfigMenuItem();
TreeNode tn = new TreeNode();
IStatusUpdate su = menuItem as Mesnac.Core.IStatusUpdate;
if (su != null)
{
tn.Name = (menuItem as Mesnac.Core.IStatusUpdate).ID;
}
else
{
if (String.IsNullOrEmpty(menuItem.Name))
{
tn.Name = Guid.NewGuid().ToString();
menuItem.Name = tn.Name;
}
}
tn.Text = menuItem.Text;
rItem.ID = tn.Name;
if (menuItem is ToolStripMenuItem)
{
rItem.Text = menuItem.Text;
}
else if (menuItem is ToolStripButton)
{
rItem.Text = menuItem.ToolTipText;
}
rItem.IsSystem = true;
tn.Tag = rItem;
if (menuItem is ToolStripMenuItem)
{
foreach (ToolStripItem mi in (menuItem as ToolStripMenuItem).DropDownItems)
{
tn.Nodes.Add(ConvertToolStripItemToTreeNode(mi));
}
}
else if (menuItem is ToolStripSeparator)
{
rItem.Text = "-";
tn.Text = "-";
}
return tn;
}
#endregion
#endregion
#region 初始化自定义系统菜单
/// <summary>
/// 初始化自定义系统菜单和工具栏
/// </summary>
/// <param name="topMenu">系统菜单栏</param>
/// <param name="toolStrip">系统工具栏</param>
public void InitCustomerMenuAndToolStrip(MenuStrip topMenu, ToolStrip toolStrip)
{
if (File.Exists(this._menuConfig))
{
TreeNode root = this.DeserializeObject(this._menuConfig) as TreeNode;
if (root != null && topMenu != null)
{
AppConfigHandler.Instance.ReBuilderMenu(topMenu, root, root);
}
}
if (File.Exists(this._toolStripConfig))
{
List<RunConfigMenuItem> lst = this.DeserializeObject(this._toolStripConfig) as List<RunConfigMenuItem>;
if (lst != null && lst.Count > 0)
{
AppConfigHandler.Instance.ReBuilderToolStrip(toolStrip, topMenu, lst);
}
}
if (Mesnac.Basic.RunSchema.Instance.Exists())
{
//如果工程配置文件存在,则读取用户权限
DataTable table = UserInfo.Instance.GetPurview();
}
}
#endregion
#region 执行业务
/// <summary>
/// 执行命令
/// </summary>
/// <param name="sender">事件源</param>
/// <param name="rcmi">命令对象</param>
public void RunCommand(object sender, RunConfigMenuItem rcmi)
{
Mesnac.ActionService.Service.Instance.Run(sender, rcmi.CommandValue);
}
#endregion
#region 自定义菜单处理程序
/// <summary>
/// 自定义菜单处理程序
/// </summary>
public class SysConfigMenuCommand : AbstractCommand
{
private static SysConfigMenuCommand instance;
private SysConfigMenuCommand()
{
//Mesnac.Gui.Common.RunEngine.Instance.Init(this._projectPath); //初始化运行引擎
}
public static SysConfigMenuCommand Instance
{
get
{
if (instance == null)
{
instance = new SysConfigMenuCommand();
}
return instance;
}
}
public override void Run()
{
//test//
//TreeNode nodeForm = Mesnac.Gui.Common.RunEngine.Instance.Tree.GetFirstNodeByNodeName("FrmPlan");
//Mesnac.Gui.Common.RunEngine.Instance.Simulation(nodeForm, false);
LoggingService<SysConfigMenuCommand>.Debug("自定义菜单处理程序...测试");
}
public void Run(string formFile, FormShowType showType)
{
TreeNode nodeForm = Mesnac.Gui.Common.RunEngine.Instance.Tree.GetFirstNodeByNodeName(formFile);
Mesnac.Gui.Common.RunEngine.Instance.Simulation(nodeForm, showType);
//查找DLL模块显示
if(nodeForm == null)
{
Mesnac.Gui.Common.RunEngine.Instance.SimulationDLL(formFile,showType);
}
}
}
#endregion
#region 国际化支持
private SysMessage _sysMessages;
/// <summary>
/// 从配置文件中加载国际化资源数据
/// </summary>
/// <returns></returns>
public SysMessage LoadSysMessage()
{
SysMessage sysMessage = null;
if (File.Exists(this._sysMessageConfig))
{
sysMessage = this.DeserializeObject(this._sysMessageConfig) as SysMessage;
}
else
{
sysMessage = new SysMessage();
}
return sysMessage;
}
/// <summary>
/// 保存国际化资源至配置文件
/// </summary>
/// <param name="sysMessage"></param>
public void SaveSysMessage(SysMessage sysMessage)
{
this.SerializeObject(sysMessage, this._sysMessageConfig);
}
/// <summary>
/// 国际化资源数据
/// </summary>
public SysMessage SysMessages
{
get
{
if (this._sysMessages == null)
{
this._sysMessages = this.LoadSysMessage();
}
return this._sysMessages;
}
}
#endregion
#endregion
}
}