Prostředky uživatelského rozhraní

Sada programů org.eclipse.jface.resource definuje třídy, které pomáhají modulům plug-in spravovat prostředky uživatelského rozhraní, jako např. písma a ikony.

Mnoho bodů rozšíření pracovní plochy umožňuje, aby moduly plug-in dodávaly ikony, které je možné použít k zobrazení jejich příspěvků na pracovní ploše. Jelikož operační systémy s grafickým uživatelským rozhraní podporují omezený počet obrázků nebo fontů v paměti v jednom okamžiku, prostředky uživatelského rozhraní modulu plug-in je třeba pečlivě spravovat a někdy sdílet mezi prvky widget.

Již jsme se setkali s několika odkazy na ikony v modulu plug-in nástroje README. Některé z jeho ikon jsou uvedeny v markupu plugin.xml.

<extension
   point="org.eclipse.ui.views">
	<category 
	   id="org.eclipse.ui.examples.readmetool"
	   name="%Views.category">
	</category>
	<view
 	   id="org.eclipse.ui.examples.readmetool.views.SectionsView"
	   name="%Views.ReadmeSections"
	   icon="icons/view16/sections.png"
	   category="org.eclipse.ui.examples.readmetool"
	   class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView">
	</view>
    </extension>

Viděli jsme také kód, který popisuje obrázky za běhu. Následující výpis je z nástroje README ReadmeEditorActionBarContributor.

   public ReadmeEditorActionBarContributor() {
      	...
	action1 = new EditorAction(MessageUtil.getString("Editor_Action1"));
	action1.setToolTipText(MessageUtil.getString("Readme_Editor_Action1"));
	action1.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_DISABLE);
	action1.setImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_ENABLE);
	...

JFace poskytuje základní podporu třídám, které umožňují, aby moduly plug-in spravovaly ikony a písma bez potřeby starat se o to, kdy budou odpovídající grafické objekty platformy vytvořeny a zrušeny. Tyto podporované třídy jsou používány moduly plug-in přímo, jak je ukázáno výše, nebo nepřímo, když modul workbench (pracovní plocha) použije tyto třídy k získání obrázků, které jsou popsány v markupu bodu rozšíření.

Deskriptory obrázků a registr

Třída SWT Image reprezentuje obrázek z pohledu operačního systému. Protože většina operačních systémů s grafickým uživatelským rozhraním je omezena v počtu obrázků otevřených najednou, měly by moduly plug-in postupovat při jejich vytváření velmi opatrné a také by měly zkontrolovat, zda se řádně po skončení používání odstraňují. Při použití tříd JFace ImageDescriptor a ImageRegistry místo obrázků SWT se mohou moduly plug-in obecně vyhnout přímému vytváření, správě a odstraňování takových obrázků.

Deskriptor obrázku

Třída ImageDescriptor může být použita jako odlehčená verze popisu obrázku. Specifikuje všechno potřebné k vytvoření obrázku, jako je adresa URL nebo název souboru, kde je možné obrázek získat. Třídy ImageDescriptors nepřidělují skutečný obrázek platformy, pokud to není konkrétně požadováno použitím metody createImage().

Deskriptory obrázků jsou tou nejlepší strategií, když je váš kód strukturován tak, že definuje všechny ikony na jednom místě a přiděluje je podle potřeby. Deskriptory obrázků mohou být vytvořeny kdykoliv bez ohledu na prostředky OS, což přináší výhodu možnosti vytvořit je všechny v inicializačním kódu.

Registr obrázků

Třída ImageRegistry se používá k uchování seznamu pojmenovaných obrázků. Klienti mohou přidávat deskriptory obrázků nebo obrázky z SWT do seznamu přímo. Když je obrázek z registru jmenovitě vyžadován, vrátí registr tento obrázek, pokud byl vytvořen, nebo jej vytvoří z deskriptoru. Toto umožňuje klientům registru obrázky sdílet.

Obrázky, které byly přidány do registru nebo z něj získány, nesmějí být žádným klientem odstraněny. Za odstranění obrázku je zodpovědný registr, jelikož obrázky jsou sdíleny více klienty. Registry zlikviduje obrázky v okamžiku, kdy se systém GUI platformy vypíná.

Vzory modulů plug-in pro používání obrázků

Určení obrázku v souboru plugin.xml

Kde je to možné, specifikujte ikonu pro objekty uživatelského rozhraní vašeho modulu plug-in v souboru plugin.xml. Mnohé body rozšíření modulu workbench zahrnují konfigurační parametry pro soubor ikon. Tím, že definujete své ikony v příspěvku rozšíření v souboru plugin.xml, přenecháte strategii správy obrázků platformě. Jelikož jsou ikony zpravidla uchovávány ve vašem adresáři modulů plug-in, umožní vám to specifikovat ikony a spravovat soubory na jednom místě.

Další vzory je třeba vzít v úvahu pouze tehdy, kdy nemůžete specifikovat ikony jako část vašeho příspěvku rozšíření.

Explicitní vytváření

Explicitní vytváření obrázku je nejlepší strategií tehdy, když je obrázek používán zřídka a není sdílen. Obrázek může být vytvořen přímo v SWT a odstraněn po použití.

Obrázky mohou být také vytvářeny explicitně pomocí deskriptoru ImageDescriptor a vyvoláním metody createImage(). Stejně jako v prvním případě musí být na obrázek vyvolána metoda dispose(), jakmile již není obrázek potřeba.  Například pokud dialogové okno vytvoří při svém otevření obrázek, mělo by ho při svém zavření odstranit.

Registr obrázků

Je-li obrázek v modulu plug-in používán často a sdílen v mnoha různých objektech v uživatelském rozhraní, je užitečné registrovat deskriptor obrázku pomocí ImageRegistry. Obrázky v registru budou sdíleny všemi objekty, které požadují obrázek stejného názvu. Žádné obrázky v registru nesmíte odstranit, jelikož jsou sdíleny dalšími objekty.

Přidání obrázku do registru je nejlepší strategií tehdy, když je obrázek často používán, dejme tomu po dobu životnosti modulu plug-in, a je sdílen mnoha objekty. Nevýhodou použití registru je to, že obrázky v něm nejsou odstraněny, dokud se systém GUI nevypne. Jelikož existuje omezení počtu obrázků platformy (SWT), které mohou být najednou otevřeny, moduly plug-in by neměly v registru otevírat příliš mnoho ikon.

Třída AbstractUIPlugin obsahuje protokol pro vytvoření registru obrázků pro celý modul plug-in.

Poskytovatelé štítků

Když se ikona používá k zobrazení položek v určitém prohlížeči často, může být sdílena podobnými položkami v prohlížeči pomocí poskytovatele štítku. Jelikož je poskytovatel štítku zodpovědný za vrácení obrázku libovolnému objektu v prohlížeči, může kontrolovat vytvoření obrázku a všechna sdílení obrázků objekty v prohlížeči.

Poskytovatel štítku může k vytvoření obrázku použít kteroukoliv z dříve diskutovaných technik. Jestliže procházíte různé implementace metody getImage() v podtřídách LabelProvider, narazíte na nejrůznější přístupy včetně ukládání jednotlivých ikon do paměti cache pro objekty a udržování tabulky obrázků podle typu.  Obrázky vytvořené pomocí poskytovatele štítku musí být odstraněny v metodě poskytovatele dispose(), která je volána, když je odstraňován prohlížeč.

Používání poskytovatele štítku je dobrým kompromisem mezi explicitním vytvářením a registrem obrázků. Podporuje sdílení ikon jako registr obrázků, ale zachovává kontrolu nad vytvářením a odstraňováním aktuálního obrázku.

Třída obrázku v rámci celého modulu plug-in

Při dolaďování modulu plug-in je běžné experimentovat se všemi těmito vzory vytváření obrázků. Může být užitečné izolovat rozhodování týkající se vytváření obrázků do oddělené třídy a instruovat všechny klienty ohledně získávání všech obrázků pomocí této třídy. Tímto způsobem je možné doladit posloupnost vytváření tak, aby odrážela skutečnou charakteristiku provozu modulu plug-in. 

ResourceManager

Třída ResourceManager se používá k uchování mapování deskriptorů obrázků k obrázkům tak, aby bylo možné obrázek používat opakovaně odkazem na jeho deskriptor. Je-li obrázek vyžádán z registru prostřednictvím deskriptoru, vrací registr obrázek, pokud byl vytvořen, nebo z deskriptoru obrázek vytvoří. Toto umožňuje klientům registru obrázky sdílet.

Správce prostředků (ResourceManager) nejvyšší úrovně je DeviceResourceManager, který je vytvořen na displeji. ResourceManager definovaný prostřednictvím JFaceResources.getResources() je objektem DeviceResourceManager a lze jej použít jako správce prostředků nejvyšší úrovně. Potřebujete-li správce prostředků s kratší životností, než má DeviceResourceManager, můžete vytvořit LocalResourceManager jako podřízený prvek a zlikvidovat jej po dokončení požadované operace.

DeviceResourceManager bude zlikvidován při likvidaci zobrazení, které jej vytvořilo, takže tento úkon není zapotřebí programovat.

Obrázky, které byly přidány do správce nebo z něj získány, nesmějí být žádným klientem zlikvidovány. Za zlikvidování obrázku je zodpovědný správce, jelikož obrázky jsou sdíleny více klienty. Registr zlikviduje obrázky v okamžiku likvidace správce prostředků (ResourceManager), který je uchovává.

Registr písem

Písma představují další limitované prostředky v operačních systémech platformy. Problematika vytváření a odstraňování je pro písma stejná jako pro obrázky a vyžaduje podobné kompromisy ohledně rychlosti a místa. Obecně jsou písma přidělována v SWT pomocí požadavku na písmo prostřednictvím názvu písma závislého na platformě.

Třída FontRegistry uchovává tabulku písem podle jejich názvů. Spravuje přidělování a odstraňování písma.

Obecně by se modul plug-in měl vyhnout přidělování písem nebo popisování písem s názvy specifickými pro platformu. Ačkoliv je registr písem používán interně v JFace, není zpravidla používán v modulech plug-in. Třída JFaceResources by se měla používat pro přístup ke společným písmům.

Je zcela běžné povolit uživatelům specifikovat jejich preference pro písma aplikací na stránce předvoleb.  V takových případech by se FontFieldEditor měl využít k získání názvu písma od uživatele a FontRegistry se může použít k uchování písma.  FontFieldEditor ise používá pouze na stránkách předvoleb.

Prostředky JFace

Třída JFaceResources ovládá přístup ke společným písmům a obrázkům platformy. Udržuje interní registr písem a obrázků, takže klienti mohou sdílet pojmenovaná písma a obrázky.

V modulu workbench (pracovní plochy) a v jiných modulech plug-in se používá množství technik ke sdílení požadovaných obrázků. Registr obrázků JFaceResources není v kódu modulů workbench a plug-in příliš používán.

Použití písem je mnohem jednodušší. Modul workbench a většina modulů plug-in používá k žádosti o písma pomocí logického názvu třídu JFaceResources. Jsou poskytovány metody jako getDialogFont() a getDefaultFont() , takže moduly plug-in mohou používat ve svých uživatelských rozhraních očekávaná písma.