diff --git a/ElectricLocomotive/ElectricLocomotive/ExtentionLocomotive.cs b/ElectricLocomotive/ElectricLocomotive/ExtentionLocomotive.cs new file mode 100644 index 0000000..5218aba --- /dev/null +++ b/ElectricLocomotive/ElectricLocomotive/ExtentionLocomotive.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ProjectElectricLocomotive.Entities; + +namespace ProjectElectricLocomotive.DrawingObjects +{ + public static class ExtentionLocomotive + { + /// + /// Создание объекта из строки + /// + /// Строка с данными для создания объекта + /// Разделитель даннных + /// Ширина + /// Высота + /// Объект + public static DrawingLocomotive? CreateDrawningLocomotive(this string info, char + separatorForObject, int width, int height) + { + string[] strs = info.Split(separatorForObject); + if (strs.Length == 3) + { + return new DrawingLocomotive(Convert.ToInt32(strs[0]), + Convert.ToInt32(strs[1]), + Color.FromName(strs[2]), width, height); + } + if (strs.Length == 6) + { + return new DrawingElectricLocomotive(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 DrawingLocomotive drawningCar, char separatorForObject) + { + var loco = drawningCar.EntityLocomotive; + if (loco == null) + { + return string.Empty; + } + var str = + $"{loco.Speed}{separatorForObject}{loco.Weight}{separatorForObject}{loco.BodyColor.Name}"; + if (loco is not EntityElectricLocomotive electricLocomotive) + { + return str; + } + return + $"{str}{separatorForObject}{electricLocomotive.AdditionalColor.Name}{separatorForObject}{electricLocomotive.Pantograph}{separatorForObject}{electricLocomotive.Compartment}"; + } + } +} diff --git a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.Designer.cs b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.Designer.cs index 1b467de..9a18fb5 100644 --- a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.Designer.cs +++ b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.Designer.cs @@ -28,49 +28,40 @@ /// private void InitializeComponent() { - panelLocomotiveCollection = new Panel(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormLocomotiveCollection)); groupBoxSets = new GroupBox(); textBoxSetName = new TextBox(); buttonDeleteSet = new Button(); listBoxStorages = new ListBox(); buttonAddSet = new Button(); - LabelOnPanel = new Label(); maskedTextBoxNumber = new MaskedTextBox(); ButtonRefreshCollection = new Button(); ButtonRemoveLocomotive = new Button(); ButtonAddLocomotive = new Button(); pictureBoxCollection = new PictureBox(); - panelLocomotiveCollection.SuspendLayout(); + menuStrip = new MenuStrip(); + файлToolStripMenuItem = new ToolStripMenuItem(); + LoadToolStripMenuItem = new ToolStripMenuItem(); + SaveToolStripMenuItem = new ToolStripMenuItem(); + saveFileDialog = new SaveFileDialog(); + openFileDialog = new OpenFileDialog(); + groupBoxMenu = new GroupBox(); groupBoxSets.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)pictureBoxCollection).BeginInit(); + menuStrip.SuspendLayout(); + groupBoxMenu.SuspendLayout(); SuspendLayout(); // - // panelLocomotiveCollection - // - panelLocomotiveCollection.AccessibleDescription = ""; - panelLocomotiveCollection.AccessibleName = ""; - panelLocomotiveCollection.Controls.Add(groupBoxSets); - panelLocomotiveCollection.Controls.Add(LabelOnPanel); - panelLocomotiveCollection.Controls.Add(maskedTextBoxNumber); - panelLocomotiveCollection.Controls.Add(ButtonRefreshCollection); - panelLocomotiveCollection.Controls.Add(ButtonRemoveLocomotive); - panelLocomotiveCollection.Controls.Add(ButtonAddLocomotive); - panelLocomotiveCollection.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); - panelLocomotiveCollection.Location = new Point(660, 2); - panelLocomotiveCollection.Name = "panelLocomotiveCollection"; - panelLocomotiveCollection.Size = new Size(248, 584); - panelLocomotiveCollection.TabIndex = 0; - panelLocomotiveCollection.Tag = "Инструменты"; - // // groupBoxSets // groupBoxSets.Controls.Add(textBoxSetName); groupBoxSets.Controls.Add(buttonDeleteSet); groupBoxSets.Controls.Add(listBoxStorages); + groupBoxSets.Controls.Add(ButtonAddLocomotive); groupBoxSets.Controls.Add(buttonAddSet); - groupBoxSets.Location = new Point(3, 15); + groupBoxSets.Location = new Point(0, 22); groupBoxSets.Name = "groupBoxSets"; - groupBoxSets.Size = new Size(242, 324); + groupBoxSets.Size = new Size(242, 314); groupBoxSets.TabIndex = 5; groupBoxSets.TabStop = false; groupBoxSets.Text = "Наборы"; @@ -112,27 +103,18 @@ buttonAddSet.UseVisualStyleBackColor = true; buttonAddSet.Click += buttonAddSet_Click; // - // LabelOnPanel - // - LabelOnPanel.AutoSize = true; - LabelOnPanel.Location = new Point(3, -3); - LabelOnPanel.Name = "LabelOnPanel"; - LabelOnPanel.Size = new Size(83, 15); - LabelOnPanel.TabIndex = 4; - LabelOnPanel.Text = "Инструменты"; - // // maskedTextBoxNumber // - maskedTextBoxNumber.Location = new Point(35, 408); + maskedTextBoxNumber.Location = new Point(6, 342); maskedTextBoxNumber.Name = "maskedTextBoxNumber"; - maskedTextBoxNumber.Size = new Size(176, 23); + maskedTextBoxNumber.Size = new Size(226, 23); maskedTextBoxNumber.TabIndex = 3; // // ButtonRefreshCollection // - ButtonRefreshCollection.Location = new Point(3, 530); + ButtonRefreshCollection.Location = new Point(6, 440); ButtonRefreshCollection.Name = "ButtonRefreshCollection"; - ButtonRefreshCollection.Size = new Size(242, 43); + ButtonRefreshCollection.Size = new Size(230, 43); ButtonRefreshCollection.TabIndex = 2; ButtonRefreshCollection.Text = " Обновить коллекцию"; ButtonRefreshCollection.UseVisualStyleBackColor = true; @@ -140,9 +122,9 @@ // // ButtonRemoveLocomotive // - ButtonRemoveLocomotive.Location = new Point(3, 460); + ButtonRemoveLocomotive.Location = new Point(6, 388); ButtonRemoveLocomotive.Name = "ButtonRemoveLocomotive"; - ButtonRemoveLocomotive.Size = new Size(242, 39); + ButtonRemoveLocomotive.Size = new Size(230, 39); ButtonRemoveLocomotive.TabIndex = 1; ButtonRemoveLocomotive.Text = "Удалить локомотив"; ButtonRemoveLocomotive.UseVisualStyleBackColor = true; @@ -150,9 +132,9 @@ // // ButtonAddLocomotive // - ButtonAddLocomotive.Location = new Point(3, 345); + ButtonAddLocomotive.Location = new Point(6, 269); ButtonAddLocomotive.Name = "ButtonAddLocomotive"; - ButtonAddLocomotive.Size = new Size(242, 39); + ButtonAddLocomotive.Size = new Size(226, 39); ButtonAddLocomotive.TabIndex = 0; ButtonAddLocomotive.Text = "Добавить локомотив"; ButtonAddLocomotive.UseVisualStyleBackColor = true; @@ -160,41 +142,110 @@ // // pictureBoxCollection // - pictureBoxCollection.Location = new Point(2, 2); + pictureBoxCollection.Location = new Point(6, 24); pictureBoxCollection.Name = "pictureBoxCollection"; - pictureBoxCollection.Size = new Size(655, 584); + pictureBoxCollection.Size = new Size(655, 560); + pictureBoxCollection.SizeMode = PictureBoxSizeMode.AutoSize; pictureBoxCollection.TabIndex = 1; pictureBoxCollection.TabStop = false; // + // menuStrip + // + menuStrip.BackColor = SystemColors.ButtonFace; + menuStrip.Items.AddRange(new ToolStripItem[] { файлToolStripMenuItem }); + menuStrip.Location = new Point(0, 0); + menuStrip.Name = "menuStrip"; + menuStrip.Size = new Size(909, 24); + menuStrip.TabIndex = 2; + menuStrip.Text = "menuStrip1"; + // + // файлToolStripMenuItem + // + файлToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { LoadToolStripMenuItem, SaveToolStripMenuItem }); + файлToolStripMenuItem.Name = "файлToolStripMenuItem"; + файлToolStripMenuItem.Size = new Size(48, 20); + файлToolStripMenuItem.Text = "&Файл"; + // + // LoadToolStripMenuItem + // + LoadToolStripMenuItem.Image = (Image)resources.GetObject("LoadToolStripMenuItem.Image"); + LoadToolStripMenuItem.ImageTransparentColor = Color.Magenta; + LoadToolStripMenuItem.Name = "LoadToolStripMenuItem"; + LoadToolStripMenuItem.Size = new Size(141, 22); + LoadToolStripMenuItem.Text = "Загрузка"; + LoadToolStripMenuItem.Click += LoadToolStripMenuItem_Click; + // + // SaveToolStripMenuItem + // + SaveToolStripMenuItem.Image = (Image)resources.GetObject("SaveToolStripMenuItem.Image"); + SaveToolStripMenuItem.ImageTransparentColor = Color.Magenta; + SaveToolStripMenuItem.Name = "SaveToolStripMenuItem"; + SaveToolStripMenuItem.Size = new Size(141, 22); + SaveToolStripMenuItem.Text = "Сохранение"; + SaveToolStripMenuItem.Click += SaveToolStripMenuItem_Click; + // + // saveFileDialog + // + saveFileDialog.Filter = "txt file | *.txt"; + // + // openFileDialog + // + openFileDialog.FileName = "openFileDialog1"; + // + // groupBoxMenu + // + groupBoxMenu.AutoSize = true; + groupBoxMenu.Controls.Add(maskedTextBoxNumber); + groupBoxMenu.Controls.Add(groupBoxSets); + groupBoxMenu.Controls.Add(ButtonRemoveLocomotive); + groupBoxMenu.Controls.Add(ButtonRefreshCollection); + groupBoxMenu.Dock = DockStyle.Right; + groupBoxMenu.Location = new Point(661, 24); + groupBoxMenu.Name = "groupBoxMenu"; + groupBoxMenu.Size = new Size(248, 563); + groupBoxMenu.TabIndex = 6; + groupBoxMenu.TabStop = false; + groupBoxMenu.Text = "Инструменты"; + // // FormLocomotiveCollection // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(909, 587); + Controls.Add(groupBoxMenu); + Controls.Add(menuStrip); Controls.Add(pictureBoxCollection); - Controls.Add(panelLocomotiveCollection); + MainMenuStrip = menuStrip; Name = "FormLocomotiveCollection"; Text = "Набор локомотивов"; - panelLocomotiveCollection.ResumeLayout(false); - panelLocomotiveCollection.PerformLayout(); groupBoxSets.ResumeLayout(false); groupBoxSets.PerformLayout(); ((System.ComponentModel.ISupportInitialize)pictureBoxCollection).EndInit(); + menuStrip.ResumeLayout(false); + menuStrip.PerformLayout(); + groupBoxMenu.ResumeLayout(false); + groupBoxMenu.PerformLayout(); ResumeLayout(false); + PerformLayout(); } - #endregion - private Panel panelLocomotiveCollection; + #endregion private Button ButtonAddLocomotive; private Button ButtonRemoveLocomotive; private Button ButtonRefreshCollection; private PictureBox pictureBoxCollection; private MaskedTextBox maskedTextBoxNumber; - private Label LabelOnPanel; private GroupBox groupBoxSets; private Button buttonDeleteSet; private ListBox listBoxStorages; private Button buttonAddSet; private TextBox textBoxSetName; + private MenuStrip menuStrip; + private SaveFileDialog saveFileDialog; + private OpenFileDialog openFileDialog; + private ToolStripMenuItem файлToolStripMenuItem; + private ToolStripMenuItem LoadToolStripMenuItem; + private ToolStripMenuItem SaveToolStripMenuItem; + private GroupBox groupBoxMenu; } } \ No newline at end of file diff --git a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.cs b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.cs index 9f5fe1d..049c631 100644 --- a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.cs +++ b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.cs @@ -132,5 +132,48 @@ namespace ProjectElectricLocomotive ReloadObjects(); } } + /// + /// Обработка нажатия "Сохранение" + /// + /// + /// + 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)) + { + MessageBox.Show("Загрузка завершена!", "Result", MessageBoxButtons.OK, MessageBoxIcon.Information); + ReloadObjects(); + } + else + { + MessageBox.Show("Ошибка загрузки!", "Result", MessageBoxButtons.OK, MessageBoxIcon.Error); + + } + } + } } } + diff --git a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.resx b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.resx index af32865..2cb4710 100644 --- a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.resx +++ b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.resx @@ -117,4 +117,37 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 19, 13 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFUSURBVDhPlZK9SgNBFIXnCcQnkLyA4CPkHayFdBY22mqj + paVlxCKCoBaClUQLESNRC4OE4EKQrAbcYBKy62Z/ynHOzUwcMzuyDhzYGc795tw7y2ZXFEVLSZI8p2la + kkf5lywO1vZr/MH54LkhwlgQKsZxvC4AfHHjjM+tHOaDiKIKiqDqk0s6rbUJoCDCsy3t5kJh+bJFZrZ8 + YGhh9ZjgSIeUUgVZPgHot2HfGwbTNu4aTf75UuW+50wVhSMAKwRwugO6aevokYohfQbDzj1/vdj8pffb + PfJREpUAEPSOvXoFBdSFBIDgmxIgTr3lEkRPYZMOwDwYDtzrXToATPVp06B9QwB8o4YAipjVr02dqx0T + gOHMGm3qNc8nL6EAX33XMP2l8cj7mQEOvMaJYbKpWy/zMAzf6BVE9ADF6CnLnCXMCn8mAUSMEiCYwX/k + +/48Y4x9AwxhsnXBwZZBAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABzSURBVDhPY/j69WvDt2/f/pODQXoZQIyYCfv+MwTPIQmD + 9ID0gg3ApoAYjGHAh/cficLD2QBS8SA1AJufkTGyWtoagM5HFwdhmAEfkPMCukJkzcjiIAw24MuXLwbI + hqArRNaMLA7CYANAAGYISIA0/O0/AID67ECmnhNDAAAAAElFTkSuQmCC + + + + 134, 11 + + + 269, 13 + + + 25 + \ No newline at end of file diff --git a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveConfig.Designer.cs b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveConfig.Designer.cs index f851898..4fa6470 100644 --- a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveConfig.Designer.cs +++ b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveConfig.Designer.cs @@ -186,7 +186,7 @@ // panelColorGreen // panelColorGreen.AllowDrop = true; - panelColorGreen.BackColor = Color.FromArgb(0, 192, 0); + panelColorGreen.BackColor = Color.Green; panelColorGreen.Location = new Point(87, 28); panelColorGreen.Name = "panelColorGreen"; panelColorGreen.Size = new Size(50, 50); diff --git a/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericCollection.cs b/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericCollection.cs index 51de520..4ff16df 100644 --- a/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericCollection.cs +++ b/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericCollection.cs @@ -87,5 +87,9 @@ namespace ProjectElectricLocomotive.Generics } } } + /// + /// Получение объектов коллекции + /// + public IEnumerable GetLocomotives => _collection.GetLocomotives(); } } diff --git a/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericStorage.cs b/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericStorage.cs index f29cdff..0c46d87 100644 --- a/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericStorage.cs +++ b/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericStorage.cs @@ -1,5 +1,4 @@ using ProjectElectricLocomotive.DrawingObjects; -using ProjectElectricLocomotive.Generics; using ProjectElectricLocomotive.MovementStrategy; using System; using System.Collections.Generic; @@ -7,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace ProjectElectricLocomotive +namespace ProjectElectricLocomotive.Generics { internal class LocomotivesGenericStorage { @@ -20,6 +19,18 @@ namespace ProjectElectricLocomotive /// Возвращение списка названий наборов /// public List Keys => _locomotivesStorage.Keys.ToList(); + /// + /// Разделитель для записи ключа и значения элемента словаря + /// + private static readonly char _separatorForKeyValue = '|'; + /// + /// Разделитель для записей коллекции данных в файл + /// + private readonly char _separatorRecords = ';'; + /// + /// Разделитель для записи информации по объекту в файл + /// + private static readonly char _separatorForObject = ':'; private readonly int _pictureWidth; @@ -79,5 +90,101 @@ namespace ProjectElectricLocomotive return null; } } + /// + /// Сохранение информации по автомобилям в хранилище в файл + /// + /// Путь и имя файла + /// true - сохранение прошло успешно, false - ошибка при сохранении данных + public bool SaveData(string filename) + { + if (File.Exists(filename)) + { + File.Delete(filename); + } + StringBuilder data = new(); + foreach (KeyValuePair> record in _locomotivesStorage) + { + StringBuilder records = new(); + foreach (DrawingLocomotive? elem in record.Value.GetLocomotives) + { + records.Append($"{elem?.GetDataForSave(_separatorForObject)}{_separatorRecords}"); + } + data.AppendLine($"{record.Key}{_separatorForKeyValue}{records}"); + } + if (data.Length == 0) + { + return false; + } + using StreamWriter fs = new StreamWriter(filename); + { + fs.WriteLine($"LocomotiveStorage{Environment.NewLine}"); + fs.WriteLine(data); + } + return true; + } + /// + /// Загрузка информации по автомобилям в хранилище из файла + /// + /// Путь и имя файла + /// true - загрузка прошла успешно, false - ошибка при загрузке данных + public bool LoadData(string filename) + { + if (!File.Exists(filename)) + { + return false; + } + + using (StreamReader fs = File.OpenText(filename)) + { + + string str = fs.ReadLine(); + + if (str == null || str.Length == 0) + { + return false; + } + + if (!str.StartsWith("LocomotiveStorage")) + { + //если нет такой записи, то это не те данные + return false; + } + + _locomotivesStorage.Clear(); + string strs = ""; + + + while ((strs = fs.ReadLine()) != null) + { + + if (strs == null) + { + return false; + } + + string[] record = strs.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries); + if (record.Length != 2) + { + continue; + } + LocomotivesGenericCollection collection = new(_pictureWidth, _pictureHeight); + string[] set = record[1].Split(_separatorRecords, StringSplitOptions.RemoveEmptyEntries); + foreach (string elem in set) + { + DrawingLocomotive? loco = elem?.CreateDrawningLocomotive(_separatorForObject, _pictureWidth, _pictureHeight); + if (loco != null) + { + if ((collection + loco) == -1) + { + return false; + } + } + } + _locomotivesStorage.Add(record[0], collection); + } + return true; + } + } } } +