Comandos

Um comando é a declaração da acção de um utilizador pelo id.  Os comandos são utilizados para declarar acções semânticas, de modo que as implementações de acções definidas em conjuntos de acções e editores se podem associar a determinado comando semântico.  A separação do comando da implementações de acções permite que vários plug-ins definam acções que implementem o mesmo comando semântico.  O comando é o que fica associado a determinada associação de teclas.

A área de trabalho define muitos comandos comuns no seu ficheiro plugin.xml, e os plug-ins são encorajados a associar as suas próprias acções a estes comandos onde tal faça sentido.  Desta forma, acções semelhantes semanticamente implementadas em diferentes plug-ins podem partilhar a mesma associação de teclas.

Definir um comando

Os comandos são definidos com o ponto de extensão org.eclipse.debug.ui.commands.  O exemplo seguinte vem da marcação da área de trabalho:

<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 nome, descrição e id para a acção.   Especifica também o ID de uma categoria para o comando, o qual é usado para agrupar comandos no diálogo de 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>
      ...

Repare que não há implementação especificada para um comando.  Um comando só se torna concreto quando um plug-in associar a sua acção ao ID do comando.

Associar uma acção a um comando

As acções podem ser associadas a um comando no código ou no ficheiro plugin.xml no que respeita a conjuntos de acções.   A escolha depende do local de definição da acção.

As acções que forem instanciadas em código também podem ser associadas a uma definição de acção com o protocolo IAction.  Tal realiza-se normalmente quando a acção é criada.  SaveAction utiliza esta técnica quando se inicializa a si própria.

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

(Nota:  O nome de método setActionDefinitionID (definir ID de definição de acção) poderia denominar-se mais adequadamente setCommandID (definir ID de comando). O nome de método reflecte a implementação original de associações de teclas e utiliza terminologia antiquada.)

Ao invocar setActionDefinitionID, a acção de implementação (SaveAction) fica associada ao ID do comando que foi usado na marcação de definição do comando. É boa prática definir constantes para definições de acções de modo a serem facilmente referenciadas no código.

Se definir uma acção num conjunto de acções, geralmente não será preciso instanciar a acção.  A área de trabalho encarrega-se disso quando invocar a acção num menu ou no teclado.  Neste caso, poderá associar a acção a um ID de comando na   marcação XML.  De seguida é apresentada a marcação hipotética para um conjunto de acções:

<extension point = "org.eclipse.ui.actionSets">
	   <actionSet id="com.example.actions.actionSet"
		   label="Example Actions"
		   visible="true">
		   <action id="com.example.actions.action1"
			   menubarPath="additions"
			   label="Acção de Salvaguarda Exemplo"
			   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 acção.

Seja com que técnica for, a associação da sua acção a um ID de comando fazem com que quaisquer associações de teclas definidas para o comando org.eclipse.ui.file.save invoquem a sua acção quando apropriado.  

Vejamos agora como se definem estas associações de teclas.