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.
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 category="org.eclipse.ui.category.file" name="%command.close.name" description="%command.close.description" id="org.eclipse.ui.file.close"> </command> <command category="org.eclipse.ui.category.file" name="%command.closeAll.name" description="%command.closeAll.description" id="org.eclipse.ui.file.closeAll"> </command> <command category="org.eclipse.ui.category.file" name="%command.save.name" icon="icons/full/ctool16/save_edit.gif" description="%command.save.description" id="org.eclipse.ui.file.save"> </command> ...
A definição do comando especifica um name, description e id para a ação. Ele também especifica uma categoria para o comando, que é utilizada paga 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> ...
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.
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 WorkbenchActionBuilder utiliza esta técnica para inicializar suas ações.
private void makeActions() { ... saveAction = new SaveAction(window); saveAction.setImageDescriptor(WorkbenchImages.getImageDescriptor(IWorkbenchGraphicConstants.IMG_CTOOL_SAVE_EDIT)); saveAction.setHoverImageDescriptor(WorkbenchImages.getImageDescriptor(IWorkbenchGraphicConstants.IMG_CTOOL_SAVE_EDIT_HOVER)); saveAction.setDisabledImageDescriptor(WorkbenchImages.getImageDescriptor(IWorkbenchGraphicConstants.IMG_CTOOL_SAVE_EDIT_DISABLED)); partService.addPartListener(saveAction); saveAction.setActionDefinitionId(saveActionDefId); ...
(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 saveActionDefId. O que é saveActionDefId? Uma olhada rápida nas definições de campo estático em WorkbenchActionBuilder mostra o seguinte:
private static final String saveActionDefId = "org.eclipse.ui.file.save";
Essa constante define o ID da cadeia que foi usada na marcação da definição do comando. É um bom hábito definir constantes para suas definições de ações 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.