189 lines
7.1 KiB
C#
189 lines
7.1 KiB
C#
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;
|
||
|
||
/// <summary>
|
||
/// Предоставляет упрощенный статический API для инициализации и конфигурации системы докинга Lattice.
|
||
/// </summary>
|
||
public static class LatticeDock
|
||
{
|
||
/// <summary>
|
||
/// Создает новый строитель конфигурации системы докинга для WinUI.
|
||
/// </summary>
|
||
/// <returns>Экземпляр <see cref="DockBuilder"/> для настройки системы.</returns>
|
||
public static DockBuilder CreateWinUIBuilder()
|
||
{
|
||
return new DockBuilder()
|
||
.WithWinUIFactory()
|
||
.WithWinUIContextManager()
|
||
.WithWinUIService();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Настраивает строитель для использования фабрики WinUI.
|
||
/// </summary>
|
||
public static DockBuilder WithWinUIFactory(this DockBuilder builder)
|
||
{
|
||
return builder.WithControlFactory(new WinUIDockControlFactory());
|
||
}
|
||
|
||
/// <summary>
|
||
/// Настраивает строитель для использования контекстного менеджера WinUI.
|
||
/// </summary>
|
||
public static DockBuilder WithWinUIContextManager(this DockBuilder builder)
|
||
{
|
||
return builder.WithContextManager(new WinUIDockContextManager());
|
||
}
|
||
|
||
/// <summary>
|
||
/// Настраивает строитель для использования UI-сервиса WinUI.
|
||
/// </summary>
|
||
public static DockBuilder WithWinUIService(this DockBuilder builder)
|
||
{
|
||
return builder.WithUIService(new WinUIDockUIService());
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Предоставляет fluent-интерфейс для конфигурации системы докинга Lattice.
|
||
/// </summary>
|
||
public sealed class DockBuilder
|
||
{
|
||
private readonly LayoutManager _layoutManager;
|
||
private readonly ContentRegistry _contentRegistry;
|
||
private IDockControlFactory? _factory;
|
||
private IDockContextManager? _contextManager;
|
||
private IDockUIService? _uiService;
|
||
|
||
/// <summary>
|
||
/// Инициализирует новый экземпляр класса <see cref="DockBuilder"/>.
|
||
/// Создает менеджер макета и реестр контента по умолчанию.
|
||
/// </summary>
|
||
public DockBuilder()
|
||
{
|
||
_layoutManager = new LayoutManager();
|
||
_contentRegistry = new ContentRegistry();
|
||
_layoutManager.ContentRegistry = _contentRegistry;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Регистрирует фабрику контролов для создания UI-элементов.
|
||
/// </summary>
|
||
/// <param name="factory">Фабрика контролов.</param>
|
||
/// <returns>Текущий экземпляр <see cref="DockBuilder"/> для цепочки вызовов.</returns>
|
||
public DockBuilder WithControlFactory(IDockControlFactory factory)
|
||
{
|
||
_factory = factory;
|
||
return this;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Регистрирует менеджер контекстных меню.
|
||
/// </summary>
|
||
/// <param name="contextManager">Менеджер контекстных меню.</param>
|
||
/// <returns>Текущий экземпляр <see cref="DockBuilder"/> для цепочки вызовов.</returns>
|
||
public DockBuilder WithContextManager(IDockContextManager contextManager)
|
||
{
|
||
_contextManager = contextManager;
|
||
return this;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Регистрирует UI-сервис для выполнения платформенно-зависимых операций.
|
||
/// </summary>
|
||
/// <param name="uiService">UI-сервис.</param>
|
||
/// <returns>Текущий экземпляр <see cref="DockBuilder"/> для цепочки вызовов.</returns>
|
||
public DockBuilder WithUIService(IDockUIService uiService)
|
||
{
|
||
_uiService = uiService;
|
||
return this;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Регистрирует тип контента в реестре.
|
||
/// </summary>
|
||
public DockBuilder RegisterContentType<T>(string contentTypeId, Func<T> factory, ContentMetadata? metadata = null)
|
||
where T : Core.Docking.Abstractions.IDockContent
|
||
{
|
||
_contentRegistry.Register(contentTypeId, factory, metadata);
|
||
return this;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Завершает конфигурацию системы докинга и возвращает настроенный экземпляр <see cref="IDockSystem"/>.
|
||
/// </summary>
|
||
/// <returns>Настроенная система докинга.</returns>
|
||
public IDockSystem Build()
|
||
{
|
||
// Настраиваем связи между компонентами
|
||
if (_factory is DockControlFactoryBase factoryBase && _contextManager != null)
|
||
{
|
||
factoryBase.ContextManager = _contextManager;
|
||
}
|
||
|
||
return new DockSystem(_layoutManager, _contentRegistry, _factory, _contextManager, _uiService);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Представляет настроенную систему докинга с доступом ко всем основным компонентам.
|
||
/// </summary>
|
||
public interface IDockSystem
|
||
{
|
||
/// <summary>
|
||
/// Получает менеджер макета.
|
||
/// </summary>
|
||
LayoutManager LayoutManager { get; }
|
||
|
||
/// <summary>
|
||
/// Получает реестр контента.
|
||
/// </summary>
|
||
ContentRegistry ContentRegistry { get; }
|
||
|
||
/// <summary>
|
||
/// Получает фабрику контролов.
|
||
/// </summary>
|
||
IDockControlFactory? ControlFactory { get; }
|
||
|
||
/// <summary>
|
||
/// Получает менеджер контекстных меню.
|
||
/// </summary>
|
||
IDockContextManager? ContextManager { get; }
|
||
|
||
/// <summary>
|
||
/// Получает UI-сервис.
|
||
/// </summary>
|
||
IDockUIService? UIService { get; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// Реализация интерфейса <see cref="IDockSystem"/>.
|
||
/// </summary>
|
||
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;
|
||
}
|
||
} |