using Lattice.Core.Docking.Engine;
using Lattice.Core.Docking.Services;
using Lattice.UI.Docking.Abstractions;
using Lattice.UI.Docking.Factories;
using Lattice.UI.Docking.WinUI.Factories;
using Lattice.UI.Docking.WinUI.Services;
using System;
namespace Lattice.UI.Docking;
///
/// Предоставляет упрощенный статический API для инициализации и конфигурации системы докинга Lattice.
///
public static class LatticeDock
{
///
/// Создает новый строитель конфигурации системы докинга для WinUI.
///
/// Экземпляр для настройки системы.
public static DockBuilder CreateWinUIBuilder()
{
return new DockBuilder()
.WithWinUIFactory()
.WithWinUIContextManager()
.WithWinUIService();
}
///
/// Настраивает строитель для использования фабрики WinUI.
///
public static DockBuilder WithWinUIFactory(this DockBuilder builder)
{
return builder.WithControlFactory(new WinUIDockControlFactory());
}
///
/// Настраивает строитель для использования контекстного менеджера WinUI.
///
public static DockBuilder WithWinUIContextManager(this DockBuilder builder)
{
return builder.WithContextManager(new WinUIDockContextManager());
}
///
/// Настраивает строитель для использования UI-сервиса WinUI.
///
public static DockBuilder WithWinUIService(this DockBuilder builder)
{
return builder.WithUIService(new WinUIDockUIService());
}
}
///
/// Предоставляет fluent-интерфейс для конфигурации системы докинга Lattice.
///
public sealed class DockBuilder
{
private readonly LayoutManager _layoutManager;
private readonly ContentRegistry _contentRegistry;
private IDockControlFactory? _factory;
private IDockContextManager? _contextManager;
private IDockUIService? _uiService;
///
/// Инициализирует новый экземпляр класса .
/// Создает менеджер макета и реестр контента по умолчанию.
///
public DockBuilder()
{
_layoutManager = new LayoutManager();
_contentRegistry = new ContentRegistry();
_layoutManager.ContentRegistry = _contentRegistry;
}
///
/// Регистрирует фабрику контролов для создания UI-элементов.
///
/// Фабрика контролов.
/// Текущий экземпляр для цепочки вызовов.
public DockBuilder WithControlFactory(IDockControlFactory factory)
{
_factory = factory;
return this;
}
///
/// Регистрирует менеджер контекстных меню.
///
/// Менеджер контекстных меню.
/// Текущий экземпляр для цепочки вызовов.
public DockBuilder WithContextManager(IDockContextManager contextManager)
{
_contextManager = contextManager;
return this;
}
///
/// Регистрирует UI-сервис для выполнения платформенно-зависимых операций.
///
/// UI-сервис.
/// Текущий экземпляр для цепочки вызовов.
public DockBuilder WithUIService(IDockUIService uiService)
{
_uiService = uiService;
return this;
}
///
/// Регистрирует тип контента в реестре.
///
public DockBuilder RegisterContentType(string contentTypeId, Func factory, ContentMetadata? metadata = null)
where T : Core.Docking.Abstractions.IDockContent
{
_contentRegistry.Register(contentTypeId, factory, metadata);
return this;
}
///
/// Завершает конфигурацию системы докинга и возвращает настроенный экземпляр .
///
/// Настроенная система докинга.
public IDockSystem Build()
{
// Настраиваем связи между компонентами
if (_factory is DockControlFactoryBase factoryBase && _contextManager != null)
{
factoryBase.ContextManager = _contextManager;
}
return new DockSystem(_layoutManager, _contentRegistry, _factory, _contextManager, _uiService);
}
}
///
/// Представляет настроенную систему докинга с доступом ко всем основным компонентам.
///
public interface IDockSystem
{
///
/// Получает менеджер макета.
///
LayoutManager LayoutManager { get; }
///
/// Получает реестр контента.
///
ContentRegistry ContentRegistry { get; }
///
/// Получает фабрику контролов.
///
IDockControlFactory? ControlFactory { get; }
///
/// Получает менеджер контекстных меню.
///
IDockContextManager? ContextManager { get; }
///
/// Получает UI-сервис.
///
IDockUIService? UIService { get; }
}
///
/// Реализация интерфейса .
///
internal sealed class DockSystem : IDockSystem
{
public LayoutManager LayoutManager { get; }
public ContentRegistry ContentRegistry { get; }
public IDockControlFactory? ControlFactory { get; }
public IDockContextManager? ContextManager { get; }
public IDockUIService? UIService { get; }
public DockSystem(
LayoutManager layoutManager,
ContentRegistry contentRegistry,
IDockControlFactory? controlFactory,
IDockContextManager? contextManager,
IDockUIService? uiService)
{
LayoutManager = layoutManager ?? throw new ArgumentNullException(nameof(layoutManager));
ContentRegistry = contentRegistry ?? throw new ArgumentNullException(nameof(contentRegistry));
ControlFactory = controlFactory;
ContextManager = contextManager;
UIService = uiService;
}
}