using Lattice.UI.Docking.Abstractions; using System.ComponentModel; using System.Runtime.CompilerServices; namespace Lattice.UI.Docking.Commands; /// /// Предоставляет базовую реализацию команды док-системы. /// Реализует интерфейс и /// для поддержки уведомлений об изменении свойств. /// /// /// Этот класс предоставляет общую логику для команд, включая управление состоянием /// возможности выполнения, уведомление об изменениях и реализацию интерфейса ICommand. /// public abstract class DockCommandBase : IDockCommand, INotifyPropertyChanged { /// /// Происходит при изменении возможности выполнения команды. /// public event EventHandler? CanExecuteChanged; /// /// Происходит при изменении значения свойства. /// public event PropertyChangedEventHandler? PropertyChanged; private bool _canExecute = true; /// /// Получает уникальный идентификатор команды. /// /// /// Строковый идентификатор команды. Должен быть уникальным в пределах системы. /// public abstract string Id { get; } /// /// Получает отображаемое имя команды. /// /// /// Имя команды, отображаемое в пользовательском интерфейсе. /// public abstract string Name { get; } /// /// Получает описание команды. /// /// /// Текстовое описание функциональности команды. /// Реализация по умолчанию возвращает пустую строку. /// public virtual string Description => string.Empty; /// /// Получает идентификатор ресурса для иконки команды. /// /// /// Имя ресурса иконки или путь к файлу иконки. /// Реализация по умолчанию возвращает пустую строку. /// public virtual string Icon => string.Empty; /// /// Получает комбинацию клавиш для быстрого вызова команды. /// /// /// Строковое представление горячей клавиши. /// Реализация по умолчанию возвращает пустую строку. /// public virtual string Shortcut => string.Empty; /// /// Получает или задает значение, указывающее, можно ли выполнить команду. /// /// /// true, если команду можно выполнить; в противном случае false. /// /// /// При изменении этого свойства генерируется событие . /// protected bool CanExecuteValue { get => _canExecute; set { if (_canExecute != value) { _canExecute = value; OnCanExecuteChanged(); OnPropertyChanged(); } } } /// /// Определяет, можно ли выполнить команду в текущем контексте. /// /// Параметр команды. /// /// true, если команду можно выполнить; в противном случае false. /// /// /// Реализация по умолчанию возвращает значение свойства . /// public virtual bool CanExecute(object? parameter) { return _canExecute; } /// /// Выполняет команду. /// /// Параметр команды. /// /// Этот метод должен быть реализован в производных классах. /// public abstract void Execute(object? parameter); /// /// Вызывает событие изменения возможности выполнения команды. /// /// /// Этот метод может быть переопределен в производных классах для добавления /// дополнительной логики перед вызовом события. /// protected virtual void OnCanExecuteChanged() { CanExecuteChanged?.Invoke(this, EventArgs.Empty); } /// /// Вызывает событие . /// /// /// Имя изменившегося свойства. Если не указано, определяется автоматически. /// protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } /// /// Предоставляет команду для закрытия контента (вкладки). /// /// /// Команда закрывает активную вкладку в указанном контроле листа. /// public class CloseContentCommand : DockCommandBase { /// /// Получает уникальный идентификатор команды. /// /// /// Идентификатор "CloseContent". /// public override string Id => "CloseContent"; /// /// Получает отображаемое имя команды. /// /// /// Имя "Close". /// public override string Name => "Close"; /// /// Получает описание команды. /// /// /// Описание "Close the current tab". /// public override string Description => "Close the current tab"; /// /// Получает идентификатор ресурса для иконки команды. /// /// /// Идентификатор "Close". /// public override string Icon => "Close"; /// /// Получает комбинацию клавиш для быстрого вызова команды. /// /// /// Горячая клавиша "Ctrl+F4". /// public override string Shortcut => "Ctrl+F4"; /// /// Определяет, можно ли выполнить команду в текущем контексте. /// /// Параметр команды. /// /// true, если команду можно выполнить; в противном случае false. /// /// /// Команда доступна только если параметр является контролом листа /// и содержит активный контент. /// public override bool CanExecute(object? parameter) { return parameter is Abstractions.IDockLeafControl leafControl && leafControl.ActiveContent != null; } /// /// Выполняет команду закрытия контента. /// /// Параметр команды. Ожидается . /// /// Команда закрывает активную вкладку в указанном контроле листа. /// public override void Execute(object? parameter) { if (parameter is Abstractions.IDockLeafControl leafControl && leafControl.ActiveContent != null) { leafControl.CloseContent(leafControl.ActiveContent); } } } /// /// Предоставляет команду для создания плавающего окна из элемента. /// public class FloatWindowCommand : DockCommandBase { /// /// Получает уникальный идентификатор команды. /// /// /// Идентификатор "FloatWindow". /// public override string Id => "FloatWindow"; /// /// Получает отображаемое имя команды. /// /// /// Имя "Float". /// public override string Name => "Float"; /// /// Получает описание команды. /// /// /// Описание "Float the window as a separate window". /// public override string Description => "Float the window as a separate window"; /// /// Получает идентификатор ресурса для иконки команды. /// /// /// Идентификатор "Float". /// public override string Icon => "Float"; /// /// Определяет, можно ли выполнить команду в текущем контексте. /// /// Параметр команды. /// /// true, если команду можно выполнить; в противном случае false. /// /// /// Команда доступна только если параметр является элементом док-системы, /// который может быть преобразован в плавающее окно. /// public override bool CanExecute(object? parameter) { return parameter is Core.Docking.Abstractions.IDockElement; } /// /// Выполняет команду создания плавающего окна. /// /// Параметр команды. Ожидается . /// /// Реализация зависит от конкретного UI и должна быть предоставлена в производных классах. /// Базовая реализация не выполняет никаких действий. /// public override void Execute(object? parameter) { // Реализация зависит от конкретного UI // В базовом классе метод не выполняет никаких действий } } /// /// Предоставляет команду для закрепления плавающего окна. /// public class DockWindowCommand : DockCommandBase { /// /// Получает уникальный идентификатор команды. /// /// /// Идентификатор "DockWindow". /// public override string Id => "DockWindow"; /// /// Получает отображаемое имя команды. /// /// /// Имя "Dock". /// public override string Name => "Dock"; /// /// Получает описание команды. /// /// /// Описание "Dock the window to the main window". /// public override string Description => "Dock the window to the main window"; /// /// Получает идентификатор ресурса для иконки команды. /// /// /// Идентификатор "Dock". /// public override string Icon => "Dock"; /// /// Определяет, можно ли выполнить команду в текущем контексте. /// /// Параметр команды. /// /// true, если команду можно выполнить; в противном случае false. /// /// /// Команда доступна только если параметр является плавающим окном, /// которое может быть закреплено в основном окне. /// public override bool CanExecute(object? parameter) { return parameter is Abstractions.IFloatingWindowControl; } /// /// Выполняет команду закрепления окна. /// /// Параметр команды. Ожидается . /// /// Реализация зависит от конкретного UI и должна быть предоставлена в производных классах. /// Базовая реализация не выполняет никаких действий. /// public override void Execute(object? parameter) { // Реализация зависит от конкретного UI // В базовом классе метод не выполняет никаких действий } }