diff --git a/ProjectLiner/ProjectLiner/CollectionGenericObjects/AbstractCompany.cs b/ProjectLiner/ProjectLiner/CollectionGenericObjects/AbstractCompany.cs index b8f6cd8..c85dc44 100644 --- a/ProjectLiner/ProjectLiner/CollectionGenericObjects/AbstractCompany.cs +++ b/ProjectLiner/ProjectLiner/CollectionGenericObjects/AbstractCompany.cs @@ -1,9 +1,12 @@ using ProjectLiner.Drawnings; +using ProjectLiner.Exceptions; +using ProjectLiner.CollectionGenericObjects; +using ProjectLiner.Exceptions; namespace ProjectLiner.CollectionGenericObjects { /// - /// Абстракция компании, хранящий коллекцию лайнеров + /// Абстракция компании, хранящий коллекцию автомобилей /// public abstract class AbstractCompany { @@ -15,7 +18,7 @@ namespace ProjectLiner.CollectionGenericObjects /// /// Размер места (высота) /// - protected readonly int _placeSizeHeight = 110; + protected readonly int _placeSizeHeight = 150; /// /// Ширина окна @@ -28,21 +31,21 @@ namespace ProjectLiner.CollectionGenericObjects protected readonly int _pictureHeight; /// - /// Коллекция лайнеров + /// Коллекция автомобилей /// protected ICollectionGenericObjects? _collection = null; /// /// Вычисление максимального количества элементов, который можно разместить в окне /// - private int GetMaxCount => _pictureWidth * _pictureHeight / (_placeSizeWidth * _placeSizeHeight); + private int GetMaxCount => _pictureWidth / _placeSizeWidth * (_pictureHeight / _placeSizeHeight); /// /// Конструктор /// /// Ширина окна /// Высота окна - /// Коллекция лайнеров + /// Коллекция автомобилей public AbstractCompany(int picWidth, int picHeight, ICollectionGenericObjects collection) { _pictureWidth = picWidth; @@ -55,12 +58,11 @@ namespace ProjectLiner.CollectionGenericObjects /// Перегрузка оператора сложения для класса /// /// Компания - /// Добавляемый объект + /// Добавляемый объект /// - - public static int operator +(AbstractCompany company, DrawningCommonLiner airplan) + public static int operator +(AbstractCompany company, DrawningCommonLiner airplane) { - return company._collection.Insert(airplan); + return company._collection.Insert(airplane); } /// @@ -71,7 +73,7 @@ namespace ProjectLiner.CollectionGenericObjects /// public static DrawningCommonLiner operator -(AbstractCompany company, int position) { - return company._collection.Remove(position) ; + return company._collection.Remove(position); } /// @@ -81,7 +83,14 @@ namespace ProjectLiner.CollectionGenericObjects public DrawningCommonLiner? GetRandomObject() { Random rnd = new(); - return _collection?.Get(rnd.Next(GetMaxCount)); + try + { + return _collection?.Get(rnd.Next(GetMaxCount)); + } + catch (ObjectNotFoundException) + { + return null; + } } /// @@ -97,8 +106,15 @@ namespace ProjectLiner.CollectionGenericObjects SetObjectsPosition(); for (int i = 0; i < (_collection?.Count ?? 0); ++i) { - DrawningCommonLiner? obj = _collection?.Get(i); - obj?.DrawTransport(graphics); + try + { + DrawningCommonLiner? obj = _collection?.Get(i); + obj?.DrawTransport(graphics); + } + catch (ObjectNotFoundException) + { + continue; + } } return bitmap; diff --git a/ProjectLiner/ProjectLiner/CollectionGenericObjects/LinerSharingService.cs b/ProjectLiner/ProjectLiner/CollectionGenericObjects/LinerSharingService.cs index ad2d528..0d43197 100644 --- a/ProjectLiner/ProjectLiner/CollectionGenericObjects/LinerSharingService.cs +++ b/ProjectLiner/ProjectLiner/CollectionGenericObjects/LinerSharingService.cs @@ -1,64 +1,67 @@ using ProjectLiner.Drawnings; +using ProjectLiner.Exceptions; +using ProjectLiner.CollectionGenericObjects; +using ProjectLiner.Exceptions; -namespace ProjectLiner.CollectionGenericObjects; - -/// -/// Реализация абстрактной компании - лайнер -/// -public class LinerSharingService : AbstractCompany +namespace ProjectLiner.CollectionGenericObjects { - /// - /// Конструктор - /// - /// Ширина - /// Высота - /// Коллекция - public LinerSharingService(int picWidth, int picHeight, ICollectionGenericObjects collection) : base(picWidth, picHeight, collection) - { - } - protected override void DrawBackgound(Graphics g) + public class LinerSharingService : AbstractCompany { - Pen pen = new(Color.Black, 4); - for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++) + public LinerSharingService(int picWidth, int picHeight, ICollectionGenericObjects collection) : base(picWidth, picHeight, collection) { - for (int j = 0; j < _pictureHeight / _placeSizeHeight + 1; ++j) + } + + protected override void DrawBackgound(Graphics g) + { + Pen pen = new(Color.Black, 4); + for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++) { - g.DrawLine(pen, i * _placeSizeWidth, (int)(j * _placeSizeHeight * 1.3), - i * _placeSizeWidth + _placeSizeWidth - 40, (int)(j * _placeSizeHeight * 1.3)); + for (int j = 0; j < _pictureHeight / _placeSizeHeight + 1; ++j) + { + g.DrawLine(pen, i * _placeSizeWidth, j * _placeSizeHeight, + i * _placeSizeWidth + _placeSizeWidth - 40, j * _placeSizeHeight); + } + g.DrawLine(pen, i * _placeSizeWidth, 0, i * _placeSizeWidth, _pictureHeight / _placeSizeHeight * _placeSizeHeight); + } + } + + protected override void SetObjectsPosition() + { + int width = _pictureWidth / _placeSizeWidth; + int height = _pictureHeight / _placeSizeHeight; + + int curWidth = width - 1; + int curHeight = 0; + + for (int i = 0; i < (_collection?.Count ?? 0); i++) + { + try + { + if (_collection.Get(i) != null) + { + _collection.Get(i).SetPictureSize(_pictureWidth, _pictureHeight); + _collection.Get(i).SetPosition(_placeSizeWidth * curWidth + 10, curHeight * _placeSizeHeight + 5); + } + + if (curWidth > 0) + curWidth--; + else + { + curWidth = width - 1; + curHeight++; + } + if (curHeight > height) + { + return; + } + } + catch (ObjectNotFoundException) + { + break; + } } - g.DrawLine(pen, i * _placeSizeWidth, 0, i * _placeSizeWidth, _pictureHeight / _placeSizeHeight * _placeSizeHeight); } } - - protected override void SetObjectsPosition() - { - int width = _pictureWidth / _placeSizeWidth; - int height = _pictureHeight / _placeSizeHeight; - - int curWidth = width - 1; - int curHeight = 0; - - for (int i = 0; i < (_collection?.Count ?? 0); i++) - { - if (_collection?.Get(i) != null) - { - _collection.Get(i)?.SetPictureSize(_pictureWidth, _pictureHeight); - _collection.Get(i)?.SetPosition(_placeSizeWidth * curWidth + 10, (int)(curHeight * _placeSizeHeight * 1.3)); - } - - if (curWidth > 0) - curWidth--; - else - { - curWidth = width - 1; - curHeight++; - } - if (curHeight > height) - { - return; - } - } - } } \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/CollectionGenericObjects/ListGenericObjects.cs b/ProjectLiner/ProjectLiner/CollectionGenericObjects/ListGenericObjects.cs index e1dc795..d37225b 100644 --- a/ProjectLiner/ProjectLiner/CollectionGenericObjects/ListGenericObjects.cs +++ b/ProjectLiner/ProjectLiner/CollectionGenericObjects/ListGenericObjects.cs @@ -1,85 +1,97 @@ -using ProjectLiner.CollectionGenericObjects; + +using ProjectLiner.Exceptions; +using ProjectLiner.CollectionGenericObjects; using ProjectLiner.Exceptions; -using System.Collections.Generic; -/// -/// Параметризованный набор объектов -/// -/// Параметр: ограничение - ссылочный тип -public class ListGenericObjects : ICollectionGenericObjects - where T : class +namespace ProjectLiner.CollectionGenericObjects { /// - /// Список объектов, которые храним + /// Параметризованный набор объектов /// - private readonly List _collection; - /// - /// Максимально допустимое число объектов в списке - /// - private int _maxCount; - public int Count => _collection.Count; - public int MaxCount + /// Параметр: ограничение - ссылочный тип + public class ListGenericObjects : ICollectionGenericObjects + where T : class { - get + /// + /// Список объектов, которые храним + /// + private readonly List _collection; + + /// + /// Максимально допустимое число объектов в списке + /// + private int _maxCount; + + public int Count => _collection.Count; + + public int MaxCount { - return _maxCount; + get + { + return _maxCount; + } + + set + { + if (value > 0) + { + _maxCount = value; + } + } } - set + public CollectionType GetCollectionType => CollectionType.List; + + /// + /// Конструктор + /// + public ListGenericObjects() { - if (value > 0) + _collection = new(); + } + + public T? Get(int position) + { + if (position >= Count || position < 0) + throw new PositionOutOfCollectionException(position); + + return _collection[position]; + } + + 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 < 0 || position > Count) + throw new PositionOutOfCollectionException(position); ; + _collection.Insert(position, obj); + return position; + } + + public T? Remove(int position) + { + if (position < 0 || position > Count) + throw new PositionOutOfCollectionException(position); + + T? temp = _collection[position]; + _collection.RemoveAt(position); + return temp; + } + + public IEnumerable GetItems() + { + for (int i = 0; i < _collection.Count; ++i) { - _maxCount = value; + yield return _collection[i]; } } } - - public CollectionType GetCollectionType => CollectionType.List; - - /// - /// Конструктор - /// - public ListGenericObjects() - { - _collection = new(); - } - public T? Get(int position) - { - // Проверка позиции - if (position >= Count || position < 0) - { - throw new PositionOutOfCollectionException(position); - } - return _collection[position]; - } - public int Insert(T obj) - { - if (Count == _maxCount) throw new CollectionOverflowException(); - _collection.Add(obj); - return Count; - } - - public int Insert(T obj, int position) - { - if (Count == _maxCount) throw new CollectionOverflowException(); - if (position >= Count || position < 0) throw new PositionOutOfCollectionException(); - _collection.Insert(position, obj); - return position; - } - - public T Remove(int position) - { - if (position >= Count || position < 0) throw new PositionOutOfCollectionException(); - T obj = _collection[position]; - _collection.RemoveAt(position); - return obj; - } - - public IEnumerable GetItems() - { - for (int i = 0; i < _collection.Count; ++i) - { - yield return _collection[i]; - } - } -} \ No newline at end of file +} diff --git a/ProjectLiner/ProjectLiner/CollectionGenericObjects/MassiveGenericObjects.cs b/ProjectLiner/ProjectLiner/CollectionGenericObjects/MassiveGenericObjects.cs index cd419af..99f8a17 100644 --- a/ProjectLiner/ProjectLiner/CollectionGenericObjects/MassiveGenericObjects.cs +++ b/ProjectLiner/ProjectLiner/CollectionGenericObjects/MassiveGenericObjects.cs @@ -1,5 +1,7 @@  using ProjectLiner.Exceptions; +using ProjectLiner.CollectionGenericObjects; +using ProjectLiner.Exceptions; namespace ProjectLiner.CollectionGenericObjects { @@ -14,7 +16,7 @@ namespace ProjectLiner.CollectionGenericObjects /// Массив объектов, которые храним /// private T?[] _collection; - + public int Count => _collection.Length; public int MaxCount @@ -52,7 +54,10 @@ namespace ProjectLiner.CollectionGenericObjects public T? Get(int position) { - if (position < 0 || position >= Count) throw new PositionOutOfCollectionException(); + if (position < 0 || position >= Count) + throw new PositionOutOfCollectionException(position); + if (_collection[position] == null) + throw new ObjectNotFoundException(position); return _collection[position]; } @@ -66,18 +71,20 @@ namespace ProjectLiner.CollectionGenericObjects return i; } } - throw new CollectionOverflowException(); + throw new CollectionOverflowException(Count); } public int Insert(T obj, int position) { + if (position >= Count || position < 0) + throw new PositionOutOfCollectionException(position); - if (position >= Count || position < 0) throw new PositionOutOfCollectionException(); if (_collection[position] == null) { _collection[position] = obj; return position; } + int temp = position + 1; while (temp < Count) { @@ -86,28 +93,34 @@ namespace ProjectLiner.CollectionGenericObjects _collection[temp] = obj; return temp; } - ++temp; + temp++; } + temp = position - 1; - while (temp >= 0) + while (temp > 0) { if (_collection[temp] == null) { _collection[temp] = obj; return temp; } - --temp; + temp--; } - throw new CollectionOverflowException(); + + throw new CollectionOverflowException(Count); } public T? Remove(int position) { - if (position >= Count || position < 0) throw new PositionOutOfCollectionException(); - T? myObject = _collection[position]; - if (myObject == null) throw new ObjectNotFoundException(); + 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 myObject; + return temp; } public IEnumerable GetItems() diff --git a/ProjectLiner/ProjectLiner/CollectionGenericObjects/StorageCollection.cs b/ProjectLiner/ProjectLiner/CollectionGenericObjects/StorageCollection.cs index abe8305..c434e79 100644 --- a/ProjectLiner/ProjectLiner/CollectionGenericObjects/StorageCollection.cs +++ b/ProjectLiner/ProjectLiner/CollectionGenericObjects/StorageCollection.cs @@ -1,214 +1,226 @@ -using ProjectLiner.CollectionGenericObjects; +using System.Data; +using System.IO; +using System.Text; using ProjectLiner.Drawnings; using ProjectLiner.Exceptions; +using ProjectLiner.CollectionGenericObjects; +using ProjectLiner.Exceptions; -/// -/// Класс-хранилище коллекций -/// -/// -public class StorageCollection - where T : DrawningCommonLiner +namespace ProjectLiner.CollectionGenericObjects { /// - /// Словарь (хранилище) с коллекциями + /// Класс-хранилище коллекций /// - readonly Dictionary> _storages; - - /// - /// Возвращение списка названий коллекций - /// - public List Keys => _storages.Keys.ToList(); - - /// - /// Ключевое слово, с которого должен начинаться файл - /// - private readonly string _collectionKey = "CollectionsStorage"; - - /// - /// Разделитель для записи ключа и значения элемента словаря - /// - private readonly string _separatorForKeyValue = "|"; - - /// - /// Разделитель для записей коллекции данных в файл - /// - private readonly string _separatorItems = ";"; - - /// - /// Конструктор - /// - public StorageCollection() + /// + public class StorageCollection + where T : DrawningCommonLiner { - _storages = new Dictionary>(); + /// + /// Словарь (хранилище) с коллекциями + /// + readonly Dictionary> _storages; - } - /// - /// Добавление коллекции в хранилище - /// - /// Название коллекции - /// тип коллекции - public void AddCollection(string name, CollectionType collectionType) - { - if (name == null || _storages.ContainsKey(name)) { return; } - switch (collectionType) + /// + /// Возвращение списка названий коллекций + /// + public List Keys => _storages.Keys.ToList(); + /// + /// Ключевое слово, с которого должен начинаться файл + /// + private readonly string _collectionKey = "CollectionsStorage"; + + /// + /// Разделитель для записи ключа и значения элемента словаря + /// + private readonly string _separatorForKeyValue = "|"; + + /// + /// Разделитель для записей коллекции данных в файл + /// + private readonly string _separatorItems = ";"; + + /// + /// Конструктор + /// + public StorageCollection() { - case CollectionType.None: + _storages = new Dictionary>(); + } + + /// + /// Добавление коллекции в хранилище + /// + /// Название коллекции + /// тип коллекции + public void AddCollection(string name, CollectionType collectionType) + { + if (name == null || _storages.ContainsKey(name)) return; - case CollectionType.Massive: - _storages[name] = new MassiveGenericObjects(); - return; - case CollectionType.List: - _storages[name] = new ListGenericObjects(); - return; - } - } - /// - /// Удаление коллекции - /// - /// Название коллекции - public void DelCollection(string name) - { - if (_storages.ContainsKey(name)) - _storages.Remove(name); - } - /// - /// Доступ к коллекции - /// - /// Название коллекции - /// - public ICollectionGenericObjects? this[string name] - { - get - { - if (name == null || !_storages.ContainsKey(name)) { return null; } - return _storages[name]; - } - } - /// - /// Сохранение информации по лайнерам в хранилище в файл - /// - /// Путь и имя файла - /// true - сохранение прошло успешно, false - ошибка при сохранении данных - public void SaveData(string filename) - { - if (_storages.Count == 0) - throw new Exception("В хранилище отсутствуют коллекции для сохранения"); - - if (File.Exists(filename)) - File.Delete(filename); - - using FileStream fs = new(filename, FileMode.Create); - using StreamWriter sw = new StreamWriter(fs); - sw.Write(_collectionKey); - foreach (KeyValuePair> value in _storages) - { - sw.Write(Environment.NewLine); - if (value.Value.Count == 0) + switch (collectionType) { - continue; - } - - sw.Write(value.Key); - sw.Write(_separatorForKeyValue); - sw.Write(value.Value.GetCollectionType); - sw.Write(_separatorForKeyValue); - sw.Write(value.Value.MaxCount); - sw.Write(_separatorForKeyValue); - - foreach (T? item in value.Value.GetItems()) - { - string data = item?.GetDataForSave() ?? string.Empty; - if (string.IsNullOrEmpty(data)) - { - continue; - } - - sw.Write(data); - sw.Write(_separatorItems); + case CollectionType.None: + return; + case CollectionType.Massive: + _storages[name] = new MassiveGenericObjects(); + return; + case CollectionType.List: + _storages[name] = new ListGenericObjects(); + return; } } - } - /// - /// Загрузка информации по лайнерам в хранилище из файла - /// - /// Путь и имя файла - /// true - загрузка прошла успешно, false - ошибка при загрузке данных - public void LoadData(string filename) - { - if (!File.Exists(filename)) + /// + /// Удаление коллекции + /// + /// Название коллекции + public void DelCollection(string name) { - throw new FileNotFoundException($"{filename} не существует"); + if (_storages.ContainsKey(name)) + _storages.Remove(name); } - using (FileStream fs = new(filename, FileMode.Open)) + /// + /// Доступ к коллекции + /// + /// Название коллекции + /// + public ICollectionGenericObjects? this[string name] { - using StreamReader sr = new StreamReader(fs); - string line = sr.ReadLine(); - if (line == null || line.Length == 0) + get { - throw new Exception("Файл не подходит"); + if (name == null || !_storages.ContainsKey(name)) + return null; + + return _storages[name]; } - if (!line.Equals(_collectionKey)) + } + + /// + /// Сохранение информации по самолетам в хранилище в файл + /// + /// Путь и имя файла + /// true - сохранение прошло успешно, false - ошибка при сохранении данных + public void SaveData(string filename) + { + if (_storages.Count == 0) + throw new NullReferenceException("В хранилище отсутствуют коллекции для сохранения"); + + if (File.Exists(filename)) + File.Delete(filename); + + + using (StreamWriter sw = new(filename)) { - throw new Exception("В файле неверные данные"); - } - _storages.Clear(); - - while (!sr.EndOfStream) - { - string[] record = sr.ReadLine().Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries); - if (record.Length != 4) + sw.Write(_collectionKey); + foreach (KeyValuePair> value in _storages) { - continue; - } - - CollectionType collectionType = (CollectionType)Enum.Parse(typeof(CollectionType), record[1]); - ICollectionGenericObjects? collection = StorageCollection.CreateCollection(collectionType); - if (collection == null) - { - throw new Exception("Не удалось создать коллекцию"); - } - - collection.MaxCount = Convert.ToInt32(record[2]); - - string[] set = record[3].Split(_separatorItems, StringSplitOptions.RemoveEmptyEntries); - foreach (string elem in set) - { - if (elem?.CreateDrawningCommonLiner() is T commonLiner) + sw.Write(Environment.NewLine); + if (value.Value.Count == 0) { - try + continue; + } + + sw.Write(value.Key); + sw.Write(_separatorForKeyValue); + sw.Write(value.Value.GetCollectionType); + sw.Write(_separatorForKeyValue); + sw.Write(value.Value.MaxCount); + sw.Write(_separatorForKeyValue); + + foreach (T? item in value.Value.GetItems()) + { + string data = item?.GetDataForSave() ?? string.Empty; + if (string.IsNullOrEmpty(data)) { - if (collection.Insert(commonLiner) == -1) - { - throw new Exception("Объект не удалось добавить в коллекцию: "); - } - } - catch (CollectionOverflowException ex) - { - throw new Exception("Коллекция переполнена", ex); + continue; } + + sw.Write(data); + sw.Write(_separatorItems); } } - _storages.Add(record[0], collection); } } - } - /// - /// Создание коллекции по типу - /// - /// - /// - private static ICollectionGenericObjects? CreateCollection(CollectionType collectionType) - { - return collectionType switch + /// + /// Загрузка информации по самолетам в хранилище из файла + /// + /// Путь и имя файла + /// true - загрузка прошла успешно, false - ошибка при загрузке данных + public void LoadData(string filename) { - CollectionType.Massive => new MassiveGenericObjects(), - CollectionType.List => new ListGenericObjects(), - _ => null, - }; + if (!File.Exists(filename)) + { + throw new FileNotFoundException("Файл не существует"); + } + + using (StreamReader sr = new(filename)) + { + string str = sr.ReadLine(); + if (str == null || str.Length == 0) + { + throw new FileFormatException("В файле нет данных"); + } + + if (!str.Equals(_collectionKey)) + { + throw new FileFormatException("В файле неверные данные"); + } + _storages.Clear(); + + while (!sr.EndOfStream) + { + string[] record = sr.ReadLine().Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries); + if (record.Length != 4) + { + continue; + } + + CollectionType collectionType = (CollectionType)Enum.Parse(typeof(CollectionType), record[1]); + ICollectionGenericObjects? collection = StorageCollection.CreateCollection(collectionType); + if (collection == null) + { + throw new InvalidOperationException("Не удалось создать коллекцию"); + } + + collection.MaxCount = Convert.ToInt32(record[2]); + + string[] set = record[3].Split(_separatorItems, StringSplitOptions.RemoveEmptyEntries); + foreach (string elem in set) + { + if (elem?.CreateDrawningCommonLiner() is T airplane) + { + try + { + if (collection.Insert(airplane) == -1) + throw new InvalidOperationException("Объект не удалось добавить в коллекцию: " + record[3]); + } + catch (CollectionOverflowException ex) + { + throw new OverflowException("Коллекция переполнена", ex); + } + } + } + _storages.Add(record[0], collection); + } + } + } + + /// + /// Создание коллекции по типу + /// + /// + /// + private static ICollectionGenericObjects? CreateCollection(CollectionType collectionType) + { + return collectionType switch + { + CollectionType.Massive => new MassiveGenericObjects(), + CollectionType.List => new ListGenericObjects(), + _ => null, + }; + } } -} \ No newline at end of file +} diff --git a/ProjectLiner/ProjectLiner/FormLinerCollection.Designer.cs b/ProjectLiner/ProjectLiner/FormLinerCollection.Designer.cs index 15c3bdb..eb6b44c 100644 --- a/ProjectLiner/ProjectLiner/FormLinerCollection.Designer.cs +++ b/ProjectLiner/ProjectLiner/FormLinerCollection.Designer.cs @@ -249,7 +249,7 @@ button3.TabIndex = 4; button3.Text = "Удаление Лайнера"; button3.UseVisualStyleBackColor = true; - button3.Click += ButtonRemoveLiner_Click; + button3.Click += ButtonRemoveCommonLiner_Click; // // button4 // diff --git a/ProjectLiner/ProjectLiner/FormLinerCollection.cs b/ProjectLiner/ProjectLiner/FormLinerCollection.cs index 7446d28..a96fe40 100644 --- a/ProjectLiner/ProjectLiner/FormLinerCollection.cs +++ b/ProjectLiner/ProjectLiner/FormLinerCollection.cs @@ -1,313 +1,329 @@ - -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging; using ProjectLiner.CollectionGenericObjects; using ProjectLiner.Drawnings; using ProjectLiner.Exceptions; +using ProjectLiner.CollectionGenericObjects; +using ProjectLiner.Exceptions; using System.Windows.Forms; -namespace ProjectLiner; -/// -/// Форма работы с компанией и ее коллекцией -/// -public partial class FormLinerCollection : Form +namespace ProjectLiner { /// - /// Хранилише коллекций + /// Форма работы с компанией и ее коллекцией /// - private readonly StorageCollection _storageCollection; - /// - /// Компания - /// - private AbstractCompany? _company = null; - /// - /// Логгер - /// - private readonly ILogger _logger; - /// - /// Конструктор - /// - public FormLinerCollection(ILogger logger) + public partial class FormLinerCollection : Form { - InitializeComponent(); - _storageCollection = new(); - _logger = logger; - } - /// - /// Выбор компании - /// - /// - /// - private void ComboBoxSelectorCompany_SelectedIndexChanged(object sender, EventArgs e) - { - panelCompanyTools.Enabled = false; - } - /// - /// Добавление лайнера - /// - /// - /// - private void ButtonAddCommonLiner_Click(object sender, EventArgs e) - { - FormLinerConfig form = new(); - form.Show(); - form.AddEvent(SetLiner); - } + /// + /// Хранилише коллекций + /// + private readonly StorageCollection _storageCollection; - /// - /// Добавление Лайнера в коллекцию - /// - /// - private void SetLiner(DrawningCommonLiner liner) - { - try + /// + /// Компания + /// + private AbstractCompany? _company = null; + + /// + /// Логер + /// + private readonly ILogger _logger; + + /// + /// Конструктор + /// + public FormLinerCollection(ILogger logger) { - if (_company == null || liner == null) + InitializeComponent(); + _storageCollection = new(); + _logger = logger; + _logger.LogInformation("Форма загрузилась"); + } + + /// + /// Выбор компании + /// + /// + /// + private void ComboBoxSelectorCompany_SelectedIndexChanged(object sender, EventArgs e) + { + panelCompanyTools.Enabled = false; + } + + /// + /// Добавление самолета + /// + /// + /// + private void ButtonAddCommonLiner_Click(object sender, EventArgs e) + { + FormLinerConfig form = new(); + form.Show(); + form.AddEvent(SetLiner); + } + + /// + /// Добавление самолета в коллекцию + /// + /// + private void SetLiner(DrawningCommonLiner CommonLiner) + { + try + { + if (_company == null || CommonLiner == null) + { + return; + } + + if (_company + CommonLiner != -1) + { + MessageBox.Show("Объект добавлен"); + pictureBox.Image = _company.Show(); + _logger.LogInformation("Добавлен объект: {0}", CommonLiner.GetDataForSave()); + } + } + catch (CollectionOverflowException ex) + { + MessageBox.Show(ex.Message); + _logger.LogError("Ошибка: {Message}", ex.Message); + } + } + + /// + /// Удаление объекта + /// + /// + /// + private void ButtonRemoveCommonLiner_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(maskedTextBox1.Text) || _company == null) { return; } - if (_company + liner != -1) + + if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) { - MessageBox.Show("Объект добавлен"); - pictureBox.Image = _company.Show(); - _logger.LogInformation("Добавлен объект: " + liner.GetDataForSave()); + return; } - } - catch (CollectionOverflowException ex) - { - MessageBox.Show(ex.Message, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); - _logger.LogError("Ошибка: {Message}", ex.Message); - } - } - /// - /// Удаление объекта - /// - /// - /// - private void ButtonRemoveLiner_Click(object sender, EventArgs e) - { - if (string.IsNullOrEmpty(maskedTextBox1.Text) || _company == null) - { - return; - } - - if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) - { - return; - } - - try - { - int pos = Convert.ToInt32(maskedTextBox1.Text); - if (_company - pos != null) - { - MessageBox.Show("Объект удален"); - pictureBox.Image = _company.Show(); - _logger.LogInformation("Удаление объекта по индексу " + pos); - } - else - { - MessageBox.Show("Не удалось удалить объект"); - _logger.LogInformation("Не удалось удалить объект из коллекции по индексу " + pos); - } - } - catch (ObjectNotFoundException ex) - { - MessageBox.Show(ex.Message); - _logger.LogError("Ошибка: {Message}", ex.Message); - } - catch (PositionOutOfCollectionException ex) - { - MessageBox.Show(ex.Message); - _logger.LogError("Ошибка: {Message}", ex.Message); - } - } - - /// - /// Передача объекта в другую форму - /// - /// - /// - private void ButtonGoToCheck_Click(object sender, EventArgs e) - { - if (_company == null) - { - return; - } - DrawningCommonLiner? liner = null; - int counter = 100; - while (liner == null) - { - liner = _company.GetRandomObject(); - counter--; - if (counter <= 0) - { - break; - } - } - if (liner == null) - { - return; - } - FormLiner form = new() - { - SetLiner = liner - }; - form.ShowDialog(); - } - /// - /// Перерисовка коллекции - /// - /// - /// - private void ButtonRefresh_Click(object sender, EventArgs e) - { - if (_company == null) - { - return; - } - - pictureBox.Image = _company.Show(); - - } - /// - /// Добавление коллекции - /// - /// - /// - private void ButtonCollectionAdd_Click(object sender, EventArgs e) - { - if (string.IsNullOrEmpty(textBoxCollectionName.Text) || (!radioButtonList.Checked && !radioButtonMassive.Checked)) - { - MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - _logger.LogInformation("Не удалось добавить коллекцию: не все данные заполнены"); - return; - } - CollectionType collectionType = CollectionType.None; - if (radioButtonMassive.Checked) - { - collectionType = CollectionType.Massive; - } - else if (radioButtonList.Checked) - { - collectionType = CollectionType.List; - } - _storageCollection.AddCollection(textBoxCollectionName.Text, collectionType); - RerfreshListBoxItems(); - _logger.LogInformation("Добавлена коллекция типа " + collectionType + " с названием " + textBoxCollectionName.Text); - } - /// - /// Удаление коллекции - /// - /// - /// - private void ButtonCollectionDel_Click(object sender, EventArgs e) - { - if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null) - { - MessageBox.Show("Коллекция не выбрана"); - return; - } - if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) - { - return; - } - _storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString()); - _logger.LogInformation("Удаление коллекции с названием {name}", listBoxCollection.SelectedItem.ToString()); - RerfreshListBoxItems(); - } - /// - /// Обновление списка в listBoxCollection - /// - private void RerfreshListBoxItems() - { - listBoxCollection.Items.Clear(); - for (int i = 0; i < _storageCollection.Keys?.Count; ++i) - { - string? colName = _storageCollection.Keys?[i]; - if (!string.IsNullOrEmpty(colName)) - { - listBoxCollection.Items.Add(colName); - } - } - } - /// - /// Создание компании - /// - /// - /// - private void ButtonCreateCompany_Click(object sender, EventArgs e) - { - if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null) - { - MessageBox.Show("Коллекция не выбрана"); - return; - } - ICollectionGenericObjects? collection = - _storageCollection[listBoxCollection.SelectedItem.ToString() ?? string.Empty]; - if (collection == null) - { - MessageBox.Show("Коллекция не проинициализирована"); - return; - } - switch (comboBoxSelectorCompany.Text) - { - case "Хранилище": - _company = new LinerSharingService(pictureBox.Width, pictureBox.Height, collection); - break; - } - panelCompanyTools.Enabled = true; - RerfreshListBoxItems(); - } - - /// - /// Обработка нажатия "Сохранение" - /// - /// - /// - private void saveToolStripMenuItem_Click(object sender, EventArgs e) - { - if (saveFileDialog.ShowDialog() == DialogResult.OK) - { try { - _storageCollection.SaveData(saveFileDialog.FileName); - MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); - _logger.LogInformation("Сохранение в файл: {filename}", saveFileDialog.FileName); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); - _logger.LogError("Ошибка: {Message}", ex.Message); - } - } - } - - /// - /// Обработка нажатия "Загрузка" - /// - /// - /// - private void loadToolStripMenuItem_Click(object sender, EventArgs e) - { - if (openFileDialog.ShowDialog() == DialogResult.OK) - { - try - { - _storageCollection.LoadData(openFileDialog.FileName); - MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); - foreach (var collection in _storageCollection.Keys) + int pos = Convert.ToInt32(maskedTextBox1.Text); + if (_company - pos != null) { - listBoxCollection.Items.Add(collection); + MessageBox.Show("Объект удален"); + pictureBox.Image = _company.Show(); + _logger.LogInformation("Удалён объект по позиции {0}", pos); } - RerfreshListBoxItems(); - _logger.LogInformation("Загрузка из файла: {filename}", openFileDialog.FileName); } - catch (Exception ex) + catch (PositionOutOfCollectionException ex) { - MessageBox.Show($"Не загрузилось: {ex.Message}", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(ex.Message); _logger.LogError("Ошибка: {Message}", ex.Message); } + catch (ObjectNotFoundException ex) + { + MessageBox.Show(ex.Message); + _logger.LogError("Ошибка: {Message}", ex.Message); + } + } + + /// + /// Передача объекта в другую форму + /// + /// + /// + private void ButtonGoToCheck_Click(object sender, EventArgs e) + { + if (_company == null) + { + return; + } + + try + { + DrawningCommonLiner? plane = null; + int counter = 100; + while (plane == null) + { + plane = _company.GetRandomObject(); + counter--; + if (counter <= 0) + { + break; + } + } + + if (plane == null) + { + return; + } + + FormLiner form = new() + { + SetLiner = plane + }; + form.ShowDialog(); + } + catch (ObjectNotFoundException) + { + _logger.LogError("Ошибка при передаче объекта на FormLiner"); + } + } + + /// + /// Перерисовка коллекции + /// + /// + /// + private void ButtonRefresh_Click(object sender, EventArgs e) + { + if (_company == null) + { + return; + } + + pictureBox.Image = _company.Show(); + } + + /// + /// Добавление коллекции + /// + /// + /// + private void ButtonCollectionAdd_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxCollectionName.Text) || (!radioButtonList.Checked && !radioButtonMassive.Checked)) + { + MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError("Ошибка: Заполнены не все данные для добавления коллекции"); + return; + } + + CollectionType collectionType = CollectionType.None; + if (radioButtonMassive.Checked) + collectionType = CollectionType.Massive; + else if (radioButtonList.Checked) + collectionType = CollectionType.List; + + _storageCollection.AddCollection(textBoxCollectionName.Text, collectionType); + RefreshListBoxItems(); + _logger.LogInformation("Добавлена коллекция: {Collection} типа: {Type}", textBoxCollectionName.Text, collectionType); + } + + /// + /// Удаление коллекции + /// + /// + /// + private void ButtonCollectionDel_Click(object sender, EventArgs e) + { + if (listBoxCollection.SelectedItems == null || listBoxCollection.SelectedIndex < 0) + { + MessageBox.Show("Коллекция не выбрана"); + return; + } + if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + { + return; + } + + _storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString()); + RefreshListBoxItems(); + _logger.LogInformation("Коллекция удалена: {0}", textBoxCollectionName.Text); + } + + /// + /// Обновление списка в listBoxCollection + /// + private void RefreshListBoxItems() + { + listBoxCollection.Items.Clear(); + for (int i = 0; i < _storageCollection.Keys?.Count; ++i) + { + string? colName = _storageCollection.Keys?[i]; + if (!string.IsNullOrEmpty(colName)) + listBoxCollection.Items.Add(colName); + } + } + + /// + /// Создание компании + /// + /// + /// + private void ButtonCreateCompany_Click(object sender, EventArgs e) + { + if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null) + { + MessageBox.Show("Коллекция не выбрана"); + return; + } + + ICollectionGenericObjects? collection = _storageCollection[listBoxCollection.SelectedItem.ToString() ?? string.Empty]; + if (collection == null) + { + MessageBox.Show("Коллекция не проинициализирована"); + return; + } + + switch (comboBoxSelectorCompany.Text) + { + case "Хранилище": + _company = new LinerSharingService(pictureBox.Width, pictureBox.Height, collection); + _logger.LogInformation("Создна компания типа {Company}, коллекция: {Collection}", comboBoxSelectorCompany.Text, textBoxCollectionName.Text); + _logger.LogInformation("Создана компания на коллекции: {Collection}", textBoxCollectionName.Text); + break; + } + + panelCompanyTools.Enabled = true; + RefreshListBoxItems(); + } + + /// + /// Обработка нажатия "Сохранение" + /// + /// + /// + private void saveToolStripMenuItem_Click(object sender, EventArgs e) + { + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + try + { + _storageCollection.SaveData(saveFileDialog.FileName); + MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.LogInformation("Сохранение в файл: {filename}", saveFileDialog.FileName); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError("Ошибка: {Message}", ex.Message); + } + } + } + + /// + /// Обработка нажатия "Загрузка" + /// + /// + /// + private void loadToolStripMenuItem_Click(object sender, EventArgs e) + { + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + try + { + _storageCollection.LoadData(openFileDialog.FileName); + MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + RefreshListBoxItems(); + _logger.LogInformation("Загрузка из файла: {filename}", saveFileDialog.FileName); + } + catch (Exception ex) + { + MessageBox.Show($"Не загрузилось: {ex.Message}", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError("Ошибка: {Message}", ex.Message); + } + } } } } \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/FormLinerCollection.resx b/ProjectLiner/ProjectLiner/FormLinerCollection.resx index 1b18cc5..5982093 100644 --- a/ProjectLiner/ProjectLiner/FormLinerCollection.resx +++ b/ProjectLiner/ProjectLiner/FormLinerCollection.resx @@ -126,4 +126,7 @@ 519, 17 + + 25 + \ No newline at end of file