using DPumpHydr.WinFrmUI.WenSkin.Json; using DPumpHydr.WinFrmUI.WenSkin.Json.Linq; 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.Windows.Forms; using System.Xml; using DPumpHydr.WinFrmUI.WenSkin.DLL; using System.Runtime.InteropServices; namespace DPumpHydr.WinFrmUI.WenSkin { public partial class WenConfig { public WenConfig(ConfigFormatEnum format = ConfigFormatEnum.Xml) : this("WenAutoConfig", format) { } public WenConfig(string configName, ConfigFormatEnum format = ConfigFormatEnum.Xml) : this(Application.StartupPath, configName, format) { } public WenConfig(string path, string configName, ConfigFormatEnum format = ConfigFormatEnum.Xml) { this.Path = path; this.ConfigFormat = format; ConfigName = configName; Load(); } public string this[string group, string name] { get => Groups[group, name]; set => Groups[group, name] = value; } public WenConfigGroup this[string group] { get => Groups[group]; } #region 委托 [Category("Wen"), Description("保存数据")] public event WenConfigEventHandler SaveChanged; [ComVisible(true)] public delegate void WenConfigEventHandler(object sender, WenConfigEventArgs e); public class WenConfigEventArgs : EventArgs { private readonly WenConfig wenConfig; public WenConfigEventArgs(WenConfig config) { this.wenConfig = config; } public WenConfig WenConfig => wenConfig; } #endregion #region 私有属性 private WenConfigGroupList groups; #endregion #region 公有属性 public WenConfigForm Form => new WenConfigForm(this); public WenConfigControl Control => new WenConfigControl(this); public WenConfigGroupList Groups => groups ??= new WenConfigGroupList(this); public string ConfigName { get; private set; } = "WenAutoConfig"; //是否使用xml public ConfigFormatEnum ConfigFormat { get; private set; } = ConfigFormatEnum.Xml; //文件路径 public string FilePath => $"{this.Path}\\{ConfigName}.{ConfigFormat.ToString().ToLower()}"; public string Path { get; private set; } public enum ConfigFormatEnum { Xml, Json } #endregion //打开配置文件 public WenConfig Load() { Load(FilePath); return this; } public void Load(string path) { if (!File.Exists(path)) return; switch (ConfigFormat) { case ConfigFormatEnum.Xml: LoadXml(path); break; case ConfigFormatEnum.Json: LoadJson(path); break; } } private void LoadXml(string path) { XmlDocument xml = new XmlDocument(); xml.Load(path); if (xml.SelectNodes("Groups/Group") is XmlNodeList gxns) { In(gxns, Groups); } static void In(XmlNodeList nodeList, WenConfigGroupList groups) { foreach (XmlNode gxn in nodeList) { WenConfigGroup group = new WenConfigGroup(groups) { Name = gxn.SelectSingleNode("Name")?.InnerText, Info = gxn.SelectSingleNode("Info")?.InnerText, AllowAdd = gxn.SelectSingleNode("AllowAdd")?.InnerText.ToLower() == "true", Visible = (gxn.SelectSingleNode("Visible")?.InnerText.ToLower() ?? "true") == "true", }; if (gxn.SelectSingleNode("Items") is XmlNode configValue) { foreach (XmlNode xn in configValue.SelectNodes("Item")) { WenConfigItem item = new WenConfigItem(group.Items) { Name = xn.SelectSingleNode("Name")?.InnerText, Info = xn.SelectSingleNode("Info")?.InnerText, Ecc = xn.SelectSingleNode("Ecc")?.InnerText.ToLower() == "true", ReadOnly = xn.SelectSingleNode("ReadOnly")?.InnerText.ToLower() == "true", Delete = xn.SelectSingleNode("Delete")?.InnerText.ToLower() == "true", Visible = (xn.SelectSingleNode("Visible")?.InnerText.ToLower() ?? "true") == "true", Tip = xn.SelectSingleNode("Tip")?.InnerText, ComboBox = xn.SelectSingleNode("ComboBox")?.InnerText.ToLower() == "true", DialogFile = xn.SelectSingleNode("DialogFile")?.InnerText.ToLower() == "true", DiaLogFolder = xn.SelectSingleNode("DiaLogFolder")?.InnerText.ToLower() == "true", Filter = xn.SelectSingleNode("Filter")?.InnerText, }; if (xn.SelectSingleNode("Value") is XmlNode itemValue) { if (item.Ecc) item.Value = itemValue.InnerText.ToAESDecrypt(); else item.Value = itemValue.InnerText; } if (xn.SelectSingleNode("Items") is XmlNode nodeitem) { foreach (XmlNode node in nodeitem.SelectNodes("Item")) { item.Items.Add(node.InnerText); } } group.Items.Add(item); } } if (gxn.SelectNodes("Groups/Group") is XmlNodeList gxns) { In(gxns, group.Groups); } groups.Add(group); } } } private void LoadJson(string path) { string str = File.ReadAllText(path); var wen = JsonConvert.DeserializeObject(str); if (wen["Groups"] is JArray gxns) { In(gxns, Groups); } static void In(JArray nodeList, WenConfigGroupList groups) { foreach (var gxn in nodeList) { WenConfigGroup group = new WenConfigGroup(groups) { Name = gxn["Name"]?.ToString(), Info = gxn["Info"]?.ToString(), AllowAdd = gxn["AllowAdd"].Value(), Visible = gxn["Visible"].Value(), }; if (gxn["Items"] is JArray configValue) { foreach (var xn in configValue) { WenConfigItem item = new WenConfigItem(group.Items) { Name = xn["Name"].Value(), Info = xn["Info"].Value(), Ecc = xn["Ecc"].Value(), ReadOnly = xn["ReadOnly"].Value(), Delete = xn["Delete"].Value(), Visible = xn["Visible"].Value(), Tip = xn["Tip"].Value(), ComboBox = xn["ComboBox"].Value(), DialogFile = xn["DialogFile"].Value(), DiaLogFolder = xn["DiaLogFolder"].Value(), Filter = xn["Filter"].Value(), }; if (xn["Value"].Value() is string itemValue) { if (item.Ecc) item.Value = itemValue.ToAESDecrypt(); else item.Value = itemValue; } if (xn["Items"] is JArray nodeitem) { foreach (var node in nodeitem) { item.Items.Add(node.Value()); } } group.Items.Add(item); } } if (gxn["Groups"] is JArray gxns) { In(gxns, group.Groups); } groups.Add(group); } } } //检查路径是否存在,不存在保存一下,重建立一次 public void Show() { this.Form.Show(); } public void ShowDialog() { this.Form.ShowDialog(); } //保存配置文件 public void Save() { switch (ConfigFormat) { case ConfigFormatEnum.Xml: SaveXml(this.FilePath); break; case ConfigFormatEnum.Json: SaveJson(this.FilePath); break; } } public XmlDocument SaveXml(string path) { WenXmlDocument xml = new WenXmlDocument(); //新方法保存xml文档 XmlDeclaration dec = xml.CreateXmlDeclaration("1.0", "utf-8", null); xml.AppendChild(dec); XmlElement root = xml.CreateElement("Groups"); xml.AppendChild(root); Out(this.Groups, root); void Out(WenConfigGroupList groups, XmlElement element) { foreach (var g in groups) { XmlElement xmlg = xml.CreateElement("Group"); xmlg.AppendChild(xml.CreateXmlElementText("Name", g.Name)); xmlg.AppendChild(xml.CreateXmlElementText("Info", g.Info)); if (g.AllowAdd) xmlg.AppendChild(xml.CreateXmlElementText("AllowAdd", g.AllowAdd.ToString())); if (!g.Visible) xmlg.AppendChild(xml.CreateXmlElementText("Visible", g.Visible.ToString())); XmlElement items = xml.CreateElement("Items"); xmlg.AppendChild(items); foreach (var item in g.Items) { XmlElement xmlitem = xml.CreateElement("Item"); xmlitem.AppendChild(xml.CreateXmlElementText("Name", item.Name)); xmlitem.AppendChild(xml.CreateXmlElementText("Info", item.Info)); if (item.ReadOnly) xmlitem.AppendChild(xml.CreateXmlElementText("ReadOnly", item.ReadOnly.ToString())); if (item.Delete) xmlitem.AppendChild(xml.CreateXmlElementText("Delete", item.Delete.ToString())); if (!item.Visible) xmlitem.AppendChild(xml.CreateXmlElementText("Visible", item.Visible.ToString())); if (!string.IsNullOrWhiteSpace(item.Tip)) xmlitem.AppendChild(xml.CreateXmlElementText("Tip", item.Tip)); if (item.DialogFile) { xmlitem.AppendChild(xml.CreateXmlElementText("DialogFile", item.DialogFile.ToString())); xmlitem.AppendChild(xml.CreateXmlElementText("Filter", item.Filter)); } if (item.DiaLogFolder) { xmlitem.AppendChild(xml.CreateXmlElementText("DiaLogFolder", item.DialogFile.ToString())); } if (item.Ecc) { xmlitem.AppendChild(xml.CreateXmlElementText("Ecc", item.Ecc.ToString())); xmlitem.AppendChild(xml.CreateXmlElementText("Value", item.Value.ToAESEncrypt())); } else { xmlitem.AppendChild(xml.CreateXmlElementText("Value", item.Value)); } if (item.ComboBox) { xmlitem.AppendChild(xml.CreateXmlElementText("ComboBox", item.ComboBox.ToString())); if (item.ComboBox && item.Items.Count > 0) { XmlElement comboxs = xml.CreateElement("Items"); foreach (var combox in item.Items) { comboxs.AppendChild(xml.CreateXmlElementText("Item", combox)); } xmlitem.AppendChild(comboxs); } } items.AppendChild(xmlitem); } if (g.Groups.Count > 0) { XmlElement xgs = xml.CreateElement("Groups"); xmlg.AppendChild(xgs); Out(g.Groups, xgs); } element.AppendChild(xmlg); } } if(!Directory.Exists(System.IO.Path.GetDirectoryName(path))) { Directory.CreateDirectory(System.IO.Path.GetDirectoryName(path)); } xml.Save(path); SaveChanged?.Invoke(this, new WenConfigEventArgs(this)); return xml; } public void SaveJson(string path) { var js = new WenConfigGroupList(this); //加密存储数据 OutData(this.Groups, js); static void OutData(WenConfigGroupList groups, WenConfigGroupList owner) { foreach (var g in groups) { WenConfigGroup jsonConfigGroup = new WenConfigGroup(owner) { Name = g.Name, AllowAdd = g.AllowAdd, Info = g.Info, Visible = g.Visible, }; owner.Add(jsonConfigGroup); foreach (var item in g.Items) { WenConfigItem jsonConfigItem = new WenConfigItem(jsonConfigGroup.Items) { ComboBox = item.ComboBox, Delete = item.Delete, Info = item.Info, Name = item.Name, ReadOnly = item.ReadOnly, Visible = item.Visible, Tip = item.Tip, Ecc = item.Ecc, }; jsonConfigItem.Items.AddRange(item.Items.ToArray()); if (item.Ecc) { jsonConfigItem.Value = item.Value?.ToAESEncrypt(); } else jsonConfigItem.Value = item.Value; jsonConfigGroup.Items.Add(jsonConfigItem); } if (g.Groups.Count > 0) OutData(g.Groups, jsonConfigGroup.Groups); } } var json = JsonConvert.SerializeObject(js, WenSkin.Json.Formatting.Indented); JObject j = new JObject { { "Groups", JsonConvert.DeserializeObject(json) } }; if (!Directory.Exists(System.IO.Path.GetDirectoryName(path))) Directory.CreateDirectory(System.IO.Path.GetDirectoryName(path)); File.WriteAllText(path, j.ToString()); SaveChanged?.Invoke(this, new WenConfigEventArgs(this)); } public class WenConfigGroup { private WenConfigItemList items; private WenConfigGroupList owner; private WenConfigGroupList groups; public WenConfigGroup(WenConfigGroupList owner) { Name = ""; Info = ""; AllowAdd = false; Visible = true; this.owner = owner; } public string Name { get; set; } public string Info { get; set; } public bool AllowAdd { get; set; } public bool Visible { get; set; } [JsonIgnore] public WenConfig WenConfig => owner.WenConfig; public WenConfigItemList Items => items ??= new WenConfigItemList(this); public WenConfigGroupList Groups => groups ??= new WenConfigGroupList(owner.WenConfig); public void Remove() { owner.Remove(this); } } public class WenConfigGroupList : List { public WenConfigGroupList(WenConfig owner) { this.owner = owner; } private readonly WenConfig owner; [JsonIgnore] public WenConfig WenConfig => owner; [JsonIgnore] public WenConfigGroup this[string str] => Find(a => a.Name?.ToUpper() == str.ToUpper()); public string this[string group, string val] { get => Find(a => a.Name?.ToUpper() == group.ToUpper())?.Items.Find(a => a?.Name.ToUpper() == val.ToUpper())?.Value; set { if (Find(a => a.Name?.ToUpper() == group.ToUpper())?.Items.Find(a => a?.Name.ToUpper() == val.ToUpper()) is WenConfigItem im) { im.Value = value; } } } //查询是否存在自定义组,不存在自动添加 public WenConfigGroup Add(string groupName, string info = "组", bool add = false) { if (Find(a => a.Name == groupName) is WenConfigGroup group && !add) { return group; } else { group = new WenConfigGroup(this) { Name = groupName, Info = info }; Add(group); return group; } } } public class WenConfigItem { private List items; private WenConfigItemList owner; public WenConfigItem(WenConfigItemList owner) { this.owner = owner; Name = ""; Info = ""; Ecc = false; ReadOnly = false; Delete = false; Value = ""; Tip = ""; Visible = true; } public string Name { get; set; } public string Info { get; set; } public bool Ecc { get; set; } public bool ReadOnly { get; set; } public bool Delete { get; set; } public string Value { get; set; } public string Tip { get; set; } = ""; public bool Visible { get; set; } public bool ComboBox { get; set; } public bool DialogFile { get; set; } public bool DiaLogFolder { get; set; } public string Filter { get; set; } = "所有文件(*.*)|*.*"; public List Items => items ??= new List(); [JsonIgnore] public WenConfig WenConfig => owner.WenConfig; public void Remove() { owner.Remove(this); } } public class WenConfigItemList : List { public WenConfigItemList(WenConfigGroup owner) { this.owner = owner; } private readonly WenConfigGroup owner; [JsonIgnore] public WenConfigGroup WenConfigGroup => owner; [JsonIgnore] public WenConfig WenConfig => owner.WenConfig; public WenConfigItem this[string str] => Find(a => a.Name?.ToUpper() == str.ToUpper()); //添加自定义设置项 public WenConfigItem Add(string itemName, string value, string info = "项", bool ecc = false, bool readOnly = false) { var item = new WenConfigItem(this) { Name = itemName, Info = info, Ecc = ecc, ReadOnly = readOnly, Value = value, }; Add(item); return item; } } } }