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 = this.lang("App.MustBeUnique", LangUtil.Get("HMI.Menu.Code")); ;
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);
}
}
}