using Lattice.Core.Docking.Abstractions;
using Lattice.Core.Docking.Engine;
using Lattice.Core.Docking.Models;
using System.ComponentModel;
namespace Lattice.UI.Docking.Abstractions;
///
/// Определяет базовый контракт для всех UI-контролов, участвующих в системе докинга.
/// Этот интерфейс предоставляет общие свойства и методы, необходимые для интеграции
/// с менеджером макета и UI-сервисами.
///
///
/// Реализации этого интерфейса должны отображать элементы док-системы (DockGroup, DockLeaf)
/// и обеспечивать взаимодействие пользователя с ними через жесты мыши, клавиатуру и сенсорный ввод.
/// Интерфейс обеспечивает двухстороннюю связь между визуальными элементами и их моделями данных.
///
public interface IDockControl : INotifyPropertyChanged
{
///
/// Получает или задает модель данных, связанную с этим контролом.
///
///
/// Экземпляр класса, реализующего , который представляет
/// состояние и структуру отображаемого элемента док-системы.
///
///
/// Изменение модели должно приводить к обновлению визуального представления.
/// Свойство используется для привязки данных между UI-слоем и слоем бизнес-логики.
///
IDockElement? Model { get; set; }
///
/// Получает или задает менеджер макета, к которому принадлежит этот контрол.
///
///
/// Экземпляр , управляющий структурой док-системы.
///
///
/// Менеджер макета предоставляет доступ к дереву компоновки, плавающим окнам
/// и автоскрываемым панелям, а также методы для манипуляции структурой.
///
LayoutManager? LayoutManager { get; set; }
///
/// Получает или задает контекстный менеджер для этого контрола.
///
///
/// Экземпляр , управляющий контекстными меню и действиями.
///
///
/// Контекстный менеджер используется для отображения контекстно-зависимых команд
/// при щелчке правой кнопкой мыши или других пользовательских действиях.
///
IDockContextManager? ContextManager { get; set; }
///
/// Получает или задает признак того, что контрол выбран.
///
///
/// true, если контрол выбран; в противном случае false.
///
///
/// Выделение контрола обычно визуально выделяет его границы или фон,
/// чтобы указать пользователю на активный элемент. В каждый момент времени
/// может быть выбран только один контрол в пределах контейнера.
///
bool IsSelected { get; set; }
///
/// Получает или задает признак того, что контрол активен.
///
///
/// true, если контрол активен; в противном случае false.
///
///
/// Активный контрол получает фокус ввода и может обрабатывать команды клавиатуры.
/// Обычно соответствует активной вкладке в контейнере или активному окну.
///
bool IsActive { get; set; }
///
/// Получает признак того, что элемент можно перетаскивать.
///
bool CanDrag { get; }
///
/// Получает признак того, что на элемент можно сбрасывать.
///
bool CanDrop { get; }
///
/// Подготавливает данные для перетаскивания.
///
object? PrepareDragData();
///
/// Обрабатывает сброс данных.
///
bool HandleDrop(object data, DockPosition position);
///
/// Обновляет внешний вид контрола в соответствии с текущим состоянием модели.
///
///
/// Этот метод должен вызываться при изменении свойств модели или при необходимости
/// принудительного обновления UI (например, после изменения темы или масштаба).
/// Реализация должна обеспечить синхронизацию всех визуальных аспектов контрола
/// с текущими значениями свойств модели.
///
void Refresh();
///
/// Применяет указанную тему к контролу.
///
/// Тема для применения.
///
/// Выбрасывается, если равен null.
///
///
/// Метод должен обновить все стили, цвета и параметры отображения контрола
/// в соответствии с переданной темой. Изменения должны применяться немедленно.
///
void ApplyTheme(IDockTheme theme);
///
/// Вызывается при изменении состояния модели для обновления UI.
///
/// Имя изменившегося свойства модели.
///
/// Этот метод предназначен для уведомления UI о конкретных изменениях в модели,
/// что позволяет выполнять точечные обновления вместо полного перестроения.
/// Должен вызываться из обработчиков событий изменения свойств модели.
///
void OnModelPropertyChanged(string propertyName);
}