Een opdracht is de actie van een gebruiker die op ID wordt gedeclareerd. Opdrachten worden gebruikt voor het declareren van semantische acties, zodat in actiesets en editors gedeclareerde implementaties van acties kunnen worden gekoppeld aan bepaalde semantische opdrachten. Doordat de opdracht van de actie-implementatie is gescheiden, kunnen meerdere plugins acties definiëren die alle dezelfde semantische opdracht gebruiken. De opdracht is datgene dat aan een bepaalde toetskoppeling gebonden wordt.
In de workbench worden vele gangbare opdrachten gedefinieerd in het bestand plugin.xml en het is raadzaam de acties van plugins aan deze opdrachten te koppelen, voor zover dat zinvol is. Zo kunnen semantisch vergelijkbare acties uit verschillende plugins van dezelfde toetskoppeling gebruik maken.
Opdrachten worden gedefinieerd met het extensiepunt org.eclipse.ui.commands. Het volgende fragment komt uit de workbenchmarkup:
<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> ...
De definitie van de opdracht omvat een naam (name), een beschrijving (description) en een id voor de actie. Ook bevat de definitie een ID voor de categorie waarin de opdracht is ingedeeld. Aan de hand van categorieën worden opdrachten gegroepeerd in het dialoogvenster met voorkeursinstellingen. De categorieën zijn ook gedefinieerd in het extensiepunt org.eclipse.ui.commands:
... <category name="%category.file.name" description="%category.file.description" id="org.eclipse.ui.category.file"> </category> ...
Merk op dat er geen implementatie van een opdracht is opgegeven. Een opdracht wordt pas concreet zodra de actie door de plugin aan het ID van de opdracht wordt gekoppeld.
U kunt een actie aan een opdracht koppelen in code of in het bestand plugin.xml van actiesets. Welke methode u kiest, hangt af van het punt waarop de actie is gedefinieerd.
Een actie die met code wordt geïnstantieerd, kan ook aan de definitie van een actie worden gekoppeld door middel van het protocol IAction. Doorgaans gebeurt dit bij het maken van de actie. Deze techniek wordt door de methode SaveAction toegepast bij de initialisatie ervan.
public SaveAction(IWorkbenchWindow window) { ... setText... setToolTipText... setImageDescriptor... setActionDefinitionId("org.eclipse.ui.file.save"); }
(Opmerking: Een betere naam voor de methode setActionDefinitionID zou setCommandID zijn. De naam van de methode duidt de oorspronkelijke implementatie van toetskoppelingen aan en is gebaseerd op verouderde terminologie.
Als u setActionDefinitionID oproept, wordt de implementerende actie (SaveAction) gekoppeld aan het opdracht-ID dat is gebruikt in de markup van de opdrachtdefinitie. Het is een goed idee constanten te definiëren voor definities van acties, zodat verwijzingen naar de definities eenvoudig kunnen worden aangelegd in de code.
Als u een actie definieert in een actieset, hoeft u meestal zelf geen actie te instantiëren. Deze taak wordt door de workbench uitgevoerd zodra de actie wordt gestart in het menu of met het toetsenbord. U kunt de actie dan aan een opdracht-ID koppelen in de XML-markup. Hieronder ziet u de hypothetische markup van een actieset:
<extension point = "org.eclipse.ui.actionSets"> <actionSet id="com.example.actions.actionSet" label="Voorbeeldacties" visible="true"> <action id="com.example.actions.action1" menubarPath="additions" label="Voorbeeld van actie Opslaan" class="org.example.actions.ExampleActionDelegate" definitionID="org.eclipse.ui.file.save"> </action> ... </actionSet> </extension>
Het kenmerk definitionID wordt gebruikt om een opdracht-ID voor de actie te declareren.
Als u de actie aan een opdracht-ID koppelt, wordt de actie automatisch opgeroepen met elke willekeurige gedefinieerde toetskoppeling voor de opdracht org.eclipse.ui.file.save (mits onder de juiste omstandigheden), ongeacht de methode die hanteert.
In het volgende onderwerp leest u hoe u toetskoppelingen kunt definiëren.