Dekorátory

Váš modul plug-in může používat dekorátory k přiřazování obrázků prostředkům a ostatním objektům, které se zobrazují v pohledech pracovní plochy.  Dekorátory se používají v situacích, kdy váš modul plug-in přidává funkci k existujícím typům prostředků.  Mnohé ze standardních pohledů se podílejí na zobrazování dekorací.  

Například PDE vkládá dekorátory, které vám umožňují rozlišovat mezi binárními a zdrojovými projekty.

Pohled Průzkumník balíčků s dekorátory PDE

Projekt com.example.helloworld  je jediným zdrojovým projektem zobrazeným v navigátoru.  Povšimněte si, že všechny ostatní, tj. binární, projekty zobrazují binární dekorátor vlevo nahoře od ikony projektu Java.  Tento dekorátor vkládá PDE s použitím bodu rozšíření org.eclipse.ui.decorators.

   <extension
         point="org.eclipse.ui.decorators">
    <decorator
            lightweight="true"
            quadrant="TOP_LEFT"
            adaptable="true"
            label="%decorator.label"
            icon="icons/full/ovr16/binary_co.png"
            state="false"
            id="org.eclipse.pde.ui.binaryProjectDecorator">
         <description>
            %decorator.desc
         </description>
         <enablement>
            ...
         </enablement>
    </decorator>
    </extension>

K dispozici je několik různých způsobů poskytnutí implementace dekorátoru.  Tento markup používá nejjednodušší způsob známý pod názvem deklarativní lehký dekorátor.  Je-li definován deklarativní lehký dekorátor, markup obsahuje kompletní popis, umístění a podmínky zpřístupnění ikony dekorátoru.  Deklarativní dekorátory se používají v případech, kdy je pro dekoraci štítku použita pouze ikona.  Modul plug-in musí pouze určit kvadrant, kde má být dekorátor překryt na běžné ikoně, a dále ikonu pro překrytí.  Jak vidíme na obrázku, je binární ikona PDE vykreslena v levém horním kvadrantu ikony balíčku.

Pokud váš modul plug-in potřebuje manipulovat kromě ikony i s textem štítku nebo je-li typ ikony určován dynamicky, můžete použít nedeklarativnílehký dekorátor.  V takovém případě musí být definována implementační třída, která implementuje ILightweightLabelDecorator.  Určená třída odpovídá za poskytnutí předpony, přípony a překryvného obrázku pro štítek během provádění programu.  Mechanizmus skládání přípony a předpony s textem štítku a provedení překrytí zajišťuje kód pracovní plochy (workbench) vláknu na pozadí.  Z tohoto důvodu musí být veškeré úkony prováděné vaším modulem plug-in ve své implementaci ILightweightLabelDecorator zabezpečeny vzhledem k vláknům uživatelského rozhraní.  (Další informace viz Provádění kódu vlákna, které nepatří do uživatelského rozhraní.)

  Následující markup ilustruje způsob, kterým klient CVS s použitím této metody definuje svůj dekorátor:

   <extension
         point="org.eclipse.ui.decorators">
    <decorator
            objectClass="org.eclipse.core.resources.IResource"
            adaptable="true"
            label="%DecoratorStandard.name"
            state="false"
            lightweight= "true"
            quadrant = "BOTTOM_RIGHT"
            class="org.eclipse.team.internal.ccvs.ui.CVSLightweightDecorator"
            id="org.eclipse.team.cvs.ui.decorator">
         <description>
            %DecoratorStandard.desc
         </description>
    </decorator>
</extension>

Dekorátory uživatel ovládá s použitím stránky předvoleb pracovní plochy Zdobení štítků.  Jednotlivé dekorátory lze zapínat a vypínat.  Své dekorátory byste měli navrhovat tak, aby se nepřekrývali ani nekolidovali se stávajícími dekorátory platformy SDK. V případech, kdy tentýž kvadrant obsazují lehké dekorátory několika modulů plug-in, nelze předem stanovit způsob vyřešení konfliktu.  

Váš modul plug-in může rovněž veškerou správu obrázků a štítků zajišťovat samostatně.  V takovém případě by měl atribut lightweight obsahovat hodnotu false a atribut class by měl obsahovat název třídy, jež implementuje ILabelDecorator.  Tato třída umožňuje doplnění původního obrázku a textu štítku vašimi vlastními anotacemi.  Poskytuje větší volnost, pokud se nechcete omezovat na předpony, přípony a prosté překrývání kvadrantu.

Ostatní atributy dekorátoru jsou nezávislé na použitém stylu implementace.  Atributy label a description obsahují text použití k pojmenování a popisu dekorátoru v dialogovém okně předvoleb.  Atribut objectClass obsahuje název třídy objektů, pro které má být dekorátor použit.  Atributenablement umožňuje stanovit podmínky, při jejichž splnění má být objekt opatřen dekorací.   Příznak adaptable určuje, zda mají být opatřeny dekorací rovněž objekty adaptující IResource.  Příznak state určuje, zda se dekorátor při výchozím nastavení zobrazuje.

Pokud vaše dekorátory obsahují informaci, jež klade vyšší nároky na výpočetní výkon nebo má sklon narušovat běžný chod programu, můžete vložit vlastní předvolby, jež uživatelům umožní další ladění dekorátoru po jeho aktivaci.  Tuto techniku používá klient CVS.

Stránka předvoleb dekorátorů CVS

 

Cyklus aktualizace dekorátoru

Zdobení se inicializuje obnovením poskytovatelů štítků, které k zajištění zdobení používají správce dekorátorů. Protože zpracování zdobení probíhá na pozadí, vzniká časový interval mezi požadavkem štítku a spuštěním události labelProviderChanged, ke kterému dochází v rámci výpočtu zdobení. Během této doby se z důvodu účinnosti vypočítávají pouze zdobení objektu. Pokud se dekorátor během této doby změní, může dojít k odeslání zastaralého výsledku při druhém nebo následném volání zdobení prvku, které bude ignorováno.

Přispěvatelé dekorátorů by se měli vyhnout změně svých dekorátorů během výpočtu zdobení. Pokud toto zajistit nelze, je požadováno druhé volání zdobení prvku po zpracování labelProviderChanged.