Une commande est la déclaration d'une action de l'utilisateur par son id. Les commandes sont utilisées pour déclarer des actions sémantiques afin que les implémentations d'action définies dans des ensembles d'actions et des éditeurs puissent s'associer à une commande sémantique donnée. La séparation de la commande et de l'implémentation d'action permet à de nombreux plug-in de définir des actions implémentant la même commande sémantique. La commande correspond à ce qui est associé à une combinaison de touches particulière.
Le plan de travail établit diverses commandes courantes dans son fichier plugin.xml et les plug-in sont invités à associer leurs propres actions à ces commandes lorsqu'approprié. De cette façon, les actions identiques sur le plan sémantique et implémentées dans différents plug-in peuvent partager la même combinaison de touches.
Les commandes sont définies à l'aide du point d'extension org.eclipse.ui.commands. L'exemple suivant provient des marques du plan de travail :
<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> ...
La définition de commande indique un nom, une description et un id pour l'action. Il indique aussi pour la commande une catégorie utilisée pour regrouper les commandes dans la boîte de dialogue des préférences. Les catégories sont également définies dans le point d'extension org.eclipse.ui.commands :
... <category name="%category.file.name" description="%category.file.description" id="org.eclipse.ui.category.file"> </category> ...
Aucune implémentation n'est spécifiée pour une commande. Une commande ne se concrétise que lorsqu'un plug-in a associé son action à son ID de commande.
Les actions peuvent être associées à une commande dans le code ou dans le fichier plugin.xmlfor action sets. Votre choix dépend de l'endroit où l'action est définie.
Les actions instanciées dans le code peuvent également être associées à une définition d'action à l'aide du protocole IAction. Ce cas se vérifie notamment lorsque l'action est créée. WorkbenchActionBuilder utilise cette technique pour initialiser ses actions.
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); ...
(Remarque : setCommandID est un nom plus approprié pour la méthode setActionDefinitionID. En effet, le nom de méthode reflétant l'implémentation d'origine des combinaisons de touches, la terminologie employée est ici obsolète.)
A l'appel de setActionDefinitionID, l'action d'implémentation (SaveAction) est associée à l'ID de commande saveActionDefId. A quoi correspond saveActionDefId ? Si vous jetez un oeil aux définitions de zones statiques dans WorkbenchActionBuilder vous voyez ce qui suit :
private static final String saveActionDefId = "org.eclipse.ui.file.save";
Cette constante définit l'ID de chaîne utilisé dans les marques de définition de la commande. Il est bienvenu de définir des constantes pour vos définitions d'actions afin d'en faciliter les références dans le code.
Si vous définissez une action dans un jeu d'actions, il est généralement inutile de l'instancier vous-même. Le plan de travail s'en charge lorsque l'utilisateur appelle votre action à partir d'un menu ou du clavier. Dans ce cas, vous pouvez associer votre action à un ID de commande dans les marques XML. Ci-après des marques hypothétiques pour un jeu d'actions :
<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="Example Save Action" class="org.example.actions.ExampleActionDelegate" definitionID="org.eclipse.ui.file.save"> </action> ... </actionSet> </extension>
L'attribut definitionID est utilisé pour déclarer un ID de commande pour l'action.
Quelle que soit la technique employée, l'association de votre action à un ID de commande entraîne l'appel de votre action au moment opportun par les combinaisons de touches définies pour la commande org.eclipse.ui.file.save.
Penchons-nous à présent sur le mode de définition de ces combinaisons de touches.