Расширение Windows-клиента

Платформа Docsvision позволяет авторам решений разрабатывать собственные расширения интерфейса Windows-клиента — аналог плагинов, дополняющих стандартную функциональность новыми возможностями, доступными пользователям. Расширения могут быть нескольких типов (описаны ниже) или совмещать в себе реализацию нескольких типов, поэтому конечная реализация расширения будет зависеть от его типа.

Технически расширение Windows-клиента представляет собой обычную карточку системы Docsvision, которая должна разрабатывается по стандартному сценарию.

В схеме карточки расширения должен быть установлен флаг Реализует расширения интерфейса хоста / Provides UI Extension. Также рекомендуется установить флаг Является справочником / Dictionary (only one instance allowed), чтобы исключить возможность создания нескольких экземпляров карточки-расширения, что может привести к конфликтам при их вызове.

Т.к. карточка исполняет лишь функции проводника расширения, то, скорее всего, добавлять в неё рабочие секции и поля не предполагается. Если это так, то добавьте в свою схему фиктивные секцию и поле, чтобы схема карточки считалась корректной.

Фиктивная секция
Рисунок 1. Фиктивная секция

Компонент карточки-расширения необходимо наследовать от класса NavExtension, в котором помимо стандартных интерфейсов компонента карточки реализованы специальные интерфейсы расширения Windows-клиента:

public sealed partial class SampleExtension : NavExtension

Обязательным для расширения любого типа является переопределение свойства SupportedTypes, в котором необходимо указать тип или типы функций, реализующих расширение:

protected override NavExtensionTypes SupportedTypes
{
 get
 {
  return NavExtensionTypes.PropertyPages | NavExtensionTypes.Picker;
 }
}

Дальнейшая реализация зависит от типа функциональности, реализуемой расширением.

Расширение виртуальных папок

Позволяет программно изменить поведение виртуальных папок. Например, "на лету" сформировать новый текст поискового запроса для виртуальной папки или отобразить собственный диалог ввода параметров.

Расширение виртуальных папок не требует реализации никаких специальных интерфейсов. Если карточка расширения назначена в качестве фильтра для виртуальной папки (это нужно сделать явно, выбрав её в поле "Тип фильтра" в свойствах папки), то при активации такой папки Windows-клиент вызывает карточку расширения методом CardHost.SelectFromCard.

Соответственно, карточка расширения может вернуть результат выбора (настроенный запрос) через FinishSelection.

protected override void OnCardClosed(EventArgs e)
{
    if (this.DialogResult = DialogResult.OK)
    {
        this.CardFrame.FinishSelection(query.GetXML(true, null), false);
    }
    base.OnCardClosed(e);
}

Расширение экспорта

Этот тип расширения появляется в списке доступных вариантов экспорта данных представления (по умолчанию в Windows-клиенте есть только возможность выгрузки данных представления в Excel). Когда пользователь выбирает соответствующую команду экспорта, управление получит код расширения, которое и будет реализовывать собственно логику экспорта данных (например, во внешнюю систему или базу данных).

Расширение экспорта требует реализации в коде карточки специального метода, который будет вызван в момент выбора пользователем соответствующей команды экспорта: CreateReport

Командное расширение

Расширение позволяет добавить собственные команды в панель инструментов (тулбар) Windows-клиента или в контекстное меню карточек и папок.

Командное расширение предполагает реализацию следующих дополнительных методов:
Логика работы Windows-клиента с командами расширения может быть отражена в следующем алгоритме:
  1. При первичной загрузке Windows-клиент опрашивает все доступные карточки расширения на предмет наличия команд. Если расширение поддерживает команды, то возвращает их массив (CreateCommands).

  2. В процессе работы при выделении пользователем конкретных объектов (карточек, папок), но перед тем как отобразить контекстное меню Windows-клиент опрашивает расширение на предмет статуса каждой команды (QueryCommandStatus).

  3. Наконец, при выборе пользователем конкретной команды, управление переходит в код карточки расширения (InvokeCommand).

Пример кода доступен по ссылке.

Обработчик событий

Расширение позволяет добавить собственную обработку стандартных событий Windows-клиента: например, таких, как запуск или завершение работы. Данный тип расширений может быть полезен в качестве вспомогательного для других типов. Например, если расширение экспорта выгружает данные в какую-то внешнюю систему, то обработчик событий может при запуске Windows-клиента пытаться заранее установить соединение с этой системой.

В расширение событий должно быть реализовано два специализированных метода:

Пикер

Такой тип расширения позволяет разработчику реализовать собственный интерфейс для выбора учетных записей пользователей (это может быть полезно в случае разработки собственного, отличного от стандартного, справочника сотрудников). Расширение такого типа будет вызвано, например, при назначении прав на объекты системы, чтобы пользователь мог оперировать не доменными учетными записями, а более полными сведениями из справочника.

Расширение-пикер предполагает реализацию следующих методов:

Контроль папки

Это расширение позволяет динамически контролировать поведение папок, например, запретить отображать подпапки или не подсвечивать количество непрочитанных карточек.

Расширение контроля папки требует реализации единственного метода: QueryFolderControl.

Пример кода, в котором для простых папок не показываются дочерние элементы:
protected override NavFolderControlFlags QueryFolderControl(NavFolderControlType folderType, Guid folderId)
{
  if (folderType = NavFolderControlType.Folder)
  {
    return NavFolderControlFlags.DoNotAskChildren;
  }
    else
  {
    return base.QueryFolderControl(folderType, folderId);
  }
}

Страницы свойств

Расширение такого типа может добавлять собственные страницы свойств к свойствам папок и карточек. На этих дополнительных страницах можно расположить произвольную информацию и элементы управления.

Для реализации дополнительных страниц свойств карточка расширения должна реализовывать специальный метод CreatePropertyPages. Метод должен создавать коллекцию страниц свойств типа (NavPropertyPage).

protected override IEnumerable<NavPropertyPage> CreatePropertyPages()
{
    Trace.WriteLine("TestExtension.InitializePropertyPages()");
    return new NavPropertyPage[] {
        new NavPropertyPage() {
            PageType = NavPropertyPageTypes.All,
            Name = "TestPropertyPage",
            Clsid = typeof(TestPropertyPage).GUID,
        },
    };
}

В свою очередь, элемент управления, реализующий собственно страницу свойств, должен быть унаследован от специального класса — NavPropertyPageControl. И так же как и компоненты карточек, он должен иметь идентификатор COM-интерфейса:

[ComVisible(true)]
[Guid("572860E1-E4C6-4120-B3DC-78C0A03F7445")]
[ClassInterface(ClassInterfaceType.None)]
public sealed partial class TestPropertyPage : NavPropertyPageControl

Расширение типов карточек

Данное расширение предоставляет информацию о пользовательских подтипах (видах) карточек. Это может быть полезно в случае разработки собственного, отличного от стандартного, справочника типов.

Информация о подтипах, которую вернет расширение, будет доступна в контекстном меню создания новой карточки, а также на странице свойств папки с ограничением на типы карточек.

Для создания расширения требуется переопределить два метода: PopulateCardTypes и LookupCardTypes.

Расширение типов папок

Такое расширение предоставляет информацию о пользовательских подтипах папок. Это может быть полезно в случае разработки собственного, отличного от стандартного, справочника типов папок.

Требуется реализовать единственный метод: PopulateFolderTypes. Метод должен сформировать и вернуть коллекцию объектов NavFolderType, описывающих тип папки. Свойства этого объекта практически полностью идентичны соответствующим свойствам папки, за исключением следующих:

  • FolderCardLocation — идентификатор карточки папок.

  • FolderTypes — дочерние типы папок.

Расширение дерева папок Windows-клиента

Данное расширение предназначено для добавления ссылок на папки в дерево папок Windows-клиента или в список избранных папок без участия папок-делегатов.

Необходимо дополнительно реализовать интерфейс INavFolderTreeExtension. Метод GetTreeExtensionFolders должен возвращать специально подготовленный массив папок, предназначенных для размещения в интерфейсе Windows-клиента.