Továrny prvků

Továrny prvků se používají k obnovení modelu pracovní plochy z dat, která byla uložena během vypínání pracovní plochy.

Dříve než se budeme blíže věnovat rozšíření továrny prvků, potřebujeme probrat obecnou metodu používanou v platformě k přidávání chování specifického pro modul plug-in do objektů obecného modelu platformy.

IAdaptables a adaptéry pracovní plochy

Při prohlížení různých tříd pracovní plochy si můžete povšimnout, že mnohá rozhraní pracovní plochy rozšiřují rozhraní IAdaptable.

Moduly plug-in používají adaptéry k přidávání specifického chování do stávajících typů v systému. Pracovní plocha například může požadovat, aby prostředky vracely název a obrázek pro účely zobrazení. Víme, že není vhodné přidávat specifické chování uživatelského rozhraní do nízkoúrovňových objektů. Jak tedy toto chování přidat k typům prostředků?

Moduly plug-in mohou registrovat adaptéry, které přidávají chování do stávajících typů. Kód aplikace pak může po objektu požadovat určitý adaptér. Není-li k dispozici žádný adaptér registrovaný pro tento objekt, aplikace může získat adaptér a použít nové chování definované v adaptéru.

Díky možnosti dynamického dotazování adaptéru pro objekt můžeme zvýšit pružnost vyvíjeného systému. Nové adaptéry lze registrovat pro typy platformy u nových modulů plug-in, aniž by bylo zapotřebí měnit definice původních typů. Následuje ukázka způsobu dotazu na určitý adaptér objektu:

   //máme objekt o, na který chceme uplatnit funkce "pracovní plochy".
   if (!(o instanceof IAdaptable)) {
      return null;
   }
   IWorkbenchAdapter adapter = (IWorkbenchAdapter)o.getAdapter(IWorkbenchAdapter.class);
   if (adapter == null)
      return null;
   // nyní lze s objektem o zacházet jako s IWorkbenchAdapter
   ...

Není-li k dispozici adaptér registrovaný pro objekt, bude jako adaptér vrácen nulový objekt. Klient musí být připraven k ošetření tohoto případu. Může dojít k situacím, kdy očekávaný adaptér není registrován.

Pracovní plocha používá adaptéry k získávání informací o uživatelském rozhraní ze základních typů platformy, např. IResource. Adaptéry oddělují základní typy od informací specifických pro uživatelské rozhraní a umožňují vývoj rozhraní pracovní plochy bez nutnosti změn základních definic.

Bez použití adaptérů by každá třída používaná prostřednictvím rozhraní API pracovní plochy musela implementovat rozhraní uživatelského rozhraní. Došlo by tak ke zvýšení počtu definic tříd, ke vzniku pevných vazeb a k vytvoření kruhových závislostí mezi jádrem a třídami uživatelského rozhraní. S použitím adaptérů každá třída implementuje IAdaptable a používá registr adaptérů a umožňuje tak modulům plug-in rozšiřovat chování základních typů.

V kódu pracovní plochy se objevují případy, kde je po základním typů platformy požadován adaptér. Tento dotaz se používá k získání objektu, který je schopen vrátit informace o typu orientované na uživatelské rozhraní.

Továrny prvků

Po vypnutí uživatelem pracovní plocha musí uložit aktuální stav objektů IAdaptable zobrazovaných pracovní plochou. Stav objektu se ukládá uložením primitivních datových parametrů objektu ve speciálním formátu IMemento. Ukládá se rovněž továrna, která je schopna obnovit objekt z IMemento. Tyto informace se ukládají do systému souborů.

Po opětovném spuštění platformy pracovní plocha vyhledá továrnu prvků přiřazenou k ID továrny objektu IMemento. Továrnu nalezne prohledáním registru modulu plug-in a vypátráním prvků vložených do rozšíření org.eclipse.ui.elementFactories.

Markup je velmi jednoduchý. Pouze musíme definovat ID továrny a příslušnou třídu, jež továrnu implementuje.

Následuje ukázka kódu ze souboru plugin.xml pracovní plochy.

   <extension
         point="org.eclipse.ui.elementFactories">
      <factory
            class="org.eclipse.ui.internal.model.ResourceFactory"
            id="org.eclipse.ui.internal.model.ResourceFactory">
      </factory>
      <factory
            class="org.eclipse.ui.internal.model.WorkspaceFactory"
            id="org.eclipse.ui.internal.model.WorkspaceFactory">
      </factory>
      <factory
            class="org.eclipse.ui.part.FileEditorInputFactory"
            id="org.eclipse.ui.part.FileEditorInputFactory">
      </factory>
      <factory
            class="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory"
            id="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory">
      </factory>
      <factory
            class="org.eclipse.ui.internal.WorkingSetFactory"
            id="org.eclipse.ui.internal.WorkingSetFactory">
      </factory>
</extension>