Files
Lattice/Lattice.UI.Docking/Abstractions/IDockLeafControl.cs
2026-01-27 06:07:15 +03:00

212 lines
8.5 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Lattice.Core.Docking.Abstractions;
using Lattice.Core.Docking.Models;
namespace Lattice.UI.Docking.Abstractions;
/// <summary>
/// Определяет контракт для UI-контрола, который отображает контейнер вкладок (DockLeaf).
/// Этот контрол управляет отображением коллекции вкладок с содержимым.
/// </summary>
/// <remarks>
/// Реализации этого интерфейса должны обеспечивать навигацию между вкладками,
/// закрытие вкладок, изменение порядка вкладок и поддержку различных положений
/// панели вкладок (сверху, снизу, слева, справа).
/// </remarks>
public interface IDockLeafControl : IDockControl
{
/// <summary>
/// Получает или задает положение панели вкладок.
/// </summary>
/// <value>
/// Положение панели вкладок относительно содержимого.
/// </value>
TabPlacement TabPlacement { get; set; }
/// <summary>
/// Получает или задает признак отображения кнопки закрытия на вкладках.
/// </summary>
/// <value>
/// true, если кнопки закрытия отображаются; в противном случае false.
/// </value>
bool ShowCloseButtons { get; set; }
/// <summary>
/// Получает или задает признак возможности изменения порядка вкладок.
/// </summary>
/// <value>
/// true, если порядок вкладок можно изменять; в противном случае false.
/// </value>
bool CanReorderTabs { get; set; }
/// <summary>
/// Получает или задает активную вкладку.
/// </summary>
/// <value>
/// Активная вкладка или null, если вкладок нет.
/// </value>
IDockContent? ActiveContent { get; set; }
/// <summary>
/// Добавляет вкладку в контрол.
/// </summary>
/// <param name="content">Контент для добавления.</param>
/// <exception cref="ArgumentNullException">
/// Выбрасывается, если <paramref name="content"/> равен null.
/// </exception>
void AddContent(IDockContent content);
/// <summary>
/// Удаляет вкладку из контрола.
/// </summary>
/// <param name="content">Контент для удаления.</param>
/// <exception cref="ArgumentNullException">
/// Выбрасывается, если <paramref name="content"/> равен null.
/// </exception>
void RemoveContent(IDockContent content);
/// <summary>
/// Закрывает указанную вкладку.
/// </summary>
/// <param name="content">Контент для закрытия.</param>
/// <returns>
/// true, если вкладка была закрыта; в противном случае false.
/// </returns>
/// <exception cref="ArgumentNullException">
/// Выбрасывается, если <paramref name="content"/> равен null.
/// </exception>
bool CloseContent(IDockContent content);
/// <summary>
/// Закрывает все вкладки, кроме указанной.
/// </summary>
/// <param name="exceptContent">Вкладка, которую нужно оставить открытой.</param>
/// <exception cref="ArgumentNullException">
/// Выбрасывается, если <paramref name="exceptContent"/> равен null.
/// </exception>
void CloseAllExcept(IDockContent exceptContent);
/// <summary>
/// Закрывает все вкладки.
/// </summary>
void CloseAll();
/// <summary>
/// Происходит при изменении активной вкладки.
/// </summary>
event EventHandler<ActiveContentChangedEventArgs> ActiveContentChanged;
/// <summary>
/// Происходит при запросе закрытия вкладки.
/// </summary>
event EventHandler<ContentClosingEventArgs> ContentClosing;
/// <summary>
/// Происходит при изменении порядка вкладок.
/// </summary>
event EventHandler<TabsReorderedEventArgs> TabsReordered;
}
/// <summary>
/// Предоставляет данные для события изменения активного контента.
/// </summary>
public class ActiveContentChangedEventArgs : EventArgs
{
/// <summary>
/// Получает предыдущий активный контент.
/// </summary>
public IDockContent? OldContent { get; }
/// <summary>
/// Получает новый активный контент.
/// </summary>
public IDockContent? NewContent { get; }
/// <summary>
/// Инициализирует новый экземпляр класса <see cref="ActiveContentChangedEventArgs"/>.
/// </summary>
/// <param name="oldContent">Предыдущий активный контент.</param>
/// <param name="newContent">Новый активный контент.</param>
public ActiveContentChangedEventArgs(IDockContent? oldContent, IDockContent? newContent)
{
OldContent = oldContent;
NewContent = newContent;
}
}
/// <summary>
/// Предоставляет данные для события закрытия контента.
/// </summary>
public class ContentClosingEventArgs : EventArgs
{
/// <summary>
/// Получает контент, который закрывается.
/// </summary>
public IDockContent Content { get; }
/// <summary>
/// Получает или задает значение, указывающее, можно ли отменить закрытие.
/// </summary>
/// <value>
/// true, если закрытие можно отменить; в противном случае false.
/// </value>
public bool CanCancel { get; set; }
/// <summary>
/// Получает или задает признак отмены закрытия.
/// </summary>
/// <value>
/// true, если закрытие отменено; в противном случае false.
/// </value>
public bool Cancel { get; set; }
/// <summary>
/// Инициализирует новый экземпляр класса <see cref="ContentClosingEventArgs"/>.
/// </summary>
/// <param name="content">Контент, который закрывается.</param>
/// <exception cref="ArgumentNullException">
/// Выбрасывается, если <paramref name="content"/> равен null.
/// </exception>
public ContentClosingEventArgs(IDockContent content)
{
Content = content ?? throw new ArgumentNullException(nameof(content));
CanCancel = true;
Cancel = false;
}
}
/// <summary>
/// Предоставляет данные для события изменения порядка вкладок.
/// </summary>
public class TabsReorderedEventArgs : EventArgs
{
/// <summary>
/// Получает старый индекс вкладки.
/// </summary>
public int OldIndex { get; }
/// <summary>
/// Получает новый индекс вкладки.
/// </summary>
public int NewIndex { get; }
/// <summary>
/// Получает перемещаемый контент.
/// </summary>
public IDockContent Content { get; }
/// <summary>
/// Инициализирует новый экземпляр класса <see cref="TabsReorderedEventArgs"/>.
/// </summary>
/// <param name="oldIndex">Старый индекс вкладки.</param>
/// <param name="newIndex">Новый индекс вкладки.</param>
/// <param name="content">Перемещаемый контент.</param>
/// <exception cref="ArgumentNullException">
/// Выбрасывается, если <paramref name="content"/> равен null.
/// </exception>
public TabsReorderedEventArgs(int oldIndex, int newIndex, IDockContent content)
{
OldIndex = oldIndex;
NewIndex = newIndex;
Content = content ?? throw new ArgumentNullException(nameof(content));
}
}