using Lattice.Core.Docking.Abstractions;
using Lattice.Core.Docking.Models;
using Lattice.UI.Docking.Abstractions;
namespace Lattice.UI.Docking.Factories;
///
/// Предоставляет базовую реализацию фабрики для создания UI-контролов док-системы.
///
///
/// Этот класс реализует общую логику для фабрик контролов, включая настройку
/// общих свойств и создание контролов для произвольных элементов.
///
public abstract class DockControlFactoryBase : IDockControlFactory
{
///
/// Получает или задает менеджер контекста для создаваемых контролов.
///
///
/// Экземпляр или null, если не установлен.
///
public IDockContextManager? ContextManager { get; set; }
///
/// Создает контрол для группы разделения.
///
/// Модель группы.
///
/// Созданный контрол группы.
///
///
/// Выбрасывается, если равен null.
///
///
/// Этот метод должен быть реализован в производных классах.
///
public abstract IDockGroupControl CreateGroupControl(DockGroup group);
///
/// Создает контрол для контейнера вкладок.
///
/// Модель листа.
///
/// Созданный контрол листа.
///
///
/// Выбрасывается, если равен null.
///
///
/// Этот метод должен быть реализован в производных классах.
///
public abstract IDockLeafControl CreateLeafControl(DockLeaf leaf);
///
/// Создает контрол для плавающего окна.
///
/// Модель окна.
///
/// Созданный контрол окна.
///
///
/// Выбрасывается, если равен null.
///
///
/// Этот метод должен быть реализован в производных классах.
///
public abstract IFloatingWindowControl CreateFloatingWindowControl(DockWindow window);
///
/// Создает контрол для автоскрываемой панели.
///
/// Модель панели.
///
/// Созданный контрол панели.
///
///
/// Выбрасывается, если равен null.
///
///
/// Этот метод должен быть реализован в производных классах.
///
public abstract IAutoHidePanelControl CreateAutoHidePanelControl(AutoHidePanel panel);
///
/// Создает контрол для разделителя.
///
/// Ориентация разделителя.
///
/// Созданный контрол разделителя.
///
///
/// Этот метод должен быть реализован в производных классах.
///
public abstract IDockSplitterControl CreateSplitterControl(SplitDirection orientation);
///
public virtual IDockControl? CreateControlForElement(IDockElement element)
{
if (element == null) throw new ArgumentNullException(nameof(element));
IDockControl? control = null;
switch (element)
{
case DockGroup group:
control = CreateGroupControl(group);
break;
case DockLeaf leaf:
control = CreateLeafControl(leaf);
break;
default:
control = null;
break;
}
if (control != null)
{
ConfigureControl(control);
}
return control;
}
///
/// Настраивает общие свойства контрола.
///
/// Контрол для настройки.
///
/// Выбрасывается, если равен null.
///
///
/// Устанавливает общие свойства, такие как контекстный менеджер,
/// для всех создаваемых контролов.
///
protected virtual void ConfigureControl(IDockControl control)
{
if (control == null) throw new ArgumentNullException(nameof(control));
if (ContextManager != null)
{
control.ContextManager = ContextManager;
}
}
}