using System; using System.Collections.Generic; using Microsoft.Extensions.Logging; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Sailboat { public partial class FormMapWithSetBoats : Form { private readonly Dictionary _mapsDict = new Dictionary() { { "Простая карта", new SimpleMap() }, { "Водная карта", new WaterMap() } }; private readonly MapsCollection _mapsCollection; private ILogger _logger; public FormMapWithSetBoats(ILogger logger) { InitializeComponent(); _logger = logger; _mapsCollection = new MapsCollection(pictureBox.Width, pictureBox.Height); comboBoxMapSelector.Items.Clear(); foreach (var item in _mapsDict) { comboBoxMapSelector.Items.Add(item.Key); } } private void ReloadMaps() { int index = listBoxMaps.SelectedIndex; listBoxMaps.Items.Clear(); for (int i = 0; i < _mapsCollection.Keys.Count; i++) { listBoxMaps.Items.Add(_mapsCollection.Keys[i]); } if (listBoxMaps.Items.Count > 0 && (index == -1 || index >= listBoxMaps.Items.Count)) { listBoxMaps.SelectedIndex = 0; } else if (listBoxMaps.Items.Count > 0 && index > -1 && index < listBoxMaps.Items.Count) { listBoxMaps.SelectedIndex = index; } } private void btn_add_boat_Click(object sender, EventArgs e) { var formBoatConfig = new FormBoatConfig(); formBoatConfig.AddEvent(InsertBoatCheck); formBoatConfig.Show(); } private void btn_remove_boat_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(maskedTextBoxPosition.Text)) { return; } if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) { return; } int pos = Convert.ToInt32(maskedTextBoxPosition.Text); try { var deletedBoat = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty] - pos; if (deletedBoat != null) { MessageBox.Show("Объект удален"); _logger.LogInformation("Из текущей карты удалён объект {@Tanker}", deletedBoat); pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); } else { _logger.LogWarning("Не удалось удалить объект по позиции {0}. Объект равен null", pos); MessageBox.Show("Не удалось удалить объект"); } } catch (BoatNotFoundException ex) { _logger.LogWarning("Ошибка удаления: {0}", ex.Message); MessageBox.Show($"Ошибка удаления: {ex.Message}"); } catch (Exception ex) { _logger.LogWarning("Неизвестная ошибка удаления: {0}", ex.Message); MessageBox.Show($"Неизвестная ошибка: {ex.Message}"); } } private void btn_show_storage_Click(object sender, EventArgs e) { if (listBoxMaps.SelectedIndex == -1) { return; } pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); } private void btn_show_map_Click(object sender, EventArgs e) { if (listBoxMaps.SelectedIndex == -1) { return; } pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowOnMap(); } private void btn_move_Click(object sender, EventArgs e) { if (listBoxMaps.SelectedIndex == -1) { return; } string name = ((Button)sender)?.Name ?? string.Empty; Direction dir = Direction.None; switch (name) { case "btn_up": dir = Direction.Up; break; case "btn_down": dir = Direction.Down; break; case "btn_left": dir = Direction.Left; break; case "btn_right": dir = Direction.Right; break; } pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].MoveObject(dir); } private void btn_add_map_Click(object sender, EventArgs e) { if (comboBoxMapSelector.SelectedIndex == -1 || string.IsNullOrEmpty(textBoxNewMapName.Text)) { MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); _logger.LogWarning("При добавлении карты {0}", comboBoxMapSelector.SelectedIndex == -1 ? "Не была выбрана карта" : "Не была названа карта"); return; } if (!_mapsDict.ContainsKey(comboBoxMapSelector.Text)) { MessageBox.Show("Нет такой карты", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); _logger.LogWarning("Отсутствует карта с типом {0}", comboBoxMapSelector.Text); return; } _mapsCollection.AddMap(textBoxNewMapName.Text, _mapsDict[comboBoxMapSelector.Text]); ReloadMaps(); _logger.LogInformation($"Добавлена карта: {textBoxNewMapName.Text}"); } private void listBoxMaps_SelectedIndexChanged(object sender, EventArgs e) { pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); _logger.LogInformation("Осуществлён переход на карту под названием {0}", listBoxMaps.SelectedItem?.ToString() ?? string.Empty); } private void btn_delete_map_Click(object sender, EventArgs e) { if (listBoxMaps.SelectedIndex == -1) { return; } if (MessageBox.Show($"Удалить карту {listBoxMaps.SelectedItem}?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { _logger.LogInformation("Удалена карта {0}", listBoxMaps.SelectedItem?.ToString() ?? string.Empty); _mapsCollection.DelMap(listBoxMaps.SelectedItem?.ToString() ?? string.Empty); ReloadMaps(); } } private void InsertBoatCheck(DrawingBoat _boat) { try { if (listBoxMaps.SelectedIndex == -1) { return; } DrawingObjectBoat boat = new(_boat); if (_mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty] + boat >= 0) { MessageBox.Show("Объект добавлен"); _logger.LogInformation("Добавлен объект {@Tanker}", _boat); pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); } else { MessageBox.Show("Не удалось добавить объект"); _logger.LogWarning("Не удалось добавить объект"); } } catch (StorageOverflowException ex) { _logger.LogWarning("Ошибка, переполнение хранилища :{0}", ex.Message); MessageBox.Show($"Ошибка хранилище переполнено: {ex.Message}", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void SaveToolStripMenuItem_Click(object sender, EventArgs e) { if (saveFileDialog.ShowDialog() == DialogResult.OK) { try { _mapsCollection.SaveData(saveFileDialog.FileName); _logger.LogInformation("Сохранение прошло успешно. Расположение файла: {0}", saveFileDialog.FileName); MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { MessageBox.Show($"Не сохранилось:{ex.Message}", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); _logger.LogWarning("Не удалось сохранить файл '{0}'. Текст ошибки: {1}", saveFileDialog.FileName, ex.Message); } } } private void LoadToolStripMenuItem_Click(object sender, EventArgs e) { if (openFileDialog.ShowDialog() == DialogResult.OK) { try { _mapsCollection.LoadData(openFileDialog.FileName); _logger.LogInformation("Загрузка данных из файла '{0}' прошла успешно", openFileDialog.FileName); ReloadMaps(); MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { _logger.LogWarning("Не удалось загрузить файл '{0}'. Текст ошибки: {1}", openFileDialog.FileName, ex.Message); MessageBox.Show($"Не загрузилось:{ex.Message}", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } private void buttonSortByType_Click(object sender, EventArgs e) { if (listBoxMaps.SelectedIndex == -1) { return; } _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].Sort(new BoatCompareByType()); pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); } private void buttonSortByColor_Click(object sender, EventArgs e) { if (listBoxMaps.SelectedIndex == -1) { return; } _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].Sort(new BoatCompareByColor()); pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); } } }