diff --git a/AbazovApp/AccountAppPlugins/AccountAppPlugins.csproj b/AbazovApp/AccountAppPlugins/AccountAppPlugins.csproj index b57c89e..177d96d 100644 --- a/AbazovApp/AccountAppPlugins/AccountAppPlugins.csproj +++ b/AbazovApp/AccountAppPlugins/AccountAppPlugins.csproj @@ -8,4 +8,14 @@ enable + + + + + + + + + + \ No newline at end of file diff --git a/AbazovApp/AccountAppPlugins/FormMain.Designer.cs b/AbazovApp/AccountAppPlugins/FormMain.Designer.cs index af0909e..ade69db 100644 --- a/AbazovApp/AccountAppPlugins/FormMain.Designer.cs +++ b/AbazovApp/AccountAppPlugins/FormMain.Designer.cs @@ -1,14 +1,17 @@ -namespace AccountAppPlugins +using static System.Net.Mime.MediaTypeNames; +using System.Windows.Forms; + +namespace AccountAppPlugins { partial class FormMain { /// - /// Required designer variable. + /// Required designer variable. /// private System.ComponentModel.IContainer components = null; /// - /// Clean up any resources being used. + /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) @@ -23,17 +26,151 @@ #region Windows Form Designer generated code /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); - this.Text = "FormMain"; + menuStrip = new MenuStrip(); + ControlsStripMenuItem = new ToolStripMenuItem(); + ActionsToolStripMenuItem = new ToolStripMenuItem(); + ThesaurusToolStripMenuItem = new ToolStripMenuItem(); + AddElementToolStripMenuItem = new ToolStripMenuItem(); + UpdElementToolStripMenuItem = new ToolStripMenuItem(); + DelElementToolStripMenuItem = new ToolStripMenuItem(); + DocsToolStripMenuItem = new ToolStripMenuItem(); + SimpleDocToolStripMenuItem = new ToolStripMenuItem(); + TableDocToolStripMenuItem = new ToolStripMenuItem(); + ChartDocToolStripMenuItem = new ToolStripMenuItem(); + panelControl = new Panel(); + menuStrip.SuspendLayout(); + SuspendLayout(); + // + // menuStrip + // + menuStrip.Items.AddRange(new ToolStripItem[] { ControlsStripMenuItem, ActionsToolStripMenuItem, DocsToolStripMenuItem }); + menuStrip.Location = new Point(0, 0); + menuStrip.Name = "menuStrip"; + menuStrip.Size = new Size(800, 24); + menuStrip.TabIndex = 0; + menuStrip.Text = "Меню"; + // + // ControlsStripMenuItem + // + ControlsStripMenuItem.Name = "ControlsStripMenuItem"; + ControlsStripMenuItem.Size = new Size(90, 20); + ControlsStripMenuItem.Text = "Компоненты"; + // + // ActionsToolStripMenuItem + // + ActionsToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { ThesaurusToolStripMenuItem, AddElementToolStripMenuItem, UpdElementToolStripMenuItem, DelElementToolStripMenuItem }); + ActionsToolStripMenuItem.Name = "ActionsToolStripMenuItem"; + ActionsToolStripMenuItem.Size = new Size(70, 20); + ActionsToolStripMenuItem.Text = "Действия"; + // + // ThesaurusToolStripMenuItem + // + ThesaurusToolStripMenuItem.Name = "ThesaurusToolStripMenuItem"; + ThesaurusToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.I; + ThesaurusToolStripMenuItem.Size = new Size(180, 22); + ThesaurusToolStripMenuItem.Text = "Справочник"; + ThesaurusToolStripMenuItem.Click += ThesaurusToolStripMenuItem_Click; + // + // AddElementToolStripMenuItem + // + AddElementToolStripMenuItem.Name = "AddElementToolStripMenuItem"; + AddElementToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.A; + AddElementToolStripMenuItem.Size = new Size(180, 22); + AddElementToolStripMenuItem.Text = "Добавить"; + AddElementToolStripMenuItem.Click += AddElementToolStripMenuItem_Click; + // + // UpdElementToolStripMenuItem + // + UpdElementToolStripMenuItem.Name = "UpdElementToolStripMenuItem"; + UpdElementToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.U; + UpdElementToolStripMenuItem.Size = new Size(180, 22); + UpdElementToolStripMenuItem.Text = "Изменить"; + UpdElementToolStripMenuItem.Click += UpdElementToolStripMenuItem_Click; + // + // DelElementToolStripMenuItem + // + DelElementToolStripMenuItem.Name = "DelElementToolStripMenuItem"; + DelElementToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.D; + DelElementToolStripMenuItem.Size = new Size(180, 22); + DelElementToolStripMenuItem.Text = "Удалить"; + DelElementToolStripMenuItem.Click += DelElementToolStripMenuItem_Click; + // + // DocsToolStripMenuItem + // + DocsToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { SimpleDocToolStripMenuItem, TableDocToolStripMenuItem, ChartDocToolStripMenuItem }); + DocsToolStripMenuItem.Name = "DocsToolStripMenuItem"; + DocsToolStripMenuItem.Size = new Size(82, 20); + DocsToolStripMenuItem.Text = "Документы"; + // + // SimpleDocToolStripMenuItem + // + SimpleDocToolStripMenuItem.Name = "SimpleDocToolStripMenuItem"; + SimpleDocToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.S; + SimpleDocToolStripMenuItem.Size = new Size(233, 22); + SimpleDocToolStripMenuItem.Text = "Простой документ"; + SimpleDocToolStripMenuItem.Click += SimpleDocToolStripMenuItem_Click; + // + // TableDocToolStripMenuItem + // + TableDocToolStripMenuItem.Name = "TableDocToolStripMenuItem"; + TableDocToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.T; + TableDocToolStripMenuItem.Size = new Size(233, 22); + TableDocToolStripMenuItem.Text = "Документ с таблицой"; + TableDocToolStripMenuItem.Click += TableDocToolStripMenuItem_Click; + // + // ChartDocToolStripMenuItem + // + ChartDocToolStripMenuItem.Name = "ChartDocToolStripMenuItem"; + ChartDocToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.C; + ChartDocToolStripMenuItem.Size = new Size(233, 22); + ChartDocToolStripMenuItem.Text = "Документ с диаграммой"; + ChartDocToolStripMenuItem.Click += ChartDocToolStripMenuItem_Click; + // + // panelControl + // + panelControl.Dock = DockStyle.Fill; + panelControl.Location = new Point(0, 24); + panelControl.Name = "panelControl"; + panelControl.Size = new Size(800, 426); + panelControl.TabIndex = 1; + // + // FormMain + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(panelControl); + Controls.Add(menuStrip); + MainMenuStrip = menuStrip; + Name = "FormMain"; + StartPosition = FormStartPosition.CenterScreen; + Text = "Главная форма"; + WindowState = FormWindowState.Maximized; + KeyDown += FormMain_KeyDown; + menuStrip.ResumeLayout(false); + menuStrip.PerformLayout(); + ResumeLayout(false); + PerformLayout(); } #endregion + + private System.Windows.Forms.MenuStrip menuStrip; + private System.Windows.Forms.ToolStripMenuItem ControlsStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem DocsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem SimpleDocToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem TableDocToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem ChartDocToolStripMenuItem; + private System.Windows.Forms.Panel panelControl; + private System.Windows.Forms.ToolStripMenuItem ActionsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem ThesaurusToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem AddElementToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem UpdElementToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem DelElementToolStripMenuItem; } } \ No newline at end of file diff --git a/AbazovApp/AccountAppPlugins/FormMain.cs b/AbazovApp/AccountAppPlugins/FormMain.cs index 7c60377..2f23297 100644 --- a/AbazovApp/AccountAppPlugins/FormMain.cs +++ b/AbazovApp/AccountAppPlugins/FormMain.cs @@ -1,9 +1,11 @@ -using System; +using PluginsConventionLibrary; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; @@ -12,9 +14,223 @@ namespace AccountAppPlugins { public partial class FormMain : Form { + private readonly Dictionary _plugins; + private string _selectedPlugin; + public FormMain() { InitializeComponent(); + _plugins = new(); + LoadPlugins(); + _selectedPlugin = string.Empty; } + + private void LoadPlugins() + { + List pluginsList = GetPlugins(); + + foreach (var plugin in pluginsList) + { + _plugins[plugin.PluginName] = plugin; + CreateMenuItem(plugin.PluginName); + } + } + + private List GetPlugins() + { + string currentDir = Environment.CurrentDirectory; + string pluginsDir = Directory.GetParent(currentDir).Parent.Parent.Parent.FullName + "\\Plugins"; + string[] dllFiles = Directory.GetFiles( + pluginsDir, + "*.dll", + SearchOption.AllDirectories + ); + List plugins = new(); + foreach (string dllFile in dllFiles) + { + try + { + Assembly assembly = Assembly.LoadFrom(dllFile); + Type[] types = assembly.GetTypes(); + foreach (Type type in types) + { + if (typeof(IPluginsConvention).IsAssignableFrom(type) && !type.IsInterface) + { + if (Activator.CreateInstance(type) is IPluginsConvention plugin) + { + plugins.Add(plugin); + } + } + } + } + catch (Exception ex) + { + MessageBox.Show( + ex.Message + ); + } + } + return plugins; + } + + private void CreateMenuItem(string pluginName) + { + ToolStripMenuItem menuItem = new(pluginName); + menuItem.Click += (object? sender, EventArgs e) => + { + UserControl userControl = _plugins[pluginName].GetControl; + if (userControl != null) + { + panelControl.Controls.Clear(); + userControl.Dock = DockStyle.Fill; + _plugins[pluginName].ReloadData(); + _selectedPlugin = pluginName; + 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() + { + if (MessageBox.Show( + "Удалить выбранный элемент?", + "Удаление", + MessageBoxButtons.YesNo, + MessageBoxIcon.Question) != DialogResult.Yes) + { + return; + } + 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() + { + SaveFileDialog saveFileDialog = new() + { + Filter = "Excel Files|*.xlsx" + }; + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + _plugins[_selectedPlugin].CreateSimpleDocument(new PluginsConventionSaveDocument() { FileName = saveFileDialog.FileName }); + + } + } + private void CreateTableDoc() + { + SaveFileDialog saveFileDialog = new() + { + Filter = "Word Files|*.docx" + }; + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + _plugins[_selectedPlugin].CreateTableDocument(new PluginsConventionSaveDocument() { FileName = saveFileDialog.FileName }); + + } + } + private void CreateChartDoc() + { + SaveFileDialog saveFileDialog = new() + { + Filter = "PDF Files|*.pdf" + }; + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + _plugins[_selectedPlugin].CreateChartDocument(new PluginsConventionSaveDocument() { FileName = saveFileDialog.FileName }); + } + } + + 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(); } } diff --git a/AbazovApp/AccountAppPlugins/FormMain.resx b/AbazovApp/AccountAppPlugins/FormMain.resx index 1af7de1..81a9e3d 100644 --- a/AbazovApp/AccountAppPlugins/FormMain.resx +++ b/AbazovApp/AccountAppPlugins/FormMain.resx @@ -1,64 +1,4 @@ - - - + @@ -117,4 +57,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + \ No newline at end of file diff --git a/AbazovApp/AccountsApp/FormMain.cs b/AbazovApp/AccountsApp/FormMain.cs index 19cbb4e..9560987 100644 --- a/AbazovApp/AccountsApp/FormMain.cs +++ b/AbazovApp/AccountsApp/FormMain.cs @@ -96,18 +96,28 @@ namespace AccountsApp private void документToolStripMenuItem_Click(object sender, EventArgs e) { + SaveFileDialog saveFileDialog = new() + { + Filter = "Excel Files|*.xlsx" + }; + if (saveFileDialog.ShowDialog() != DialogResult.OK) return; List avatars = new List(); foreach (var account in _logic.ReadList(null)) { avatars.Add(account.Avatar); } - string path = AppDomain.CurrentDomain.BaseDirectory + "Аватары.xlsx"; + string path = saveFileDialog.FileName; if (excelImagesComponent.createWithImages(new ExcelImageInfo(path, "Аватары", avatars.ToArray()))) MessageBox.Show("Документ создан"); } private void документСДиаграммойToolStripMenuItem_Click(object sender, EventArgs e) { - string path = AppDomain.CurrentDomain.BaseDirectory + "Интересы.pdf"; + SaveFileDialog saveFileDialog = new() + { + Filter = "PDF Files|*.pdf" + }; + if (saveFileDialog.ShowDialog() != DialogResult.OK) return; + string path = saveFileDialog.FileName; Dictionary> data = new Dictionary>(); data = _logic @@ -129,7 +139,12 @@ namespace AccountsApp private void документСТаблицейToolStripMenuItem_Click(object sender, EventArgs e) { - string path = AppDomain.CurrentDomain.BaseDirectory + "Аккаунты.docx"; + SaveFileDialog saveFileDialog = new() + { + Filter = "Word Files|*.docx" + }; + if (saveFileDialog.ShowDialog() != DialogResult.OK) return; + string path = saveFileDialog.FileName; List<(int, int)> merges = new List<(int, int)> { (1, 2) }; List widths = new List { 100, 100, 100, 100 }; List<(string, string)> headers = new List<(string, string)> { @@ -141,6 +156,7 @@ namespace AccountsApp }; wordTableComponentAccount.createWithTable(path, "Список аккаунтов", merges, widths, headers, _logic.ReadList(null)); + MessageBox.Show("Успех"); } } } diff --git a/AbazovApp/AccountsApp/FormMain.resx b/AbazovApp/AccountsApp/FormMain.resx index 3206035..62434ef 100644 --- a/AbazovApp/AccountsApp/FormMain.resx +++ b/AbazovApp/AccountsApp/FormMain.resx @@ -70,6 +70,6 @@ 639, 27 - 90 + 137 \ No newline at end of file diff --git a/AbazovApp/AccountsApp/PluginsConvention.cs b/AbazovApp/AccountsApp/PluginsConvention.cs index aa16346..3e96755 100644 --- a/AbazovApp/AccountsApp/PluginsConvention.cs +++ b/AbazovApp/AccountsApp/PluginsConvention.cs @@ -1,7 +1,9 @@ using AbazovViewComponents.LogicalComponents; +using AccountsBusinessLogic.BusinessLogics; using AccountsContracts.BusinessLogicContracts; using AccountsContracts.StorageContracts; using AccountsContracts.ViewModels; +using AccountsDataBaseImplement.Implements; using ComponentsLibraryNet60.DocumentWithChart; using ComponentsLibraryNet60.Models; using ControlsLibraryNet60.Core; @@ -32,6 +34,16 @@ namespace AccountsApp get { return _controlDataTable; } } + public PluginsConvention() + { + _accountLogic = new AccountLogic(new AccountStorage()); + _interestLogic = new InterestLogic(new InterestStorage()); + _excelImagesComponent = new(); + _wordTableComponent = new(); + _chartBar = new(); + _controlDataTable = new(); + } + public PluginsConventionElement GetElement { get @@ -66,7 +78,7 @@ namespace AccountsApp public bool DeleteElement(PluginsConventionElement element) { _accountLogic.Delete( - new(element.Id.GetHashCode()) + new AccountsContracts.BindingModels.AccountBindingModel { Id = element.Id.GetHashCode()} ); return true; } @@ -108,7 +120,7 @@ namespace AccountsApp { avatars.Add(account.Avatar); } - string path = AppDomain.CurrentDomain.BaseDirectory + "Аватары.xlsx"; + string path = saveDocument.FileName; if (_excelImagesComponent.createWithImages(new ExcelImageInfo(path, "Аватары", avatars.ToArray()))) { MessageBox.Show("Документ создан"); @@ -119,7 +131,7 @@ namespace AccountsApp public bool CreateTableDocument(PluginsConventionSaveDocument saveDocument) { - string path = AppDomain.CurrentDomain.BaseDirectory + "Аккаунты.docx"; + string path = saveDocument.FileName; List<(int, int)> merges = new List<(int, int)> { (1, 2) }; List widths = new List { 100, 100, 100, 100 }; List<(string, string)> headers = new List<(string, string)> { @@ -139,7 +151,7 @@ namespace AccountsApp { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - string path = AppDomain.CurrentDomain.BaseDirectory + "Интересы.pdf"; + string path = saveDocument.FileName; Dictionary> data = new Dictionary>(); data = _accountLogic diff --git a/AbazovApp/AccountsContracts/BindingModels/AccountBindingModel.cs b/AbazovApp/AccountsContracts/BindingModels/AccountBindingModel.cs index d05fb83..3d904ea 100644 --- a/AbazovApp/AccountsContracts/BindingModels/AccountBindingModel.cs +++ b/AbazovApp/AccountsContracts/BindingModels/AccountBindingModel.cs @@ -20,10 +20,5 @@ namespace AccountsContracts.BindingModels public int InterestId { get; set; } public string Avatar { get; set; } = string.Empty; - - public AccountBindingModel(int id) - { - Id = id; - } } }