Popisovače

org.eclipse.ui.handlers

3.1

Bod rozšíření pro popisovače (obsluhy) vznikl propracováním experimentálního prvku handlerSubmission definovaného na platformě Eclipse 3.0. Popisovač představuje chování příkazu v daném časovém okamžiku. S příkazem může být asociováno nula a více popisovačů. V daném časovém okamžiku však příkaz může mít nejvýše jeden aktivní popisovač (nebo žádný). Aktivní popisovač je ten, který je aktuálně odpovědný za realizaci chování příkazu. To je velmi podobné konceptu popisovače akce a akce s měnitelným cílem.

Bod rozšíření pro popisovače umožňuje vývojářům modulů plug-in určit popisovač, který se má stát aktivní nebo který se má zpřístupnit za určitých podmínek. Pokud popisovač není aktivní, pak na něj své chování nebude delegovat žádný příkaz. Pokud je popisovač znepřístupněn, pak nikdo nebude žádat o jeho provedení; spuštění popisovače je zablokováno. Podmínky jsou definovány za použití modulu Expression Language přidaného ve verzi 3.0. Vyjadřují se pomocí klauzulí activeWhen a enabledWhen.

Modul Workbench poskytuje několik proměnných, na které se tyto výrazy mohou spoléhat. Podporované proměnné jsou: aktivní kontexty, aktivní editor, aktivní součást a aktuální výběr. Přestože v tomto počátečním návrhu nejsou podporovány, je zřetelně vidět, jak by bylo možné další proměnné přidávat, nebo dokonce povolit vývojářům modulů plug-in, aby přidávali další proměnné.

Popisovač, který neurčuje žádné podmínky, je výchozí popisovač. Výchozí popisovač je aktivní pouze v případě, že nejsou splněny všechny podmínky jakéhokoli jiného popisovače. Pokud jsou splněny podmínky u dvou popisovačů, provede se porovnání podmínek. Princip je v tom, že se vybere popisovač, jehož podmínka je konkrétnější nebo více lokální. K tomu je třeba podívat se na proměnné, na které se podmínka odkazuje. "Vyhraje" podmínka odkazující se na proměnnou, která je nejvíce konkrétní. Pořadí konkrétnosti (od nejméně konkrétních po nejvíce konkrétní) je definováno v org.eclipse.ui.ISources.

Pokud se konflikt ani tímto způsobem nevyřeší, aktivní nebude žádný popisovač. Pokud je zapnutá určitá volba trasování, povede to na zápis zprávy do protokolu. Ke konfliktu dojde i v případě, že existují dva výchozí popisovače. Odpovědností vývojářů modulů plug-in a testerů integrace je zajistit, aby k tomuto nedocházelo. Tyto podmínky se používají proto, aby se zabránilo zbytečnému načítání modulů plug-in. Tyto definice popisovače (obsluhy) jsou zabaleny do proxy. Aby proxy načetl svůj základní popisovač, musí se stát dvě věci: podmínky pro proxy musí být splněny, aby se stal aktivní, a příkaz musí být požádán o provedení něčeho, co musí delegovat (tj. 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>


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


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

Dalšímu načítání modulů plug-in lze zabránit tak, že se určí, kdy je popisovač zpřístupněn. Pokud proxy dosud popisovač nenačetl, pak se o zpřístupnění popisovače rozhoduje výhradně na základě syntaxe výrazů. Pokud proxy již popisovač načetl, nejprve se kontroluje syntaxe výrazů. Pokud se syntaxe výrazů vyhodnotí jako true, zkontrolujte se, zda je popisovač (obsluha) zpřístupněn(a). (Jedná se o zkrácenou logickou operaci "and" mezi syntaxí výrazů a stavem zpřístupnění popisovače).

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

Všechny popisovače (obsluhy) implementují org.eclipse.core.commands.IHandler. V rámci modulu Workbench je možné popisovače aktivovat a deaktivovat pomocí rozhraní org.eclipse.ui.handlers.IHandlerService. Toto rozhraní lze načíst z podpůrných objektů modulu Workbench, např. samotného IWorkbench. K načtení služby můžete spustit volání jako IWorkbench.getAdapter(IHandlerService.class).

Popisovače (obsluhy) můžete také aktivovat a deaktivovat pomocí kódu odkazu v modulu Workbench. To lze provést prostřednictvím níže uvedeného mechanizmu. Tento mechanizmus je užitečný v případě klientů, kteří do nabídek a panelů nástrojů přispívají pomocí akcí.

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