PIbd-31_Afanasev.S.S._COP_5/Component/FormsPlugin/FormMain.cs
2024-11-13 13:30:45 +04:00

313 lines
11 KiB
C#

using Plugins;
using System.Reflection;
namespace FormsPlugin
{
public partial class FormMain : Form
{
/// <summary>
/// Ïëàãèíû
/// </summary>
private readonly Dictionary<string, IPluginsConvention> _plugins;
/// <summary>
/// Âûáðàííûé ïëàãèí
/// </summary>
private string _selectedPlugin;
/// <summary>
/// Êîíñòðóêòîð
/// </summary>
public FormMain()
{
InitializeComponent();
_plugins = LoadPlugins();
_selectedPlugin = string.Empty;
}
/// <summary>
/// Çàãðóçèòü ïëàãèíû
/// </summary>
/// <returns></returns>
private Dictionary<string, IPluginsConvention> LoadPlugins()
{
var plugins = new Dictionary<string, IPluginsConvention>();
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;
}
/// <summary>
/// Ñîçäàòü ToolStripMenuItem äëÿ ïëàãèíà
/// </summary>
/// <param name="pluginName"></param>
/// Ñîçäàòü 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);
}
/// <summary>
/// Îáðàáîò÷èê íàæàòèÿ êëàâèø
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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;
}
}
/// <summary>
/// Ïîêàçàòü òåçàóðóñ
/// </summary>
private void ShowThesaurus()
{
_plugins[_selectedPlugin].GetThesaurus()?.Show();
}
/// <summary>
/// Äîáàâèòü ýëåìåíò
/// </summary>
private void AddNewElement()
{
var form = _plugins[_selectedPlugin].GetForm(null);
if (form != null && form.ShowDialog() == DialogResult.OK)
{
_plugins[_selectedPlugin].ReloadData();
}
}
/// <summary>
/// Îáíîâèòü ýëåìåíò
/// </summary>
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();
}
}
/// <summary>
/// Óäàëèòü ýëåìåíò
/// </summary>
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();
}
}
/// <summary>
/// Ñîçäàòü ïðîñòîé äîêóìåíò
/// </summary>
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);
}
}
}
}
/// <summary>
/// Ñîçäàòü äîêóìåíò ñ òàáëèöåé
/// </summary>
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);
}
}
}
}
/// <summary>
/// Ñîçäàòü äîêóìåíò ñ äèàãðàììîé
/// </summary>
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);
}
}
}
}
/// <summary>
/// Îáðàáîò÷èê äëÿ îòîáðàæåíèÿ òåçàóðóñà
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ThesaurusToolStripMenuItem_Click(object sender, EventArgs e) => ShowThesaurus();
/// <summary>
/// Îáðàáîò÷èê äëÿ äîáàâëåíèÿ ýëåìåíòà
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AddElementToolStripMenuItem_Click(object sender, EventArgs e) => AddNewElement();
/// <summary>
/// Îáðàáîò÷èê äëÿ îáíîâëåíèÿ ýëåìåíòà
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void UpdElementToolStripMenuItem_Click(object sender, EventArgs e) => UpdateElement();
/// <summary>
/// Îáðàáîò÷èê äëÿ óäàëåíèÿ ýëåìåíòà
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DelElementToolStripMenuItem_Click(object sender, EventArgs e) => DeleteElement();
/// <summary>
/// Îáðàáîò÷èê äëÿ ñîçäàíèÿ ïðîñòîãî äîêóìåíòà
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SimpleDocToolStripMenuItem_Click(object sender, EventArgs e) => CreateSimpleDoc();
/// <summary>
/// Îáðàáîò÷èê äëÿ ñîçäàíèÿ äîêóìåíòà ñ òàáëèöåé
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TableDocToolStripMenuItem_Click(object sender, EventArgs e) => CreateTableDoc();
/// <summary>
/// Îáðàáîò÷èê äëÿ ñîçäàíèÿ äîêóìåíòà ñ äèàãðàììîé
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ChartDocToolStripMenuItem_Click(object sender, EventArgs e) => CreateChartDoc();
}
}