using Lattice.Core.Docking.Engine;
using Lattice.Core.Docking.Services;
using Lattice.UI.Docking.Abstractions;
using Lattice.UI.Docking.Factories;
namespace Lattice.UI.Docking;
///
/// Предоставляет статический API для инициализации и управления UI-фреймворком Lattice.
///
public static class LatticeUIFramework
{
private static bool _isInitialized;
private static LatticeBuilder? _currentBuilder;
///
/// Получает значение, указывающее, инициализирован ли фреймворк.
///
public static bool IsInitialized => _isInitialized;
///
/// Получает текущий строитель конфигурации фреймворка.
///
public static LatticeBuilder CurrentBuilder
{
get
{
if (!_isInitialized)
throw new InvalidOperationException("Lattice framework is not initialized. Call Initialize() first.");
return _currentBuilder!;
}
}
///
/// Получает менеджер макета из текущего строителя.
///
public static LayoutManager? LayoutManager => _currentBuilder?.LayoutManager;
///
/// Получает реестр контента из текущего строителя.
///
public static ContentRegistry? ContentRegistry => _currentBuilder?.ContentRegistry;
///
/// Получает фабрику контролов из текущего строителя.
///
public static IDockControlFactory? ControlFactory => _currentBuilder?.ControlFactory;
///
/// Получает менеджер контекстных меню из текущего строителя.
///
public static IDockContextManager? ContextManager => _currentBuilder?.ContextManager;
///
/// Получает UI-сервис из текущего строителя.
///
public static IDockUIService? UIService => _currentBuilder?.UIService;
///
/// Инициализирует фреймворк Lattice с указанными параметрами.
///
public static LatticeBuilder Initialize(LatticeOptions? options = null)
{
if (_isInitialized)
throw new InvalidOperationException("Lattice framework is already initialized");
options ??= new LatticeOptions();
var layoutManager = new LayoutManager();
var contentRegistry = new ContentRegistry();
_currentBuilder = new LatticeBuilder(layoutManager, contentRegistry, options);
_isInitialized = true;
return _currentBuilder;
}
///
/// Сбрасывает состояние фреймворка к неинициализированному.
///
public static void Reset()
{
_isInitialized = false;
_currentBuilder = null;
}
}
///
/// Представляет настройки инициализации фреймворка Lattice.
///
public class LatticeOptions
{
///
/// Получает или задает значение, указывающее, следует ли автоматически
/// регистрировать стандартные команды.
///
public bool RegisterDefaultCommands { get; set; } = true;
///
/// Получает или задает значение, указывающее, следует ли автоматически
/// создавать сервисы при их первом запросе.
///
public bool AutoCreateServices { get; set; } = true;
///
/// Получает или задает идентификатор приложения.
///
public string? ApplicationId { get; set; }
///
/// Получает или задает значение, указывающее, следует ли включить
/// расширенное логирование операций системы.
///
public bool EnableVerboseLogging { get; set; } = false;
}
///
/// Предоставляет fluent-интерфейс для конфигурации фреймворка Lattice.
///
public sealed class LatticeBuilder
{
private readonly LayoutManager _layoutManager;
private readonly ContentRegistry _contentRegistry;
private readonly LatticeOptions _options;
private IDockControlFactory? _controlFactory;
private IDockContextManager? _contextManager;
private IDockUIService? _uiService;
private bool _isBuilt;
///
/// Получает менеджер макета.
///
public LayoutManager LayoutManager => _layoutManager;
///
/// Получает реестр контента.
///
public ContentRegistry ContentRegistry => _contentRegistry;
///
/// Получает фабрику контролов.
///
public IDockControlFactory? ControlFactory => _controlFactory;
///
/// Получает менеджер контекстных меню.
///
public IDockContextManager? ContextManager => _contextManager;
///
/// Получает UI-сервис.
///
public IDockUIService? UIService => _uiService;
///
/// Инициализирует новый экземпляр класса .
///
internal LatticeBuilder(LayoutManager layoutManager, ContentRegistry contentRegistry, LatticeOptions options)
{
_layoutManager = layoutManager ?? throw new ArgumentNullException(nameof(layoutManager));
_contentRegistry = contentRegistry ?? throw new ArgumentNullException(nameof(contentRegistry));
_options = options ?? throw new ArgumentNullException(nameof(options));
_layoutManager.ContentRegistry = contentRegistry;
}
///
/// Регистрирует фабрику контролов для создания UI-элементов.
///
public LatticeBuilder WithControlFactory(IDockControlFactory factory)
{
_controlFactory = factory ?? throw new ArgumentNullException(nameof(factory));
return this;
}
///
/// Регистрирует менеджер контекстных меню для управления контекстными действиями.
///
public LatticeBuilder WithContextManager(IDockContextManager manager)
{
_contextManager = manager ?? throw new ArgumentNullException(nameof(manager));
return this;
}
///
/// Регистрирует UI-сервис для выполнения платформенно-зависимых операций.
///
public LatticeBuilder WithUIService(IDockUIService service)
{
_uiService = service ?? throw new ArgumentNullException(nameof(service));
return this;
}
///
/// Регистрирует тип контента в реестре.
///
public LatticeBuilder RegisterContentType(string contentTypeId, Func factory, ContentMetadata? metadata = null)
where T : Core.Docking.Abstractions.IDockContent
{
if (string.IsNullOrWhiteSpace(contentTypeId))
throw new ArgumentNullException(nameof(contentTypeId));
_contentRegistry.Register(contentTypeId, factory, metadata);
return this;
}
///
/// Завершает конфигурацию фреймворка.
///
public ILatticeFramework Build()
{
if (_isBuilt)
throw new InvalidOperationException("Framework has already been built.");
_isBuilt = true;
return new LatticeFramework(this);
}
}
///
/// Предоставляет интерфейс для доступа к компонентам фреймворка Lattice.
///
public interface ILatticeFramework
{
///
/// Получает менеджер макета.
///
LayoutManager LayoutManager { get; }
///
/// Получает реестр контента.
///
ContentRegistry ContentRegistry { get; }
///
/// Получает фабрику контролов.
///
IDockControlFactory? ControlFactory { get; }
///
/// Получает менеджер контекстных меню.
///
IDockContextManager? ContextManager { get; }
///
/// Получает UI-сервис.
///
IDockUIService? UIService { get; }
}
///
/// Реализация интерфейса .
///
internal class LatticeFramework : ILatticeFramework
{
private readonly LatticeBuilder _builder;
///
/// Инициализирует новый экземпляр класса .
///
public LatticeFramework(LatticeBuilder builder)
{
_builder = builder ?? throw new ArgumentNullException(nameof(builder));
}
///
public LayoutManager LayoutManager => _builder.LayoutManager;
///
public ContentRegistry ContentRegistry => _builder.ContentRegistry;
///
public IDockControlFactory? ControlFactory => _builder.ControlFactory;
///
public IDockContextManager? ContextManager => _builder.ContextManager;
///
public IDockUIService? UIService => _builder.UIService;
}