13 Commits
Lab2 ... Lab8

Author SHA1 Message Date
a67ca743c6 result 2024-06-17 09:44:23 +04:00
7fc6a50c1b comparer & sorting 2024-06-16 23:08:52 +04:00
9c904ea947 In process : wasn't checked [!] 2024-06-16 21:39:45 +04:00
5071187623 logging 2024-06-16 19:46:37 +04:00
7f58bbb1ad In process : solve log problem & add left exceptions 2024-06-15 23:48:53 +04:00
f575f977b0 files and streams 2024-06-15 18:06:35 +04:00
86e57edbc8 In process : fix loading from txt 2024-06-15 13:28:42 +04:00
f3a64bc617 delegates 2024-06-15 10:03:23 +04:00
f52c0fc2ca In process : make helicopter non-default 2024-06-15 09:53:32 +04:00
0498d0da74 collections 2024-06-15 09:05:36 +04:00
b822f2ef79 In process : connect buttons, list-&-text boxes 2024-06-13 13:58:43 +04:00
a6ff38c3e4 polymorphism 2024-06-13 10:57:01 +04:00
8733297af1 In Process : check array and add list implementation 2024-06-13 00:05:05 +04:00
31 changed files with 2464 additions and 37 deletions

View File

@@ -0,0 +1,84 @@
using ProjectCruiser.DrawningSamples;
namespace ProjectCruiser.CollectionGenericObj;
/// Абстракция компании, хранящий коллекцию автомобилей
/// </summary>
public abstract class AbstractCompany
{
// Размеры места
protected readonly int _placeSizeWidth = 312; // ширина
protected readonly int _placeSizeHeight = 56; // высота
// Ширина окна
protected readonly int _pictureWidth;
// Высота окна
protected readonly int _pictureHeight;
// Коллекция автомобилей
protected ICollectionGenObj<DrawningBase>? _collection = null;
private int GetMaxCount => (_pictureWidth / (_placeSizeWidth + 20))
* ( _pictureHeight / (_placeSizeHeight + 4));
public AbstractCompany(int picWidth, int picHeight,
ICollectionGenObj<DrawningBase>? collection)
{
_pictureWidth = picWidth;
_pictureHeight = picHeight;
_collection = collection;
_collection.MaxCount = GetMaxCount;
}
// Перегрузка оператора сложения для класса
public static int operator +(AbstractCompany company,
DrawningBase transport) => company._collection.Insert(transport, new DrawiningShipEqutables());
// Перегрузка оператора удаления для класса
public static DrawningBase operator -(AbstractCompany company,
int pos) => company._collection?.Remove(pos);
// Сортировка ----------------------------------------------------------- [!]
public void Sort(IComparer<DrawningBase?> comparer) =>
_collection?.CollectionSort(comparer);
// Получение случайного объекта из коллекции
public DrawningBase? GetRandomObject()
{
Random rnd = new();
return _collection?.GetItem(rnd.Next(GetMaxCount));
}
// Вывод всей коллекции
public Bitmap? Show()
{
Bitmap bitmap = new(_pictureWidth, _pictureHeight);
Graphics graphics = Graphics.FromImage(bitmap);
DrawBackground(graphics);
SetObjectsPosition(_collection.Count - 1);
for (int i = 0; i < (_collection?.Count ?? 0); i++)
{
// try
// {
DrawningBase? obj = _collection?.GetItem(i);
obj?.DrawTransport(graphics);
// } catch (Exception ex)
// {
// Console.WriteLine(ex.Message);
// }
}
return bitmap;
}
// Вывод заднего фона
protected abstract void DrawBackground(Graphics g);
// Расстановка объектов
protected abstract void SetObjectsPosition(int border);
}

View File

@@ -0,0 +1,147 @@
using ProjectCruiser.DrawningSamples;
using ProjectCruiser.Exceptions;
namespace ProjectCruiser.CollectionGenericObj;
public class ArrayGenObj<T> : ICollectionGenObj<T>
where T : class
{
// Массив объектов, которые храним
private T?[] _collection;
// Максимально допустимое число объектов в массиве
private int _maxCount;
public int Count => _collection.Count(s => (s != null));
public int MaxCount
{
get { return _maxCount; }
set
{
if (value > 0)
{
_maxCount = value;
if (_collection.Length == 0) _collection = new T?[value];
else Array.Resize(ref _collection, value);
}
}
}
public CollectionType GetCollectionType => CollectionType.Array;
public ArrayGenObj()
{
_collection = Array.Empty<T?>();
}
// methods :
public T? GetItem(int index)
{
if (index > _maxCount)
throw new CollectionOverflowException(index);
if (index < 0)
throw new PositionOutOfCollectionException(index);
if (_collection[index] == null)
throw new ObjectNotFoundException(index);
return _collection[index];
}
public int Insert(T? item, IEqualityComparer<DrawningBase?>? cmpr = null)
{
if (item == null) throw
new NullReferenceException("> Inserting item is null");
else
{
if (cmpr != null && item == cmpr)
{
throw new Exception();
}
}
// выход за границы, курируется CollectionOverflowException
if (Count >= _maxCount) throw new CollectionOverflowException(Count);
// any empty place -> fill immediately
for (int i = Count; i < _maxCount; i++)
{
if (_collection[i] == null)
{
_collection[i] = item;
return i;
}
}
return Count;
}
public int Insert(T? item, int index, IEqualityComparer<DrawningBase?>? cmpr = null)
{
if (index < 0 || index >= _maxCount) throw new PositionOutOfCollectionException(index);
if (Count >= _maxCount) throw new CollectionOverflowException(Count);
if (item == null) throw
new NullReferenceException("> Inserting item (at position) is null");
else
{
if (cmpr != null && item == cmpr)
{
throw new Exception();
}
}
if (_collection[index] == null)
{
_collection[index] = item;
return index;
}
else
{
int min_diff = 100, firstNullIndex = 100;
for (int i = 0; i < Count; i++)
{
if (_collection[i] == null && min_diff > Math.Abs(index - i))
{
min_diff = Math.Abs(index - i);
firstNullIndex = i;
}
}
_collection[firstNullIndex] = item;
return firstNullIndex;
}
}
public T? Remove(int index)
{
if (index >= _maxCount || index < 0)
// on the other positions items don't exist
{
throw new PositionOutOfCollectionException(index);
}
T? item = _collection[index];
_collection[index] = null;
if (item == null) throw new ObjectNotFoundException(index);
return item;
}
public IEnumerable<T?> GetItems()
{
for (int i = 0; i < MaxCount; ++i)
{
yield return _collection[i];
}
}
void ICollectionGenObj<T>.CollectionSort(IComparer<T?> comparer)
{
Array.Sort(_collection, comparer);
}
}

View File

@@ -0,0 +1,63 @@
namespace ProjectCruiser.CollectionGenericObj;
// Класс, хранящиий информацию по коллекции
/// </summary>
public class CollectionInfo : IEquatable<CollectionInfo>
{
// Название коллекции
public string Name { get; private set; }
// Тип
public CollectionType CollectionType { get; private set; }
// Описание
public string Description { get; private set; }
// Разделитель для записи информации по объекту в файл
private static readonly string _separator = "-";
public CollectionInfo(string name, CollectionType collectionType, string
description)
{
Name = name;
CollectionType = collectionType;
Description = description;
}
// Создание объекта из строки
public static CollectionInfo? GetCollectionInfo(string data)
{
string[] strs = data.Split(_separator,
StringSplitOptions.RemoveEmptyEntries);
if (strs.Length < 1 || strs.Length > 3)
{
return null;
}
return new CollectionInfo(strs[0],
(CollectionType)Enum.Parse(typeof(CollectionType),
strs[1]), strs.Length > 2 ?
strs[2] : string.Empty);
}
public override string ToString()
{
return Name + _separator + CollectionType + _separator + Description;
}
public bool Equals(CollectionInfo? other)
{
// if (Name != other.Name) return false; >>>
// else if (CollectionType != other.CollectionType) return false;
// else if (Description != other.Description) return false;
return Name == other?.Name;
}
public override bool Equals(object? obj)
{
return Equals(obj as CollectionInfo);
}
public override int GetHashCode()
{
return Name.GetHashCode();
}
}

View File

@@ -0,0 +1,8 @@
namespace ProjectCruiser.CollectionGenericObj;
public enum CollectionType
{
None = 0,
Array = 1,
List = 2
}

View File

@@ -0,0 +1,36 @@
using ProjectCruiser.DrawningSamples;
namespace ProjectCruiser.CollectionGenericObj;
public interface ICollectionGenObj<T> where T : class
{
// Кол-во объектов в коллекции
int Count { get; }
// Установка max кол-ва элементов
int MaxCount { set; get; }
/// Добавление объекта в коллекцию
/// <param name="obj">Добавляемый объект</param>
/// <returns>true - вставка прошла удачно, false - вставка не удалась</returns>
int Insert(T obj, IEqualityComparer<DrawningBase?>? cmpr = null);
int Insert(T obj, int position, IEqualityComparer<DrawningBase?>? cmpr = null);
/// Удаление объекта из коллекции с конкретной позиции
/// <param name="position">Позиция</param>
/// <returns>true - удаление прошло удачно, false - удаление не удалось</returns>
T? Remove(int position);
// Получение объекта по позиции
T? GetItem(int position);
// Получение типа коллекции
CollectionType GetCollectionType { get; }
// Получение объектов коллекции по одному
IEnumerable<T?> GetItems();
// Сортировка коллекции
/// <param name="comparer">Сравнитель объектов</param>
void CollectionSort(IComparer<T?> comparer);
}

View File

@@ -0,0 +1,119 @@
using ProjectCruiser.DrawningSamples;
using ProjectCruiser.Exceptions;
namespace ProjectCruiser.CollectionGenericObj;
// Параметризованный набор объектов
public class ListGenObj<T> : ICollectionGenObj<T>
where T : class
{
// Список объектов, которые храним
private List<T?> _collection;
// Максимально допустимое число объектов в списке
private int _maxCount;
public int Count => _collection.Count;
public int MaxCount
{
get { return _maxCount; }
set
{
if (value > 0)
{
if (_collection.Count == 0) _collection = new List<T>(value);
else _collection.Capacity = value; // instead of resizing
_maxCount = value;
}
}
}
public CollectionType GetCollectionType => CollectionType.List;
public ListGenObj()
{
_collection = new();
}
public T? GetItem(int position)
{
if (position > _maxCount)
throw new CollectionOverflowException(position);
if (position < 0)
throw new PositionOutOfCollectionException(position);
if (_collection[position] == null)
throw new ObjectNotFoundException(position);
return _collection[position];
}
public int Insert(T? obj, IEqualityComparer<DrawningBase?>? cmpr = null)
{
if (obj == null)
throw new NullReferenceException("> Inserting object is null");
else
{
if (cmpr != null && obj == cmpr)
{
throw new Exception();
}
}
// выход за границы, курируется CollectionOverflowException
if (Count >= _maxCount) throw new CollectionOverflowException(Count);
_collection.Add(obj);
return Count;
}
public int Insert(T? obj, int position, IEqualityComparer<DrawningBase?>? cmpr = null)
{
if (position < 0 || position >= _maxCount)
throw new PositionOutOfCollectionException(position);
if (Count >= _maxCount) throw new CollectionOverflowException(Count);
if (obj == null)
throw new NullReferenceException("> Inserting object (at position) is null");
else
{
if (cmpr != null && obj == cmpr)
{
throw new Exception();
}
}
_collection.Insert(position, obj);
return position;
}
public T? Remove(int position)
{
if (position >= _maxCount || position < 0)
// on the other positions items don't exist
{
throw new PositionOutOfCollectionException(position);
}
T? item = _collection[position];
_collection.RemoveAt(position);
if (item == null) throw new ObjectNotFoundException(position);
return item;
}
public IEnumerable<T?> GetItems()
{
for (int i = 0; i < _collection.Count; ++i)
{
yield return _collection[i];
}
}
void ICollectionGenObj<T>.CollectionSort(IComparer<T?> comparer)
{
_collection.Sort(comparer);
}
}

View File

@@ -0,0 +1,80 @@
using ProjectCruiser.DrawningSamples;
namespace ProjectCruiser.CollectionGenericObj;
public class ShipSharingService : AbstractCompany
{
protected int MaxInRow { get; private set; }
protected int MaxInColon { get; private set; }
private int fromBorder = 20, fromCeiling = 20, between = 30;
public ShipSharingService(int picWidth, int picHeight,
ICollectionGenObj<DrawningBase> collection)
: base(picWidth, picHeight, collection)
{
MaxInRow = (picWidth - fromBorder - fromCeiling)
/ (_placeSizeWidth + between);
MaxInColon = (picHeight - fromBorder - fromCeiling)
/ _placeSizeHeight;
}
protected override void DrawBackground(Graphics g)
{
Pen pen = new(Color.Black, 2);
int currentH = fromCeiling, currentW = fromBorder;
for (int i = 0; i < MaxInRow; i++)
{
currentH = fromCeiling;
for (int j = 0; j < MaxInColon; j++)
{
g.DrawLine(pen, currentW + _placeSizeWidth,
currentH, currentW, currentH);
g.DrawLine(pen, currentW, currentH,
currentW, currentH + _placeSizeHeight);
currentH += _placeSizeHeight + 1;
}
currentW += _placeSizeWidth + between;
}
}
protected override void SetObjectsPosition(int border)
{
int index_collection = 0;
int newY = fromCeiling + 4;
if (_collection != null)
{
for (int i = 0; i < MaxInColon; i++)
{
int newX = fromBorder + 2;
for (int j = 0; j < MaxInRow; j++)
{
try
{
_collection.GetItem(index_collection).SetPictureSize(
_pictureWidth, _pictureHeight);
_collection.GetItem(index_collection).SetPosition(newX, newY);
} catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
newX += _placeSizeWidth + between + 2;
if (index_collection < border)
{
index_collection++;
}
else return;
}
newY += _placeSizeHeight + 1;
}
}
}
}

View File

@@ -0,0 +1,181 @@
using System.CodeDom;
using System.Text;
using ProjectCruiser.DrawningSamples;
namespace ProjectCruiser.CollectionGenericObj;
public class StorageCollection<T>
where T : DrawningBase // class
{
private readonly string _separatorForKeyValue = "|";
private readonly string _separatorItems = ";";
private readonly string _collectionKey = "CollectionsStorage";
// Словарь (хранилище) с коллекциями < CollectionInfo, type (class) >
readonly Dictionary<CollectionInfo, ICollectionGenObj<T>> _storages;
// Возвращение списка коллекций
public List<CollectionInfo> Keys => _storages.Keys.ToList();
public StorageCollection()
{
_storages = new Dictionary<CollectionInfo, ICollectionGenObj<T>>();
}
// Добавление коллекции в хранилище
public void AddCollection(string name, CollectionType collType)
{
// descroption [ ? ] >>>
CollectionInfo coll = new CollectionInfo(name, collType, string.Empty);
if (name == null || _storages.ContainsKey(coll)
|| collType == CollectionType.None)
{
throw new NullReferenceException("> Not enough information to save");
}
_storages.Add(coll, CreateCollection(collType));
}
// Удаление коллекции ( по ключу-строке - её имени )
public void DelCollection(string name)
{
// descroption [ ? ] >>>
CollectionInfo coll = new CollectionInfo(name,
CollectionType.None, string.Empty);
if (_storages.ContainsKey(coll)) _storages.Remove(coll);
else throw new NullReferenceException("> No such key in the list");
}
// Доступ к коллекции , индексатор [!!!]
public ICollectionGenObj<T>? this[string name]
{
get => _storages.ContainsKey(new CollectionInfo(name, CollectionType.None, string.Empty))
? _storages[new CollectionInfo(name, CollectionType.None, string.Empty)] : null;
}
/// Сохранение информации по автомобилям в хранилище в файл
/// <param name="filename">Путь и имя файла</param>
/// <returns>true - сохранение прошло успешно,
/// false - ошибка при сохранении данных</returns>
public void SaveData(string filename)
{
if (_storages.Count == 0)
throw new NullReferenceException("> No existing collections to save");
if (File.Exists(filename)) { File.Delete(filename); }
StringBuilder sb = new();
sb.Append(_collectionKey); // const
foreach (KeyValuePair<CollectionInfo, ICollectionGenObj<T>> pair in _storages)
{
sb.Append(Environment.NewLine); // не сохраняем пустые коллекции
if (pair.Value.Count == 0) { continue; }
sb.Append(pair.Key);
sb.Append(_separatorForKeyValue);
// <...>
sb.Append(pair.Value.MaxCount);
sb.Append(_separatorForKeyValue);
foreach (T? item in pair.Value.GetItems())
{
string data = item?.GetDataForSave() ?? string.Empty;
if (string.IsNullOrEmpty(data))
{
continue;
}
sb.Append(data);
sb.Append(_separatorItems);
}
}
using FileStream fs = new(filename, FileMode.Create);
byte[] info = new UTF8Encoding(true).GetBytes(sb.ToString());
fs.Write(info, 0, info.Length);
}
// Создание коллекции по типу
private static ICollectionGenObj<T>? CreateCollection(CollectionType collectionType)
{
return collectionType switch
{
CollectionType.Array => new ArrayGenObj<T>(),
CollectionType.List => new ListGenObj<T>(),
_ => null,
};
}
// Загрузка информации по кораблям в хранилище из файла
public void LoadData(string filename)
{
if (!File.Exists(filename)) throw new FileNotFoundException("> No such file");
string bufferTextFromFile = "";
using (FileStream fs = new(filename, FileMode.Open))
{
byte[] b = new byte[fs.Length];
UTF8Encoding temp = new(true);
while (fs.Read(b, 0, b.Length) > 0)
{
bufferTextFromFile += temp.GetString(b);
}
}
string[] strs = bufferTextFromFile.Split(
new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
if (strs == null || strs.Length == 0)
throw new NullReferenceException("> No data to decode");
if (!strs[0].Equals(_collectionKey))
throw new InvalidDataException("> Incorrect data");
string[] companies = new string[strs.Length - 1];
for (int k = 1; k < strs.Length; k++)
{
companies[k - 1] = strs[k];
}
_storages.Clear();
foreach (string data in companies)
{
string[] record = data.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries);
if (record.Length != 3) // >
// [key + collType] | maxcount | all next inf > 4
{ continue; }
CollectionInfo? collInfo = CollectionInfo.GetCollectionInfo(record[0]) ??
throw new Exception("[!] Failed to decode information : " + record[0]);
ICollectionGenObj<T>? collection = StorageCollection<T>.CreateCollection(
collInfo.CollectionType) ??
throw new Exception("[!] Failed to create a collection");
collection.MaxCount = Convert.ToInt32(record[1]);
string[] set = record[2].Split(_separatorItems,
StringSplitOptions.RemoveEmptyEntries);
foreach (string elem in set)
{
if (elem?.CreateDrawningCar() is T ship)
{
try
{
collection.Insert(ship);
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
}
_storages.Add(collInfo, collection);
}
}
}

View File

@@ -14,9 +14,9 @@ public class DrawningBase
private readonly int _drawningHeight = 42; // Высота прорисовки автомобиля
// Инициализация свойств (теперь через конструктор)
public DrawningBase(int speed, double weight, Color bodyColor) : this()
public DrawningBase(EntityBase ship) : this()
{
EntityTransport = new EntityBase(speed, weight, bodyColor);
EntityTransport = ship;
}
private DrawningBase()

View File

@@ -5,18 +5,16 @@ namespace ProjectCruiser.DrawningSamples;
public class DrawningCruiser : DrawningBase
{
// Инициализация свойств (все параметры класса (сущности))
public DrawningCruiser(int speed, double weight, Color bodyColor,
Color additionalColor, bool pads, bool hangar) : base(302, 42)
// all additional featchures 'inside' object, so size remains
public DrawningCruiser(EntityCruiser ship) : base((EntityBase)ship)
{
EntityTransport = new EntityCruiser(speed, weight,
bodyColor, additionalColor, pads, hangar);
EntityTransport = ship;
}
public override void DrawTransport(Graphics g)
{
if (EntityTransport == null || EntityTransport is not EntityCruiser ship ||
!_startPosX.HasValue || !_startPosY.HasValue) // [ !!! ] :O
if (EntityTransport == null ||
EntityTransport is not EntityCruiser ship ||
!_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
@@ -31,24 +29,18 @@ public class DrawningCruiser : DrawningBase
base.DrawTransport(g);
// вертолетная площадка
// вертолетная площадка - non-default
if (ship.HelicopterPads)
{
g.DrawEllipse(pen, _startPosX.Value + 170, _startPosY.Value + 11, 20, 20);
g.FillEllipse(PadBrush, _startPosX.Value + 170, _startPosY.Value + 11, 20, 20);
}
// ангар
if (ship.Hangar)
// ангар(ы)
if (ship.Hangars)
{
int n = EntityTransport.values[2];
if (n == 1) g.FillRectangle(additionalBrush, _startPosX.Value + 250, _startPosY.Value + 20, 14, 7);
else
{
g.FillRectangle(additionalBrush, _startPosX.Value + 80, _startPosY.Value + 10, 10, 20);
g.FillRectangle(additionalBrush, _startPosX.Value + 70, _startPosY.Value + 12, 8, 12);
}
g.FillRectangle(additionalBrush, _startPosX.Value + 80, _startPosY.Value + 10, 10, 20);
g.FillRectangle(additionalBrush, _startPosX.Value + 70, _startPosY.Value + 12, 8, 12);
}
else g.FillRectangle(additionalBrush, _startPosX.Value + 250, _startPosY.Value + 20, 14, 7);
}
}

View File

@@ -0,0 +1,31 @@
namespace ProjectCruiser.DrawningSamples;
// Сравнение по типу, скорости, весу
public class DrawningShipCompare : IComparer<DrawningBase?>
{
public int Compare(DrawningBase? x, DrawningBase? y)
{
if (x == null || x.EntityTransport == null)
{
return 1;
}
if (y == null || y.EntityTransport == null)
{
return -1;
}
if (x.GetType().Name != y.GetType().Name)
{
return x.GetType().Name.CompareTo(y.GetType().Name);
}
var speedCompare = x.EntityTransport.Speed.CompareTo(y.EntityTransport.Speed);
if (speedCompare != 0)
{
return speedCompare;
}
return x.EntityTransport.Weight.CompareTo(y.EntityTransport.Weight);
}
}

View File

@@ -0,0 +1,34 @@
namespace ProjectCruiser.DrawningSamples;
public class DrawningShipCompareByColor : IComparer<DrawningBase?>
{
public int Compare(DrawningBase? x, DrawningBase? y)
{
if (x == null || x.EntityTransport == null)
{
return 1;
}
if (y == null || y.EntityTransport == null)
{
return -1;
}
var bodycolorCompare = x.EntityTransport.MainColor.Name.CompareTo(
y.EntityTransport.MainColor.Name);
if (bodycolorCompare != 0)
{
return bodycolorCompare;
}
var speedCompare = x.EntityTransport.Speed.CompareTo(y.EntityTransport.Speed);
if (speedCompare != 0)
{
return speedCompare;
}
return x.EntityTransport.Weight.CompareTo(y.EntityTransport.Weight);
}
}

View File

@@ -0,0 +1,45 @@
using System.Diagnostics.CodeAnalysis;
using ProjectCruiser.Entities;
namespace ProjectCruiser.DrawningSamples;
// Реализация сравнения двух объектов класса-прорисовки
public class DrawiningShipEqutables : IEqualityComparer<DrawningBase?>
{
public bool Equals(DrawningBase? x, DrawningBase? y)
{
if (x == null || x.EntityTransport == null) return false;
if (y == null || y.EntityTransport == null) return false;
if (x.GetType().Name != y.GetType().Name) return false;
if (x.EntityTransport.Speed != y.EntityTransport.Speed) return false;
if (x.EntityTransport.Weight != y.EntityTransport.Weight) return false;
if (x.EntityTransport.MainColor != y.EntityTransport.MainColor) return false;
if (x is DrawningCruiser && y is DrawningCruiser)
{
/* public Color AdditionalColor { get; private set; } // доп. цвет
// признаки (наличия)
public bool HelicopterPads { get; private set; } // вертолетная площадка
public bool Hangars { get; private set; } // ангар */
EntityCruiser EntityX = (EntityCruiser)x.EntityTransport;
EntityCruiser EntityY = (EntityCruiser)y.EntityTransport;
if (EntityX.AdditionalColor != EntityY.AdditionalColor)
return false;
if (EntityX.Hangars != EntityY.Hangars)
return false;
if (EntityX.HelicopterPads != EntityY.HelicopterPads)
return false;
}
return true;
}
public int GetHashCode([DisallowNull] DrawningBase obj)
{
return obj.GetHashCode();
}
}

View File

@@ -0,0 +1,41 @@
using ProjectCruiser.Entities;
namespace ProjectCruiser.DrawningSamples;
public static class ExtentionDrShip
{
// Разделитель для записи информации по объекту в файл
private static readonly string _separatorForObject = ":";
// Создание объекта из строки
public static DrawningBase? CreateDrawningCar(this string info)
{
string[] strs = info.Split(_separatorForObject);
EntityBase? ship = EntityCruiser.CreateEntity(strs);
if (ship != null)
{
return new DrawningCruiser((EntityCruiser)ship);
}
ship = EntityBase.CreateEntity(strs);
if (ship != null)
{
return new DrawningBase(ship);
}
return null;
}
// Получение данных для сохранения в файл - - - - - - -
public static string GetDataForSave(this DrawningBase drShip)
// метод расширения за счёт ключевого слова 'this'
// вызов метода достигается не через имя класса,
// а при вызове у объекта типа DrawningBase [*]
{
string[]? array = drShip?.EntityTransport?.GetStringRepresentation();
if (array == null)
{
return string.Empty;
}
return string.Join(_separatorForObject, array);
}
}

344
ProjectCruiser/EditorForm3.Designer.cs generated Normal file
View File

@@ -0,0 +1,344 @@
namespace ProjectCruiser
{
partial class EditorForm3
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
ParametersBox = new GroupBox();
AdvLabel = new Label();
BaseLabel = new Label();
groupBox2 = new GroupBox();
PurpleP = new Panel();
GreenP = new Panel();
PinkP = new Panel();
OrangeP = new Panel();
CyanP = new Panel();
YellowP = new Panel();
RedP = new Panel();
BlueP = new Panel();
checkBoxPads = new CheckBox();
checkBoxHangars = new CheckBox();
WeightN = new NumericUpDown();
SpeedN = new NumericUpDown();
Label = new Label();
Showcase = new PictureBox();
btnAdd = new Button();
btnCancel = new Button();
panelObject = new Panel();
labelAcolor = new Label();
labelMcolor = new Label();
ParametersBox.SuspendLayout();
groupBox2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)WeightN).BeginInit();
((System.ComponentModel.ISupportInitialize)SpeedN).BeginInit();
((System.ComponentModel.ISupportInitialize)Showcase).BeginInit();
panelObject.SuspendLayout();
SuspendLayout();
//
// ParametersBox
//
ParametersBox.Controls.Add(AdvLabel);
ParametersBox.Controls.Add(BaseLabel);
ParametersBox.Controls.Add(groupBox2);
ParametersBox.Controls.Add(checkBoxPads);
ParametersBox.Controls.Add(checkBoxHangars);
ParametersBox.Controls.Add(WeightN);
ParametersBox.Controls.Add(SpeedN);
ParametersBox.Controls.Add(Label);
ParametersBox.Location = new Point(12, 0);
ParametersBox.Name = "ParametersBox";
ParametersBox.Size = new Size(388, 495);
ParametersBox.TabIndex = 0;
ParametersBox.TabStop = false;
ParametersBox.Text = "Parameters";
//
// AdvLabel
//
AdvLabel.BorderStyle = BorderStyle.FixedSingle;
AdvLabel.Location = new Point(175, 428);
AdvLabel.Name = "AdvLabel";
AdvLabel.Size = new Size(184, 46);
AdvLabel.TabIndex = 5;
AdvLabel.Text = "Advanced";
AdvLabel.TextAlign = ContentAlignment.MiddleCenter;
AdvLabel.MouseDown += BaseAdvLabel_MouseDown;
//
// BaseLabel
//
BaseLabel.BorderStyle = BorderStyle.FixedSingle;
BaseLabel.Location = new Point(17, 428);
BaseLabel.Name = "BaseLabel";
BaseLabel.Size = new Size(132, 46);
BaseLabel.TabIndex = 4;
BaseLabel.Text = "Base";
BaseLabel.TextAlign = ContentAlignment.MiddleCenter;
BaseLabel.MouseDown += BaseAdvLabel_MouseDown;
//
// groupBox2
//
groupBox2.Controls.Add(PurpleP);
groupBox2.Controls.Add(GreenP);
groupBox2.Controls.Add(PinkP);
groupBox2.Controls.Add(OrangeP);
groupBox2.Controls.Add(CyanP);
groupBox2.Controls.Add(YellowP);
groupBox2.Controls.Add(RedP);
groupBox2.Controls.Add(BlueP);
groupBox2.Location = new Point(17, 197);
groupBox2.Name = "groupBox2";
groupBox2.Size = new Size(342, 213);
groupBox2.TabIndex = 1;
groupBox2.TabStop = false;
groupBox2.Text = "Color picker";
//
// PurpleP
//
PurpleP.BackColor = Color.DarkViolet;
PurpleP.Location = new Point(260, 126);
PurpleP.Name = "PurpleP";
PurpleP.Size = new Size(63, 59);
PurpleP.TabIndex = 12;
//
// GreenP
//
GreenP.BackColor = Color.SpringGreen;
GreenP.Location = new Point(259, 49);
GreenP.Name = "GreenP";
GreenP.Size = new Size(63, 59);
GreenP.TabIndex = 9;
//
// PinkP
//
PinkP.BackColor = Color.DeepPink;
PinkP.Location = new Point(180, 126);
PinkP.Name = "PinkP";
PinkP.Size = new Size(63, 59);
PinkP.TabIndex = 11;
//
// OrangeP
//
OrangeP.BackColor = Color.DarkOrange;
OrangeP.Location = new Point(180, 49);
OrangeP.Name = "OrangeP";
OrangeP.Size = new Size(63, 59);
OrangeP.TabIndex = 8;
//
// CyanP
//
CyanP.BackColor = Color.Cyan;
CyanP.Location = new Point(100, 126);
CyanP.Name = "CyanP";
CyanP.Size = new Size(63, 59);
CyanP.TabIndex = 10;
//
// YellowP
//
YellowP.BackColor = Color.Gold;
YellowP.Location = new Point(19, 126);
YellowP.Name = "YellowP";
YellowP.Size = new Size(63, 59);
YellowP.TabIndex = 9;
//
// RedP
//
RedP.BackColor = Color.Firebrick;
RedP.Location = new Point(100, 49);
RedP.Name = "RedP";
RedP.Size = new Size(63, 59);
RedP.TabIndex = 7;
//
// BlueP
//
BlueP.BackColor = SystemColors.Highlight;
BlueP.Location = new Point(19, 49);
BlueP.Name = "BlueP";
BlueP.Size = new Size(63, 59);
BlueP.TabIndex = 6;
//
// checkBoxPads
//
checkBoxPads.AutoSize = true;
checkBoxPads.Location = new Point(24, 142);
checkBoxPads.Name = "checkBoxPads";
checkBoxPads.Size = new Size(203, 36);
checkBoxPads.TabIndex = 3;
checkBoxPads.Text = "Helicopter pad";
checkBoxPads.UseVisualStyleBackColor = true;
//
// checkBoxHangars
//
checkBoxHangars.AutoSize = true;
checkBoxHangars.Location = new Point(234, 142);
checkBoxHangars.Name = "checkBoxHangars";
checkBoxHangars.Size = new Size(133, 36);
checkBoxHangars.TabIndex = 1;
checkBoxHangars.Text = "Hangars";
checkBoxHangars.UseVisualStyleBackColor = true;
//
// WeightN
//
WeightN.Location = new Point(198, 88);
WeightN.Maximum = new decimal(new int[] { 1000, 0, 0, 0 });
WeightN.Minimum = new decimal(new int[] { 100, 0, 0, 0 });
WeightN.Name = "WeightN";
WeightN.Size = new Size(142, 39);
WeightN.TabIndex = 2;
WeightN.Value = new decimal(new int[] { 100, 0, 0, 0 });
//
// SpeedN
//
SpeedN.Location = new Point(36, 88);
SpeedN.Maximum = new decimal(new int[] { 1000, 0, 0, 0 });
SpeedN.Minimum = new decimal(new int[] { 100, 0, 0, 0 });
SpeedN.Name = "SpeedN";
SpeedN.Size = new Size(142, 39);
SpeedN.TabIndex = 1;
SpeedN.Value = new decimal(new int[] { 100, 0, 0, 0 });
//
// Label
//
Label.AutoSize = true;
Label.Location = new Point(36, 53);
Label.Name = "Label";
Label.Size = new Size(304, 32);
Label.TabIndex = 1;
Label.Text = "Speed Weight";
//
// Showcase
//
Showcase.Location = new Point(58, 98);
Showcase.Name = "Showcase";
Showcase.Size = new Size(458, 272);
Showcase.TabIndex = 1;
Showcase.TabStop = false;
//
// btnAdd
//
btnAdd.Location = new Point(419, 447);
btnAdd.Name = "btnAdd";
btnAdd.Size = new Size(268, 46);
btnAdd.TabIndex = 2;
btnAdd.Text = "Add";
btnAdd.UseVisualStyleBackColor = true;
btnAdd.Click += AddButton_Click;
//
// btnCancel
//
btnCancel.Location = new Point(694, 447);
btnCancel.Name = "btnCancel";
btnCancel.Size = new Size(286, 46);
btnCancel.TabIndex = 3;
btnCancel.Text = "Cancel";
btnCancel.UseVisualStyleBackColor = true;
//
// panelObject
//
panelObject.AllowDrop = true;
panelObject.Controls.Add(labelAcolor);
panelObject.Controls.Add(labelMcolor);
panelObject.Controls.Add(Showcase);
panelObject.Location = new Point(419, 12);
panelObject.Name = "panelObject";
panelObject.Size = new Size(561, 410);
panelObject.TabIndex = 4;
panelObject.DragDrop += PanelObject_DragDrop;
panelObject.DragEnter += PanelObject_DragEnter;
//
// labelAcolor
//
labelAcolor.AllowDrop = true;
labelAcolor.BorderStyle = BorderStyle.FixedSingle;
labelAcolor.Location = new Point(253, 39);
labelAcolor.Name = "labelAcolor";
labelAcolor.Size = new Size(263, 42);
labelAcolor.TabIndex = 7;
labelAcolor.Text = "Additional color";
labelAcolor.TextAlign = ContentAlignment.MiddleCenter;
labelAcolor.DragDrop += AdditionalColor_DragDrop;
labelAcolor.DragEnter += AdditionalColor_DragEnter;
//
// labelMcolor
//
labelMcolor.AllowDrop = true;
labelMcolor.BorderStyle = BorderStyle.FixedSingle;
labelMcolor.Location = new Point(58, 39);
labelMcolor.Name = "labelMcolor";
labelMcolor.Size = new Size(180, 42);
labelMcolor.TabIndex = 6;
labelMcolor.Text = "Main color";
labelMcolor.TextAlign = ContentAlignment.MiddleCenter;
labelMcolor.DragDrop += BodyColor_DragDrop;
labelMcolor.DragEnter += BodyColor_DragEnter;
//
// EditorForm3
//
AutoScaleDimensions = new SizeF(13F, 32F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(992, 516);
Controls.Add(panelObject);
Controls.Add(btnCancel);
Controls.Add(btnAdd);
Controls.Add(ParametersBox);
Name = "EditorForm3";
Text = "FormTransportConfig";
ParametersBox.ResumeLayout(false);
ParametersBox.PerformLayout();
groupBox2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)WeightN).EndInit();
((System.ComponentModel.ISupportInitialize)SpeedN).EndInit();
((System.ComponentModel.ISupportInitialize)Showcase).EndInit();
panelObject.ResumeLayout(false);
ResumeLayout(false);
}
#endregion
private GroupBox ParametersBox;
private Label Label;
private CheckBox checkBoxPads;
private CheckBox checkBoxHangars;
private NumericUpDown WeightN;
private NumericUpDown SpeedN;
private GroupBox groupBox2;
private Label BaseLabel;
private Label AdvLabel;
private Panel PurpleP;
private Panel GreenP;
private Panel PinkP;
private Panel OrangeP;
private Panel CyanP;
private Panel YellowP;
private Panel RedP;
private Panel BlueP;
private PictureBox Showcase;
private Button btnAdd;
private Button btnCancel;
private Panel panelObject;
private Label labelMcolor;
private Label labelAcolor;
}
}

View File

@@ -0,0 +1,121 @@
using ProjectCruiser.DrawningSamples;
using ProjectCruiser.Entities;
using System;
namespace ProjectCruiser;
public partial class EditorForm3 : Form
{
private DrawningBase _cruiser;
// private event Action<DrawingBase>? shipDelegate;
private event ShipDelegate? shipDelegate;
public EditorForm3()
{
InitializeComponent();
BlueP.MouseDown += Panel_MouseDown;
RedP.MouseDown += Panel_MouseDown;
PinkP.MouseDown += Panel_MouseDown;
YellowP.MouseDown += Panel_MouseDown;
CyanP.MouseDown += Panel_MouseDown;
PurpleP.MouseDown += Panel_MouseDown;
GreenP.MouseDown += Panel_MouseDown;
OrangeP.MouseDown += Panel_MouseDown;
btnCancel.Click += (sender, e) => Close();
}
public void AddEvent(ShipDelegate del)// Action<DrawingBase> delegator)
{
if (shipDelegate == null) shipDelegate = del;
else shipDelegate += del;
}
private void DrawObject()
{
Bitmap bmp = new(Showcase.Width, Showcase.Height);
Graphics gr = Graphics.FromImage(bmp);
_cruiser?.SetPictureSize(Showcase.Width, Showcase.Height);
_cruiser?.SetPosition(Showcase.Width - 400, Showcase.Height - 120);
_cruiser?.DrawTransport(gr);
Showcase.Image = bmp;
}
private void Panel_MouseDown(object? sender, MouseEventArgs e)
{
// TODO отправка цвета в Drag&Drop
(sender as Control).DoDragDrop((sender as Control).BackColor, DragDropEffects.Move | DragDropEffects.Copy);
}
private void BaseAdvLabel_MouseDown(object sender, MouseEventArgs e)
{
(sender as Label)?.DoDragDrop((sender as Label)?.Name ?? string.Empty, DragDropEffects.Move | DragDropEffects.Copy);
}
private void PanelObject_DragEnter(object sender, DragEventArgs e)
{
if (e.Data?.GetDataPresent(DataFormats.Text) ?? false) e.Effect = DragDropEffects.Copy;
else e.Effect = DragDropEffects.None;
}
private void PanelObject_DragDrop(object sender, DragEventArgs e)
{
switch (e.Data?.GetData(DataFormats.Text)?.ToString())
{
case "BaseLabel":
EntityBase ship = new EntityBase((int)SpeedN.Value, (double)WeightN.Value, Color.White);
_cruiser = new DrawningBase(ship);
break;
case "AdvLabel":
Random rn = new Random();
EntityCruiser cruiser = new EntityCruiser((int)SpeedN.Value, (double)WeightN.Value,
Color.White, Color.Black, checkBoxPads.Checked, checkBoxHangars.Checked);
_cruiser = new DrawningCruiser(cruiser);
break;
}
labelMcolor.BackColor = Color.Empty;
labelAcolor.BackColor = Color.Empty;
DrawObject();
}
// Логика смены цветов: основного и дополнительного (для продвинутого объекта)
private void BodyColor_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(Color))) e.Effect = DragDropEffects.Copy;
else e.Effect = DragDropEffects.None;
}
private void BodyColor_DragDrop(object sender, DragEventArgs e)
{
if (_cruiser != null)
{
_cruiser.EntityTransport.setMainColor((Color)e.Data.GetData(typeof(Color)));
DrawObject();
}
}
private void AdditionalColor_DragEnter(object sender, DragEventArgs e)
{
if (_cruiser is DrawningCruiser)
{
if (e.Data.GetDataPresent(typeof(Color))) e.Effect = DragDropEffects.Copy;
else e.Effect = DragDropEffects.None;
}
}
private void AdditionalColor_DragDrop(object sender, DragEventArgs e)
{
if (_cruiser.EntityTransport is EntityCruiser _ship)
{
_ship.setAdditionalColor((Color)e.Data.GetData(typeof(Color)));
}
DrawObject();
}
private void AddButton_Click(object sender, EventArgs e)
{
if (_cruiser != null)
{
shipDelegate?.Invoke(_cruiser);
Close();
}
}
}

View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -7,6 +7,11 @@ public class EntityBase
public double Weight { get; private set; } // вес
public Color MainColor { get; private set; } // основной цвет
public void setMainColor(Color clr)
{
MainColor = clr;
}
// public bool Deckhouse { get; private set; } // салон на верхней палубе
public double Step => Speed * 100 / Weight;
@@ -19,9 +24,26 @@ public class EntityBase
Speed = speed;
Weight = weight;
MainColor = mainc;
// Deckhouse = deckhouse;
values[0] = rn.Next(1, 4);
values[1] = rn.Next(5, 10);
values[2] = rn.Next(1, 3);
}
// Получение массива строк со значениями свойств
// объекта : тип (название класса), скорость, вес, осн. цвет [*]
public virtual string[] GetStringRepresentation()
{
return new[] { nameof(EntityBase), Speed.ToString(),
Weight.ToString(), MainColor.Name };
}
// decoding string to object
public static EntityBase? CreateEntity(string[] parameters)
{
if (parameters.Length != 4 || parameters.Length == 0 ||
parameters[0] != "EntityBase") return null;
return new EntityBase(Convert.ToInt32(parameters[1]),
Convert.ToDouble(parameters[2]), Color.FromName(parameters[3]));
}
}

View File

@@ -4,16 +4,43 @@ public class EntityCruiser : EntityBase
{
public Color AdditionalColor { get; private set; } // доп. цвет
public void setAdditionalColor(Color clr)
{
AdditionalColor = clr;
}
// признаки (наличия)
public bool HelicopterPads { get; private set; } // вертолетная площадка
public bool Hangar { get; private set; } // ангар
public bool Hangars { get; private set; } // ангар
public EntityCruiser(int speed, double weight, Color mainc,
Color additionalColor, bool pads, bool hangar)
Color additionalColor, bool pad, bool hangars)
: base(speed, weight, mainc)
{
AdditionalColor = additionalColor;
HelicopterPads = pads;
Hangar = hangar;
HelicopterPads = pad; // non-default now for editor Form3
Hangars = hangars;
}
// Получение массива строк со значениями свойств
// объекта : тип (название класса), скорость, вес, осн. цвет [*],
// доп. цвет, истинность наличия площадки и (,) ангаров.
public override string[] GetStringRepresentation() // :O
{
return new[] { nameof(EntityCruiser), Speed.ToString(),
Weight.ToString(), MainColor.Name, AdditionalColor.Name,
HelicopterPads.ToString(), Hangars.ToString()};
}
// decoding string to object
public static EntityCruiser? CreateEntity(string[] parameters)
{
if (parameters.Length != 7 || parameters.Length == 0 ||
parameters[0] != "EntityCruiser") return null;
return new EntityCruiser(Convert.ToInt32(parameters[1]),
Convert.ToDouble(parameters[2]), Color.FromName(parameters[3]),
Color.FromName(parameters[4]), Convert.ToBoolean(parameters[5]),
Convert.ToBoolean(parameters[6]));
}
}

View File

@@ -0,0 +1,18 @@
using System.Runtime.Serialization;
namespace ProjectCruiser.Exceptions;
// Класс, описывающий ошибку переполнения коллекции
[Serializable]
internal class CollectionOverflowException : ApplicationException
{
public CollectionOverflowException(int count)
: base("<> Possible accsess\nof collection is over : " + count) { }
public CollectionOverflowException() : base() { }
public CollectionOverflowException(string message) : base(message) { }
public CollectionOverflowException(string message, Exception exception) :
base(message, exception)
{ }
protected CollectionOverflowException(SerializationInfo info,
StreamingContext contex) : base(info, contex) { }
}

View File

@@ -0,0 +1,16 @@
using System.Runtime.Serialization;
namespace ProjectCruiser.Exceptions;
// Класс, описывающий ошибку, что по указанной позиции нет элемента
[Serializable]
internal class ObjectNotFoundException : ApplicationException
{
public ObjectNotFoundException(int i)
: base("<> Didn't find obj\non this position : " + i) { }
public ObjectNotFoundException() : base() { }
public ObjectNotFoundException(string message) : base(message) { }
public ObjectNotFoundException(string message, Exception exception)
: base(message, exception) { }
protected ObjectNotFoundException(SerializationInfo info,
StreamingContext contex) : base(info, contex) { }
}

View File

@@ -0,0 +1,16 @@
using System.Runtime.Serialization;
namespace ProjectCruiser.Exceptions;
// Класс, описывающий ошибку выхода за границы коллекции
[Serializable]
internal class PositionOutOfCollectionException : ApplicationException
{
public PositionOutOfCollectionException(int i)
: base("<> Out of collection\nboarder. Position : " + i) { }
public PositionOutOfCollectionException() : base() { }
public PositionOutOfCollectionException(string message) : base(message) { }
public PositionOutOfCollectionException(string message,
Exception exception) : base(message, exception) { }
protected PositionOutOfCollectionException(SerializationInfo info,
StreamingContext contex) : base(info, contex) { }
}

View File

@@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectCruiser.MoveStrategy;
namespace ProjectCruiser.MoveStrategy;
public class MoveToBorder : AbstractStrategy
{

View File

@@ -1,4 +1,5 @@
using ProjectCruiser.DrawningSamples;
using ProjectCruiser.Entities;
using ProjectCruiser.MoveStrategy;
namespace ProjectCruiser
@@ -11,6 +12,19 @@ namespace ProjectCruiser
// Стратегия перемещения
private AbstractStrategy? _strategy;
// Получение объекта
public DrawningBase SetShip
{
set
{
_drawningCruiser = value;
_drawningCruiser.SetPictureSize(pictureBoxCr.Width, pictureBoxCr.Height);
comboBoxStrategy.Enabled = true;
_strategy = null;
Draw();
}
}
public OceanForm1()
{
InitializeComponent();
@@ -46,15 +60,18 @@ namespace ProjectCruiser
switch (type)
{
case nameof(DrawningBase):
_drawningCruiser = new DrawningBase(random.Next(100, 300), random.Next(1000, 3000),
EntityBase ship = new EntityBase(random.Next(100, 300), random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)));
_drawningCruiser = new DrawningBase(ship);
break;
case nameof(DrawningCruiser):
_drawningCruiser = new DrawningCruiser(random.Next(100, 300), random.Next(1000, 3000),
EntityCruiser cruiser = new EntityCruiser(
random.Next(100, 300), random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)),
Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)));
_drawningCruiser = new DrawningCruiser(cruiser);
break;
default:

View File

@@ -1,17 +1,45 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Configuration;
using Serilog;
namespace ProjectCruiser
{
internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
Application.Run(new OceanForm1());
ServiceCollection services = new();
ConfigureServices(services);
using ServiceProvider serviceProvider = services.BuildServiceProvider();
Application.Run(serviceProvider.GetRequiredService<ServiceForm2>());
}
private static void ConfigureServices(ServiceCollection services)
{
string[] path = Directory.GetCurrentDirectory().Split('\\');
string pathNeed = "";
for (int i = 0; i < path.Length - 3; i++)
{
pathNeed += path[i] + "\\";
}
services.AddSingleton<ServiceForm2>().AddLogging(option =>
{
option.SetMinimumLevel(LogLevel.Information);
option.AddSerilog(new LoggerConfiguration().ReadFrom.Configuration(
new ConfigurationBuilder().AddJsonFile(
$"{pathNeed}serilog.json").Build()).CreateLogger());
});
}
}
}

View File

@@ -8,4 +8,16 @@
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.1" />
<PackageReference Include="Serilog" Version="4.0.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="8.0.1" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
</ItemGroup>
</Project>

376
ProjectCruiser/ServiceForm2.Designer.cs generated Normal file
View File

@@ -0,0 +1,376 @@
namespace ProjectCruiser
{
partial class ServiceForm2
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
comboBoxArrList = new ComboBox();
groupBox = new GroupBox();
companyPanel = new Panel();
btnDeleteCollection = new Button();
listBox = new ListBox();
btnAddCollection = new Button();
rBtnList = new RadioButton();
rBtnArray = new RadioButton();
maskedTxtBoxCName = new MaskedTextBox();
label = new Label();
toolPanel = new Panel();
btnUpdate = new Button();
btnTest = new Button();
maskedTextBoxPosition = new MaskedTextBox();
btnDelete = new Button();
btnAddCruiser = new Button();
btnCreateCompany = new Button();
pictureBox = new PictureBox();
menuStrip = new MenuStrip();
fileToolStripMenuItem = new ToolStripMenuItem();
saveToolStripMenuItem = new ToolStripMenuItem();
loadToolStripMenuItem = new ToolStripMenuItem();
saveFileDialog = new SaveFileDialog();
openFileDialog = new OpenFileDialog();
btnSortType = new Button();
btnSortColor = new Button();
groupBox.SuspendLayout();
companyPanel.SuspendLayout();
toolPanel.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox).BeginInit();
menuStrip.SuspendLayout();
SuspendLayout();
//
// comboBoxArrList
//
comboBoxArrList.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
comboBoxArrList.FormattingEnabled = true;
comboBoxArrList.Items.AddRange(new object[] { "Storage" });
comboBoxArrList.Location = new Point(17, 38);
comboBoxArrList.Name = "comboBoxArrList";
comboBoxArrList.Size = new Size(241, 40);
comboBoxArrList.TabIndex = 0;
comboBoxArrList.SelectedIndexChanged += SelectorCompany_SelectedIndexChanged;
//
// groupBox
//
groupBox.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
groupBox.Controls.Add(companyPanel);
groupBox.Controls.Add(toolPanel);
groupBox.Controls.Add(btnCreateCompany);
groupBox.Controls.Add(comboBoxArrList);
groupBox.Location = new Point(1421, 43);
groupBox.Name = "groupBox";
groupBox.Size = new Size(273, 964);
groupBox.TabIndex = 2;
groupBox.TabStop = false;
groupBox.Text = "Tool panel";
//
// companyPanel
//
companyPanel.Controls.Add(btnDeleteCollection);
companyPanel.Controls.Add(listBox);
companyPanel.Controls.Add(btnAddCollection);
companyPanel.Controls.Add(rBtnList);
companyPanel.Controls.Add(rBtnArray);
companyPanel.Controls.Add(maskedTxtBoxCName);
companyPanel.Controls.Add(label);
companyPanel.Location = new Point(17, 83);
companyPanel.Name = "companyPanel";
companyPanel.Size = new Size(243, 359);
companyPanel.TabIndex = 7;
//
// btnDeleteCollection
//
btnDeleteCollection.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
btnDeleteCollection.Location = new Point(16, 276);
btnDeleteCollection.Name = "btnDeleteCollection";
btnDeleteCollection.Size = new Size(214, 76);
btnDeleteCollection.TabIndex = 11;
btnDeleteCollection.Text = "Remove Collection";
btnDeleteCollection.UseVisualStyleBackColor = true;
btnDeleteCollection.Click += btnCollectionDel_Click;
//
// listBox
//
listBox.FormattingEnabled = true;
listBox.Location = new Point(16, 171);
listBox.Name = "listBox";
listBox.Size = new Size(214, 100);
listBox.TabIndex = 10;
//
// btnAddCollection
//
btnAddCollection.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
btnAddCollection.Location = new Point(15, 118);
btnAddCollection.Name = "btnAddCollection";
btnAddCollection.Size = new Size(214, 49);
btnAddCollection.TabIndex = 7;
btnAddCollection.Text = "Add Collection";
btnAddCollection.UseVisualStyleBackColor = true;
btnAddCollection.Click += btnCollectionAdd_Click;
//
// rBtnList
//
rBtnList.AutoSize = true;
rBtnList.Location = new Point(150, 80);
rBtnList.Name = "rBtnList";
rBtnList.Size = new Size(80, 36);
rBtnList.TabIndex = 9;
rBtnList.TabStop = true;
rBtnList.Text = "List";
rBtnList.UseVisualStyleBackColor = true;
//
// rBtnArray
//
rBtnArray.AutoSize = true;
rBtnArray.Location = new Point(16, 79);
rBtnArray.Name = "rBtnArray";
rBtnArray.Size = new Size(100, 36);
rBtnArray.TabIndex = 8;
rBtnArray.TabStop = true;
rBtnArray.Text = "Array";
rBtnArray.UseVisualStyleBackColor = true;
//
// maskedTxtBoxCName
//
maskedTxtBoxCName.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
maskedTxtBoxCName.Location = new Point(16, 40);
maskedTxtBoxCName.Name = "maskedTxtBoxCName";
maskedTxtBoxCName.Size = new Size(214, 39);
maskedTxtBoxCName.TabIndex = 7;
//
// label
//
label.AutoSize = true;
label.Location = new Point(29, 5);
label.Name = "label";
label.Size = new Size(188, 32);
label.TabIndex = 0;
label.Text = "Collection name";
//
// toolPanel
//
toolPanel.Controls.Add(btnSortColor);
toolPanel.Controls.Add(btnSortType);
toolPanel.Controls.Add(btnUpdate);
toolPanel.Controls.Add(btnTest);
toolPanel.Controls.Add(maskedTextBoxPosition);
toolPanel.Controls.Add(btnDelete);
toolPanel.Controls.Add(btnAddCruiser);
toolPanel.Enabled = false;
toolPanel.Location = new Point(26, 537);
toolPanel.Name = "toolPanel";
toolPanel.Size = new Size(226, 415);
toolPanel.TabIndex = 13;
//
// btnUpdate
//
btnUpdate.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
btnUpdate.Location = new Point(16, 350);
btnUpdate.Name = "btnUpdate";
btnUpdate.Size = new Size(193, 57);
btnUpdate.TabIndex = 6;
btnUpdate.Text = "Update";
btnUpdate.UseVisualStyleBackColor = true;
btnUpdate.Click += btnRefresh_Click;
//
// btnTest
//
btnTest.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
btnTest.Location = new Point(17, 142);
btnTest.Name = "btnTest";
btnTest.Size = new Size(192, 80);
btnTest.TabIndex = 5;
btnTest.Text = "Choose\r\nfor testing";
btnTest.UseVisualStyleBackColor = true;
btnTest.Click += btnChooseforTest_Click;
//
// maskedTextBoxPosition
//
maskedTextBoxPosition.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
maskedTextBoxPosition.Location = new Point(17, 55);
maskedTextBoxPosition.Mask = "00";
maskedTextBoxPosition.Name = "maskedTextBoxPosition";
maskedTextBoxPosition.Size = new Size(192, 39);
maskedTextBoxPosition.TabIndex = 3;
maskedTextBoxPosition.ValidatingType = typeof(int);
//
// btnDelete
//
btnDelete.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
btnDelete.Location = new Point(17, 99);
btnDelete.Name = "btnDelete";
btnDelete.Size = new Size(192, 41);
btnDelete.TabIndex = 4;
btnDelete.Text = "Delete";
btnDelete.UseVisualStyleBackColor = true;
btnDelete.Click += btnRemoveShip_Click;
//
// btnAddCruiser
//
btnAddCruiser.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
btnAddCruiser.Location = new Point(16, 4);
btnAddCruiser.Name = "btnAddCruiser";
btnAddCruiser.Size = new Size(192, 48);
btnAddCruiser.TabIndex = 2;
btnAddCruiser.Text = "Add cruiser";
btnAddCruiser.UseVisualStyleBackColor = true;
btnAddCruiser.Click += btnAddTransport_Click;
//
// btnCreateCompany
//
btnCreateCompany.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
btnCreateCompany.Location = new Point(17, 447);
btnCreateCompany.Name = "btnCreateCompany";
btnCreateCompany.Size = new Size(245, 85);
btnCreateCompany.TabIndex = 12;
btnCreateCompany.Text = "Create or switch to Company";
btnCreateCompany.UseVisualStyleBackColor = true;
btnCreateCompany.Click += btnCreateCompany_Click;
//
// pictureBox
//
pictureBox.Dock = DockStyle.Left;
pictureBox.Location = new Point(0, 40);
pictureBox.Name = "pictureBox";
pictureBox.Size = new Size(1415, 967);
pictureBox.TabIndex = 3;
pictureBox.TabStop = false;
//
// menuStrip
//
menuStrip.ImageScalingSize = new Size(32, 32);
menuStrip.Items.AddRange(new ToolStripItem[] { fileToolStripMenuItem });
menuStrip.Location = new Point(0, 0);
menuStrip.Name = "menuStrip";
menuStrip.Size = new Size(1700, 40);
menuStrip.TabIndex = 4;
menuStrip.Text = "menuStrip1";
//
// fileToolStripMenuItem
//
fileToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { saveToolStripMenuItem, loadToolStripMenuItem });
fileToolStripMenuItem.Name = "fileToolStripMenuItem";
fileToolStripMenuItem.Size = new Size(71, 36);
fileToolStripMenuItem.Text = "File";
//
// saveToolStripMenuItem
//
saveToolStripMenuItem.Name = "saveToolStripMenuItem";
saveToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.S;
saveToolStripMenuItem.Size = new Size(277, 44);
saveToolStripMenuItem.Text = "Save";
saveToolStripMenuItem.Click += saveToolStripMenuItem_Click;
//
// loadToolStripMenuItem
//
loadToolStripMenuItem.Name = "loadToolStripMenuItem";
loadToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.L;
loadToolStripMenuItem.Size = new Size(277, 44);
loadToolStripMenuItem.Text = "Load";
loadToolStripMenuItem.Click += loadToolStripMenuItem_Click;
//
// saveFileDialog
//
saveFileDialog.Filter = "txt file|*.txt";
//
// openFileDialog
//
openFileDialog.Filter = "txt file|*.txt";
//
// btnSortType
//
btnSortType.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
btnSortType.Location = new Point(16, 232);
btnSortType.Name = "btnSortType";
btnSortType.Size = new Size(192, 52);
btnSortType.TabIndex = 7;
btnSortType.Text = "Sort by type";
btnSortType.UseVisualStyleBackColor = true;
btnSortType.Click += btnSortType_Click;
//
// btnSortColor
//
btnSortColor.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
btnSortColor.Location = new Point(16, 285);
btnSortColor.Name = "btnSortColor";
btnSortColor.Size = new Size(192, 52);
btnSortColor.TabIndex = 8;
btnSortColor.Text = "Sort by color";
btnSortColor.UseVisualStyleBackColor = true;
btnSortColor.Click += btnSortColor_Click;
//
// ServiceForm2
//
AutoScaleDimensions = new SizeF(13F, 32F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1700, 1007);
Controls.Add(pictureBox);
Controls.Add(groupBox);
Controls.Add(menuStrip);
MainMenuStrip = menuStrip;
Name = "ServiceForm2";
Text = "ServiceForm2";
groupBox.ResumeLayout(false);
companyPanel.ResumeLayout(false);
companyPanel.PerformLayout();
toolPanel.ResumeLayout(false);
toolPanel.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureBox).EndInit();
menuStrip.ResumeLayout(false);
menuStrip.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
#endregion
private ComboBox comboBoxArrList;
private GroupBox groupBox;
private Button btnAddCruiser;
private Button btnUpdate;
private Button btnTest;
private Button btnDelete;
private MaskedTextBox maskedTextBoxPosition;
private PictureBox pictureBox;
private Panel companyPanel;
private RadioButton rBtnArray;
private MaskedTextBox maskedTxtBoxCName;
private Label label;
private RadioButton rBtnList;
private Button btnAddCollection;
private ListBox listBox;
private Button btnDeleteCollection;
private Button btnCreateCompany;
private Panel toolPanel;
private MenuStrip menuStrip;
private ToolStripMenuItem fileToolStripMenuItem;
private ToolStripMenuItem saveToolStripMenuItem;
private ToolStripMenuItem loadToolStripMenuItem;
private SaveFileDialog saveFileDialog;
private OpenFileDialog openFileDialog;
private Button btnSortColor;
private Button btnSortType;
}
}

View File

@@ -0,0 +1,305 @@
using ProjectCruiser.CollectionGenericObj;
using ProjectCruiser.DrawningSamples;
using Microsoft.Extensions.Logging;
using ProjectCruiser.Exceptions;
// using NLog.Extensions.Logging;
namespace ProjectCruiser;
public partial class ServiceForm2 : Form
{
// Компания
private AbstractCompany? _company = null;
private readonly StorageCollection<DrawningBase> _storageCollection;
// Логер
private readonly ILogger _logger;
// Конструктор > logger
public ServiceForm2(ILogger<ServiceForm2> logger)
{
InitializeComponent();
_storageCollection = new();
_logger = logger;
_logger.LogInformation("> Form is loaded successfully");
}
// Выбор компании
private void SelectorCompany_SelectedIndexChanged(object sender, EventArgs e)
{
toolPanel.Enabled = false;
}
// Добавление корабля
private void btnAddTransport_Click(object sender, EventArgs e)
{
EditorForm3 form3 = new();
form3.AddEvent(CreateObject);
form3.Show();
}
// Создание объекта класса-перемещения
private void CreateObject(DrawningBase? ship)
{
try
{
if (_company == null || ship == null)
{
throw new NullReferenceException(" > No existing collections to save");
}
int count = _company + ship;
MessageBox.Show("> Object was added");
pictureBox.Image = _company.Show();
_logger.LogInformation("> Adding object succeed {ship} at {count} position", ship, count);
}
catch (Exception ex)
{
MessageBox.Show("[!] Failed to add object\n" + ex.Message);
_logger.LogError("< Error > : {Message}", ex.Message);
}
}
// Удаление объекта
private void btnRemoveShip_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(maskedTextBoxPosition.Text)
|| _company == null) return;
if (MessageBox.Show("[*] Remove object: Are you sure?", "Remove",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) return;
int pos = Convert.ToInt32(maskedTextBoxPosition.Text);
try
{
if (_company - pos != null)
{
MessageBox.Show("> Object was removed");
pictureBox.Image = _company.Show();
_logger.LogInformation("Object at " +
pos + "position was deleted successfully");
}
}
catch (Exception ex)
{
MessageBox.Show("[!] Failed to remove object");
_logger.LogError("< Error > : {Message}", ex.Message);
}
}
// Передача объекта в другую форму
private void btnChooseforTest_Click(object sender, EventArgs e)
{
if (_company == null)
{
return;
}
DrawningBase? ship = null;
int counter = 100;
while (ship == null)
{
try
{
ship = _company.GetRandomObject();
counter--;
if (counter <= 0)
{
break;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return;
}
}
if (ship == null)
{
return;
}
OceanForm1 form = new() { SetShip = ship };
form.ShowDialog();
}
private void btnRefresh_Click(object sender, EventArgs e)
{
if (_company == null)
{
return;
}
pictureBox.Image = _company.Show();
}
private void btnCollectionAdd_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(maskedTxtBoxCName.Text) || (!rBtnList.Checked && !rBtnArray.Checked))
{
MessageBox.Show("Enter correct data or choose an option", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
CollectionType collType = CollectionType.None;
if (rBtnArray.Checked)
{
collType = CollectionType.Array;
}
else if (rBtnList.Checked)
{
collType = CollectionType.List;
}
try
{
_storageCollection.AddCollection(maskedTxtBoxCName.Text, collType);
_logger.LogInformation("Adding collection succeed : {Name}, {Type}", maskedTxtBoxCName.Text, collType);
}
catch (NullReferenceException ex)
{
Console.WriteLine(ex.Message);
_logger.LogError("< Error > : {Message}", ex.Message);
}
RefreshListBoxItems();
}
private void btnCollectionDel_Click(object sender, EventArgs e)
{
if (listBox.SelectedItem == null || listBox.SelectedIndex < 0)
{
MessageBox.Show("Collection was not choosed");
return;
}
if (MessageBox.Show("Are you sure?", "Removing",
MessageBoxButtons.OK, MessageBoxIcon.Question)
!= DialogResult.OK) return;
try
{
_storageCollection.DelCollection(listBox.SelectedItem.ToString());
RefreshListBoxItems();
_logger.LogInformation("Removing collection succeed : {Name}", listBox.SelectedItem.ToString);
}
catch (NullReferenceException ex)
{
Console.WriteLine(ex.Message);
_logger.LogError("< Error > : {Message}", ex.Message);
}
}
private void RefreshListBoxItems()
{
listBox.Items.Clear();
for (int i = 0; i < _storageCollection.Keys?.Count; ++i)
{
string? collName = _storageCollection.Keys?[i].Name;
if (!string.IsNullOrEmpty(collName))
{
listBox.Items.Add(collName);
}
}
}
private void btnCreateCompany_Click(object sender, EventArgs e)
{
if (listBox.SelectedIndex < 0 || listBox.SelectedItem == null)
{
MessageBox.Show("Collection wasn't choosed");
return;
}
ICollectionGenObj<DrawningBase>? collection =
_storageCollection[listBox.SelectedItem.ToString() ?? string.Empty];
if (collection == null)
{
MessageBox.Show("Collection wasn't initialized");
return;
}
switch (comboBoxArrList.Text)
{
case "Storage":
_company = new ShipSharingService(pictureBox.Width,
pictureBox.Height, collection);
break;
}
toolPanel.Enabled = true; // block of buttons at the right bottom
RefreshListBoxItems();
}
// saving to file
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
try
{
_storageCollection.SaveData(saveFileDialog.FileName);
MessageBox.Show(" < Saved succesfully >",
"Result :", MessageBoxButtons.OK, MessageBoxIcon.Information);
_logger.LogInformation("Saving to file : {filename}", saveFileDialog.FileName);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Result :", MessageBoxButtons.OK, MessageBoxIcon.Error);
_logger.LogError("< Error > : {Message}", ex.Message);
}
}
}
// loading from file
private void loadToolStripMenuItem_Click(object sender, EventArgs e)
{
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
try
{
_storageCollection.LoadData(openFileDialog.FileName);
MessageBox.Show(" < Loaded succesfully >",
"Result :", MessageBoxButtons.OK, MessageBoxIcon.Information);
_logger.LogInformation("Loading from file : {Filename}", openFileDialog.FileName);
RefreshListBoxItems();
}
catch (Exception ex)
{
MessageBox.Show("< Failed to load >" + ex.Message,
"Result :", MessageBoxButtons.OK, MessageBoxIcon.Error);
_logger.LogError("< Error > : {Message}", ex.Message);
}
}
}
// Сортировка по сравнителю
private void CompareShips(IComparer<DrawningBase?> comparer)
{
if (_company == null)
{
return;
}
_company.Sort(comparer);
pictureBox.Image = _company.Show();
}
private void btnSortType_Click(object sender, EventArgs e)
{
CompareShips(new DrawningShipCompare());
}
private void btnSortColor_Click(object sender, EventArgs e)
{
CompareShips(new DrawningShipCompareByColor());
}
}

View File

@@ -0,0 +1,129 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>217, 17</value>
</metadata>
<metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>460, 17</value>
</metadata>
</root>

View File

@@ -0,0 +1,6 @@
using ProjectCruiser.DrawningSamples;
namespace ProjectCruiser
{
public delegate void ShipDelegate(DrawningBase transport);
}

View File

@@ -0,0 +1,15 @@
{
"Serilog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "File",
"Args": { "path": "log.log" }
}
],
"Properties": {
"Application": "Sample"
}
}
}