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
// В базовом классе метод не выполняет никаких действий
}
}