diff --git a/Locomotive/Locomotive/FormMapWithSetLocomotives.cs b/Locomotive/Locomotive/FormMapWithSetLocomotives.cs index 69b44ff..a4d16e9 100644 --- a/Locomotive/Locomotive/FormMapWithSetLocomotives.cs +++ b/Locomotive/Locomotive/FormMapWithSetLocomotives.cs @@ -1,4 +1,6 @@ -using System; +using Serilog; +using Serilog.Formatting.Compact; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; @@ -21,6 +23,8 @@ namespace Locomotive }; /// Объект от коллекции карт private readonly MapsCollection _mapsCollection; + + /// Конструктор public FormMapWithSetLocomotives() { @@ -64,12 +68,14 @@ namespace Locomotive return; } _mapsCollection.AddMap(textBoxNewMapName.Text, _mapsDict[comboBoxSelectorMap.Text]); + Log.Information($"Map {textBoxNewMapName.Text} added"); ReloadMaps(); } /// Выбор карты private void listBoxMaps_SelectedIndexChanged(object sender, EventArgs e) { pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + Log.Information($"Map switched to {listBoxMaps.SelectedItem?.ToString() ?? string.Empty}"); } /// Удаление карты private void buttonDeleteMap_Click(object sender, EventArgs e) @@ -81,6 +87,7 @@ namespace Locomotive if (MessageBox.Show($"Delete map {listBoxMaps.SelectedItem}?","Deleting", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { _mapsCollection.DelMap(listBoxMaps.SelectedItem?.ToString() ?? string.Empty); + Log.Information($"Map {listBoxMaps.SelectedItem?.ToString() ?? string.Empty} deleted"); ReloadMaps(); } } @@ -99,15 +106,27 @@ namespace Locomotive return; } - if (_mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty] + new DrawningObjectLocomotive(locomotive) != -1) + try { - MessageBox.Show("Object added"); - pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); - } + if (_mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty] + new DrawningObjectLocomotive(locomotive) != -1) + { + MessageBox.Show("Object added"); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + Log.Information($"Object {locomotive} added"); + } - else + else + { + MessageBox.Show("Failed to add object"); + } + } + catch(StorageOverflowException ex) { - MessageBox.Show("Failed to add object"); + MessageBox.Show($"Storage overflow error: {ex.Message}"); + } + catch (Exception ex) + { + MessageBox.Show($"Unknown error: {ex.Message}"); } } @@ -128,15 +147,28 @@ namespace Locomotive return; } int pos = Convert.ToInt32(maskedTextBoxPosition.Text); - if (_mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty] - pos != null) + try { - MessageBox.Show("Object removed"); - pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + if (_mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty] - pos != null) + { + MessageBox.Show("Object removed"); + Log.Information($"Locomotive at {pos} deleted"); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + } + else + { + MessageBox.Show("Failed to remove object"); + } } - else + catch(LocomotiveNotFoundException ex) { - MessageBox.Show("Failed to remove object"); + MessageBox.Show($"Delete error: {ex.Message}"); } + catch (Exception ex) + { + MessageBox.Show($"Unknown error: {ex.Message}"); + } + } /// Вывод набора private void buttonShowStorage_Click(object sender, EventArgs e) @@ -190,13 +222,15 @@ namespace Locomotive { if (saveFileDialog.ShowDialog() == DialogResult.OK) { - if (_mapsCollection.SaveData(saveFileDialog.FileName)) + try { - MessageBox.Show("Saved successfully", "Result", MessageBoxButtons.OK, MessageBoxIcon.Information); + _mapsCollection.SaveData(saveFileDialog.FileName); + MessageBox.Show("Saving success", "Result", MessageBoxButtons.OK, MessageBoxIcon.Information); + Log.Information($"Saved to {saveFileDialog.FileName}"); } - else + catch (Exception ex) { - MessageBox.Show("Saving failed", "Result", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show($"Saving error: {ex.Message}", "Result",MessageBoxButtons.OK, MessageBoxIcon.Error); } } } @@ -205,16 +239,19 @@ namespace Locomotive { if (loadFileDialog.ShowDialog() == DialogResult.OK) { - if (_mapsCollection.LoadData(loadFileDialog.FileName)) + + try { + _mapsCollection.LoadData(loadFileDialog.FileName); MessageBox.Show("Loaded successfully", "Result", MessageBoxButtons.OK, MessageBoxIcon.Information); + Log.Information($"Loaded from {loadFileDialog.FileName}"); + ReloadMaps(); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); } - else + catch(Exception ex) { - MessageBox.Show("Loading failed", "Result", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show($"Loading failed + {ex.Message}", "Result", MessageBoxButtons.OK, MessageBoxIcon.Error); } - ReloadMaps(); - pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); } } } diff --git a/Locomotive/Locomotive/Locomotive.csproj b/Locomotive/Locomotive/Locomotive.csproj index 13ee123..4a08ebd 100644 --- a/Locomotive/Locomotive/Locomotive.csproj +++ b/Locomotive/Locomotive/Locomotive.csproj @@ -8,6 +8,13 @@ enable + + + + + + + True diff --git a/Locomotive/Locomotive/LocomotiveNotFoundException.cs b/Locomotive/Locomotive/LocomotiveNotFoundException.cs new file mode 100644 index 0000000..21333e6 --- /dev/null +++ b/Locomotive/Locomotive/LocomotiveNotFoundException.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Locomotive +{ + internal class LocomotiveNotFoundException : ApplicationException + { + public LocomotiveNotFoundException(int i) : base($"Не найден объект по позиции {i}") { } + public LocomotiveNotFoundException() : base() { } + public LocomotiveNotFoundException(string message) : base(message) { } + public LocomotiveNotFoundException(string message, Exception exception) : + base(message, exception) { } + protected LocomotiveNotFoundException(SerializationInfo info, StreamingContext context) : base(info, context) { } + } +} diff --git a/Locomotive/Locomotive/MapWithSetLocomotivesGeneric.cs b/Locomotive/Locomotive/MapWithSetLocomotivesGeneric.cs index f132ff7..f533023 100644 --- a/Locomotive/Locomotive/MapWithSetLocomotivesGeneric.cs +++ b/Locomotive/Locomotive/MapWithSetLocomotivesGeneric.cs @@ -15,9 +15,9 @@ namespace Locomotive /// Высота окна отрисовки private readonly int _pictureHeight; /// Размер занимаемого объектом места (ширина) - private readonly int _placeSizeWidth = 210; + private readonly int _placeSizeWidth = 150; /// Размер занимаемого объектом места (высота) - private readonly int _placeSizeHeight = 90; + private readonly int _placeSizeHeight = 150; /// Набор объектов private readonly SetLocomotivesGeneric _setLocomotives; /// Карта @@ -138,8 +138,8 @@ namespace Locomotive /// Метод прорисовки объектов private void DrawLocomotives(Graphics g) { - int width = _pictureWidth / _placeSizeWidth; - int height = _pictureHeight / _placeSizeHeight; + int width = _pictureWidth / _placeSizeWidth - 1; + int height = _pictureHeight / _placeSizeHeight - 1; int curWidth = 0; int curHeight = 0; @@ -147,7 +147,7 @@ namespace Locomotive foreach (var locomotive in _setLocomotives.GetLocomotives()) { // установка позиции - locomotive?.SetObject(curWidth * _placeSizeWidth + 10, curHeight * _placeSizeHeight + 15, _pictureWidth, _pictureHeight); + locomotive?.SetObject(curWidth * _placeSizeWidth + 10, curHeight * _placeSizeHeight + 80, _pictureWidth, _pictureHeight); locomotive?.DrawningObject(g); if (curWidth < width) curWidth++; else diff --git a/Locomotive/Locomotive/MapsCollection.cs b/Locomotive/Locomotive/MapsCollection.cs index a5cbd09..01faa30 100644 --- a/Locomotive/Locomotive/MapsCollection.cs +++ b/Locomotive/Locomotive/MapsCollection.cs @@ -1,4 +1,5 @@ -using System; +using Serilog; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -54,7 +55,7 @@ namespace Locomotive } /// Сохранение информации по локомотивам в хранилище в файл - public bool SaveData(string filename) + public void SaveData(string filename) { if (File.Exists(filename)) { @@ -72,14 +73,14 @@ namespace Locomotive ); } } - return true; } /// Загрузка нформации по локомотивам в депо из файла - public bool LoadData(string filename) + public void LoadData(string filename) { if (!File.Exists(filename)) { - return false; + Log.Warning($"FileNotFoundException {filename}"); + throw new FileNotFoundException("Файл не найден"); } using (FileStream fs = new(filename, FileMode.Open)) using (StreamReader sr = new StreamReader(fs, Encoding.UTF8)) @@ -88,7 +89,8 @@ namespace Locomotive if (!curLine.Contains("MapsCollection")) { - return false; + Log.Warning($"FileFormatException"); + throw new FileFormatException("Формат данных в файле неправильный"); } _mapStorages.Clear(); @@ -113,8 +115,6 @@ namespace Locomotive _mapStorages.Add(elems[0], new MapWithSetLocomotivesGeneric(_pictureWidth, _pictureHeight, map)); _mapStorages[elems[0]].LoadData(elems[2].Split(separatorData, StringSplitOptions.RemoveEmptyEntries)); } - - return true; } diff --git a/Locomotive/Locomotive/Program.cs b/Locomotive/Locomotive/Program.cs index ceb3e6a..3fee70d 100644 --- a/Locomotive/Locomotive/Program.cs +++ b/Locomotive/Locomotive/Program.cs @@ -1,3 +1,5 @@ +using Serilog; + namespace Locomotive { internal static class Program @@ -10,6 +12,9 @@ namespace Locomotive { // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. + + + Log.Logger = new LoggerConfiguration().WriteTo.File(new Serilog.Formatting.Compact.CompactJsonFormatter(), "C:\\secondCourse\\OOP\\ProjectLomotive\\Locomotive\\log.clef").CreateLogger(); ApplicationConfiguration.Initialize(); Application.Run(new FormMapWithSetLocomotives()); } diff --git a/Locomotive/Locomotive/SetLocomotivesGeneric.cs b/Locomotive/Locomotive/SetLocomotivesGeneric.cs index 342fd46..104b027 100644 --- a/Locomotive/Locomotive/SetLocomotivesGeneric.cs +++ b/Locomotive/Locomotive/SetLocomotivesGeneric.cs @@ -1,4 +1,5 @@ -using System; +using Serilog; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -30,7 +31,11 @@ namespace Locomotive /// Добавление объекта в набор на конкретную позицию public int Insert(T locomotive, int position) { - if (position >= _maxCount|| position < 0) return -1; + if (position < 0) return -1; + if (Count >= _maxCount) { + Log.Warning("StorageOverflowException"); + throw new StorageOverflowException(_maxCount); + } _places.Insert(position, locomotive); return position; @@ -39,8 +44,13 @@ namespace Locomotive public T Remove(int position) { if (position >= _maxCount || position < 0) return null; + if (_places[position] is null) + { + Log.Warning($"LocomotiveNotFoundException at {position}"); + throw new LocomotiveNotFoundException(position); + } T result = _places[position]; - _places.RemoveAt(position); + _places[position] = null; return result; } // Индексатор @@ -61,15 +71,9 @@ namespace Locomotive public IEnumerable GetLocomotives() { foreach (var locomotive in _places) - { - if (locomotive != null) - { - yield return locomotive; - } - else - { - yield break; - } + { + yield return locomotive; + } } } diff --git a/Locomotive/Locomotive/StorageOverflowException.cs b/Locomotive/Locomotive/StorageOverflowException.cs new file mode 100644 index 0000000..0aa497f --- /dev/null +++ b/Locomotive/Locomotive/StorageOverflowException.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Locomotive +{ + internal class StorageOverflowException : ApplicationException + { + public StorageOverflowException(int count) : base($"В наборе превышено допустимое количество: {count}") { } + public StorageOverflowException() : base() { } + public StorageOverflowException(string message) : base(message) { } + public StorageOverflowException(string message, Exception exception) : + base(message, exception) { } + protected StorageOverflowException(SerializationInfo info, StreamingContext context) : base(info, context) { } + + } +}