using ProjectAirplaneWithRadar.Drawnings;
using ProjectAirplaneWithRadar.Exceptions;
namespace ProjectAirplaneWithRadar.CollectionGenericObjects
{
///
/// Абстракция компании, хранящий коллекцию автомобилей
///
public abstract class AbstractCompany
{
///
/// Размер места (ширина)
///
protected readonly int _placeSizeWidth = 210;
///
/// Размер места (высота)
///
protected readonly int _placeSizeHeight = 110;
///
/// Ширина окна
///
protected readonly int _pictureWidth;
///
/// Высота окна
///
protected readonly int _pictureHeight;
///
/// Коллекция автомобилей
///
protected ICollectionGenericObjects? _collection = null;
///
/// Вычисление максимального количества элементов, который можно разместить в окне
///
private int GetMaxCount => _pictureWidth / _placeSizeWidth * (_pictureHeight / _placeSizeHeight);
///
/// Конструктор
///
/// Ширина окна
/// Высота окна
/// Коллекция автомобилей
public AbstractCompany(int picWidth, int picHeight, ICollectionGenericObjects collection)
{
_pictureWidth = picWidth;
_pictureHeight = picHeight;
_collection = collection;
_collection.MaxCount = GetMaxCount;
}
///
/// Перегрузка оператора сложения для класса
///
/// Компания
/// Добавляемый объект
///
public static int operator +(AbstractCompany company, DrawningAirplane airplane)
{
return company._collection.Insert(airplane, new DrawningAirplaneEqutables());
}
///
/// Перегрузка оператора удаления для класса
///
/// Компания
/// Номер удаляемого объекта
///
public static DrawningAirplane operator -(AbstractCompany company, int position)
{
return company._collection.Remove(position);
}
///
/// Получение случайного объекта из коллекции
///
///
public DrawningAirplane? GetRandomObject()
{
Random rnd = new();
try
{
return _collection?.Get(rnd.Next(GetMaxCount));
}
catch (ObjectNotFoundException)
{
return null;
}
}
///
/// Вывод всей коллекции
///
///
public Bitmap? Show()
{
Bitmap bitmap = new(_pictureWidth, _pictureHeight);
Graphics graphics = Graphics.FromImage(bitmap);
DrawBackgound(graphics);
SetObjectsPosition();
for (int i = 0; i < (_collection?.Count ?? 0); ++i)
{
try
{
DrawningAirplane? obj = _collection?.Get(i);
obj?.DrawTransport(graphics);
}
catch (ObjectNotFoundException)
{
continue;
}
}
return bitmap;
}
///
/// Вывод заднего фона
///
///
protected abstract void DrawBackgound(Graphics g);
///
/// Расстановка объектов
///
protected abstract void SetObjectsPosition();
///
/// Сортировка
///
/// Сравнитель объектов
public void Sort(IComparer comparer) => _collection?.CollectionSort(comparer);
}
}