using DesktopTools.BusinessLogics; using DesktopTools.Enums; using DesktopTools.Interfaces; using DesktopTools.Models; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Windows.Forms; using System.Xml.Linq; namespace DepartmentPortalDesctop { public partial class FormMain : Form { private readonly Dictionary _baseControls; private readonly Dictionary _controls; private readonly string _fileForXmlConfig = "ControlsConfig.xml"; public FormMain() { InitializeComponent(); _baseControls = new Dictionary(); _controls = new Dictionary(); var extensions = DesktopLoader.GetWindowDesktopExtensions(); foreach (var extens in extensions) { ToolStripMenuItem menu = null; var list = extens?.GetListControlEntityList()?.ToList(); if (list != null && list.Count > 0) { menu = new ToolStripMenuItem { Text = list[0].Title }; for (int i = 0; i < list.Count; i++) { if (list[i].Control is IControl control) { if (_baseControls.ContainsKey(list[i].Id)) { continue; } _baseControls.Add(list[i].Id, control); var submenu = new ToolStripMenuItem { Text = list[i].Title, Tag = list[i].Id }; submenu.Click += (object sender, EventArgs e) => { OpenControl(new Guid((sender as ToolStripMenuItem).Tag.ToString())); }; menu.DropDownItems.Add(submenu); } } } list = extens?.GetListControlSpecialList()?.ToList(); if (list != null && list.Count > 0) { if (menu == null) { menu = new ToolStripMenuItem { Text = list[0].Title }; } else if (menu.Text != list[0].Title) { menuMain.Items.Add(menu); menu = new ToolStripMenuItem { Text = list[0].Title }; } menu.DropDownItems.Add(new ToolStripSeparator()); for (int i = 0; i < list.Count; i++) { if (list[i].Control is IControl control) { if (_baseControls.ContainsKey(list[i].Id)) { continue; } _baseControls.Add(list[i].Id, control); var submenu = new ToolStripMenuItem { Text = list[i].Title, Tag = list[i].Id }; submenu.Click += (object sender, EventArgs e) => { OpenControl(new Guid((sender as ToolStripMenuItem).Tag.ToString())); }; menu.DropDownItems.Add(submenu); } } } if (menu != null) { menuMain.Items.Add(menu); } } if (File.Exists(_fileForXmlConfig)) { var xml = XDocument.Load(_fileForXmlConfig).Element("Controls"); Guid? id = null; if (xml != null) { foreach (XElement node in xml.Elements("Control")) { var type = node.Attribute("Type").Value.ToString(); var control = _baseControls.Values.FirstOrDefault(x => x.GetType().FullName == type); if (control != null) { var ctrl = control.GetInstance(); ctrl.Open(new ControlOpenModel { OpenMode = ControlOpenMode.List, LazyLoading = true, CloseList = CloseControl }); ctrl.LoadFromXml(node.ToString()); _controls.Add(ctrl.ControlId, ctrl); dataGridViewControls.Rows.Insert(0, new object[] { ctrl.ControlId, ctrl.Title }); id = ctrl.ControlId; } } if (id.HasValue) { ShowControl(id.Value); } } } } /// /// Добавление нового контрола /// /// private void OpenControl(Guid id) { if (!_baseControls.ContainsKey(id)) { return; } if (_baseControls[id] == null) { return; } var ctrl = _baseControls[id].GetInstance(); if (!_controls.ContainsKey(ctrl.ControlId)) { ctrl.Open(new ControlOpenModel { OpenMode = ControlOpenMode.List, CloseList = CloseControl }); _controls.Add(ctrl.ControlId, ctrl); panelControl.Controls.Clear(); panelControl.Controls.Add(ctrl as UserControl); dataGridViewControls.Rows.Add(new object[] { ctrl.ControlId, ctrl.Title }); dataGridViewControls.Rows[^1].Selected = true; } } /// /// Закрытие контрола /// /// private void CloseControl(Guid id) { if (!_controls.ContainsKey(id)) { return; } var ctrl = _controls[id]; if (ctrl == null) { return; } for (int i = 0; i < dataGridViewControls.Rows.Count; ++i) { if (dataGridViewControls.Rows[i].Cells[0].Value.ToString() == ctrl.ControlId.ToString()) { dataGridViewControls.Rows.RemoveAt(i); if (i < dataGridViewControls.Rows.Count - 1) { dataGridViewControls.Rows[i].Selected = true; ShowControl(new Guid(dataGridViewControls.Rows[i].Cells[0].Value.ToString())); } else if (i > 0) { dataGridViewControls.Rows[i - 1].Selected = true; ShowControl(new Guid(dataGridViewControls.Rows[i - 1].Cells[0].Value.ToString())); } break; } } _controls.Remove(ctrl.ControlId); } /// /// Отображение контрола /// /// private void ShowControl(Guid id) { if (!_controls.ContainsKey(id)) { return; } var ctrl = _controls[id]; if (ctrl == null) { return; } panelControl.Controls.Clear(); panelControl.Controls.Add(ctrl as UserControl); } private void ButtonShowHideControlList_Click(object sender, EventArgs e) { ButtonShowHideControlList.Text = panelControls.Visible ? ">" : "<"; panelControls.Visible = !panelControls.Visible; } private void DataGridViewControls_CellClick(object sender, DataGridViewCellEventArgs e) => ShowControl(new Guid(dataGridViewControls.Rows[e.RowIndex].Cells[0].Value.ToString())); private void FormMain_FormClosing(object sender, FormClosingEventArgs e) { var xml = new XElement("Controls"); foreach (var cntrl in _controls) { xml.AddFirst(XElement.Parse(cntrl.Value.SaveToXml())); } if (File.Exists(_fileForXmlConfig)) { File.Delete(_fileForXmlConfig); } xml.Save(_fileForXmlConfig); } } }