Hanterare

org.eclipse.ui.handlers

3.1

Utökningspunkten för hanterare är en utveckling av det experimentella handlerSubmission-element som definierats i Eclipse 3.0. En hanterare är en kommandofunktion vid en viss tidpunkt. Ett kommando kan ha ingen eller flera associerade hanterare. Ett kommando har däremot antingen ingen aktiv hanterare eller en aktiv hanterare vid varje tidpunkt. Den aktiva hanteraren är en som för tillfället är ansvarig för att genomföra kommandofunktionen. Detta är väldigt lika begreppet med en åtgärdshanterare och en åtgärd som kan byta mål.

Med hjälp av hanterarens utökningspunkt kan en utvecklare av insticksprogram specificera en hanterare som aktiveras under vissa omständigheter. Om en hanterare är inaktiv delegeras inte dess funktion till hanteraren av något kommando. Om en hanterare är avaktiverad blir den inte ombedd att utföra något, körningen av hanteraren blockeras. Villkoren definieras med hjälp av den funktion för uttrycksspråk som lades till i 3.0. De uttrycks med hjälp av satsdelarna activeWhen och enabledWhen.

I arbetsmiljön finns vissa variabler som dessa uttryck kan förlita sig på. De användbara variablerna är: de aktiva kontexterna, den aktiva redigeraren, den aktiva delen och aktuellt urval. Fast detta inte kunde användas i sin initiala utformning är det lätt att se hur det skulle vara möjligt att lägga till andra variabler, eller till och med tillåta utvecklare av insticksprogram att tillhandahålla flera variabler.

En hanterare som inte anger några villkor är en standardhanterare. En standardhanterare är bara aktiv om ingen annan hanterare har alla villkor uppfyllda. Om två hanterare ännu har villkor som är uppfyllda, jämförs villkoren. Tanken är att välja en hanterare vars villkor är mer specifika eller mer lokala. Detta görs genom att granska de variabler som refereras till i villkoret. Det villkor som refererar till den mest specifika variabeln "vinner". Specificitetsordningen (från den minst specifika till den mest specifika) definieras i org.eclipse.ui.ISources.

Om konflikten ändå inte löses är ingen hanterare aktiv. Om ett visst spårningsalternativ aktiveras leder detta till ett meddelande i loggen. En konflikt kan också inträffa om det finns två standardhanterare. Det är utvecklaren av insticksprogram och integrationstestarna som ansvarar för att säkerställa att detta inte händer. Villkoren används för att undvika onödig inläsning av insticksprogram. Hanterardefinitionerna anges i en proxy. Om en proxy ska kunna läsa in underliggande hanterare måste två saker ske: villkoren för proxyn måste vara uppfyllda så att den aktiveras och kommandot måste ombes att göra något vilket måste delegeras (t.ex. 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>


<!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)>



<!ELEMENT class (parameter*)>

<!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)*>

Ett allmänt rotelement. Elementet kan användas i en utökningspunkt till att definiera enablement-uttrycket för den. De underordnade objekten till ett enablement-uttryck kombineras med hjälp av operatorn and.



<!ELEMENT not (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>

Elementet representerar ett NOT-uttryck för resultatet från utvärderingen av underelementsuttrycken.



<!ELEMENT and (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>

Det här elementet representerar en AND-åtgärd för resultatet från utvärderingen av underelementuttrycken.



<!ELEMENT or (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>

Det här elementet representerar en OR-åtgärd för resultatet från utvärderingen av underelementuttrycken.



<!ELEMENT instanceof EMPTY>

<!ATTLIST instanceof

value CDATA #REQUIRED>

Elementet används till att göra en instanceof-kontroll av det aktuella objektet. Uttrycket returnerar EvaluationResult.TRUE om objektstypen är en undertyp till den typ som angavs av attributvärdet. I annat fall returneras EvaluationResult.FALSE.



<!ELEMENT test EMPTY>

<!ATTLIST test

property CDATA #REQUIRED

args     CDATA #IMPLIED

value    CDATA #IMPLIED>

Elementet används till att utvärdera egenskapsläget för det aktuella objektet. Uppsättningen egenskaper som kan testas kan utökas med hjälp av utökningspunkten för egenskapstestfunktionen. Testuttrycket returnerar EvaluationResult.NOT_LOADED om den aktuella egenskapstestfunktionen inte har lästs in ännu.



<!ELEMENT systemTest EMPTY>

<!ATTLIST systemTest

property CDATA #REQUIRED

value    CDATA #REQUIRED>

Testar en systemegenskap genom att anropa metoden System.getProperty method och jämför resultatet med det värde som angetts via värdeattributet.



<!ELEMENT equals EMPTY>

<!ATTLIST equals

value CDATA #REQUIRED>

Elementet används till att göra en equals-kontroll av det aktuella objektet. Uttrycket returnerar EvaluationResult.TRUE om objektet är detsamma som det värde som tillhandahålls av attributvärdet. I annat fall returneras EvaluationResult.FALSE.



<!ELEMENT count EMPTY>

<!ATTLIST count

value CDATA #REQUIRED>

Elementet används till att testa antalet element i samlingen.



<!ELEMENT with (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>

<!ATTLIST with

variable CDATA #REQUIRED>

Det här elementet ändrar det objekt som ska kontrolleras för alla underordnade element till det objekt som refereras till av den angivna variabeln. Om variabeln inte kan lösas returnerar uttrycket ExpressionException när det utvärderas. De underordnade objekten till ett with-uttryck kombineras med hjälp av operatorn and.



<!ELEMENT resolve (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>

<!ATTLIST resolve

variable CDATA #REQUIRED

args     CDATA #IMPLIED>

Det här elementet ändrar det objekt som ska kontrolleras för alla underordnade element till det objekt som refereras till av den angivna variabeln. Om variabeln inte kan lösas returnerar uttrycket ExpressionException när det utvärderas. De underordnade objekten till ett with-uttryck kombineras med hjälp av operatorn and.



<!ELEMENT adapt (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>

<!ATTLIST adapt

type CDATA #REQUIRED>

Det här elementet används till anpassa det aktuella objektet till den typ som angavs av attributtypen. Uttrycket returneras som inte inläst om adaptern eller den refererade typen inte har lästs in än. Det returnerar ett ExpressionException under utvärdering om samma typnamn inte finns alls. De underordnade objekten till ett adapt-uttryck kombineras med hjälp av operatorn and.



<!ELEMENT iterate (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>

<!ATTLIST iterate

operator (or|and) >

Det här elementet används till att räkna stegvis över en variabel som är av typen java.util.Collection. Om det aktuella objektet inte är av typen java.util.Collection returneras ExpressionException när uttrycket utvärderas.



<extension point=

"org.eclipse.ui.handlers"

>

<handler commandId=

"commandId"

class=

"org.eclipse.compare.Command"

>

<activeWhen>

<with variable=

"inställning"

>

<count value=

"1"

/>

<iterate operator=

"and"

>

<adapt type=

"IResource"

/>

</iterate>

</with>

</activeWhen>

</handler>

</extension>

I syfte att ytterligare undvika inläsning av insticksprogram kan du specificera när hanteraren aktiveras. Om proxyn ännu inte har läst in hanteraren används bara uttryckssyntaxen för att bestämma om hanteraren aktiveras. Om hanteraren har lästs in konsulteras uttryckssyntaxen först. Om uttryckssyntaxen utvärderas till "true" får hanteraren en fråga om den är aktiverad. (Detta är en kortslutningsboolesk "and"-åtgärd mellan de två uttryckens syntax och hanterarens aktiverade läge.)

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

Alla hanterare implementerar org.eclipse.core.commands.IHandler. Inom arbetsmiljön är det möjligt att aktivera och avaktivera hanterare med hjälp av gränssnittet org.eclipse.ui.handlers.IHandlerService. Det här gränssnittet kan hämtas från användbara arbetsmiljöobjekt, t.ex. IWorkbench själv. Om du vill hämta tjänsten bör du göra ett anrop, som t.ex. IWorkbench.getAdapter(IHandlerService.class).

Du kan också aktivera och avaktivera hanterare med hjälp av den gamla koden i arbetsmiljön. Detta kan göras med hjälp av den äldre mekanism som visas nedan. Denna mekanism är bra för klienter som använder åtgärder att lägga till på menyer och i verktygsfält.

 IWorkbenchPartSite mySite;
 IAction myAction;
 
 myAction.setActionDefinitionId(commandId);
 IKeyBindingService service = mySite.getKeyBindingService();
 service.registerAction(myAction);