Comandos

Um comando é a declaração da ação de um usuário por ID.  Os comandos são usados para declarar ações semânticas para que as implementações de ações definidas em conjuntos de ações e editores possam se associar a um comando de semântica específico.  A separação do comando da implementação da ação permite que vários plug-ins definam ações que implementem o mesmo comando de semântica.  O comando é a parte que fica associada a uma ligação de teclas específica.

O workbench define vários comandos comuns em seu arquivo plugin.xml e os plug-ins são estimulados a associar suas próprias ações a esses comandos onde fizer sentido.  Desse modo, ações semanticamente semelhantes implementadas em plug-ins diferentes podem compartilhar a mesma ligação de teclas.

Definindo um Comando

Os comandos são definidos utilizando o ponto de extensão org.eclipse.ui.commands.  O segmento a seguir é retirado da marcação do workbench:

<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>
	...

A definição do comando especifica um name, description e id para a ação.   Especifica também o id de uma categoria para o comando, que é utilizado para agrupar comandos no diálogo preferências.  As categorias também são definidas no ponto de extensão org.eclipse.ui.commands :

      ...
      <category
            name="%category.file.name"
            description="%category.file.description"
            id="org.eclipse.ui.category.file">
      </category>
      ...

Observe que não existe uma implementação especificada para um comando.  Um comando se torna concreto apenas quando um plug-in associa sua ação ao ID do comando.

Associando uma ação a um comando

As ações podem ser associadas a um comando em código ou no plugin.xml para conjuntos de ações.  Sua opção depende de onde a ação está definida.

As ações instanciadas em código também podem ser associadas a uma definição de ação utilizando o protocolo IAction.  Isso é feito normalmente quando a ação é criada.  A SaveAction utiliza essa técnica quando é inicializada.

public SaveAction(IWorkbenchWindow window) {
	...
	setText...
	setToolTipText...
	setImageDescriptor...
	setActionDefinitionId("org.eclipse.ui.file.save"); 
}

(Nota:  O nome do método setActionDefinitionID poderia ser nomeado mais apropriadamente como setCommandID.  O nome do método reflete a implementação original das ligações de teclas e utiliza uma terminologia ultrapassada.)

Fazendo a chamada de setActionDefinitionID, a ação de implementação (SaveAction) é associada ao id de comando que foi utilizado na marcação da definição de comando. É um bom hábito definir constantes para as suas definições de ação para que sejam facilmente referidas em código.

Se você definir uma ação em um conjunto de ações, normalmente não precisará instanciar a própria ação.  O workbench o fará para você quando o usuário chamar a ação em um menu ou pelo teclado.  Nesse caso, é possível associar a ação a um ID de comando em sua  marcação XML.  O seguinte mostra uma marcação hipotética para um conjunto de ações:

<extension point = "org.eclipse.ui.actionSets">
	   <actionSet id="com.example.actions.actionSet"
		   label="Exemplo de Ações"
		   visible="true">
		   <action id="com.example.actions.action1"
			   menubarPath="additions"
			   label="Exemplo de Ação de Salvamento"
			   class="org.example.actions.ExampleActionDelegate"
			   definitionID="org.eclipse.ui.file.save">
		   </action>
		   ...
	   </actionSet>
   </extension>

O atributo definitionID é utilizado para declarar um ID de comando para a ação.

Independente da técnica utilizada, associar sua ação a um ID de comando fará com que qualquer ligação de teclas que tenha sido definida para o comando org.eclipse.ui.file.save chame sua ação quando apropriado. 

Agora, vamos ver como essas ligações de teclas são definidas.