Kezelők

org.eclipse.ui.handlers

3.1

A handlers kiterjesztési pont az Eclipse 3.0 változatában meghatározott kísérleti handlerSubmission elem feldolgozása. A kezelő egy parancs viselkedése egy adott időpontban. Egy parancsnak nulla vagy több hozzá tartozó kezelője lehet. Azonban egy adott időpontban egy parancsnak vagy nincs aktív kezelője, vagy egyetlen aktív kezelője van. Az az aktív kezelő, amely pillanatnyilag felelős a parancs viselkedésének biztosításáért. Ez nagyon hasonló egy műveletkezelő és egy áttervezhető művelet alapelvéhez.

A handlers kiterjesztési pont lehetővé teszi egy bedolgozófejlesztő számára egy olyan kezelő megadását, amelynek aktívvá és/vagy engedélyezetté kell válnia bizonyos feltételek esetén. Ha egy kezelő inaktív, akkor egy parancs sem fogja delegálni a viselkedését a kezelőhoz. Ha egy kezelő tiltott, akkor a kezelő nem fog végrehajtásra kerülni, mert a kezelő végrehajtása letiltásra kerül. A feltételek a 3.0 változatban felvett kifejezésekkel kapcsolatos nyelvi szolgáltatás használatával adhatók meg. Az activeWhen és enabledWhen záradékokkal kerülnek kifejezésre.

A munkaterület biztosít néhány változót, amelyekre ezen kifejezések támaszkodhatnak. A támogatott változók a következők: az aktív környezetek, az aktív szerkesztő, az aktív rész és az aktuális kijelölés. Bár ebben a kezdeti tervben nem támogatott, egyszerűen megérthető, hogy hogyan lehetne más változót felvenni vagy akár a bedolgozófejlesztők számára más változók hozzáadását engedélyezni.

Az olyan kezelő alapértelmezett kezelő, amely nem határoz meg feltételeket. Egy alapértelmezett kezelő csak akkor aktív, ha a többi kezelő összes feltétele nincs kielégítve. Ha két kezelőnek is van kielégített feltétele, akkor a kezelők összehasonlításra kerülnek. Az ötlet azon kezelő kiválasztása, amely feltétele specifikusabb vagy jobban vonatkozik a helyre. Ehhez a feltétel által hivatkozott változók kikeresésre kerülnek. A legspecifikusabb változóra hivatkozó feltétel "nyer". A specifikusság sorrendje (a legkevésbé specifikustól a legspecifikusabbig) az org.eclipse.ui.ISources elemben van meghatározva.

Ha ez sem oldja fel az ütközést, akkor egyik kezelő sem lesz aktív. Ha egy adott nyomkövetési beállítás be van kapcsolva, akkor ez az eset megjelenik üzenetként a naplóban. Ütközés akkor is előfordulhat, ha két alapértelmezett kezelő van. A bedolgozófejlesztők és az integrációtesztelők felelőssége annak biztosítása, hogy ez nem történjen meg. Ezen feltételek a szükségtelen bedolgozóbetöltések elkerülésére használhatók. Ezen kezelőmeghatározások egy proxyban találhatók. Ahhoz, hogy egy proxy betöltse az alapul szolgáló kezelőjét, két dolognak kell megtörténnie: a proxy feltételeinek kielégítettnek kell lenniük, hogy az aktívvá váljon, és a parancsot meg kell kérni, hogy tegyen valamit, amit delegálnia kell (pl.: 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)*>

Általános gyökérelem. Az elem kiterjesztési pontokon belül használható a hozzá tartozó enablement kifejez meghatározására. Az enablement kifejezések leszármazottai az and operátorral kombinálhatók.



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

Ez az elem egy NOT műveletet képvisel a részelemeként kiértékelt kifejezés eredményén.



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

Ez az elem egy AND műveletet képvisel a részelemeként kiértékelt összes kifejezés eredményén.



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

Ez az elem egy OR műveletet képvisel a részelemeként kiértékelt összes kifejezés eredményén.



<!ELEMENT instanceof EMPTY>

<!ATTLIST instanceof

value CDATA #REQUIRED>

Ezzel az elemmel végezhető el a fókuszban lévő objektum instanceof ellenőrzése. A kifejezés az EvaluationResult.TRUE értékkel tér vissza, ha az objektum típusa a value attribútumban megadott típus altípusa. Ellenkező esetben EvaluationResult.FALSE kerül visszaadásra.



<!ELEMENT test EMPTY>

<!ATTLIST test

property CDATA #REQUIRED

args     CDATA #IMPLIED

value    CDATA #IMPLIED>

Ezzel az elemmel értékelhető ki a fókuszban lévő objektum tulajdonságának állapota. A tesztelhető tulajdonságok halmaza a tulajdonságtesztelő kiterjesztési ponton terjeszthető ki. A tesztelési kifejezés EvaluationResult.NOT_LOADED értéket ad vissza, ha a tényleges tesztelést végző tulajdonságtesztelő még nincs betöltve.



<!ELEMENT systemTest EMPTY>

<!ATTLIST systemTest

property CDATA #REQUIRED

value    CDATA #REQUIRED>

Megvizsgál egy rendszertulajdonságot a System.getProperty metódus meghívásával, és összehasonlítja az eredményt a value attribútumban megadott értékkel.



<!ELEMENT equals EMPTY>

<!ATTLIST equals

value CDATA #REQUIRED>

Ezzel az elemmel végezhető el a fókuszban lévő objektum egyenlőségi ellenőrzése. A kifejezés az EvaluationResult.TRUE értékkel tér vissza, ha az objektum egyenlő a value attribútumban megadott értékkel. Ellenkező esetben EvaluationResult.FALSE kerül visszaadásra.



<!ELEMENT count EMPTY>

<!ATTLIST count

value CDATA #REQUIRED>

Ezzel az elemmel vizsgálható megy egy kollekció elemszáma.



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

<!ATTLIST with

variable CDATA #REQUIRED>

Az elem módosítja a leszármazott elemek tekintetében megvizsgálandó objektumot az adott változó által hivatkozott objektumra. Ha a változó nem oldható fel, akkor a kifejezés a kiértékelés során ExpressionException kivételt ad. A with kifejezések leszármazottai az and operátorral kombinálhatók.



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

<!ATTLIST resolve

variable CDATA #REQUIRED

args     CDATA #IMPLIED>

Az elem módosítja a leszármazott elemek tekintetében megvizsgálandó objektumot az adott változó által hivatkozott objektumra. Ha a változó nem oldható fel, akkor a kifejezés a kiértékelés során ExpressionException kivételt ad. A with kifejezések leszármazottai az and operátorral kombinálhatók.



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

<!ATTLIST adapt

type CDATA #REQUIRED>

Ezzel az elemmel adaptálható a fókuszban lévő objektum a type attribútummal megadott típusra. A kifejezés "nincs betöltve" értéket ad vissza, ha a hivatkozott adapter vagy típus még nincs betöltve. ExpressionException kivételt ad a kiértékelés során, ha a típus neve egyáltalán nem létezik. Az adapt kifejezések leszármazottai az and operátorral kombinálhatók.



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

<!ATTLIST iterate

operator (or|and) >

Ezzel az elemmel iterálhatók a java.util.Collection típusú változók. Ha a fókuszban lévő objektum nem java.util.Collection típusú, akkor a kifejezés kiértékelése ExpressionException kivételt ad.



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

A bedolgozóbetöltés elkerüléséhez, azt is meg lehet, hogy a kezelő mikor legyen engedélyezett. Ha a proxy még nem töltötte be a kezelőt, akkor csak a kifejezések szintaxisa kerül felhasználásra annak eldöntésére, hogy a kezelő engedélyezett-e. Ha a proxy betöltötte a kezelőt, akkor a kifejezések szintaxisa kerül először ellenőrzésre. Ha a kifejezések szintaxisa true értéket ad, akkor a kezelőt kérdezi meg a rendszer arról, hogy engedélyezett-e. (Ez egy "és" logikai rövidzár művelet a kifejezések szintaxisa és a kezelő engedélyezett állapota között.)

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

Az összes kezelő az org.eclipse.core.commands.IHandler felületet valósítja meg. A munkaterületen aktiválhatók és leállíthatók a kezelők az org.eclipse.ui.handlers.IHandlerService felület használatával. Ez a felület az olyan támogató munkaterület-objektumokból kérhető le, mint maga az IWorkbench. A szolgáltatás lekéréséhez egy olyan hívást kell elvégeznie, mint az IWorkbench.getAdapter(IHandlerService.class).

A kezelők aktiválása és leállítása a munkaterületen az örökölt kód használatával is lehetséges. Ez az alább bemutatásra kerülő öröklési mechanizmuson keresztül végezhető el. Ez a mechanizmus azon ügyfelek számára hasznos, akik műveleteket használnak a menükhöz vagy eszköztárakhoz hozzáadásra.

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