Het extensiepunt met afhandelingsroutines is een uitwerking van het experimentele element handlerSubmission
dat in Eclipse 3.0 is gedefinieerd. Een afhandelingsroutine is het gedrag van een opdracht op een bepaald moment. Aan een opdracht kunnen nul of meer afhandelingsroutines gekoppeld worden. Er kan echter nooit meer dan één actieve afhandelingsroutine zijn ingesteld voor een opdracht. De actieve afhandelingsroutine zorgt voor de verwerking van het gedrag van de opdracht. Het concept van afhandelingsroutines is erg vergelijkbaar met dat van actie-afhandelingsroutines en herbruikbare acties.
Het extensiepunt stelt ontwikkelaars van plugins in staat afhandelingsroutines te specificeren die onder bepaalde voorwaarden actief en/of ingeschakeld moeten worden. Als een afhandelingsroutine inactief is, wordt deze niet gebruikt voor het gedrag van opdrachten. Voor uitgeschakelde afhandelingsroutines geldt dat de verwerking ervan wordt geblokkeerd. U kunt de voorwaarden definiëren met de expressievoorzieningen die in 3.0 zijn toegevoegd. De expressies zijn opgebouwd uit de clausules activeWhen
en enabledWhen
.
De workbench verstrekt enkele variabelen voor deze expressies. Ondersteunde variabelen zijn de actieve context, de actieve editor, het actieve onderdeel en de huidige selectie. In dit eerste ontwerp mogen de variabelen dan niet ondersteund worden, het is goed voor te stellen hoe eenvoudig het zou zijn andere variabelen toe te voegen of ontwikkelaars van plugins zelfs andere variabelen te laten aanleveren.
Een afhandelingsroutine zonder voorwaarden is een standaardafhandelingsroutine. Deze routine is alleen actief als aan geen van de voorwaarden van de andere routines is voldaan. Als aan de voorwaarden van twee afhandelingsroutines wordt voldaan, worden de voorwaarden met elkaar vergeleken om een afhandelingsroutine te vinden met een specifiekere voorwaarde of een kleiner bereik. Voor de vergelijking worden de variabelen gebruikt waarnaar door de voorwaarde wordt verwezen. De voorwaarde die vervolgens naar de meest specifieke variabele verwijst, wordt overgenomen. De volgorde van de specificiteit (minst naar meest specifiek) is gedefinieerd in org.eclipse.ui.ISources
.
Als het conflict niet kan worden opgelost, is er geen actieve afhandelingsroutine. Er wordt vervolgens een vermelding in het logboek vastgelegd mits een bepaalde traceringsoptie is ingesteld. Er kan ook een conflict optreden wanneer er twee standaardafhandelingsroutines zijn ingesteld. De pluginontwikkelaars en de testers moeten ervoor zorgen dat deze situatie zich niet voordoet. De voorwaarden worden gehanteerd om te voorkomen dat plugins onnodig geladen worden. De definities van de afhandelingsroutines zijn in een proxy opgenomen. Een proxy kan de onderliggende afhandelingsroutine laden als aan de proxy-voorwaarden wordt voldaan (zodat deze actief wordt) en als een taak door een opdracht moet worden gedelegeerd (voorbeeld: execute()).
<!ELEMENT extension (handler*)>
<!ATTLIST extension
point CDATA #REQUIRED
id CDATA #IMPLIED
name CDATA #IMPLIED>
<!ELEMENT handler (activeWhen? , class? , enabledWhen?)>
<!ATTLIST handler
commandId CDATA #REQUIRED
class CDATA #IMPLIED
helpContextId CDATA #IMPLIED>
De identificatie van de Help-context die op deze specifieke afhandelingsroutine betrekking heeft. Voor een opdracht kan ook een algemene beschrijving van het gedrag van de opdracht worden ingesteld, maar het is soms wenselijker voor een afhandelingsroutine om Help te bieden die verder op de implementatie ingaat.
Vanaf: 3.2
<!ELEMENT activeWhen (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>
<!ELEMENT enabledWhen (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>
<!ATTLIST class
class CDATA #IMPLIED>
<!ELEMENT parameter EMPTY>
<!ATTLIST parameter
name CDATA #REQUIRED
value CDATA #REQUIRED>
<!ELEMENT enablement (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
Een generiek hoofdelement. U kunt het element in een extensiepunt gebruiken om de beschikbaarheidsexpressie ervan te definiëren. De criteria van een beschikbaarheidsvoorwaarde worden gecombineerd met de operator AND.
<!ELEMENT not (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>
Dit element is een NOT-bewerking op het evaluatieresultaat van de bijbehorende subexpressie.
<!ELEMENT and (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
Dit element is een AND-bewerking op het evaluatieresultaat van alle bijbehorende subexpressies.
<!ELEMENT or (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
Dit element is een OR-bewerking op het evaluatieresultaat van alle bijbehorende subexpressies.
<!ELEMENT instanceof EMPTY>
<!ATTLIST instanceof
value CDATA #REQUIRED>
Dit element wordt gebruikt om een instanceof-controle uit te voeren op het object dat de focus heeft. De expressie retourneert EvaluationResult.TRUE als het objecttype een subtype is van het type dat voor de kenmerkwaarde is opgegeven. Anders retourneert de expressie EvaluationResult.FALSE.
<!ELEMENT test EMPTY>
<!ATTLIST test
property CDATA #REQUIRED
args CDATA #IMPLIED
value CDATA #IMPLIED>
Dit element wordt gebruikt om de eigenschapsstatus te evalueren van het object dat de focus heeft. De testbare eigenschappen kunnen worden uitgebreid met het extensiepunt van de eigenschapstester. De testexpressie retourneert EvaluationResult.NOT_LOADED als de eigenschapstester nog niet is geladen.
<!ELEMENT systemTest EMPTY>
<!ATTLIST systemTest
property CDATA #REQUIRED
value CDATA #REQUIRED>
Vraagt een systeemeigenschap op met de methode System.getProperty en vergelijkt het resultaat daarvan met de waarde die voor het kenmerk value is opgegeven.
<!ELEMENT equals EMPTY>
<!ATTLIST equals
value CDATA #REQUIRED>
Dit element wordt gebruikt om een equals-controle uit te voeren op het object dat de focus heeft. De expressie retourneert EvaluationResult.TRUE als het object gelijk is aan de waarde die voor de kenmerkwaarde is opgegeven. Anders retourneert de expressie EvaluationResult.FALSE.
<!ELEMENT count EMPTY>
<!ATTLIST count
value CDATA #REQUIRED>
Dit element wordt gebruikt om het aantal elementen van een collectie op te vragen.
<!ELEMENT with (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST with
variable CDATA #REQUIRED>
Dit element wijzigt het te inspecteren object voor alle subelementen in het object waarnaar door de opgegeven variabele wordt verwezen. Als de variabele niet kan worden omgezet, verwerpt de expressie de uitzondering ExpressionException tijdens de evaluatie. De onderliggende items van een with-expressie worden gecombineerd met de operator AND.
<!ELEMENT resolve (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST resolve
variable CDATA #REQUIRED
args CDATA #IMPLIED>
Dit element wijzigt het te inspecteren object voor alle subelementen in het object waarnaar door de opgegeven variabele wordt verwezen. Als de variabele niet kan worden omgezet, verwerpt de expressie de uitzondering ExpressionException tijdens de evaluatie. De onderliggende items van een with-expressie worden gecombineerd met de operator AND.
<!ELEMENT adapt (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST adapt
type CDATA #REQUIRED>
Dit element wordt gebruikt om het focusobject aan te passen aan het type dat voor het kenmerk type is opgegeven. De expressie retourneert 'not loaded' als de adapter of het type nog niet is geladen. Als de typenaam helemaal niet bestaat, wordt de uitzondering ExpressionException verworpen tijdens de evaluatie. De criteria van een adapt-expressie worden gecombineerd met de operator AND.
<!ELEMENT iterate (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST iterate
operator (or|and) >
Dit element wordt gebruikt om een variabele van het type java.util.Collection te doorlopen. Als het focusobject niet van het type java.util.Collection is, wordt de uitzondering ExpressionException verworpen tijdens de evaluatie.
<extension point=
"org.eclipse.ui.handlers"
>
<handler commandId=
"commandId"
class=
"org.eclipse.compare.Command"
>
<activeWhen>
<with variable=
"selectie"
>
<count value=
"1"
/>
<iterate operator=
"and"
>
<adapt type=
"IResource"
/>
</iterate>
</with>
</activeWhen>
</handler>
</extension>
U kunt het laden van plugins verder voorkomen door aan te geven wanneer de afhandelingsroutine ingeschakeld moet zijn. Als de routine nog niet geladen is door de proxy, dan wordt alleen de expressiesyntaxis gebruikt om te bepalen of de afhandelingsroutine moet worden ingeschakeld. Is de routine al wel geladen, dan wordt de expressiesyntaxis eerst geraadpleegd. Resulteert de evaluatie van de expressiesyntaxis in waar, dan wordt de routine gevraagd of deze ingeschakeld is. (Dit is een verkorte booleaanse AND-vergelijking tussen de expressiesyntaxis en de status van de afhandelingsroutine.)
<extension point=
"org.eclipse.ui.handlers"
>
<handler commandId=
"commandId"
class=
"org.eclipse.Handler"
>
<enabledWhen>
<with variable=
"context"
>
<property id=
"id"
value=
"debugging"
/>
</with>
</enabledWhen>
</handler>
</extension>
Alle afhandelingsroutines moeten org.eclipse.core.commands.IHandler
implementeren. U kunt routines in de workbench (de)activeren met de interface org.eclipse.ui.handlers.IHandlerService
. U kunt de interface ophalen uit ondersteunde workbenchobjecten, waaronder IWorkbench
. De service kunt u aanroepen met IWorkbench.getAdapter(IHandlerService.class)
.
Ook kunt u afhandelingsroutines (de)activeren door middel van verouderde code in de workbench. Hieronder ziet u een voorbeeld. De methode komt van pas op clients waarop aanleveringen voor menu's en werkbalken worden toegevoegd met acties.
IWorkbenchPartSite mySite; IAction myAction; myAction.setActionDefinitionId(commandId); IKeyBindingService service = mySite.getKeyBindingService(); service.registerAction(myAction);
Copyright (c) 2005 IBM Corporation en anderen.
Alle rechten voorbehouden. Dit programma en het begeleidende materiaal zijn beschikbaar gesteld onder de voorwaarden van de Eclipse Public License v1.0 die bij deze distributie is geleverd en beschikbaar is op http://www.eclipse.org/legal/epl-v10.html.