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