четверг, 4 августа 2011 г.

Консольные приложения (20): Подтверждение действий

Кроме обычных сообщений, вы можете также выводить сообщения, подтверждающие действия.

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



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



Для создания такого подтверждения нам нужно:
  • использовать XML-элемент для подтверждающего сообщения
  • использовать функцию, которая будет выполнять действие при подтверждении
XML-элемент для подтверждающего сообщения - это ConfirmAction. Он добавляется - как и любое другое действие - внутри элемента Actions.

Внутри ConfirmAction нужно поместить вызов функции при помощи XML-элемента function.

Это нюанс, на который нужно обратить внимание. Внутри ConfirmAction нельзя поместить одно из действий, например, для удаления элемента - DeleteDataAction, а только вызов C1 функции.

К счастью, в C1 есть функции, которые позволяют создавать, изменять и удалять элемент данных определенного типа. При создании типа, эти функции создаются автоматически для этого типа. Одной из таких функций мы и воспользуемся для удаления элемента.

Но давайте по порядку.

Добавление сообщения

Сначала добавим наш ConfirmAction в файл определения дерева (полный пример).

<DataElements Type="Demo.Movie" Icon="pagetype-pagetype" Label="${C1:Data:Demo.Movie:Title} (${C1:Data:Demo.Movie:Year})">
  <Actions>
    <ConfirmAction Label="Удалить фильм" ConfirmTitle="Удалить фильм?" ConfirmMessage="Удалить выбранный фильм?">
      <!-- здесь будет функция удаления элемента -->
    </ConfirmAction>
  </Actions>
  <!-- остальной XML -->
</DataElements>

У ConfirmAction три обязательных атрибута:
  • Label: надпись на кнопке на панели инструментов и пункте контекстного меню - для вызова сообщения
  • ConfirmTitle: заголовок окна подтверждающего сообщения
  • ConfirmMessage: текст подтверждающего сообщения
И пять необязательных:
  • RefreshTree: Обновляет дерево после выполнения действия, если значение "true". По умолчанию - "false".
  • Icon: иконка для кнопки на панели инструментов и пункта контекстного меню. По умолчанию, используется системная иконка для этого действия. (Названия допустимых иконок можно посмотреть здесь /Composite/images/icons/StandardIcons.xml.)
  • ToolTip: подсказка, всплывающая при наведении на кнопку или пункт меню. По умолчанию, используется значение атрибута Label.
  • PermissionTypes: список разрешений для этого действия.
  • Location: Расположение кнопки на панели инструментов. Так как это действие может быть оболочкой для стандартного действия - добавления, изменения или удаления элемента данных, - то имеет смысл разместить его в привычном на панели месте. Значения могут быть: Add, Edit, Delete, Other. Последнее значение используется по умолчанию.
Добавление функции

А теперь добавим функцию. Наш тип данных - из пример - называется Demo.Movie, поэтому нужная нам функция удаления данных будет называться Demo.Movie.DeleteDataInstance.

У нее есть параметр Filter, для которого мы сделаем вызов еще одной автоматически созданной для этого типа функции - фильтра по ссылке данных Demo.Movie.DataReferenceFilter.

А уже для параметра DataReference функции Demo.Movie.DataReferenceFilter мы укажем идентификатор элемента данных, который нужно удалить. В данном случае удобно воспользоваться динамическим полем ${C1:Data:Demo.Movie:Id}.

<ConfirmAction Label="Удалить фильм" ConfirmTitle="Удалить фильм?" ConfirmMessage="Удалить выбранный фильм?">
  <function name="Demo.Movie.DeleteDataInstance" xmlns="http://www.composite.net/ns/function/1.0">
    <param name="Filter">
      <function name="Demo.Movie.DataReferenceFilter">
        <param name="DataReference" value="${C1:Data:Demo.Movie:Id}" />
      </function>
    </param>
  </function>
</ConfirmAction>

Теперь при нажатии кнопки "Удалить фильм" будет выводится подтверждающее сообщение. И элемент будет удаляться только, если будет нажата кнопка "ОК".

На этом пока что все про консольные приложения в C1. Но я думаю, что для примеров в других темах мы будем возвращаться к ним еще не раз.

Комментариев нет:

Отправить комментарий