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; } } }