PIbd-11_Tarasov_V.D._Simple/ProjectMonorail/FormMonorailCollection.cs
2024-05-20 14:51:38 +04:00

348 lines
13 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Microsoft.Extensions.Logging;
using ProjectMonorail.Scripts.Exceptions;
using ProjectMonorail.Scripts.Monorail.CollectionGenericObjects;
using ProjectMonorail.Scripts.Monorail.Drawnings;
using System.Diagnostics;
namespace ProjectMonorail
{
/// <summary>
/// Форма работы с компанией и ее коллекцией
/// </summary>
public partial class FormMonorailCollection : Form
{
/// <summary>
/// Логер
/// </summary>
private readonly ILogger _logger;
/// <summary>
/// Хранилище коллекций
/// </summary>
private readonly StorageCollection<DrawingMonorail> _storageCollection;
/// <summary>
/// Компания
/// </summary>
private AbstractCompany? _company = null;
/// <summary>
/// Конструктор
/// </summary>
public FormMonorailCollection(ILogger<FormMonorailCollection> logger)
{
InitializeComponent();
_storageCollection = new StorageCollection<DrawingMonorail>();
_logger = logger;
_logger.LogInformation("Форма загрузилась");
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ComboBoxSelectorCompany_SelectedIndexChanged(object sender, EventArgs e)
{
switch (comboBoxSelectorCompany.Text)
{
case "Хранилище":
_company = new DepotSharingService(pictureBox.Width, pictureBox.Height, new MassiveGenericObjects<DrawingMonorail>());
break;
}
}
private void ButtonAddMonorail_Click(object sender, EventArgs e)
{
FormMonorailConfig form = new FormMonorailConfig();
form.Show();
form.AddEventListener_Monorail(SetMonorail);
}
private void SetMonorail(DrawingMonorail monorail)
{
try
{
if (monorail == null || _company == null) return;
if (_company + monorail != -1)
{
MessageBox.Show("Объект добавлен");
pictureBox.Image = _company.Show();
_logger.LogInformation("Объект добавлен");
}
}
catch (Exception ex)
{
MessageBox.Show("Не удалось добавить объект");
Debug.WriteLine(ex.Message);
LogException(ex);
}
}
private void buttonRemoveMonorail_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrEmpty(maskedTextBox.Text) || _company == null) throw new Exception("Входные дынне пустые");
if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return;
int position = Convert.ToInt32(maskedTextBox.Text);
if (_company - position != null)
{
MessageBox.Show("Объект удален");
pictureBox.Image = _company.Show();
_logger.LogInformation("Объект удален");
}
}
catch (Exception ex)
{
MessageBox.Show("Не удалось удалить объект");
LogException(ex);
}
}
private void ButtonGoToCheck_Click(object sender, EventArgs e)
{
if (_company == null) return;
DrawingMonorail? monorail = null;
int coutner = 100;
while (monorail == null && coutner-- > 0)
{
monorail = _company.GetRandomObject();
}
if (monorail == null) return;
FormMonorail form = new FormMonorail()
{
SetMonorail = monorail
};
form.ShowDialog();
}
private void ButtonRefresh_Click(object sender, EventArgs e)
{
if (_company == null) return;
pictureBox.Image = _company.Show();
}
/// <summary>
/// Обновление списка в listBoxCollection
/// </summary>
private void RerfreshListBoxItems()
{
listBoxCollection.Items.Clear();
for (int i = 0; i < _storageCollection.Keys?.Count; ++i)
{
string? colName = _storageCollection.Keys?[i].Name;
if (!string.IsNullOrEmpty(colName))
{
listBoxCollection.Items.Add(colName);
}
}
}
/// <summary>
/// Добавление коллекции
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCollectionAdd_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrEmpty(textBoxCollectionName.Text) || (!radioButtonList.Checked && !radioButtonMassive.Checked))
{
MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
throw new Exception("Не все данные заполнены");
}
CollectionType collectionType = CollectionType.None;
if (radioButtonMassive.Checked)
{
collectionType = CollectionType.Massive;
}
else if (radioButtonList.Checked)
{
collectionType = CollectionType.List;
}
_storageCollection.AddCollection(textBoxCollectionName.Text, collectionType);
_logger.LogInformation("Коллекция добавлена " + textBoxCollectionName.Text);
RerfreshListBoxItems();
}
catch (Exception ex)
{
LogException(ex);
}
}
/// <summary>
/// Удаление коллекции
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCollectionDelete_Click(object sender, EventArgs e)
{
try
{
// TODO прописать логику удаления элемента из коллекции
// нужно убедиться, что есть выбранная коллекция
// спросить у пользователя через MessageBox, что он подтверждает, что хочет удалить запись
// удалить и обновить ListBox
if (listBoxCollection.SelectedItem == null || listBoxCollection.SelectedIndex < 0)
{
MessageBox.Show("Коллекция для удаления не выбрана");
return;
}
if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return;
_storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString());
_logger.LogInformation("Коллекция с название: " + listBoxCollection.SelectedItem.ToString() + " удалена");
RerfreshListBoxItems();
}
catch (Exception ex)
{
LogException(ex);
}
}
/// <summary>
/// Создание компании
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCreateCompany_Click(object sender, EventArgs e)
{
try
{
if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null)
{
MessageBox.Show("Коллекция не выбрана");
throw new Exception("Коллекция не выбрана");
}
ICollectionGenericObjects<DrawingMonorail>? collection =
_storageCollection[listBoxCollection.SelectedItem.ToString() ?? string.Empty];
if (collection == null)
{
MessageBox.Show("Коллекция не проинициализирована");
throw new Exception("Коллекция не проинициализирована");
}
switch (comboBoxSelectorCompany.Text)
{
case "Хранилище":
_company = new DepotSharingService(pictureBox.Width, pictureBox.Height, collection);
break;
}
panelCompanyTools.Enabled = true;
RerfreshListBoxItems();
}
catch (Exception ex)
{
LogException(ex);
}
}
/// <summary>
/// Обработка нажатия "Сохранения"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SaveToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
_storageCollection.SaveData(saveFileDialog.FileName);
MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
_logger.LogInformation("Сохранение прошло успешно в файл {filename}", saveFileDialog.FileName);
}
}
catch (Exception ex)
{
MessageBox.Show("Не сохранилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error);
LogException(ex);
}
}
/// <summary>
/// Обработка нажатия "Загрузки"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void LoadToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
_storageCollection.LoadData(openFileDialog.FileName);
MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
RerfreshListBoxItems();
_logger.LogInformation("Загрузка успешна завершена");
}
}
catch (Exception ex)
{
MessageBox.Show("Не загрузилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error);
LogException(ex);
}
}
private void LogException(Exception ex)
{
if (ex is CollectionOverflowException)
{
_logger.LogError("Ошибка {Message}", ((CollectionOverflowException)ex).Message);
}
else if (ex is FileEmptyException)
{
_logger.LogError("Ошибка {Message}", ((FileEmptyException)ex).Message);
}
else if (ex is FileDoesNotExistException)
{
_logger.LogError("Ошибка {Message}", ((FileDoesNotExistException)ex).Message);
}
else if (ex is ObjectNotFoundException)
{
_logger.LogError("Ошибка {Message}", ((ObjectNotFoundException)ex).Message);
}
else if (ex is PositionOutOfCollectionException)
{
_logger.LogError("Ошибка {Message}", ((PositionOutOfCollectionException)ex).Message);
}
else if (ex is ObjectIsEqualException)
{
_logger.LogError("Ошибка: {Message}", ex.Message);
}
else
{
_logger.LogError("Ошибка {Message}", ex.Message);
}
}
private void buttonSortByType_Click(object sender, EventArgs e)
{
CompareMonorail(new DrawningMonorailCompareByType());
}
private void buttonByColor_Click(object sender, EventArgs e)
{
CompareMonorail(new DrawningMonorailCompareByColor());
}
private void CompareMonorail(IComparer<DrawingMonorail?> comparer)
{
if (_company == null)
{
return;
}
_company.Sort(comparer);
pictureBox.Image = _company.Show();
}
}
}