Команды

Команда - это объявление пользовательского действия по ИД.  Команды используются для объявления семантических действий, чтобы реализации этих действий, определенные в наборах действий и редакторах, могли связать себя с определенной семантической командой.   Разделение команды и реализации действия позволяет нескольким модулям указывать действия, реализующие одну семантическую команду.   Команда связывается с определенной привязкой клавиш.

Рабочая среда определяет множество распространенных команд в файле 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 будет запускать действие в подходящей ситуации. 

Теперь давайте рассмотрим, как задаются привязки клавиш.