diff --git a/Stormtrooper/Stormtrooper/CollectionGenericObjects/AbstractCompany.cs b/Stormtrooper/Stormtrooper/CollectionGenericObjects/AbstractCompany.cs index 7fa344c..380341f 100644 --- a/Stormtrooper/Stormtrooper/CollectionGenericObjects/AbstractCompany.cs +++ b/Stormtrooper/Stormtrooper/CollectionGenericObjects/AbstractCompany.cs @@ -1,4 +1,5 @@ using Stormtrooper.Drawnings; +using Stormtrooper.Exceptions; namespace Stormtrooper.CollectionGenericObjects; @@ -35,8 +36,7 @@ public abstract class AbstractCompany /// /// Вычисление максимального количества элементов, который можно разместить в окне /// - private int GetMaxCount => _pictureWidth * _pictureHeight / (_placeSizeWidth * _placeSizeHeight); - + private int GetMaxCount => (_pictureWidth / _placeSizeWidth) * (_pictureHeight / _placeSizeHeight); /// /// Конструктор /// @@ -92,20 +92,30 @@ public abstract class AbstractCompany { Bitmap bitmap = new(_pictureWidth, _pictureHeight); Graphics graphics = Graphics.FromImage(bitmap); - DrawBackgound(graphics); + DrawBackground(graphics); + SetObjectsPosition(); for (int i = 0; i < (_collection?.Count ?? 0); ++i) { - DrawningAircraft? obj = _collection?.Get(i); - obj?.DrawTransport(graphics); + try + { + DrawningAircraft? obj = _collection?.Get(i); + obj?.DrawTransport(graphics); + } + catch (ObjectNotFoundException e) + { } + catch (PositionOutOfCollectionException e) + { } } + return bitmap; } + /// /// Вывод заднего фона /// /// - protected abstract void DrawBackgound(Graphics g); + protected abstract void DrawBackground(Graphics g); /// /// Расстановка объектов diff --git a/Stormtrooper/Stormtrooper/CollectionGenericObjects/AircraftHangarService.cs b/Stormtrooper/Stormtrooper/CollectionGenericObjects/AircraftHangarService.cs index 63282a7..96fe711 100644 --- a/Stormtrooper/Stormtrooper/CollectionGenericObjects/AircraftHangarService.cs +++ b/Stormtrooper/Stormtrooper/CollectionGenericObjects/AircraftHangarService.cs @@ -1,4 +1,5 @@ using Stormtrooper.Drawnings; +using Stormtrooper.Exceptions; namespace Stormtrooper.CollectionGenericObjects { @@ -17,7 +18,7 @@ namespace Stormtrooper.CollectionGenericObjects ICollectionGenericObjects collection) : base(picWidth, picHeight, collection) { } - protected override void DrawBackgound(Graphics g) + protected override void DrawBackground(Graphics g) { int width = _pictureWidth / _placeSizeWidth; int height = _pictureHeight / _placeSizeHeight; @@ -41,18 +42,18 @@ namespace Stormtrooper.CollectionGenericObjects for (int i = 0; i < (_collection?.Count ?? 0); i++) { - if (_collection.Get(i) != null) - { + try { _collection.Get(i).SetPictureSize(_pictureWidth, _pictureHeight); _collection.Get(i).SetPosition(_placeSizeWidth * curWidth + 10, curHeight * _placeSizeHeight + 10); } - + catch (ObjectNotFoundException) { } + catch (PositionOutOfCollectionException e) { } if (curWidth > 0) curWidth--; else { - curWidth = width - 1; - curHeight ++; + curWidth = width - 1; + curHeight++; } if (curHeight >= height) @@ -63,3 +64,4 @@ namespace Stormtrooper.CollectionGenericObjects } } } + diff --git a/Stormtrooper/Stormtrooper/CollectionGenericObjects/ListGenericObjects.cs b/Stormtrooper/Stormtrooper/CollectionGenericObjects/ListGenericObjects.cs index bf71592..eb0d568 100644 --- a/Stormtrooper/Stormtrooper/CollectionGenericObjects/ListGenericObjects.cs +++ b/Stormtrooper/Stormtrooper/CollectionGenericObjects/ListGenericObjects.cs @@ -1,4 +1,5 @@ -using System; +using Stormtrooper.Exceptions; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -23,7 +24,21 @@ where T : class private int _maxCount; public int Count => _collection.Count; - public int MaxCount { set { if (value > 0) { _maxCount = value; } } get { return Count; } } + public int MaxCount + { + set + { + if (value > 0) + { + _maxCount = value; + } + } + get + { + + return Count; + } + } public CollectionType GetCollectionType => CollectionType.List; @@ -34,52 +49,36 @@ where T : class { _collection = new(); } - public T? Get(int position) + public T Get(int position) { - // TODO проверка позиции - if( position>= 0 && position < Count) - { - return _collection[position]; - } - return null; - } - public int Insert(T obj) - { - // TODO проверка, что не превышено максимальное количество элементов - // TODO вставка в конец набора - if (Count <= _maxCount) - { - _collection.Add(obj); - return Count; - } - return -1; - } - public int Insert(T obj, int position) - { - // TODO проверка, что не превышено максимальное количество элементов - // TODO проверка позиции - // TODO вставка по позиции - if (Count < _maxCount && position>=0 && position < _maxCount) - { - _collection.Insert(position, obj); - return position; - } - return -1; - } - public T Remove(int position) - { - // TODO проверка позиции - // TODO удаление объекта из списка - T temp = _collection[position]; - if(position>=0 && position < _maxCount) - { - _collection.RemoveAt(position); - return temp; - } - return null; + if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position); + return _collection[position]; } - public IEnumerable GetItems() + public int Insert(T obj) + { + if (Count == _maxCount) throw new CollectionOverflowException(Count); + _collection.Add(obj); + return Count; + } + + public int Insert(T obj, int position) + { + if (Count == _maxCount) throw new CollectionOverflowException(Count); + if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position); + _collection.Insert(position, obj); + return position; + } + + public T Remove(int position) + { + if (position >= _collection.Count || position < 0) throw new PositionOutOfCollectionException(position); + T obj = _collection[position]; + _collection.RemoveAt(position); + return obj; + } + +public IEnumerable GetItems() { for (int i = 0; i < Count; ++i) { diff --git a/Stormtrooper/Stormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs b/Stormtrooper/Stormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs index aebd7fc..4819b3b 100644 --- a/Stormtrooper/Stormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs +++ b/Stormtrooper/Stormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs @@ -1,29 +1,33 @@ -using Stormtrooper.Drawnings; +using Stormtrooper.Exceptions; +using Stormtrooper.CollectionGenericObjects; +using Stormtrooper.Exceptions; namespace Stormtrooper.CollectionGenericObjects; - /// /// Параметризованный набор объектов /// /// Параметр: ограничение - ссылочный тип public class MassiveGenericObjects : ICollectionGenericObjects -where T : class + where T : class { /// /// Массив объектов, которые храним /// private T?[] _collection; - public int Count => _collection.Length; - - public int MaxCount { + /// + /// Установка максимального кол-ва объектов + /// + public int MaxCount + { get { return _collection.Length; } set { - if (value > 0) { + if (value > 0) + { if (_collection.Length > 0) { Array.Resize(ref _collection, value); @@ -45,71 +49,86 @@ where T : class { _collection = Array.Empty(); } + /// + /// Получение объекта по позиции + /// + /// Позиция (индекс) + /// public T? Get(int position) { - // проверка позиции - if (position >= _collection.Length || position < 0) - { - return null; - } + if (position < 0 || position >= Count) throw new PositionOutOfCollectionException(position); + if (_collection[position] == null) throw new ObjectNotFoundException(position); return _collection[position]; } + public int Insert(T obj) { - // вставка в свободное место набора - int index = 0; - while (index < _collection.Length) + // вставка в свободное место набора + for (int i = 0; i < Count; i++) { - if (_collection[index] == null) + if (_collection[i] == null) { - _collection[index] = obj; - return index; + _collection[i] = obj; + return i; } - index++; } - return -1; + + throw new CollectionOverflowException(Count); } + public int Insert(T obj, int position) { + // проверка позиции + if (position < 0 || position >= Count) throw new PositionOutOfCollectionException(position); - if (position >= _collection.Length || position < 0) - { return -1; } - - if (_collection[position] == null) + if (_collection[position] != null) { - _collection[position] = obj; - return position; - } - int index; - - for (index = position + 1; index < _collection.Length; ++index) - { - if (_collection[index] == null) + bool pushed = false; + for (int index = position + 1; index < Count; index++) { - _collection[position] = obj; - return position; + if (_collection[index] == null) + { + position = index; + pushed = true; + break; + } + } + + if (!pushed) + { + for (int index = position - 1; index >= 0; index--) + { + if (_collection[index] == null) + { + position = index; + pushed = true; + break; + } + } + } + + if (!pushed) + { + throw new CollectionOverflowException(Count); } } - for (index = position - 1; index >= 0; --index) - { - if (_collection[index] == null) - { - _collection[position] = obj; - return position; - } - } - return -1; + // вставка + _collection[position] = obj; + return position; } - public T Remove(int position) + + public T? Remove(int position) { - if (position >= _collection.Length || position < 0) - { return null; } - T DrawningAircraft = _collection[position]; - _collection[position] = null; - return DrawningAircraft; - } + // проверка позиции + if (position < 0 || position >= Count) throw new PositionOutOfCollectionException(position); + if (_collection[position] == null) throw new ObjectNotFoundException(position); + + T? temp = _collection[position]; + _collection[position] = null; + return temp; + } public IEnumerable GetItems() { for (int i = 0; i < _collection.Length; ++i) diff --git a/Stormtrooper/Stormtrooper/CollectionGenericObjects/StorageCollection.cs b/Stormtrooper/Stormtrooper/CollectionGenericObjects/StorageCollection.cs index 20407b5..75bf013 100644 --- a/Stormtrooper/Stormtrooper/CollectionGenericObjects/StorageCollection.cs +++ b/Stormtrooper/Stormtrooper/CollectionGenericObjects/StorageCollection.cs @@ -1,5 +1,6 @@ using Stormtrooper.CollectionGenericObjects; using Stormtrooper.Drawnings; +using Stormtrooper.Exceptions; using System; using System.Collections.Generic; using System.Linq; @@ -51,22 +52,23 @@ where T : DrawningAircraft /// /// Название коллекции /// тип коллекции - public void AddCollection(string name, CollectionType collectionType) + public void AddCollection(string name, CollectionType collectionType) { - // TODO проверка, что name не пустой и нет в словаре записи с таким ключом - // TODO Прописать логику для добавления - if (!(collectionType == CollectionType.None) && !_storages.ContainsKey(name)) + if (string.IsNullOrEmpty(name) || _storages.ContainsKey(name)) + return; + switch (collectionType) { - if (collectionType == CollectionType.List) - { + case CollectionType.List: _storages.Add(name, new ListGenericObjects()); - } - else if (collectionType == CollectionType.Massive) - { + break; + case CollectionType.Massive: _storages.Add(name, new MassiveGenericObjects()); - } + break; + default: + break; } } + /// /// Удаление коллекции /// @@ -81,15 +83,12 @@ where T : DrawningAircraft /// /// Название коллекции /// - public ICollectionGenericObjects? this[string name] + public ICollectionGenericObjects? this[string name] { get { - // TODO Продумать логику получения объекта - if (_storages.ContainsKey(name)) - { - return _storages[name]; - } + if (_storages.TryGetValue(name, out ICollectionGenericObjects? value)) + return value; return null; } } @@ -98,11 +97,11 @@ where T : DrawningAircraft /// /// Путь и имя файла /// true - сохранение прошло успешно, false - ошибка при сохранении данных - public bool SaveData(string filename) + public void SaveData(string filename) { if (_storages.Count == 0) { - return false; + throw new Exception("В хранилище отсутствуют коллекции для сохранения"); } @@ -111,8 +110,6 @@ where T : DrawningAircraft File.Delete(filename); } - - using FileStream fs = new(filename, FileMode.Create); using StreamWriter streamWriter = new StreamWriter(fs); streamWriter.Write(_collectionKey); @@ -148,43 +145,37 @@ where T : DrawningAircraft } } - return true; } /// /// Загрузка информации по кораблям в хранилище из файла /// /// - /// true - загрузка прошла успешно, false - ошибка при загрузке данных - public bool LoadData(string filename) + public void LoadData(string filename) { if (!File.Exists(filename)) { - return false; + throw new FileNotFoundException("Файл не существует"); } - using (StreamReader sr = new StreamReader(filename))// открываем файла на чтение + + using (StreamReader sr = new StreamReader(filename)) { string? str; str = sr.ReadLine(); if (str != _collectionKey.ToString()) - return false; - + throw new FormatException("В файле неверные данные"); _storages.Clear(); - while ((str = sr.ReadLine()) != null) { string[] record = str.Split(_separatorForKeyValue); - - if (record.Length != 4) { continue; } - CollectionType collectionType = (CollectionType)Enum.Parse(typeof(CollectionType), record[1]); ICollectionGenericObjects? collection = StorageCollection.CreateCollection(collectionType); if (collection == null) { - return false; + throw new InvalidOperationException("Не удалось определить тип коллекции:" + record[1]); } collection.MaxCount = Convert.ToInt32(record[2]); @@ -194,15 +185,22 @@ where T : DrawningAircraft { if (elem?.CreateDrawningAircraft() is T aircraft) { - if (collection.Insert(aircraft) == -1) - return false; + try + { + if (collection.Insert(aircraft) == -1) + { + throw new InvalidOperationException("Объект не удалось добавить в коллекцию: " + record[3]); + } + } + catch (CollectionOverflowException ex) + { + throw new CollectionOverflowException("Коллекция переполнена", ex); + } } } - _storages.Add(record[0], collection); } } - return true; } private static ICollectionGenericObjects? CreateCollection(CollectionType collectionType) { diff --git a/Stormtrooper/Stormtrooper/Exceptions/CollectionOverflowException.cs b/Stormtrooper/Stormtrooper/Exceptions/CollectionOverflowException.cs new file mode 100644 index 0000000..5a579ca --- /dev/null +++ b/Stormtrooper/Stormtrooper/Exceptions/CollectionOverflowException.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Stormtrooper.Exceptions; + +/// +/// Класс, описывающий ошибку переполнения коллекции +/// +[Serializable] +public class CollectionOverflowException : ApplicationException +{ + public CollectionOverflowException(int count) : base("В коллекции превышено допустимое количество: " + count) { } + + public CollectionOverflowException() : base() { } + + public CollectionOverflowException(string message) : base(message) { } + + public CollectionOverflowException(string message, Exception exception) : base(message, exception) { } + + protected CollectionOverflowException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} diff --git a/Stormtrooper/Stormtrooper/Exceptions/ObjectNotFoundException.cs b/Stormtrooper/Stormtrooper/Exceptions/ObjectNotFoundException.cs new file mode 100644 index 0000000..b2cd58e --- /dev/null +++ b/Stormtrooper/Stormtrooper/Exceptions/ObjectNotFoundException.cs @@ -0,0 +1,21 @@ +using System.Runtime.Serialization; + + +namespace Stormtrooper.Exceptions; + +/// +/// Класс, описывающий ошибку, что по указанной позиции нет элемента +/// +[Serializable] +internal class ObjectNotFoundException : ApplicationException +{ + public ObjectNotFoundException(int i) : base("Не найден объект по позиции " + i) { } + + public ObjectNotFoundException() : base() { } + + public ObjectNotFoundException(string message) : base(message) { } + + public ObjectNotFoundException(string message, Exception exception) : base(message, exception) { } + + protected ObjectNotFoundException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} diff --git a/Stormtrooper/Stormtrooper/Exceptions/PositionOutOfCollectionException.cs b/Stormtrooper/Stormtrooper/Exceptions/PositionOutOfCollectionException.cs new file mode 100644 index 0000000..5371d59 --- /dev/null +++ b/Stormtrooper/Stormtrooper/Exceptions/PositionOutOfCollectionException.cs @@ -0,0 +1,21 @@ +using System.Runtime.Serialization; + + +namespace Stormtrooper.Exceptions; + +/// +/// Класс, описывающий ошибку выхода за границы коллекции +/// +[Serializable] +internal class PositionOutOfCollectionException : ApplicationException +{ + public PositionOutOfCollectionException(int i) : base("Выход за границы коллекции. Позиция " + i) { } + + public PositionOutOfCollectionException() : base() { } + + public PositionOutOfCollectionException(string message) : base(message) { } + + public PositionOutOfCollectionException(string message, Exception exception) : base(message, exception) { } + + protected PositionOutOfCollectionException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} diff --git a/Stormtrooper/Stormtrooper/FormAircraftCollection.Designer.cs b/Stormtrooper/Stormtrooper/FormAircraftCollection.Designer.cs index 0613a06..3cc8154 100644 --- a/Stormtrooper/Stormtrooper/FormAircraftCollection.Designer.cs +++ b/Stormtrooper/Stormtrooper/FormAircraftCollection.Designer.cs @@ -66,9 +66,9 @@ groupBoxTools.Controls.Add(panelStorage); groupBoxTools.Controls.Add(comboBoxSelectorCompany); groupBoxTools.Dock = DockStyle.Right; - groupBoxTools.Location = new Point(980, 28); + groupBoxTools.Location = new Point(959, 28); groupBoxTools.Name = "groupBoxTools"; - groupBoxTools.Size = new Size(264, 649); + groupBoxTools.Size = new Size(264, 660); groupBoxTools.TabIndex = 0; groupBoxTools.TabStop = false; groupBoxTools.Tag = ""; @@ -250,7 +250,7 @@ pictureBox.Dock = DockStyle.Fill; pictureBox.Location = new Point(0, 28); pictureBox.Name = "pictureBox"; - pictureBox.Size = new Size(980, 649); + pictureBox.Size = new Size(959, 660); pictureBox.TabIndex = 1; pictureBox.TabStop = false; // @@ -260,7 +260,7 @@ menuStrip.Items.AddRange(new ToolStripItem[] { fileToolStripMenuItem }); menuStrip.Location = new Point(0, 0); menuStrip.Name = "menuStrip"; - menuStrip.Size = new Size(1244, 28); + menuStrip.Size = new Size(1223, 28); menuStrip.TabIndex = 2; menuStrip.Text = "menuStrip1"; // @@ -285,7 +285,7 @@ loadToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.L; loadToolStripMenuItem.Size = new Size(227, 26); loadToolStripMenuItem.Text = "Загрузка"; - loadToolStripMenuItem.Click += LoadToolStripMenuItem_Click; + loadToolStripMenuItem.Click += loadToolStripMenuItem_Click; // // saveFileDialog // @@ -299,7 +299,7 @@ // AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(1244, 677); + ClientSize = new Size(1223, 688); Controls.Add(pictureBox); Controls.Add(groupBoxTools); Controls.Add(menuStrip); diff --git a/Stormtrooper/Stormtrooper/FormAircraftCollection.cs b/Stormtrooper/Stormtrooper/FormAircraftCollection.cs index c550944..50b9227 100644 --- a/Stormtrooper/Stormtrooper/FormAircraftCollection.cs +++ b/Stormtrooper/Stormtrooper/FormAircraftCollection.cs @@ -1,5 +1,7 @@ -using Stormtrooper.CollectionGenericObjects; +using Microsoft.Extensions.Logging; +using Stormtrooper.CollectionGenericObjects; using Stormtrooper.Drawnings; +using Stormtrooper.Exceptions; using System; using System.Collections.Generic; using System.ComponentModel; @@ -25,13 +27,19 @@ public partial class FormAircraftCollection : Form /// private AbstractCompany? _company; + /// + /// Логер + /// + private readonly ILogger _logger; + /// /// Конструктор /// - public FormAircraftCollection() + public FormAircraftCollection(ILogger logger) { InitializeComponent(); _storageCollection = new(); + _logger = logger; } private void ComboBoxSelectorCompany_SelectedIndexChanged(object sender, EventArgs e) @@ -62,38 +70,52 @@ public partial class FormAircraftCollection : Form { return; } - - if (_company + aircraft != -1) + try { + var res = _company + aircraft; MessageBox.Show("Объект добавлен"); + _logger.LogInformation($"Объект добавлен под индексом {res}"); pictureBox.Image = _company.Show(); } - else + catch (Exception ex) { - MessageBox.Show("Не удалось добавить объект"); + MessageBox.Show($"Объект не добавлен: {ex.Message}", "Результат", MessageBoxButtons.OK, + MessageBoxIcon.Error); + _logger.LogError($"Ошибка: {ex.Message}", ex.Message); } } + /// + /// Кнопка удаления самолета + /// + /// + /// private void ButtonRemoveAircraft_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(maskedTextBox.Text) || _company == null) { return; } - if (MessageBox.Show("Удалить объект?", "Удаление", - MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) + + if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != + DialogResult.Yes) { return; } + int pos = Convert.ToInt32(maskedTextBox.Text); - if (_company - pos != null) + try { - MessageBox.Show("Объект удален!"); + var res = _company - pos; + MessageBox.Show("Объект удален"); + _logger.LogInformation($"Объект удален под индексом {pos}"); pictureBox.Image = _company.Show(); } - else + catch (Exception ex) { - MessageBox.Show("Не удалось удалить объект"); + MessageBox.Show(ex.Message, "Не удалось удалить объект", + MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError($"Ошибка: {ex.Message}", ex.Message); } } @@ -143,13 +165,13 @@ public partial class FormAircraftCollection : Form /// private void ButtonCollectionAdd_Click(object sender, EventArgs e) { - - if (string.IsNullOrEmpty(textBoxCollectionName.Text) || (!radioButtonList.Checked && !radioButtonMassive.Checked)) + if (string.IsNullOrEmpty(textBoxCollectionName.Text) || + (!radioButtonList.Checked && !radioButtonMassive.Checked)) { - MessageBox.Show("Не все данные заполнены", "Ошибка", - MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } + CollectionType collectionType = CollectionType.None; if (radioButtonMassive.Checked) { @@ -159,8 +181,19 @@ public partial class FormAircraftCollection : Form { collectionType = CollectionType.List; } - _storageCollection.AddCollection(textBoxCollectionName.Text, collectionType); - RerfreshListBoxItems(); + + try + { + _storageCollection.AddCollection(textBoxCollectionName.Text, collectionType); + _logger.LogInformation("Добавление коллекции"); + RerfreshListBoxItems(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError($"Ошибка: {ex.Message}", ex.Message); + } + } /// @@ -170,22 +203,21 @@ public partial class FormAircraftCollection : Form /// private void ButtonCollectionDel_Click(object sender, EventArgs e) { - // TODO прописать логику удаления элемента из коллекции - // нужно убедиться, что есть выбранная коллекция - // спросить у пользователя через MessageBox, что он подтверждает, что хочет удалить запись - // удалить и обновить ListBox if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null) { MessageBox.Show("Коллекция не выбрана"); return; } - if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + + if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != + DialogResult.Yes) { return; } - _storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString()); - RerfreshListBoxItems(); + _storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString()); + _logger.LogInformation("Коллекция удалена"); + RerfreshListBoxItems(); } /// @@ -201,7 +233,8 @@ public partial class FormAircraftCollection : Form return; } - ICollectionGenericObjects? collection = _storageCollection[listBoxCollection.SelectedItem.ToString() ?? string.Empty]; + ICollectionGenericObjects? collection = + _storageCollection[listBoxCollection.SelectedItem.ToString() ?? string.Empty]; if (collection == null) { MessageBox.Show("Коллекция не проинициализирована"); @@ -212,12 +245,12 @@ public partial class FormAircraftCollection : Form { case "Хранилище": _company = new AircraftHangarService(pictureBox.Width, pictureBox.Height, collection); + _logger.LogInformation("Компания создана"); break; } panelCompanyTools.Enabled = true; RerfreshListBoxItems(); - } /// /// Обновление списка в listBoxCollection @@ -244,13 +277,16 @@ public partial class FormAircraftCollection : Form { if (saveFileDialog.ShowDialog() == DialogResult.OK) { - if (_storageCollection.SaveData(saveFileDialog.FileName)) + try { + _storageCollection.SaveData(saveFileDialog.FileName); MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.LogInformation("Сохранение в файл: {filename}", saveFileDialog.FileName); } - else + catch (Exception ex) { MessageBox.Show("Не сохранилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError("Ошибка: {Message}", ex.Message); } } } @@ -260,18 +296,21 @@ public partial class FormAircraftCollection : Form /// /// /// - private void LoadToolStripMenuItem_Click(object sender, EventArgs e) + private void loadToolStripMenuItem_Click(object sender, EventArgs e) { if (openFileDialog.ShowDialog() == DialogResult.OK) { - if (_storageCollection.LoadData(openFileDialog.FileName)) + try { - MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _storageCollection.LoadData(openFileDialog.FileName); RerfreshListBoxItems(); + MessageBox.Show("Загрузка прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.LogInformation("Загрузка из файла: {filename}", openFileDialog.FileName); } - else + catch (Exception ex) { - MessageBox.Show("Не сохранилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show("Загрузка не выполнена", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError("Ошибка: {Message}", ex.Message); } } } diff --git a/Stormtrooper/Stormtrooper/Program.cs b/Stormtrooper/Stormtrooper/Program.cs index 8d32d67..eea7db2 100644 --- a/Stormtrooper/Stormtrooper/Program.cs +++ b/Stormtrooper/Stormtrooper/Program.cs @@ -1,17 +1,44 @@ -namespace Stormtrooper +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Configuration; +using Serilog; + + +namespace Stormtrooper; + +internal static class Program { - internal static class Program + [STAThread] + static void Main() { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); + var services = new ServiceCollection(); + ConfigureServices(services); + using (ServiceProvider serviceProvider = services.BuildServiceProvider()) { - // To customize application configuration such as set high DPI settings or default font, - // see https://aka.ms/applicationconfiguration. - ApplicationConfiguration.Initialize(); - Application.Run(new FormAircraftCollection()); + Application.Run(serviceProvider.GetRequiredService()); } } + + private static void ConfigureServices(ServiceCollection services) + { + services.AddSingleton().AddLogging(option => + { + string[] path = Directory.GetCurrentDirectory().Split('\\'); + string pathNeed = ""; + for (int i = 0; i < path.Length - 3; i++) + { + pathNeed += path[i] + "\\"; + } + + var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile(path: $"{pathNeed}serilogConfig.json", optional: false, reloadOnChange: true) + .Build(); + var logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger(); + option.SetMinimumLevel(LogLevel.Information); + option.AddSerilog(logger); + }); + } } \ No newline at end of file diff --git a/Stormtrooper/Stormtrooper/Stormtrooper.csproj b/Stormtrooper/Stormtrooper/Stormtrooper.csproj index 244387d..42fac2c 100644 --- a/Stormtrooper/Stormtrooper/Stormtrooper.csproj +++ b/Stormtrooper/Stormtrooper/Stormtrooper.csproj @@ -8,6 +8,16 @@ enable + + + + + + + + + + True @@ -23,4 +33,10 @@ + + + Always + + + \ No newline at end of file diff --git a/Stormtrooper/Stormtrooper/serilogConfig.json b/Stormtrooper/Stormtrooper/serilogConfig.json new file mode 100644 index 0000000..d97e26c --- /dev/null +++ b/Stormtrooper/Stormtrooper/serilogConfig.json @@ -0,0 +1,20 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.File" ], + "MinimumLevel": "Information", + "WriteTo": [ + { + "Name": "File", + "Args": { + "path": "Logs/log_.log", + "rollingInterval": "Day", + "outputTemplate": "[{Timestamp:HH:mm:ss.fff}]{Level:u4}: {Message:lj}{NewLine}{Exception}" + } + } + ], + "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ], + "Properties": { + "Application": "Stormtrooper" + } + } +}