using Lattice.Core.Docking.Abstractions;
using Lattice.Core.Docking.Models;
using Lattice.UI.Docking.Abstractions;
using Lattice.UI.Docking.Factories;
using Microsoft.UI.Xaml;
using System;
namespace Lattice.UI.Docking.WinUI.Factories;
///
/// Фабрика контролов для платформы WinUI.
/// Создает UI-элементы для отображения компонентов системы докинга.
///
///
///
/// Фабрика реализует паттерн "Абстрактная фабрика", предоставляя единый интерфейс
/// для создания всех типов контролов док-системы. Это позволяет абстрагировать
/// конкретную UI-платформу (WinUI) от бизнес-логики системы.
///
///
/// Все создаваемые контролы автоматически настраиваются: устанавливаются связи
/// с менеджером макета, контекстным менеджером и применяется текущая тема оформления.
///
///
public sealed class WinUIDockControlFactory : DockControlFactoryBase, IDockControlFactory
{
private readonly IDockTheme _theme;
///
/// Инициализирует новый экземпляр фабрики WinUI.
///
/// Тема оформления для применения к создаваемым контролам.
///
/// Выбрасывается, если равен null.
///
///
/// Конструктор создает фабрику с заданной темой оформления. Все контролы,
/// созданные этой фабрикой, будут автоматически применять указанную тему.
///
public WinUIDockControlFactory(IDockTheme theme)
{
_theme = theme ?? throw new ArgumentNullException(nameof(theme));
}
///
/// Создает контрол для группы разделения.
///
/// Модель группы разделения.
///
/// Созданный контрол группы.
///
///
/// Выбрасывается, если равен null.
///
///
/// Создает экземпляр , настраивает его связи
/// с моделью и другими сервисами, применяет текущую тему оформления.
///
public override IDockGroupControl CreateGroupControl(DockGroup group)
{
var control = new LatticeDockGroup();
ConfigureControl(control, group);
control.ApplyTheme(_theme);
return control;
}
///
/// Создает контрол для контейнера вкладок.
///
/// Модель контейнера вкладок.
///
/// Созданный контрол листа.
///
///
/// Выбрасывается, если равен null.
///
///
/// Создает экземпляр , настраивает его связи
/// с моделью и другими сервисами, применяет текущую тему оформления.
/// Контрол поддерживает все положения панели вкладок и операции с вкладками.
///
public override IDockLeafControl CreateLeafControl(DockLeaf leaf)
{
var control = new LatticeTabControl();
ConfigureControl(control, leaf);
control.ApplyTheme(_theme);
return control;
}
///
/// Создает контрол для плавающего окна.
///
/// Модель плавающего окна.
///
/// Созданный контрол окна.
///
///
/// Выбрасывается, если равен null.
///
///
/// В текущей реализации метод не реализован. Плавающие окна требуют
/// дополнительной интеграции с оконной системой платформы.
///
public override IFloatingWindowControl CreateFloatingWindowControl(DockWindow window)
{
// TODO: Реализовать создание плавающего окна
throw new NotImplementedException();
}
///
/// Создает контрол для автоскрываемой панели.
///
/// Модель автоскрываемой панели.
///
/// Созданный контрол панели.
///
///
/// Выбрасывается, если равен null.
///
///
/// В текущей реализации метод не реализован. Автоскрываемые панели требуют
/// сложной логики анимации и взаимодействия с краями окна.
///
public override IAutoHidePanelControl CreateAutoHidePanelControl(AutoHidePanel panel)
{
// TODO: Реализовать создание автоскрываемой панели
throw new NotImplementedException();
}
///
/// Создает контрол для разделителя.
///
/// Ориентация разделителя.
///
/// Созданный контрол разделителя.
///
///
/// Создает экземпляр , настраивает его ориентацию
/// и применяет текущую тему оформления. Разделитель поддерживает перетаскивание
/// для изменения соотношения размеров между соседними областями.
///
public override IDockSplitterControl CreateSplitterControl(SplitDirection orientation)
{
var control = new LatticeSplitter
{
Orientation = orientation
};
ConfigureControl(control);
control.ApplyTheme(_theme);
return control;
}
///
/// Создает хост для размещения системы докинга.
///
///
/// Созданный док-хост.
///
///
/// Создает корневой контейнер для всей системы докинга - экземпляр .
/// Хост управляет всем макетом приложения, включая основное дерево компоновки,
/// плавающие окна и автоскрываемые панели.
///
public IDockHost CreateDockHost()
{
var host = new LatticeDockHost();
ConfigureControl(host);
host.ApplyTheme(_theme);
return host;
}
///
/// Настраивает созданный контрол.
///
/// Контрол для настройки.
/// Модель данных для контрола (опционально).
///
/// Устанавливает основные связи контрола: модель данных, менеджер макета,
/// контекстный менеджер. Также настраивает привязку данных через DataContext.
/// Этот метод вызывается для всех создаваемых контролов.
///
private void ConfigureControl(IDockControl control, IDockElement? model = null)
{
if (control == null) return;
control.Model = model;
control.LayoutManager = LatticeUIFramework.LayoutManager;
control.ContextManager = LatticeUIFramework.ContextManager;
if (control is FrameworkElement frameworkElement && model != null)
{
frameworkElement.DataContext = model;
}
}
}