using Plugins; using System.Reflection; namespace FormsPlugin { public partial class FormMain : Form { /// /// Плагины /// private readonly Dictionary _plugins; /// /// Выбранный плагин /// private string _selectedPlugin; /// /// Конструктор /// public FormMain() { InitializeComponent(); _plugins = LoadPlugins(); _selectedPlugin = string.Empty; } /// /// Загрузить плагины /// /// private Dictionary LoadPlugins() { var plugins = new Dictionary(); string pluginsDir = Directory.GetParent(Directory.GetCurrentDirectory())! .Parent!.Parent!.FullName + "\\plugins"; string[] dllFiles = Directory.GetFiles(pluginsDir, "*.dll", SearchOption.AllDirectories); foreach (string dllFile in dllFiles) { try { Assembly assembly = Assembly.LoadFrom(dllFile); Type[] types = assembly.GetTypes(); foreach (var type in types) { if (typeof(IPluginsConvention).IsAssignableFrom(type) && !type.IsInterface) { var plugin = (IPluginsConvention)Activator.CreateInstance(type)!; plugins.Add(plugin.PluginName, plugin); CreateToolStripMenuItem(plugin.PluginName); } } } catch (Exception ex) { // Ошибка при загрузке плагина Console.WriteLine($"Ошибка при загрузке плагина {dllFile}: {ex.Message}"); } } return plugins; } /// /// Создать ToolStripMenuItem для плагина /// /// /// Создать ToolStripMenuItem для плагина (создание элементов меню) private void CreateToolStripMenuItem(string pluginName) { var menuItem = new ToolStripMenuItem(pluginName); menuItem.Click += (object? sender, EventArgs e) => { _selectedPlugin = pluginName; // Начало обработки выбранногоо плагина IPluginsConvention plugin = _plugins![pluginName]; // Get Control возвращает пользовательский элемент UserControl userControl = plugin.GetControl; if (userControl != null) { // panelControl добавляет контейнер на котором происходит отображение интерфейса panelControl.Controls.Clear(); plugin.ReloadData(); userControl.Dock = DockStyle.Fill; panelControl.Controls.Add(userControl); } }; ControlsStripMenuItem.DropDownItems.Add(menuItem); } /// /// Обработчик нажатия клавиш /// /// /// private void FormMain_KeyDown(object sender, KeyEventArgs e) { if (string.IsNullOrEmpty(_selectedPlugin) || !_plugins.ContainsKey(_selectedPlugin)) { return; } if (!e.Control) { return; } switch (e.KeyCode) { case Keys.I: ShowThesaurus(); break; case Keys.A: AddNewElement(); break; case Keys.U: UpdateElement(); break; case Keys.D: DeleteElement(); break; case Keys.S: CreateSimpleDoc(); break; case Keys.T: CreateTableDoc(); break; case Keys.C: CreateChartDoc(); break; } } /// /// Показать тезаурус /// private void ShowThesaurus() { _plugins[_selectedPlugin].GetThesaurus()?.Show(); } /// /// Добавить элемент /// private void AddNewElement() { var form = _plugins[_selectedPlugin].GetForm(null); if (form != null && form.ShowDialog() == DialogResult.OK) { _plugins[_selectedPlugin].ReloadData(); } } /// /// Обновить элемент /// private void UpdateElement() { var element = _plugins[_selectedPlugin].GetElement; if (element == null) { MessageBox.Show("Нет выбранного элемента!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } var form = _plugins[_selectedPlugin].GetForm(element); if (form != null && form.ShowDialog() == DialogResult.OK) { _plugins[_selectedPlugin].ReloadData(); } } /// /// Удалить элемент /// private void DeleteElement() { var element = _plugins[_selectedPlugin].GetElement; if (element == null) { MessageBox.Show("Нет выбранного элемента!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (_plugins[_selectedPlugin].DeleteElement(element)) { _plugins[_selectedPlugin].ReloadData(); } } /// /// Создать простой документ /// private void CreateSimpleDoc() { using (var dialog = new SaveFileDialog { Filter = "pdf|*.pdf" }) { if (dialog.ShowDialog() == DialogResult.OK) { string fileName = dialog.FileName.ToString(); if (_plugins[_selectedPlugin].CreateSimpleDocument(new PluginsConventionSaveDocument() { FileName = fileName })) { MessageBox.Show("Документ сохранён", "Создание документа", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("Ошибка при создании документа", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } /// /// Создать документ с таблицей /// private void CreateTableDoc() { using (var dialog = new SaveFileDialog { Filter = "xlsx|*.xlsx" }) { if (dialog.ShowDialog() == DialogResult.OK) { string fileName = dialog.FileName.ToString(); if (_plugins[_selectedPlugin].CreateTableDocument(new PluginsConventionSaveDocument() { FileName = fileName })) { MessageBox.Show("Документ сохранён", "Создание документа", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("Ошибка при создании документа", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } /// /// Создать документ с диаграммой /// private void CreateChartDoc() { using (var dialog = new SaveFileDialog { Filter = "docx|*.docx" }) { if (dialog.ShowDialog() == DialogResult.OK) { string fileName = dialog.FileName.ToString(); if (_plugins[_selectedPlugin].CreateChartDocument(new PluginsConventionSaveDocument() { FileName = fileName })) { MessageBox.Show("Документ сохранён", "Создание документа", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("Ошибка при создании документа", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } /// /// Обработчик для отображения тезауруса /// /// /// private void ThesaurusToolStripMenuItem_Click(object sender, EventArgs e) => ShowThesaurus(); /// /// Обработчик для добавления элемента /// /// /// private void AddElementToolStripMenuItem_Click(object sender, EventArgs e) => AddNewElement(); /// /// Обработчик для обновления элемента /// /// /// private void UpdElementToolStripMenuItem_Click(object sender, EventArgs e) => UpdateElement(); /// /// Обработчик для удаления элемента /// /// /// private void DelElementToolStripMenuItem_Click(object sender, EventArgs e) => DeleteElement(); /// /// Обработчик для создания простого документа /// /// /// private void SimpleDocToolStripMenuItem_Click(object sender, EventArgs e) => CreateSimpleDoc(); /// /// Обработчик для создания документа с таблицей /// /// /// private void TableDocToolStripMenuItem_Click(object sender, EventArgs e) => CreateTableDoc(); /// /// Обработчик для создания документа с диаграммой /// /// /// private void ChartDocToolStripMenuItem_Click(object sender, EventArgs e) => CreateChartDoc(); } }