using HMI.Core.Annotation; using HMI.Core.Util; using HMI.MenuManage.Entity; using HMI.UI.DpUtil; using HMI.UI.Util; using Microsoft.Win32; using Panuon.WPF.UI; using System; using System.Collections.ObjectModel; using System.ComponentModel; using System.Data; using System.Reflection; using System.Windows; using System.Windows.Controls; namespace HMI.MenuManage { /// /// ModalWindow.xaml 的交互逻辑 /// public partial class MenuModal : WindowX { public MenuModal() { DataContext = this; InitializeComponent(); } public MenuData Data { get; set; } public SqliteHelper sqliteHelper { get; set; } private bool _isProcessing; private ObservableCollection parentSource; public ObservableCollection ParentSource { get { return parentSource; } set { Set(ref parentSource, value); } } protected override void OnClosing(CancelEventArgs e) { //Press Continue Button if (DialogResult == true) { if (_isProcessing) { e.Cancel = true; return; } var okButton = WindowXModalDialog.GetOKButton(this); try { _isProcessing = true; ButtonHelper.SetIsPending(okButton, true); if (!ValidateForm()) { e.Cancel = true; return; } SaveOrUpdateData(); } catch (Exception ex) { ToastHelper.Error(this, "Error!"); e.Cancel = true; return; } finally { _isProcessing = false; ButtonHelper.SetIsPending(okButton, false); } } base.OnClosing(e); } public bool ValidateCode(object value, out string err) { err = null; string segment = string.IsNullOrEmpty(Data.Id) ? "" : $" AND id!='{Data.Id}'"; string sql = $"SELECT 1 FROM menu WHERE code='{TbCode.Text}'{segment};"; if (sqliteHelper.HasData(sql)) { err = $"{LangUtil.Get("HMI.Menu.Code")}{LangUtil.Get("HMI.Menu.CodeMustBeUnique")}"; return false; } return true; } public bool ValidateName(object value, out string err) { err = null; string segment = string.IsNullOrEmpty(Data.Id) ? "" : $" AND id!='{Data.Id}'"; string sql = $"SELECT 1 FROM menu WHERE name='{TbName.Text}'{segment};"; if (sqliteHelper.HasData(sql)) { err = string.Format(LangUtil.Get("App.MustBeUnique"), LangUtil.Get("HMI.Menu.Name")); return false; } return true; } private bool ValidateForm() { //PreValidate(); bool flag = FormGroupHelper.ValidateForm(formPanel); if (flag) { Data.Code = TbCode.Text; Data.Name = TbName.Text; Data.Icon = TbIcon.Text; Data.Level = TbLevel.Text; Data.Type = TbType.Text; Data.ParentCode = TbParentCode.SelectedValue?.ToString(); Data.DllPath = TbDllPath.Text; Data.ClassName = TbClassName.Text; } return flag; } private void RefreshParentCode() { ObservableCollection datas = new ObservableCollection(); string sql = $"SELECT code,name FROM menu WHERE level = 1 ORDER By id;"; DataTable dt = sqliteHelper.GetDataTable(sql); if (dt != null) { foreach (DataRow dr in dt.Rows) { var menu = new MenuData { Code = dr["code"].ToString(), Name = dr["name"].ToString(), }; datas.Add(menu); } } ParentSource = datas; } public bool? Open(MenuData data) { RefreshParentCode(); Data = data; TbCode.Text = Data.Code; TbName.Text = Data.Name; TbIcon.Text = Data.Icon; TbLevel.SelectedValue = Data.Level; TbType.SelectedValue = Data.Type; TbParentCode.SelectedValue = Data.ParentCode; TbDllPath.Text = Data.DllPath; TbClassName.Text = Data.ClassName; return this.ShowDialog(); } private void SaveOrUpdateData() { if (string.IsNullOrEmpty(Data.Id)) { InsertMenu(Data); } else { UpdateMenu(Data); } } public void InsertMenu(MenuData data) { string sql = $@"INSERT INTO menu (code,name,icon,level,type,parentCode,dllPath,className) VALUES ('{data.Code}','{data.Name}','{data.Icon}','{data.Level}','{data.Type}','{data.ParentCode}', '{data.DllPath}','{data.ClassName}');"; sqliteHelper.ExecuteSql(sql); } public void UpdateMenu(MenuData data) { string sql = $@"UPDATE menu SET code='{data.Code}',name='{data.Name}', icon='{data.Icon}',level='{data.Level}',type='{data.Type}',parentCode='{data.ParentCode}', dllPath='{data.DllPath}',className='{data.ClassName}' WHERE id='{data.Id}';"; sqliteHelper.ExecuteSql(sql); } private void IconSelect_Click(object sender, RoutedEventArgs e) { //string BasePath = PathHelper.IconFolder; //OpenFileDialog openFileDialog = new OpenFileDialog(); //openFileDialog.Filter = "(*.*)|*.*"; //openFileDialog.InitialDirectory = BasePath; //openFileDialog.Title = "选择图片"; //openFileDialog.Multiselect = false; //if (openFileDialog.ShowDialog() == true) //{ // string FileName = openFileDialog.FileName; // if (!FileName.StartsWith(BasePath)) // { // (this, "请将图标移动至程序Icon目录下!", ToastPosition.Top); // } // else // { // TbIcon.Text = FileName.Replace(BasePath, "."); // } //} IconSelector selector = new IconSelector { Title = LangUtil.Get("App.SelectIcon"), Owner = this }; if (selector.Open(Data.Icon) == true) { TbIcon.Text = selector.Data; } } private void DllSelect_Click(object sender, RoutedEventArgs e) { string pluginPath = PathHelper.PluginFolder(); OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "(*.dll)|*.dll"; openFileDialog.InitialDirectory = pluginPath; openFileDialog.Title = LangUtil.Get("App.SelectFile"); openFileDialog.Multiselect = false; if (openFileDialog.ShowDialog() == true) { string FileName = openFileDialog.FileName; if (!FileName.StartsWith(pluginPath)) { ToastHelper.Warning(this, LangUtil.Get("App.Msg.PluginMustInPluginFolder")); } else { TbDllPath.Text = FileName.Replace(pluginPath, "."); try { object[] infos = Assembly.LoadFrom(FileName).GetCustomAttributes(typeof(PluginClassNameAttribute), false); if (infos != null && infos.Length > 0) { PluginClassNameAttribute attr = (PluginClassNameAttribute)infos[0]; TbClassName.Text = attr.ClassName; } } catch (Exception ex) { } } } } private void TbLevel_SelectionChanged(object sender, SelectionChangedEventArgs e) { bool flag = (((ComboBoxItem)e.AddedItems[0])?.Content?.ToString() == "2"); FormGroupHelper.SetIsRequired(FgType, flag); FormGroupHelper.SetIsRequired(FgParentCode, flag); FormGroupHelper.SetIsRequired(FgDllPath, flag); FormGroupHelper.SetIsRequired(FgClassName, flag); } } }