Команда - это объявление пользовательского действия по ИД. Команды используются для объявления семантических действий, чтобы реализации этих действий, определенные в наборах действий и редакторах, могли связать себя с определенной семантической командой. Разделение команды и реализации действия позволяет нескольким модулям указывать действия, реализующие одну семантическую команду. Команда связывается с определенной привязкой клавиш.
Рабочая среда определяет множество распространенных команд в файле plugin.xml и позволяет связывать действия модулей с этими командами. Таким образом, семантически схожие действия, реализованные в разных модулях, могут быть связаны с одной привязкой клавиш.
Команды задаются с помощью точки расширения org.eclipse.ui.commands. Ниже приведен фрагмент кода рабочей среды:
<extension point="org.eclipse.ui.commands"> ... <command name="%command.save.name" description="%command.save.description" categoryId="org.eclipse.ui.category.file" id="org.eclipse.ui.file.save"> </command> ...
Определение команды задает имя, описание и ИД действия. Оно также указывает ИД категории команды, используемый для группировки команд в окне параметров. Категории также задаются с помощью точки расширения org.eclipse.ui.commands :
... <category name="%category.file.name" description="%category.file.description" id="org.eclipse.ui.category.file"> </category> ...
Обратите внимание, что для команды не указана реализация. Команда обретает конкретные черты только тогда, когда модуль связывает действие с ИД команды.
Действия можно связать с командой в коде или файле plugin.xml для наборов действий. Выбор зависит от того, где задано действие.
Заданные в коде действия можно также связать с определениями действий с помощью протокола IAction. Обычно это делается при создании действия. SaveAction использует этот прием при собственной инициализации.
public SaveAction(IWorkbenchWindow window) { ... setText... setToolTipText... setImageDescriptor... setActionDefinitionId("org.eclipse.ui.file.save"); }
Примечание: Для метода setActionDefinitionID лучше бы подошло имя setCommandID. Имя метода отражает первоначальную реализацию привязок клавиш и использует устаревшую терминологию.
Вызывая setActionDefinitionID, действие реализации (SaveAction) связывается с ИД команды, использованным в коде определения команды. Хорошим стилем считается использование констант для определения действий, чтобы их можно было быстро найти в коде.
Если вы задаете действие в наборе действий, то обычно создавать само действие нет необходимости. За вас это сделает рабочая среда, когда пользователь запустит действие с помощью меню или клавиатуры. В этом случае можно связать действие с ИД команды в XML-коде. Ниже приведен фрагмент гипотетического кода для набора действий:
<extension point = "org.eclipse.ui.actionSets"> <actionSet id="com.example.actions.actionSet" label="Примеры действий" visible="true"> <action id="com.example.actions.action1" menubarPath="additions" label="Пример действия Сохранить" class="org.example.actions.ExampleActionDelegate" definitionID="org.eclipse.ui.file.save"> </action> ... </actionSet> </extension>
Атрибут definitionID используется для объявления ИД команды для действия.
Используя любой из приведенных способов, можно связать действие с ИД команды, после чего привязка клавиш для команды org.eclipse.ui.file.save будет запускать действие в подходящей ситуации.
Теперь давайте рассмотрим, как задаются привязки клавиш.