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.
lj_plc/Main/Mesnac.Gui.Edit/Pad/ProjectWindow.cs

658 lines
26 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Configuration;
using System.IO;
using System.Threading;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Reflection;
using System.Reflection.Emit;
using ICSharpCode.Core;
using Mesnac.Gui.Workbench;
using Mesnac.PlugIn.Pad;
using Mesnac.PlugIn.View;
using Mesnac.PlugIn.Workbench;
using Mesnac.Basic;
using Mesnac.Equips;
using Mesnac.Gui.Common;
using Mesnac.Gui.Edit.Global;
using Mesnac.Gui.Edit.Common;
using Mesnac.Gui.Edit.Dialog;
using Mesnac.Gui.Edit.ViewContent;
using Mesnac.Controls.Default;
namespace Mesnac.Gui.Edit.Pad
{
public partial class ProjectWindow : DefaultPadContent
{
#region 定义变量
//private AccidenceAnalyzer express;
//private Dictionary<string, Form> _runForms = new Dictionary<string, Form>();
//private readonly string _componentsActionFile = Path.Combine(Application.StartupPath, PublicConfig.Instance.ComponentsActionFile); //工具箱控件动画配置文件
#endregion
#region 公共属性
/// <summary>
/// 工程树
/// </summary>
public TreeView Tree
{
get
{
return tvProject;
}
}
#endregion
#region 构造方法与初始化处理
public ProjectWindow()
{
InitializeComponent();
this.InitUIMethod();
this.Init();
}
#region 重绘DefaultPadContent的RedrawContent方法
/// <summary>
/// 重绘组件事件触发时执行
/// </summary>
public override void RedrawContent()
{
base.RedrawContent();
this.InitUIMethod();
this.RefreshTreeNodeUI();
}
#endregion
/// <summary>
/// 初始化界面元素
/// </summary>
private void InitUIMethod()
{
this.mnuPreRun.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Form_mnuPreRun_Text")); //临时仿真
this.mnuDeleteFormItem.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Form_mnuDelete_Text")); //删除
this.mnuDeviceManager.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Form_mnuManage_Text")); //管理
this.mnuNewForm.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Form_mnuNew_Text")); //新建
this.mnuActionStrip.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Form_mnuNew_Text")); //新建
this.smuDelete.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Form_mnuDelete_Text")); //删除
this.tsmManger.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Form_mnuManage_Text")); ; //管理
}
/// <summary>
/// 刷新固定节点文本
/// </summary>
private void RefreshTreeNodeUI()
{
TreeNode tnFormName = this.tvProject.GetFirstNodeByNodeName(FixNodeName.NodeFormName);
TreeNode tnDeviceName = this.tvProject.GetFirstNodeByNodeName(FixNodeName.NodeDeviceName);
TreeNode tnDataSourceName = this.tvProject.GetFirstNodeByNodeName(FixNodeName.NodeDataSourceName);
TreeNode tnCommandName = this.tvProject.GetFirstNodeByNodeName(FixNodeName.NodeCommandName);
if (tnFormName != null)
{
tnFormName.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Gui_Edit_Pad_ProjectWindow_Forms")); //"画面"
}
if (tnDeviceName != null)
{
tnDeviceName.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Gui_Edit_Pad_ProjectWindow_Devices")); //"设备"
}
if (tnDataSourceName != null)
{
tnDataSourceName.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Gui_Edit_Pad_ProjectWindow_DataSources")); //"数据源";
}
if (tnCommandName != null)
{
tnCommandName.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Gui_Edit_Pad_ProjectWindow_Commands")); //"命令";
}
}
/// <summary>
/// 初始加载时展开树节点
/// </summary>
private void Init()
{
//this.tvProject.ExpandAll();
this.tvProject.Nodes.Clear();
//注册表达式
//express = new AccidenceAnalyzer();
//express.OnAccidenceAnalysis += new AccidenceAnalyzer.AccidenceAnalysis(express_OnAccidenceAnalysis);
//express.OnCallBack += new AccidenceAnalyzer.CallBack(express_OnCallBack);
//设备节点更新处理
Mesnac.Equips.Factory.Instance.OnConfigChanged += delegate(object sender, EventArgs e)
{
TreeNode tnDeviceName = this.tvProject.GetFirstNodeByNodeName(FixNodeName.NodeDeviceName);
if (tnDeviceName != null)
{
tnDeviceName.Nodes.Clear();
Dictionary<string, Mesnac.Equips.SetConfig.ConfigEquip> allConfigEquips = Mesnac.Equips.Factory.Instance.AllConfigEquip;
foreach (string key in allConfigEquips.Keys)
{
TreeNode tnDevice = new TreeNode();
tnDevice.Name = key;
tnDevice.Text = key;
tnDevice.Tag = key;
tnDevice.ImageIndex = 5;
tnDevice.SelectedImageIndex = 5;
tnDeviceName.Nodes.Add(tnDevice);
}
tnDeviceName.ExpandAll();
}
};
//数据源节点更新处理
DataSourceFactory.Instance.DataSourceRefresh += delegate(object sender, EventArgs e)
{
TreeNode tnDataSourceName = this.tvProject.GetFirstNodeByNodeName(FixNodeName.NodeDataSourceName);
if (tnDataSourceName != null)
{
tnDataSourceName.Nodes.Clear();
Dictionary<string, DataSourceItem> allDataSources = DataSourceFactory.Instance.DataSources;
foreach (string key in allDataSources.Keys)
{
TreeNode tnDataSource = new TreeNode();
tnDataSource.Name = key;
tnDataSource.Text = key;
tnDataSource.Tag = key;
tnDataSource.ImageIndex = 7;
tnDataSource.SelectedImageIndex = 7;
tnDataSourceName.Nodes.Add(tnDataSource);
}
tnDataSourceName.ExpandAll();
}
};
}
#endregion
#region 公共方法
/// <summary>
/// 生成工程树
/// </summary>
public void GenerateProjectTree(string fullFileName)
{
string projectName = Path.GetFileNameWithoutExtension(fullFileName);
TreeView tv = this.Tree;
tv.Nodes.Clear();
TreeNode root = new TreeNode();
root.Name = projectName;
root.Text = projectName;
root.ToolTipText = projectName;
root.Tag = AppConfigHandler.Instance.CurrentProjectWizardName;
root.ImageIndex = 0;
root.SelectedImageIndex = 0;
TreeNode nodeForm = new TreeNode();
nodeForm.Name = FixNodeName.NodeFormName;
nodeForm.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Gui_Edit_Pad_ProjectWindow_Forms")); //"画面";
nodeForm.Tag = FixNodeName.NodeFormName;
nodeForm.ImageIndex = 1;
nodeForm.SelectedImageIndex = 1;
root.Nodes.Add(nodeForm);
TreeNode nodeDeviceDriver = new TreeNode();
nodeDeviceDriver.Name = FixNodeName.NodeDeviceName;
nodeDeviceDriver.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Gui_Edit_Pad_ProjectWindow_Devices")); //"设备";
nodeDeviceDriver.Tag = FixNodeName.NodeDeviceName;
nodeDeviceDriver.ImageIndex = 2;
nodeDeviceDriver.SelectedImageIndex = 2;
root.Nodes.Add(nodeDeviceDriver);
TreeNode nodeDataSource = new TreeNode();
nodeDataSource.Name = FixNodeName.NodeDataSourceName;
nodeDataSource.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Gui_Edit_Pad_ProjectWindow_DataSources")); //"数据源";
nodeDataSource.Tag = FixNodeName.NodeDataSourceName;
nodeDataSource.ImageIndex = 6;
nodeDataSource.SelectedImageIndex = 6;
root.Nodes.Add(nodeDataSource);
TreeNode nodeAction = new TreeNode();
nodeAction.Name = FixNodeName.NodeCommandName;
nodeAction.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Gui_Edit_Pad_ProjectWindow_Commands")); //"命令";
nodeAction.Tag = FixNodeName.NodeCommandName;
nodeAction.ImageIndex = 5;
nodeAction.SelectedImageIndex = 5;
root.Nodes.Add(nodeAction);
tv.Nodes.Add(root);
tv.ExpandAll();
tv.SaveToXml(fullFileName);
Mesnac.Equips.Factory.Instance.ConfigFile = Path.Combine(Path.GetDirectoryName(AppConfigHandler.Instance.FullFileName), nodeDeviceDriver.GetPathNoRoot()) + ".xml";
}
#endregion
#region 工程树节点的单击事件(左键激活设计画面,右键弹出新建、临时仿真菜单)
private void tvProject_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
#region 画面处理
if (e.Button == MouseButtons.Right)
{
#region 画面
this.Tree.SelectedNode = e.Node;
//新建画面
if (e.Node.Name == FixNodeName.NodeFormName)
{
this.cmsForm.Show(this.tvProject, e.X, e.Y);
}
//临时仿真与删除画面
if (e.Node.Parent != null && e.Node.Parent.Name == FixNodeName.NodeFormName)
{
this.cmsFormItem.Show(this.tvProject, e.X, e.Y);
this.mnuPreRun.Visible = true;
}
else
{
this.mnuPreRun.Visible = false;
}
#endregion
#region 命令
if (e.Node.Parent != null && e.Node.Parent.Name == FixNodeName.NodeCommandName)
{
this.cmsActionChild.Show(this.tvProject, e.X, e.Y);
}
if (e.Node.Name == FixNodeName.NodeCommandName)
{
this.cmsActionFrom.Show(this.tvProject, e.X, e.Y);
}
#endregion
#region 设备
if (e.Node.Name == FixNodeName.NodeDeviceName)
{
this.cmsDevice.Show(this.tvProject, e.X, e.Y);
}
#endregion
#region 数据源
if (e.Node.Name == FixNodeName.NodeDataSourceName)
{
this.cmsResourceForm.Show(this.tvProject, e.X, e.Y);
}
#endregion
}
else if (e.Button == MouseButtons.Left)
{
//鼠标点击某个画面时,同时激活对应的画面
this.Tree.SelectedNode = e.Node;
if (e.Node.Parent != null && (e.Node.Parent.Name == FixNodeName.NodeFormName))
{
foreach (IViewContent vc in WorkbenchSingleton.Workbench.ViewContentCollection)
{
if (vc.ViewContentID.StartsWith(e.Node.Name))
{
WorkbenchSingleton.Workbench.WorkbenchLayout.ShowView(vc);
break;
}
}
}
//鼠标点击设备的处理
}
#endregion
}
#endregion
#region 工程树的双击事件(激活画面或设备的设计画面)
private void tvProject_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
{
//加载显示画面
if (e.Button == MouseButtons.Left && e.Clicks == 2)
{
//鼠标点击某个画面时,同时激活对应的画面
bool flag = false;
this.Tree.SelectedNode = e.Node;
if (e.Node.Parent!= null && e.Node.Parent.Name == FixNodeName.NodeFormName)
{
IWorkbenchWindow window = WorkbenchSingleton.Workbench.GetViewByViewContentID(e.Node.Name);
if (window != null)
{
flag = true;
try
{
window.SelectWindow();
}
catch
{
window.CloseWindow(true);
}
}
if (!flag)
{
string fileName = Path.Combine(Path.GetDirectoryName(AppConfigHandler.Instance.FullFileName), e.Node.GetPathNoRoot()) + ".xml";
//this.TopContainer.CreateNewForm(fileName);
NewFormCommand cmm = new NewFormCommand(fileName);
cmm.Run();
}
}
else if (e.Node.Name == FixNodeName.NodeDeviceName || (e.Node.Parent != null && e.Node.Parent.Name == FixNodeName.NodeDeviceName))
{
foreach (IViewContent vc in WorkbenchSingleton.Workbench.ViewContentCollection)
{
if (vc.TitleName.StartsWith("DataConfig"))
{
WorkbenchSingleton.Workbench.ShowView(vc);
flag = true;
break;
}
}
if (!flag)
{
//Mesnac.Equips.Factory.Instance.ManageEquip(AppConfigHandler.Instance.CurrentProjectWizardName, this.TopContainer.DockPanelMain);
Mesnac.Equips.Factory.Instance.ManageEquip(WorkbenchSingleton.Workbench);
Mesnac.Equips.Factory.Instance.ManageEquip(WorkbenchSingleton.Workbench);
}
}
else if (e.Node.Name == FixNodeName.NodeDataSourceName || (e.Node.Parent != null && e.Node.Parent.Name == FixNodeName.NodeDataSourceName))
{
this.DataSourceManager();
}
else if (e.Node.Name == FixNodeName.NodeCommandName || (e.Node.Parent != null && e.Node.Parent.Name == FixNodeName.NodeCommandName))
{
if (e.Node.ToolTipText == CreateType.Command.ToString())
{
FrmEventAction form = new FrmEventAction();
List<Mesnac.Controls.Base.DesignAction> list = new List<Mesnac.Controls.Base.DesignAction>();
GetActionXML(out list, e.Node);
form.ActionList = list;
form.ShowDialog();
if (form.DialogResult == DialogResult.OK)
{
list = form.ActionList;
SaveActionXML(list, e.Node.Tag.ToString());
}
}
}
}
}
/// <summary>
/// 保存ActionXML
/// </summary>
/// <param name="name"></param>
/// <param name="remark"></param>
/// <param name="uid"></param>
public void SaveActionXML(List<Mesnac.Controls.Base.DesignAction> list, string node)
{
XmlDocument dom = new XmlDocument();
string path = Path.Combine(Path.GetDirectoryName(AppConfigHandler.Instance.FullFileName), Mesnac.Basic.FixNodeName.NodeCommandName + ".xml");
dom.Load(path);
int cnodes = dom.DocumentElement.ChildNodes.Count;
for (int i = 0; i < cnodes; i++)
{
XmlNode xnode = dom.DocumentElement.ChildNodes[0];
if (xnode.Name == "Property" && xnode.Attributes.Count > 0 && xnode.Attributes[0].Value == node)
{
dom.DocumentElement.RemoveChild(xnode);
}
}
foreach (Mesnac.Controls.Base.DesignAction d in list)
{
XmlElement rootxe = dom.DocumentElement;
XmlElement xe = dom.CreateElement("Property");
xe.SetAttribute("actionname", node);
xe.SetAttribute("name", d.Name);
xe.SetAttribute("remark", d.Remark);
xe.SetAttribute("guid", d.GUID);
rootxe.AppendChild(xe);
dom.Save(path);
}
}
/// <summary>
/// 保存ActionXML
/// </summary>
/// <param name="name"></param>
/// <param name="remark"></param>
/// <param name="uid"></param>
public void GetActionXML(out List<Mesnac.Controls.Base.DesignAction> list, TreeNode node)
{
list = new List<Mesnac.Controls.Base.DesignAction>();
XmlDocument dom = new XmlDocument();
string path = Path.Combine(Path.GetDirectoryName(AppConfigHandler.Instance.FullFileName), Mesnac.Basic.FixNodeName.NodeCommandName + ".xml");
dom.Load(path);
foreach (XmlElement x in dom.DocumentElement.ChildNodes)
{
if (x.Name == "Property" && x.GetAttribute("guid") != "" && x.GetAttribute("actionname") == node.Tag.ToString())
{
Mesnac.Controls.Base.DesignAction d = new Mesnac.Controls.Base.DesignAction();
d.Name = x.GetAttribute("name");
d.Remark = x.GetAttribute("remark");
d.GUID = x.GetAttribute("guid");
list.Add(d);
}
}
}
#endregion
#region 新建画面与删除画面
/// <summary>
/// 新建画面
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mnuNewForm_Click(object sender, EventArgs e)
{
switch (this.Tree.SelectedNode.Name)
{
case FixNodeName.NodeFormName:
//string frmName = this.TopContainer.CreateNewForm(); //创建画面,并获得画面文件名
string frmName = new NewFormCommand().CreateNewForm(); //创建画面,并获得画面文件名
break;
case FixNodeName.NodeDeviceName: //创建虚拟设备
ICSharpCode.Core.LoggingService<ProjectWindow>.Info("创建虚拟设备,请等待处理...");
break;
}
}
/// <summary>
/// 删除画面
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mnuDeleteFormItem_Click(object sender, EventArgs e)
{
string fileName = String.Empty;
TreeNode node = this.Tree.SelectedNode;
string msg1 = StringParser.Parse(ResourceService.GetString("Dialog_MessageBox_DeleteAsk")); //确定要删除吗?
DialogResult result = MessageBox.Show(msg1, Mesnac.Basic.LanguageHelper.Caption, MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
#region 删除画面节点
fileName = Path.Combine(AppConfigHandler.Instance.FullFileName, node.GetPathNoRoot()) + ".xml";
//1、关闭设计器
IWorkbenchWindow window = Workbench.WorkbenchSingleton.Workbench.GetViewByViewContentID(node.Name);
if (window != null)
{
Workbench.WorkbenchSingleton.Workbench.CloseView(window.ViewContent);
}
//2、删除文件
if (File.Exists(fileName))
{
File.Delete(fileName);
}
//3、删除节点并更新工程文件
node.Parent.Nodes.Remove(node);
this.Tree.SaveToXml(AppConfigHandler.Instance.FullFileName);
#endregion
}
}
#endregion
#region 画面临时仿真
/// <summary>
/// 画面临时仿真
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mnuPreRun_Click(object sender, EventArgs e)
{
this.RunSimulation();
}
public void RunSimulation()
{
TreeNode node = this.Tree.SelectedNode;
//初始化运行引擎
//Mesnac.Gui.Common.RunEngine.Instance.Init(Path.GetDirectoryName(AppConfigHandler.Instance.FullFileName), true);
Mesnac.Gui.Common.RunEngine.Instance.Init(Path.GetDirectoryName(AppConfigHandler.Instance.FullFileName), false, false, false);
Mesnac.Gui.Common.RunEngine.Instance.Simulation(node, FormShowType.Form);
}
#endregion
#region 设备管理
private void mnuDeviceManager_Click(object sender, EventArgs e)
{
Mesnac.Equips.Factory.Instance.ManageEquip(WorkbenchSingleton.Workbench);
}
#endregion
#region 显示数据源管理
/// <summary>
/// 显示数据源管理
/// </summary>
private void DataSourceManager()
{
FrmDataSource frmDataSource = null;
IWorkbenchWindow window = WorkbenchSingleton.Workbench.GetViewByType(typeof(Mesnac.Gui.Edit.ViewContent.FrmDataSource));
if (window != null)
{
frmDataSource = window.ViewContent as FrmDataSource;
}
if (frmDataSource == null)
{
frmDataSource = new FrmDataSource();
}
WorkbenchSingleton.Workbench.ShowView(frmDataSource);
}
#endregion
#region 事件处理
private void ProjectWindow_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
this.Hide();
}
private void DesigerMenuItem_Click(object sender, EventArgs e)
{
switch (this.Tree.SelectedNode.Name)
{
case FixNodeName.NodeFormName:
//string frmName = this.TopContainer.CreateNewForm(); //创建画面,并获得画面文件名
string frmName = new NewFormCommand().CreateNewForm();
break;
case FixNodeName.NodeDeviceName: //创建虚拟设备
MessageBox.Show("等待处理...ProjectWindow.cs");
break;
}
}
private void mnuActionStrip_Click(object sender, EventArgs e)
{
switch (this.Tree.SelectedNode.Name)
{
case FixNodeName.NodeCommandName:
string frmName = new NewFormCommand().CreateActionFrm();
if (frmName == "")
return;
List<Mesnac.Controls.Base.DesignAction> list = new List<Mesnac.Controls.Base.DesignAction>();
FrmEventAction form = new FrmEventAction();
form.ShowDialog();
//弹出命令对话框
if (form.DialogResult == DialogResult.OK)
{
if (form.DialogResult == DialogResult.OK)
{
list = form.ActionList;
SaveActionXML(list, frmName);
}
}
break;
}
}
/// <summary>
/// 删除命令
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void smuDelete_Click(object sender, EventArgs e)
{
TreeNode node = this.Tree.SelectedNode;
DialogResult result = MessageBox.Show("确定要删除吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
//删除xml中节点
string fileName = Path.Combine(Path.GetDirectoryName(AppConfigHandler.Instance.FullFileName), Mesnac.Basic.FixNodeName.NodeCommandName + ".xml");
XmlDocument dom = new XmlDocument();
dom.Load(fileName);
int cnodes = dom.DocumentElement.ChildNodes.Count;
for (int i = 0; i < cnodes; i++)
{
XmlNode xnode = dom.DocumentElement.ChildNodes[0];
if (xnode.Name == "Property" && xnode.Attributes.Count > 0 && xnode.Attributes[0].Value == node.Tag.ToString())
{
dom.DocumentElement.RemoveChild(xnode);
}
}
///////////////////
node.Parent.Nodes.Remove(node);
this.Tree.SaveToXml(AppConfigHandler.Instance.FullFileName);
}
}
private void tsmManger_Click(object sender, EventArgs e)
{
this.DataSourceManager();
}
#endregion
}
}