Behandlere

org.eclipse.ui.handlers

3.1

Behandlerutvidelsespunktet er mer utfyllende enn det eksperimentelle handlerSubmission-elementet som er definert i Eclipse 3.0. En behandler er virkemåten til en kommando på et bestemt tidspunkt. En kommando kan ha null eller flere tilknyttede behandlere. En kommando vil imidlertid på et hvilket som helst tidspunkt enten ha ingen aktive behandlere eller en aktiv behandler. Den aktive behandleren er den som for øyeblikket har ansvar for å utføre virkemåten til kommandoen. Dette likner veldig på konseptet med en handlingsbehandler og en handling som kan skifte mål.

Behandlerutvidelsespunktet gjør det mulig for en plugin-utvikler å oppgi en behandler som skal bli aktiv og/eller aktivert under visse omstendigheter. Hvis behandleren er inaktiv, vil ingen kommandoer delegere virkemåten sin til behandleren. Hvis en behandler blir deaktivert, blir det ikke bedt om at behandleren utføres. Utføringen av behandleren er blokkert. Betingelsene defineres ved hjelp av uttrykkspråkfunksjonen som er lagt til i 3.0. De uttrykkes med leddene activeWhen og enabledWhen.

Arbeidsbenken har noen variabler som disse uttrykkene kan avhenge av. Dette er variablene som støttes: den aktive konteksten, det aktive redigeringsprogrammet, den aktive delen og det gjeldende valget. Selv om det ikke støttes i dette opprinnelige designet, er det enkelt å se hvordan det hadde vært mulig å legge til andre variabler eller til og med la plugin-utviklere bidra med andre variabler.

En behandler som ikke oppgir noen betingelser, er en standardbehandler. En standardbehandler er bare aktiv hvis det ikke er noen andre behandlere der betingelsene er oppfylt. Hvis to behandlere har betingelser som er oppfylt, blir betingelsene sammenliknet. Hensikten med dette er å velge den behandleren som har den mest spesifikke eller lokale betingelsen. Dette gjøres ved å se på variablene som betingelsene refererer til. Den betingelsen som refererer til den mest spesifikke variabelen, "vinner". Hvor spesifikk en variable er (fra den minst spesifikke til den mest spesifikke), er definert i org.eclipse.ui.ISources.

Hvis dette ikke løser konflikten, er ingen behandler aktiv. Hvis et bestemt sporingsalternativ er slått på, fører det til en melding i loggen. Det kan også oppstå en konflikt hvis der er to standardbehandlere. Det er plugin-utviklerne og integreringstesterne som har ansvar for å sikre at dette ikke skjer. Disse betingelsene blir brukt for å unngå unødvendig innlasting av plugin-moduler. Disse behandlerdefinisjonene er pakket i en proxy. Hvis en proxy skal laste inn den underliggende behandleren, er det avhengig av to ting: betingelsene for proxyen må være oppfylt, slik at den blir aktiv, og kommandoen må bli bedt om å gjøre noe som den må delegere (for eksempel 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)*>

Et generisk rotelement. Elementet kan brukes i et utvidelsespunkt for å definere det tilhørende aktiveringsuttrykket. Underordnede under et aktiveringsuttrykk kombineres med operatoren AND.



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

Dette elementet representerer en NOT-operasjon på resultatet av evalueringen av underelementuttrykket.



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

Dette elementet representerer en AND-operasjon på resultatet av evalueringen av alle dets underelementuttrykk.



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

Dette elementet representerer en OR-operasjon på resultatet av evalueringen av alle tilhørende underelementuttrykk.



<!ELEMENT instanceof EMPTY>

<!ATTLIST instanceof

value CDATA #REQUIRED>

Dette elementet brukes til å utføre en instanceof-kontroll av objektet i fokus. Uttrykket returnerer EvaluationResult.TRUE hvis objektets type er en subtype under typen som er spesifisert ved attributtverdien. Ellers returneres EvaluationResult.FALSE.



<!ELEMENT test EMPTY>

<!ATTLIST test

property CDATA #REQUIRED

args     CDATA #IMPLIED

value    CDATA #IMPLIED>

Dette elementet brukes til å evaluere egenskapstilstanden til objektet i fokus. Settet med prøvbare egenskaper kan utvides ved hjelp av utvidelsespunktet for egenskapstesting. Testuttrykket returnerer EvaluationResult.NOT_LOADED hvis egenskapstesteren som utfører den faktiske testingen, ennå ikke er lastet inn.



<!ELEMENT systemTest EMPTY>

<!ATTLIST systemTest

property CDATA #REQUIRED

value    CDATA #REQUIRED>

Tester en systemegenskap ved å kalle opp metoden System.getProperty, og sammenlikner resultatet med verdien spesifisert gjennom value-attributtet.



<!ELEMENT equals EMPTY>

<!ATTLIST equals

value CDATA #REQUIRED>

Dette elementet brukes til å utføre en equals-kontroll av objektet i fokus. Uttrykket returnerer EvaluationResult.TRUE hvis objektet er lik verdien gitt ved attributtverdien. Ellers returneres EvaluationResult.FALSE.



<!ELEMENT count EMPTY>

<!ATTLIST count

value CDATA #REQUIRED>

Dette elementet brukes til å teste antallet elementer i en samling.



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

<!ATTLIST with

variable CDATA #REQUIRED>

Dette elementet endrer objektet som skal inspiseres, for alle underordnede elementer under objektet som refereres med den gitte variabelen. Hvis variabelen ikke kan behandles, vil uttrykket kaste et ExpressionException ved evaluering. Underordnede under et with-uttrykk kombineres ved hjelp av 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 elementet endrer objektet som skal inspiseres, for alle underordnede elementer under objektet som refereres med den gitte variabelen. Hvis variabelen ikke kan behandles, vil uttrykket kaste et ExpressionException ved evaluering. Underordnede under et with-uttrykk kombineres ved hjelp av operatoren AND.



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

<!ATTLIST adapt

type CDATA #REQUIRED>

Dette elementet brukes til å tilpasse objektet i fokus til typen spesifisert ved attributtypen. Uttrykket returnerer ikke lastet inn hvis adapteren eller typen som det refereres til, ikke er lastet inn. Det kaster et ExpressionException under evaluering hvis typenavnet ikke finnes i det hele tatt. Underordnede under et adapt-uttrykk kombineres ved hjelp av operatoren AND.



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

<!ATTLIST iterate

operator (or|and) >

Dette elementet brukes til å gjenta en variabel som er av typen java.util.Collection. Hvis objektet i fokus ikke er av typen java.util.Collection, kastes et ExpressionException ved evaluering av uttrykket.



<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 ytterligere å unngå innlasting av plugin-moduler er det mulig å oppgi når behandleren skal aktiveres. Hvis proxyen ennå ikke har lastet inn behandleren, blir bare uttrykkssyntaksen brukt for å fastsette om behandleren er aktivert. Hvis proxyen har lastet inn behandleren, blir uttrykkssyntaksen konsultert først. Hvis uttrykkssyntaksen vurderes som "true", blir behandleren spurt om den er aktivert. (Dette er en forenklet boolsk "and"-operasjon mellom uttrykkssyntaksen og behandlerens aktiverte 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å en arbeidsbenk er det mulig å aktivere og deaktivere behandlere ved hjelp av org.eclipse.ui.handlers.IHandlerService-grensesnittet. Dette grensesnittet kan hentes fra arbeidsbenkobjekter som støttes, for eksempel selve IWorkbench. Du kan hente denne tjenesten ved å foreta et kall, for eksempel IWorkbench.getAdapter(IHandlerService.class).

Det er også mulig å aktivere og deaktivere behandlere med arvet kode på arbeidsbenken. Dette kan gjøres ved hjelp av den arvede mekanismen som er vist her. Denne mekanismen er nyttig for klienter som bruker handlinger for å bidra til menyer eller verktøylinjer.

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