Behandlere

org.eclipse.ui.handlers

3.1

Behandlerudvidelsespunktet er en uddybning af det eksperimenterende handlerSubmission-element, der er defineret i Eclipse 3.0. En behandler er funktionsmåden af en kommando på et bestemt tidspunkt. En kommando kan have nul eller flere behandlere tilknyttet. På givet tidspunkt vil en kommando dog enten ikke have nogen aktiv behandler eller én aktiv behandler. Den aktive behandler er en behandler, som i øjeblikket er ansvarlig for udførelsen af kommandoens funktionsmåde. Dette svarer i høj grad til en funktionsbehandler og en funktion, der kan tildeles et nyt mål.

Behandlerudvidelsespunktet giver en pluginudvikler mulighed for at angive en behandler, der skal blive aktiv og/eller aktiveret under bestemte betingelser. Hvis en behandler er inaktiv, vil ingen kommando delegere sin funktionsmåde til behandleren. Hvis en behandler deaktiveres, vil der være blokeret for udførelse af behandleren. Betingelserne defineres vha. udtrykssprogfaciliteten, som blev tilføjet fra 3.0. De udtrykkes vha. activeWhen og enabledWhen.

Arbejdsbænken indeholder nogle variabler, som disse udtryk kan benytte. De understøttede variabler er: de aktive kontekster, den aktive editor, den aktive del og det aktuelle valg. Selvom det ikke understøttes i det første design, er det nemt at se, hvordan det kan være muligt at tilføje andre variabler eller endda at tillade pluginudviklere at tilføre andre variabler.

En behandler, der ikke angiver nogen betingelser, er en standardbehandler. En standardhandler er kun aktiv, hvis ingen anden behandler har opfyldt sine betingelser. Hvis to behandlere stadig har betingelser, der er opfyldt, bliver betingelserne sammenlignet. Ideen er at vælge en behandler, hvis betingelse er mere specifik eller mere lokal. For at gøre dette kigges der på de variabler, betingelsen refererer til. Den betingelse, der refererer til den mest specifikke variabel, "vinder". Specifikationsrækkefølgen (fra mindst specifik til mest specifik) er defineret af org.eclipse.ui.ISources.

Hvis dette stadig ikke løser konflikten, er der ingen aktiv behandler. Hvis en bestemt sporingsindstilling er aktiveret, fører denne til en meddelelse i logfilen. Der kan også opstå en konflikt, hvis der er to standardbehandlere. Det er pluginudviklernes og integrationstesternes ansvar at sikre, at dette ikke sker. Betingelserne bruges til at undgå unødvendig indlæsning af plugins. Disse behandlerdefinitioner er omgivet af en proxy. Hvis en proxy skal indlæses i den underliggende behandler, skal der ske to ting: Betingelserne for proxy'en skal være opfyldt, så den bliver aktiv, og kommandoen skal blive bedt om at gøre noget, som den skal delegere (f.eks. execute()).

<!ELEMENT extension (handler*)>

<!ATTLIST extension

point CDATA #REQUIRED

id    CDATA #IMPLIED

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

Et generisk rodelement. Elementet kan anvendes i et udvidelsespunkt for at angive dets aktiveringsudtryk. Underordnede til et aktiveringsudtryk kombineres vha. en operator.



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

Dette element repræsenterer en NOT-funktion på resultatet af evalueringen af dets underelementudtryk.



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

Dette element repræsenterer en AND-funktion på resultatet af evalueringen af dets underelementudtryk.



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

Dette element repræsenterer en OR-funktion på resultatet af evalueringen af alle dets underelementudtryk.



<!ELEMENT instanceof EMPTY>

<!ATTLIST instanceof

value CDATA #REQUIRED>

Dette element anvendes til at udføre et instanceof-check af objektet i fokus. Udtrykket returnerer EvaluationResult.TRUE, hvis objektets type er en undertype der er angivet af attributværdien. Eller returneres EvaluationResult.FALSE.



<!ELEMENT test EMPTY>

<!ATTLIST test

property CDATA #REQUIRED

args     CDATA #IMPLIED

value    CDATA #IMPLIED>

Dette element anvendes til evaluere egenskabstilstanden for objektet i fokus. Sættet af egenskaber, der kan testes, kan udvides vha. udvidelsespunktet egenskabstester. Testudtrykket returnerer EvaluationResult.NOT_LOADED, hvis egenskabstester, der udfører den aktuelle test, ikke er indlæst endnu.



<!ELEMENT systemTest EMPTY>

<!ATTLIST systemTest

property CDATA #REQUIRED

value    CDATA #REQUIRED>

Tester en systemegenskab ved at kalde metoden System.getProperty og sammenligner resultatet med den værdi, der er angivet via værdiattributten.



<!ELEMENT equals EMPTY>

<!ATTLIST equals

value CDATA #REQUIRED>

Dette element anvendes til at udføre en sammenligningskontrol af objektet i fokus. Udtrykket returnerer EvaluationResult.TRUE, hvis objektet er lig med værdiudbyderen for attributværdien. Eller returneres EvaluationResult.FALSE.



<!ELEMENT count EMPTY>

<!ATTLIST count

value CDATA #REQUIRED>

Dette element anvendes til at teste antallet af elementer i en samling.



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

<!ATTLIST with

variable CDATA #REQUIRED>

Dette element ændrer det objekt, der skal undersøges for alle underordnede elementer, til et objekt, der henvises til fra en given variabel. Hvis variablen ikke kan opløses, vil udtrykket sende en ExpressionException, når den evalueres. En underordnet med et with-udtryk kombineres ved at bruge operatoren and.



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

<!ATTLIST resolve

variable CDATA #REQUIRED

args     CDATA #IMPLIED>

Dette element ændrer det objekt, der skal undersøges for alle underordnede elementer, til et objekt, der henvises til fra en given variabel. Hvis variablen ikke kan opløses, vil udtrykket sende en ExpressionException, når den evalueres. En underordnet med et with-udtryk kombineres ved at bruge operatoren and.



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

<!ATTLIST adapt

type CDATA #REQUIRED>

Dette element anvendes til at tilpasse objekter i fokus til den type, der er angivet af attributtypen. Udtrykket returnerer ikke indlæst, hvis adapteren eller den type, der henvises til, ikke er indlæst endnu. Det sender enExpressionException under evalueringen, hvis typenavnet slet ikke findes. Underordnede til et tilpasset udtryk kombineres vha. operatoren AND.



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

<!ATTLIST iterate

operator (or|and) >

Dette element anvendes til gentagelser for en variabel, der har typen java.util.Collection. Hvis objektet i fokus ikke er af typen java.util.Collection, sendes der en ExpressionException, når udtrykket evalueres.



<extension point=

"org.eclipse.ui.handlers"

>

<handler commandId=

"commandId"

class=

"org.eclipse.compare.Command"

>

<activeWhen>

<with variable=

"selection"

>

<count value=

"1"

/>

<iterate operator=

"and"

>

<adapt type=

"IResource"

/>

</iterate>

</with>

</activeWhen>

</handler>

</extension>

For yderligere at undgå indlæsning af plugins er det muligt at angive, hvornår behandleren aktiveres. Hvis proxy'en endnu ikke har indlæst behandleren, er det kun udtrykssyntaksen, der bruges til at afgøre, om behandleren aktiveres. Hvis proxy'en har indlæst behandleren, konsulteres udtrykssyntaksen først. Hvis udtrykssyntaksen evalueres til true, bliver behandleren spurgt, om den er aktiveret. (Dette er en short-circuit boolesk "and"-funktion mellem udtrykssyntaksen og behandlerens aktiverede tilstand).

<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 behandlere implementerer org.eclipse.core.commands.IHandler. På arbejdsbænken er det muligt at aktivere og deaktivere behandlere vha. grænsefladen org.eclipse.ui.handlers.IHandlerService. Denne grænseflade kan hentes fra arbejdsbænkobjekter, der understøtter dette, f.eks. selve IWorkbench. For at hente servicen, skal du foretage et kald som IWorkbench.getAdapter(IHandlerService.class).

Det er også muligt at aktivere og deaktivere behandlere vha. ældre kode på arbejdsbænken. Dette kan gøres via den ældre mekanisme vist nedenfor. Denne mekanisme er nyttig for klienter, som bruger funktioner til at bidrage til menuer eller værktøjslinjer.

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