using Lattice.Core.Docking.Abstractions; using Lattice.Core.Docking.Engine; using Lattice.Core.Docking.Models; using Lattice.UI.Docking.Abstractions; using Lattice.UI.Docking.Factories; namespace Lattice.UI.Docking.Utilities; /// /// Предоставляет утилитарные методы для работы с док-системой. /// public static class DockUtilities { /// /// Создает дерево контролов для указанного менеджера макета. /// public static IDockControl? CreateControlTree(LayoutManager manager, IDockControlFactory factory, IDockControl? parentControl = null) { if (manager == null) throw new ArgumentNullException(nameof(manager)); if (factory == null) throw new ArgumentNullException(nameof(factory)); return CreateControlForElement(manager.Root, factory, parentControl); } /// /// Создает контрол для указанного элемента. /// public static IDockControl? CreateControlForElement(IDockElement? element, IDockControlFactory factory, IDockControl? parentControl = null) { if (element == null) return null; var control = factory.CreateControlForElement(element); if (control == null) return null; // Устанавливаем родительский контрол if (parentControl != null) { // Здесь может быть установка дополнительных связей } // Рекурсивно создаем дочерние контролы if (element is DockGroup group) { if (control is IDockGroupControl groupControl) { var firstChild = CreateControlForElement(group.First, factory, control); var secondChild = CreateControlForElement(group.Second, factory, control); groupControl.SetChildren(firstChild, secondChild); } } return control; } /// /// Находит контрол для указанного элемента в дереве контролов. /// public static IDockControl? FindControlForElement(IDockControl root, IDockElement element) { if (root == null) throw new ArgumentNullException(nameof(root)); if (element == null) throw new ArgumentNullException(nameof(element)); if (root.Model?.Id == element.Id) return root; if (root is IDockGroupControl groupControl) { var found = FindControlForElement(groupControl.FirstChild, element); if (found != null) return found; found = FindControlForElement(groupControl.SecondChild, element); if (found != null) return found; } return null; } /// /// Обновляет дерево контролов при изменении макета. /// public static void UpdateControlTree(IDockControl root, LayoutManager manager, IDockControlFactory factory) { if (root == null) throw new ArgumentNullException(nameof(root)); if (manager == null) throw new ArgumentNullException(nameof(manager)); if (factory == null) throw new ArgumentNullException(nameof(factory)); // TODO: Реализовать эффективное обновление дерева контролов // вместо полной перестройки } }