diff --git a/AccordionBus/AccordionBus/BusCollectionForm.Designer.cs b/AccordionBus/AccordionBus/BusCollectionForm.Designer.cs index 849a532..00731c4 100644 --- a/AccordionBus/AccordionBus/BusCollectionForm.Designer.cs +++ b/AccordionBus/AccordionBus/BusCollectionForm.Designer.cs @@ -39,8 +39,15 @@ buttonRemoveBus = new Button(); buttonAddBus = new Button(); labelTools = new Label(); + menuStrip = new MenuStrip(); + файлToolStripMenuItem = new ToolStripMenuItem(); + saveToolStripMenuItem = new ToolStripMenuItem(); + LoadToolStripMenuItem = new ToolStripMenuItem(); + openFileDialog = new OpenFileDialog(); + saveFileDialog = new SaveFileDialog(); ((System.ComponentModel.ISupportInitialize)pictureBoxCollection).BeginInit(); panelTools.SuspendLayout(); + menuStrip.SuspendLayout(); SuspendLayout(); // // pictureBoxCollection @@ -150,19 +157,64 @@ labelTools.TabIndex = 0; labelTools.Text = "Инструменты"; // + // menuStrip + // + menuStrip.Dock = DockStyle.None; + menuStrip.Items.AddRange(new ToolStripItem[] { файлToolStripMenuItem }); + menuStrip.Location = new Point(0, 0); + menuStrip.Name = "menuStrip"; + menuStrip.Size = new Size(176, 24); + menuStrip.TabIndex = 2; + menuStrip.Text = "menuStrip"; + // + // файлToolStripMenuItem + // + файлToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { saveToolStripMenuItem, LoadToolStripMenuItem }); + файлToolStripMenuItem.Name = "файлToolStripMenuItem"; + файлToolStripMenuItem.Size = new Size(48, 20); + файлToolStripMenuItem.Text = "Файл"; + // + // saveToolStripMenuItem + // + saveToolStripMenuItem.Name = "saveToolStripMenuItem"; + saveToolStripMenuItem.Size = new Size(180, 22); + saveToolStripMenuItem.Text = "Сохранение"; + saveToolStripMenuItem.Click += saveToolStripMenuItem_Click; + // + // LoadToolStripMenuItem + // + LoadToolStripMenuItem.Name = "LoadToolStripMenuItem"; + LoadToolStripMenuItem.Size = new Size(180, 22); + LoadToolStripMenuItem.Text = "Загрузка"; + LoadToolStripMenuItem.Click += LoadToolStripMenuItem_Click; + // + // openFileDialog + // + openFileDialog.FileName = "openFileDialog"; + openFileDialog.Filter = "txt file | *.txt"; + // + // saveFileDialog + // + saveFileDialog.Filter = "txt file | *.txt"; + // // BusCollectionForm // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(884, 461); + Controls.Add(menuStrip); Controls.Add(panelTools); Controls.Add(pictureBoxCollection); + MainMenuStrip = menuStrip; Name = "BusCollectionForm"; Text = "BusCollectionForm"; ((System.ComponentModel.ISupportInitialize)pictureBoxCollection).EndInit(); panelTools.ResumeLayout(false); panelTools.PerformLayout(); + menuStrip.ResumeLayout(false); + menuStrip.PerformLayout(); ResumeLayout(false); + PerformLayout(); } #endregion @@ -178,5 +230,11 @@ private Button buttonAddObject; private Button buttonDeleteObject; private ListBox listBoxStorages; + private MenuStrip menuStrip; + private ToolStripMenuItem файлToolStripMenuItem; + private ToolStripMenuItem saveToolStripMenuItem; + private ToolStripMenuItem LoadToolStripMenuItem; + private OpenFileDialog openFileDialog; + private SaveFileDialog saveFileDialog; } } \ No newline at end of file diff --git a/AccordionBus/AccordionBus/BusCollectionForm.cs b/AccordionBus/AccordionBus/BusCollectionForm.cs index 5534fd4..91f1579 100644 --- a/AccordionBus/AccordionBus/BusCollectionForm.cs +++ b/AccordionBus/AccordionBus/BusCollectionForm.cs @@ -191,5 +191,46 @@ namespace AccordionBus pictureBoxCollection.Image = obj.ShowBuses(); } + + /// + /// Обработка нажатия "Сохранение" + /// + /// + /// + private void saveToolStripMenuItem_Click(object sender, EventArgs e) + { + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + if (_storage.SaveData(saveFileDialog.FileName)) + { + MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show("Не удалось сохранить данные", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + /// + /// Обработка нажатия "Загрузка" + /// + /// + /// + private void LoadToolStripMenuItem_Click(object sender, EventArgs e) + { + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + if (_storage.LoadData(openFileDialog.FileName)) + { + ReloadObjects(); + MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show("Не удалось загрузить данные", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } } } diff --git a/AccordionBus/AccordionBus/BusCollectionForm.resx b/AccordionBus/AccordionBus/BusCollectionForm.resx index a395bff..bebf4d9 100644 --- a/AccordionBus/AccordionBus/BusCollectionForm.resx +++ b/AccordionBus/AccordionBus/BusCollectionForm.resx @@ -117,4 +117,13 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + + + 132, 17 + + + 265, 17 + \ No newline at end of file diff --git a/AccordionBus/AccordionBus/BusGenericCollection.cs b/AccordionBus/AccordionBus/BusGenericCollection.cs index f01a9c9..be771bd 100644 --- a/AccordionBus/AccordionBus/BusGenericCollection.cs +++ b/AccordionBus/AccordionBus/BusGenericCollection.cs @@ -42,6 +42,11 @@ namespace AccordionBus.Generics /// private readonly SetGeneric _collection; + /// + /// Получение объектов коллеции + /// + public IEnumerable GetBuses => _collection.GetBuses(); + /// /// Конструктор /// diff --git a/AccordionBus/AccordionBus/BusGenericStorage.cs b/AccordionBus/AccordionBus/BusGenericStorage.cs index 63634a1..56ce81d 100644 --- a/AccordionBus/AccordionBus/BusGenericStorage.cs +++ b/AccordionBus/AccordionBus/BusGenericStorage.cs @@ -34,6 +34,21 @@ namespace AccordionBus /// private readonly int _pictureHeight; + /// + /// Разделитель для записи ключа и значения элемента словаря + /// + private static readonly char _separatorForKeyValue = '|'; + + /// + /// Разделитель для записей коллекции данных в файл + /// + private readonly char _separatorRecords = ';'; + + /// + /// Разделитель для записи информации по объекту в файл + /// + private static readonly char _separatorForObject = ':'; + /// /// Конструктор /// @@ -88,5 +103,95 @@ namespace AccordionBus return null; } } + + /// + /// Сохранение информации по автобусам в хранилище в файл + /// + /// Путь и имя файла + /// true - сохранение прошло успешно, false - ошибка при сохранении данных + public bool SaveData(string filename) + { + if (File.Exists(filename)) + { + File.Delete(filename); + } + + StringBuilder data = new(); + foreach (KeyValuePair> record in _busStorages) + { + StringBuilder records = new(); + foreach (DrawingBus? elem in record.Value.GetBuses) + { + records.Append($"{elem?.GetDataForSave(_separatorForObject)}{_separatorRecords}"); + } + data.AppendLine($"{record.Key}{_separatorForKeyValue}{records}"); + } + + if (data.Length == 0) + { + return false; + } + + using (StreamWriter writer = new StreamWriter(filename)) + { + writer.Write($"BusStorage{Environment.NewLine}{data}"); + } + + return true; + } + + /// + /// Загрузка информации по автобусам в хранилище из файла + /// + /// Путь и имя файла + /// true - загрузка прошла успешно, false - ошибка при загрузке данных + public bool LoadData(string filename) + { + if (!File.Exists(filename)) + { + return false; + } + + using (StreamReader reader = new StreamReader(filename)) + { + string line = reader.ReadLine(); + if (line == null || line.Length == 0 || !line.StartsWith("BusStorage")) + { + // Если строка пустая + // Или если нет записи "BusStorage", то это не те данные + return false; + } + + _busStorages.Clear(); + + line = reader.ReadLine(); + while (line != null && line.Length != 0) + { + string[] record = line.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries); + if (record.Length != 2) + { + continue; + } + + BusGenericCollection collection = new(_pictureWidth, _pictureHeight); + string[] set = record[1].Split(_separatorRecords, StringSplitOptions.RemoveEmptyEntries); + foreach (string elem in set) + { + DrawingBus? bus = elem?.CreateDrawingBus(_separatorForObject, _pictureWidth, _pictureHeight); + if (bus != null) + { + if (collection + bus == -1) + { + return false; + } + } + } + _busStorages.Add(record[0], collection); + line = reader.ReadLine(); + } + } + + return true; + } } } diff --git a/AccordionBus/AccordionBus/ExtensionDrawingBus.cs b/AccordionBus/AccordionBus/ExtensionDrawingBus.cs new file mode 100644 index 0000000..dcff4d6 --- /dev/null +++ b/AccordionBus/AccordionBus/ExtensionDrawingBus.cs @@ -0,0 +1,69 @@ +using AccordionBus.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; + +namespace AccordionBus.Drawings +{ + /// + /// Расширение для класса EntityBus + /// + public static class ExtensionDrawingBus + { + /// + /// Создание объекта из строки + /// + /// Строка с данными для создания объекта + /// Разделитель данных + /// Ширина + /// Высота + /// Объект + public static DrawingBus? CreateDrawingBus(this string info, char separatorForObject, int width, int height) + { + string[] strs = info.Split(separatorForObject); + if (strs.Length == 3) + { + return new DrawingBus(Convert.ToInt32(strs[0]), + Convert.ToInt32(strs[1]), + Color.FromName(strs[2]), + width, height); + } + if (strs.Length == 6) + { + return new DrawingAccordionBus(Convert.ToInt32(strs[0]), + Convert.ToInt32(strs[1]), + Color.FromName(strs[2]), + Color.FromName(strs[3]), + Convert.ToBoolean(strs[4]), + Convert.ToBoolean(strs[5]), + width, height); + } + return null; + } + + /// + /// Получение данных для сохранения в файл + /// + /// Сохраняемый объект + /// Разделитель данных + /// Строка с данными по объекту + public static string GetDataForSave(this DrawingBus drawingBus, char separatorForObject) + { + var bus = drawingBus.EntityBus; + if (bus == null) + { + return string.Empty; + } + + var str = $"{bus.Speed}{separatorForObject}{bus.Weight}{separatorForObject}{bus.BodyColor.Name}"; + if (bus is not EntityAccordionBus accordionBus) + { + return str; + } + return $"{str}{separatorForObject}{accordionBus.AdditionalColor.Name}{separatorForObject}{accordionBus.AdditionalBody}{separatorForObject}{accordionBus.AdditionalDoor}"; + } + } +} diff --git a/AccordionBus/AccordionBus/SetGeneric.cs b/AccordionBus/AccordionBus/SetGeneric.cs index f46d2cc..8c07418 100644 --- a/AccordionBus/AccordionBus/SetGeneric.cs +++ b/AccordionBus/AccordionBus/SetGeneric.cs @@ -119,7 +119,7 @@ namespace AccordionBus.Generics /// public IEnumerable GetBuses(int? maxBuses = null) { - for (int i = 0; i < _maxCount; i++) + for (int i = 0; i < _places.Count; i++) { yield return _places[i]; if (maxBuses.HasValue && i == maxBuses.Value) diff --git a/data.txt b/data.txt new file mode 100644 index 0000000..535404e --- /dev/null +++ b/data.txt @@ -0,0 +1,3 @@ +BusStorage +0|100:100:Magenta:Blue:True:False;100:100:Yellow; +1|100:100:Yellow:Magenta:True:True;100:100:Blue;