using Lattice.Core.Docking.Abstractions;
using Lattice.Core.Docking.Models;
namespace Lattice.UI.Docking.Abstractions;
///
/// Определяет контракт для главного контейнера док-системы, который служит корневым элементом
/// для всего пользовательского интерфейса системы докинга. Управляет размещением и состоянием
/// всех дочерних элементов, включая плавающие окна и автоскрываемые панели.
///
///
/// Реализации этого интерфейса представляют собой центральный координатор UI-слоя,
/// который интегрирует функциональность менеджера макета и контекстных меню в единый визуальный компонент.
///
public interface IDockHost : IDockControl
{
///
/// Получает коллекцию контролов плавающих окон, связанных с этим хостом.
///
///
/// Коллекция объектов, реализующих ,
/// представляющих все активные плавающие окна в системе.
///
///
/// Плавающие окна могут быть созданы пользователем или программно через методы API.
///
IEnumerable FloatingWindows { get; }
///
/// Получает коллекцию контролов автоскрываемых панелей, прикрепленных к краям окна.
///
///
/// Коллекция объектов, реализующих ,
/// представляющих автоскрываемые панели на разных сторонах окна.
///
///
/// Автоскрываемые панели скрываются, оставляя видимой только полоску-заголовок,
/// и разворачиваются при наведении курсора или клике.
///
IEnumerable AutoHidePanels { get; }
///
/// Получает или задает значение, указывающее, отображается ли панель инструментов (Toolbox).
///
///
/// true, если панель инструментов видима; в противном случае false.
/// Значение по умолчанию зависит от реализации.
///
///
/// Панель инструментов обычно содержит элементы для быстрого доступа к командам
/// или создания новых компонентов в приложении.
///
bool ShowToolbox { get; set; }
///
/// Получает или задает значение, указывающее, отображается ли строка состояния.
///
///
/// true, если строка состояния видима; в противном случае false.
/// Значение по умолчанию зависит от реализации.
///
///
/// Строка состояния обычно отображает текущий статус приложения,
/// информацию о выбранном элементе или прогресс выполнения операций.
///
bool ShowStatusBar { get; set; }
///
/// Получает или задает значение, указывающее, отображается ли главное меню приложения.
///
///
/// true, если главное меню видимо; в противном случае false.
/// Значение по умолчанию зависит от реализации.
///
bool ShowMenu { get; set; }
///
/// Создает новое плавающее окно для размещения указанного элемента док-системы.
///
///
/// Элемент док-системы (группа или лист), который будет размещен в плавающем окне.
///
/// Заголовок создаваемого окна.
///
/// Экземпляр , представляющий созданное плавающее окно.
///
///
/// Выбрасывается, если равен null.
///
///
/// Созданное окно может быть перемещено пользователем в любое место экрана,
/// изменено в размерах и обычно содержит стандартные элементы управления окном
/// (заголовок, кнопки закрытия/сворачивания).
///
IFloatingWindowControl CreateFloatingWindow(IDockElement element, string title);
///
/// Закрывает указанное плавающее окно и возвращает его содержимое в основной макет.
///
///
/// Плавающее окно, которое необходимо закрыть.
///
///
/// Выбрасывается, если равен null.
///
///
/// При закрытии плавающего окна его содержимое обычно возвращается в то место
/// в основном макете, откуда оно было извлечено, или в ближайшую допустимую позицию.
///
void CloseFloatingWindow(IFloatingWindowControl window);
///
/// Добавляет автоскрываемую панель с указанным содержимым к заданной стороне окна.
///
///
/// Контент, который будет отображаться в автоскрываемой панели.
///
///
/// Сторона окна, к которой будет прикреплена панель.
///
///
/// Экземпляр , представляющий созданную панель.
///
///
/// Выбрасывается, если равен null.
///
///
/// Автоскрываемые панели полезны для инструментов, к которым нужен частый,
/// но не постоянный доступ, так как они экономят пространство экрана.
///
IAutoHidePanelControl AddAutoHidePanel(Core.Docking.Abstractions.IDockContent content, DockSide side);
///
/// Удаляет автоскрываемую панель из интерфейса.
///
///
/// Автоскрываемая панель, которую необходимо удалить.
///
///
/// Выбрасывается, если равен null.
///
///
/// После удаления панели её содержимое обычно либо закрывается полностью,
/// либо преобразуется в обычную закрепленную панель, в зависимости от настроек.
///
void RemoveAutoHidePanel(IAutoHidePanelControl panel);
///
/// Происходит при изменении структуры макета док-системы.
///
///
/// Может вызываться при добавлении/удалении элементов, изменении размеров,
/// создании/закрытии плавающих окон и других операциях, влияющих на компоновку.
///
event EventHandler LayoutChanged;
///
/// Происходит при создании нового плавающего окна.
///
event EventHandler FloatingWindowCreated;
///
/// Происходит при закрытии плавающего окна.
///
event EventHandler FloatingWindowClosed;
}
///
/// Предоставляет данные для события создания плавающего окна.
/// Содержит ссылку на созданное окно и информацию о его содержимом.
///
public class FloatingWindowCreatedEventArgs : EventArgs
{
///
/// Получает созданное плавающее окно.
///
///
/// Экземпляр , представляющий новое окно.
///
public IFloatingWindowControl Window { get; }
///
/// Инициализирует новый экземпляр класса .
///
/// Созданное плавающее окно.
///
/// Выбрасывается, если равен null.
///
public FloatingWindowCreatedEventArgs(IFloatingWindowControl window)
{
Window = window ?? throw new ArgumentNullException(nameof(window));
}
}
///
/// Предоставляет данные для события закрытия плавающего окна.
/// Содержит ссылку на закрываемое окно и информацию о причине закрытия.
///
public class FloatingWindowClosedEventArgs : EventArgs
{
///
/// Получает закрытое плавающее окно.
///
///
/// Экземпляр , представляющее закрытое окно.
///
public IFloatingWindowControl Window { get; }
///
/// Получает значение, указывающее, было ли окно закрыто пользователем.
///
///
/// true, если окно было закрыто действием пользователя (клик на крестик);
/// false, если закрытие было инициировано программно.
///
public bool IsUserInitiated { get; }
///
/// Инициализирует новый экземпляр класса .
///
/// Закрытое плавающее окно.
///
/// Признак того, что закрытие было инициировано пользователем.
///
///
/// Выбрасывается, если равен null.
///
public FloatingWindowClosedEventArgs(IFloatingWindowControl window, bool isUserInitiated = true)
{
Window = window ?? throw new ArgumentNullException(nameof(window));
IsUserInitiated = isUserInitiated;
}
}