using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ContainerShip.MovementStrategy; using ContainerShip.DrawningObjects; namespace ContainerShip.Generic { internal class ShipsGenericStorage { private static readonly char _separatorForKeyValue = '|'; private readonly char _separatorRecords = ';'; private static readonly char _separatorForObject = ':'; readonly Dictionary> _shipStorages; public List Keys => _shipStorages.Keys.ToList(); private readonly int _pictureWidth; private readonly int _pictureHeight; public ShipsGenericStorage(int pictureWidth, int pictureHeight) { _shipStorages = new Dictionary>(); _pictureWidth = pictureWidth; _pictureHeight = pictureHeight; } public void AddSet(string name) { foreach (string nameStorage in Keys) { if (nameStorage == name) { MessageBox.Show("Набор с заданным именем уже существует", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } _shipStorages.Add(name, new ShipsGenericCollection(_pictureWidth, _pictureHeight)); } public void DelSet(string name) { if (_shipStorages.ContainsKey(name)) { _shipStorages.Remove(name); } } public bool SaveData(string filename) { if (File.Exists(filename)) { File.Delete(filename); } using (StreamWriter sw = File.CreateText(filename)) { sw.WriteLine($"ShipStorage"); foreach (var record in _shipStorages) { StringBuilder records = new(); foreach (DrawningShip? elem in record.Value.GetShip) { records.Append($"{elem?.GetDataForSave(_separatorForObject)}{_separatorRecords}"); } sw.WriteLine($"{record.Key}{_separatorForKeyValue}{records}"); } } return true; } public bool LoadData(string filename) { if (!File.Exists(filename)) { return false; } using (StreamReader sr = File.OpenText(filename)) { string? curLine = sr.ReadLine(); if (curLine == null || !curLine.Contains("ShipStorage")) { return false; } _shipStorages.Clear(); curLine = sr.ReadLine(); while (curLine != null) { string[] record = curLine.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries); ShipsGenericCollection collection = new(_pictureWidth, _pictureHeight); string[] set = record[1].Split(_separatorRecords, StringSplitOptions.RemoveEmptyEntries); foreach (string elem in set) { DrawningShip? ship = elem?.CreateDrawningShip(_separatorForObject, _pictureWidth, _pictureHeight); if (ship != null) { if (collection + ship == -1) { return false; } } } _shipStorages.Add(record[0], collection); curLine = sr.ReadLine(); } } return true; } public ShipsGenericCollection? this[string ind] { get { if (_shipStorages.ContainsKey(ind)) { return _shipStorages[ind]; } return null; } } } }