XKRS2023Frm/CopyCode/MainFrm.cs
2023-03-24 17:02:04 +08:00

439 lines
15 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
using XKRS.Common.Factory;
using XKRS.Common.Interface;
using XKRS.Common.Model.Helper;
using XKRS.UI.Model.Winform;
using XKRS.UI.Model.Winform.Helper;
namespace XKRS.UI.Main
{
public partial class MainFrm : Form
{
IProcess _process = null;
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.Process processB = new System.Diagnostics.Process();
System.Diagnostics.Process processC = new System.Diagnostics.Process();
public MainFrm()
{
InitializeComponent();
System.Diagnostics.Process.GetCurrentProcess().PriorityClass = System.Diagnostics.ProcessPriorityClass.RealTime;
var theme = new VS2015LightTheme();
stsStripLayout.BackColor = ststripDevices.BackColor = Color.FromArgb(64, 64, 64);
dockPanelMain.Theme = theme;
VisualStudioToolStripExtender extender = new VisualStudioToolStripExtender();
extender.SetStyle(menuMain, VisualStudioToolStripExtender.VsVersion.Vs2015, theme);
InitialMenu(MenuFormFactory.MenuFrmTypeDict, "");
m_deserializeMenuFrm = new DeserializeDockContent(GetMenuFromPersistString);
m_deserializeDeviceRunFrm = new DeserializeDockContent(GetAllFormPersistString);
notifyIcon.Text = SettingHelper.GetProgramDescription();
string iconPath = SettingHelper.GetProgramIcon();
if (!string.IsNullOrWhiteSpace(iconPath))
{
notifyIcon.Icon = Icon = new Icon(iconPath);
}
}
private void RegisterEvent(MenuFormBase dockFrm)
{
dockFrm.OnUploadProcess = DockFrm_OnUploadProcess;
}
#region Menu
readonly ManualResetEvent _allMenuLoadDoneHandle = new ManualResetEvent(false);
private void InitialMenu(Dictionary<MenuNodeAttribute, Type> menuFrmTypeDict, string parentMenuCode)
{
menuFrmTypeDict.Keys.Where(u => u.ParentMenuCode == parentMenuCode).OrderBy(m => m.MenuOrder).ToList().ForEach(m =>
{
ToolStripMenuItem item = new ToolStripMenuItem(m.MenuName);
item.Tag = m.MenuCode;
if (m.IsActualForm)
{
item.Click += MenuFormItem_Click;
}
});
}
private async void DockFrm_OnUploadProcess(string frmId, IProcess process)
{
await Task.Run(() =>
{
_allMenuLoadDoneHandle.WaitOne();//阻止当前线程直到WaitHandle接收到信号
this.Invoke(new Action(() =>
{
_process = process;
CloseAllDeviceFrm();
try
{
foreach (var dock in dockPanelMain.Contents)
{
MenuFormBase m = dock as MenuFormBase;
if (m != null && m.Id != frmId)
{
m.DownloadProcess(process);
}
}
}
catch (Exception ex)
{
throw ex;
}
}));
});
}
private void MenuFormItem_Click(object sender, EventArgs e)
{
try
{
SuspendLayout();
ToolStripMenuItem item = sender as ToolStripMenuItem;
bool isExisted = false;
foreach (var dock in dockPanelMain.Contents)
{
MenuFormBase menu = dock as MenuFormBase;
if (menu != null && menu.Tag.ToString() == item.Tag.ToString())
{
if (menu.IsHidden)
{
menu.Show();
}
menu.BringToFront();
isExisted = true;
break;
}
}
if (isExisted)
{
ResumeLayout();
return;
}
MenuFormBase dockFrm = MenuFormFactory.GetMenuFrm(item.Tag.ToString());
if (dockFrm == null)
{
return;
}
dockFrm.Text = item.Text;
dockFrm.DockPanel = dockPanelMain;
dockFrm.SetLoginStatus(IsLogin);
dockFrm.DockStateChanged += DockStateChanged;
dockFrm.Show();
RegisterEvent(dockFrm);
ResumeLayout();
}
catch
{
}
}
#endregion
private void MainFrm_Load(object sender, EventArgs e)
{
LoadLayoutFromXML(m_deserializeMenuFrm);
_allMenuLoadDoneHandle.Set();
AdvancedPwdFrm.OnLoginOK = OnLoginOK;
LoadProcess();
LoadLayoutFromXML(m_deserializeDeviceRunFrm);
LoadProcess(false);
Openexe();
}
private void Openexe()
{
string strPathExe = Environment.CurrentDirectory + "\\BDebug2022110201_5" + "\\NJJ-ZK.exe";
process.StartInfo.WorkingDirectory = Environment.CurrentDirectory + "\\BDebug2022110201_5";
process.StartInfo.FileName = strPathExe;
process.StartInfo.Arguments = null;//-s -t 可以用来关机或重启
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = false;//true
process.StartInfo.RedirectStandardOutput = false;
process.StartInfo.RedirectStandardError = false;
process.StartInfo.CreateNoWindow = false;
process.Start();//启动
string strPathExe2 = Environment.CurrentDirectory + "\\CDebug2022110201_4" + "\\NJJ-ZK.exe";
processB.StartInfo.WorkingDirectory = Environment.CurrentDirectory + "\\CDebug2022110201_4";
processB.StartInfo.FileName = strPathExe2;
processB.StartInfo.Arguments = null;//-s -t 可以用来关机、开机或重启
processB.StartInfo.UseShellExecute = false;
processB.StartInfo.RedirectStandardInput = false; //true
processB.StartInfo.RedirectStandardOutput = false; //true
processB.StartInfo.RedirectStandardError = false;
processB.StartInfo.CreateNoWindow = false;
processB.Start();//启动
string strPathExe3 = Environment.CurrentDirectory + "\\ADebug2022110201_2" + "\\NJJ-ZK.exe";
processC.StartInfo.WorkingDirectory = Environment.CurrentDirectory + "\\ADebug2022110201_2";
processC.StartInfo.FileName = strPathExe3;
processC.StartInfo.Arguments = null;//-s -t 可以用来关机、开机或重启
processC.StartInfo.UseShellExecute = false;
processC.StartInfo.RedirectStandardInput = false; //true
processC.StartInfo.RedirectStandardOutput = false; //true
processC.StartInfo.RedirectStandardError = false;
processC.StartInfo.CreateNoWindow = false;
processC.Start();//启动
}
private void Killexe()
{
try
{
process.CloseMainWindow();//通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程
process.Close();//释放与此组件关联的所有资源
processB.CloseMainWindow();//通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程
processB.Close();//释放与此组件关联的所有资源
processC.CloseMainWindow();//通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程
processC.Close();//释放与此组件关联的所有资源
}
catch
{
}
}
private List<string> LoadProcessCode()
{
var systemProcessCodes = ProcessFactory.GetProcessCodes();
var avaiableProcessCodes = SettingHelper.GetProcessCodes();
List<string> pCodes = new List<string>();
if (avaiableProcessCodes.Count > 0)
{
pCodes = avaiableProcessCodes.Intersect(systemProcessCodes).ToList();
}
else
{
pCodes = systemProcessCodes;
}
if (pCodes.Count > 1)
{
pCodes.RemoveAll(u => u == "");
}
return pCodes;
}
private List<string> LoadProductionCode()
{
return SettingHelper.GetProductionCodes();
}
/// <summary>
/// 载入流程
/// </summary>
/// <param name="isInitialProcess">是否为初始化流程</param>
private void LoadProcess(bool isInitialProcess = true)
{
if (isInitialProcess)//初次创建流程
{
var processCodes = LoadProcessCode();
var productionCodes = LoadProductionCode();
_process = ProcessFactory.CreateStationProcess(processCodes[0], productionCodes[0], out string msg);
if (!string.IsNullOrWhiteSpace(msg))
{
_process = null;
throw new ProcessException($"创建失败,{msg}", null, ExceptionLevel.Fatal);
}
_process.InitialProcess("");
}
}
#region Login
bool isLogin = false;
bool IsLogin
{
get => isLogin;
set
{
isLogin = value;
tsslLoginStatus.Text = isLogin ? "已登录" : "未登录";
foreach (var dock in dockPanelMain.Contents)
{
var menuFrm = dock as MenuFormBase;
if (menuFrm != null)
{
menuFrm.SetLoginStatus(isLogin);
}
}
}
}
private void OnLoginOK(bool isLogin)
{
IsLogin = isLogin;
}
#endregion
#region CloseForm
private void DeviceDisplayFrm_FormClosed(object sender, FormClosedEventArgs e)
{
string id = (sender as DeviceRunFrmBase).Device.Id;
if (showedDeviceUIDict.ContainsKey(id))
{
showedDeviceUIDict.Remove(id);
}
}
private void CloseAllDeviceFrm()
{
this.Invoke(new Action(() =>
{
this.SuspendLayout();
dockPanelMain.Contents.Select(u =>
{
if (u is DeviceRunFrmBase runFrmBase)
{
return runFrmBase;
}
else
{
return null;
}
}).ToList().ForEach(u =>
{
if (u == null)
return;
if (_process.DeviceCollection.Any(d => d.Id == u.Device.Id))
return;
u.DockPanel = null;
u.Close();
});
this.ResumeLayout();
}));
}
#endregion
#region Layout布局
string _layoutFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"{SettingHelper.GetSelectLayout()}.layout");//路径
private DeserializeDockContent m_deserializeMenuFrm;
private DeserializeDockContent m_deserializeDeviceRunFrm;
private IDockContent GetMenuFromPersistString(string persistString)
{
return null;
}
private IDockContent GetAllFormPersistString(string persistString)
{
if (persistString.StartsWith("MenuFrm"))
{
var desc = persistString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
string menuCode = desc[1];
foreach(var dock in dockPanelMain.Contents)
{
MenuFormBase menu = dock as MenuFormBase;
if (menu != null && menu.Tag.ToString() == menuCode)
{
return dock;
}
}
MenuFormBase dockFrm = MenuFormFactory.GetMenuFrm(menuCode);
if (dockFrm == null)
{
return null;
}
dockFrm.Text = desc[2];
dockFrm.DockStateChanged += DockStateChanged;
dockFrm.SetLoginStatus(IsLogin);
RegisterEvent(dockFrm);
return dockFrm;
}
if (persistString.StartsWith("DeviceRunFrm"))
{
string deviceId = persistString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)[1];
var device = _process.DeviceCollection.FirstOrDefault(u => u.Id == deviceId);
if (null == device || null == deviceId)
{
return null;
}
if (!showedDeviceUIDict.ContainsKey(deviceId))
{
var runCtrl = UIFactory.GetRunCtrl(device);
DeviceRunFrmBase runFrm = new DeviceRunFrmBase(device, runCtrl);
runFrm.Text = device.Name;
runFrm.MdiParent = this;
runFrm.DockPanel = dockPanelMain;
runFrm.DockState = DockState.Document;
runFrm.FormClosed += DeviceDisplayFrm_FormClosed;
runFrm.DockStateChanged += DockStateChanged;
showedDeviceUIDict[deviceId] = runFrm;
}
return showedDeviceUIDict[deviceId];
}
return null;
}
private void DockStateChanged(object sender, EventArgs e)
{
if (sender is DockContent dc)
{
if (dc.DockState == DockState.Float)
{
dc.Parent.FindForm().FormBorderStyle = FormBorderStyle.Sizable;
}
}
}
private void LoadLayoutFromXML(DeserializeDockContent dContent)
{
if (!File.Exists(_layoutFile))
return;
dockPanelMain.SuspendLayout(true);//悬挂式布局
CloseAllDeviceFrm();
while (dockPanelMain.Contents.Count > 0)
{
dockPanelMain.Contents[0].DockHandler.DockPanel = null;
}
using (FileStream stream = new FileStream(_layoutFile, FileMode.Open))
{
dockPanelMain.LoadFromXml(stream, dContent);
stream.Close();
}
dockPanelMain.ResumeLayout(true, true);
}
#endregion
#region Device Display
readonly Dictionary<string, DeviceRunFrmBase> showedDeviceUIDict = new Dictionary<string, DeviceRunFrmBase>();
#endregion
}
}