Prohlížeče

Proč byste měli používat nějaký prohlížeč, když jsme již viděli, že příspěvky uživatelského rozhraní pracovní plochy, jako jsou pohledy, editory, průvodci a dialogová okna, mohou být implementovány přímo s prvky widget SWT?  

Prohlížeče vám umožní vytvářet prvky widget a současně stále používat vaše modelové objekty. Pokud použijete nějaký widget SWT přímo, musíte konvertovat své objekty do řetězců a obrázků očekávaných prostředím SWT.  Prohlížeče působí jako adaptéry pro prvky widget SWT, které zpracují běžný kód pro manipulaci s událostmi prvků widget, které byste jinak museli implementovat sami. 

Jako první jsme viděli prohlížeč v příspěvku nástroje README v ReadmeSectionsView.

      public void createPartControl(Composite parent) {
      viewer = new ListViewer(parent);
      ...
   }
Poznámka:  Prohlížeče je možné použít k poskytnutí implementace jak pro pohledy pracovní plochy, tak pro editory. Výraz prohlížeč neznamená, že prohlížeče jsou užitečné pouze k implementaci pohledů. Například TextViewer se používá při implementaci v mnoha editorech modulů workbench (pracovní plochy) a plug-in.

Standardní prohlížeče

Modul JFace poskytuje prohlížeče pro většinu netriviálních prvků widget v SWT. Prohlížeče jsou nejběžněji používány pro prvky widget seznamů, stromů, tabulek a textů. 

Každý prohlížeč má přidružený widget SWT. Tento widget může být vytvořen implicitně dodáním nadřazeného Kompozitního prvku ve vhodném konstruktoru nebo explicitně nejprve jeho vytvořením a pak dodáním do prohlížeče v jeho konstruktoru.

Prohlížeče orientované na seznamy

Seznamy, stromy a tabulky mají z pohledu uživatele mnoho společných schopností, jako např. naplnění objekty, výběry, třídění a filtrování. 

Tyto prohlížeče uchovávají seznam doménových objektů (nazývaných prvky) a zobrazují je v odpovídajících prvcích widget SWT. Widget seznam ví, jak získat textový štítek z libovolného prvku v seznamu.  Získá štítek z poskytovateleILabelProvider, který může být na tento prohlížeč nastaven.  Prohlížeče seznamů vědí, jak mapovat ze zpětného volání zpět do světa prvků známých pro klienta prohlížeče.

Klienti, kteří používají prostý widget SWT, musejí operovat na úrovni SWT - kde položkami jsou řetězce a události se často vztahují k indexu uvnitř seznamu řetězců. Prohlížeče poskytují vyšší úroveň sémantiky. Klienti jsou upozorňováni na výběry a změny v seznamu pomocí prvků, které poskytli prohlížeči. Prohlížeče ošetří všechnu hrubou práci pro mapování indexů zpět na prvky za současného přizpůsobení pro filtrovaný pohled na objekty a přetřídění, pokud je potřeba.

Schopnost filtrování a třídění je ošetřena tím, že se pro prohlížeč určí třídicí mechanizmus (ViewerSorter) a/nebo filtr (ViewerFilter). (Tyto prostředky mohou být specifikovány kromě prohlížeče seznamů také pro prohlížeče stromů a tabulek.) Klient musí pouze poskytnout třídu, která je schopna porovnávat nebo filtrovat objekty v seznamu. Prohlížeč ošetřuje podrobnosti naplňování seznamu v souladu s určeným pořadím a filtrováním a současně udržuje toto pořadí a filtrování v případech, kdy jsou prvky přidávány a odebírány.

Prohlížeče nejsou určeny k rozšiřování prostřednictvím klientů.  Chcete-li prohlížeč přizpůsobit, můžete jej konfigurovat svými vlastními poskytovateli obsahu a štítků.

ListViewer mapuje prvky v seznamu na obslužný prvek SWT List.

TreeViewer zobrazuje hierarchické objekty v prvku widget SWT Tree. Ošetřuje podrobnosti ohledně rozbalování a sbalování položek. Pro různé obslužné prvky stromů SWT (prostý strom, tabulkový strom, strom zaškrtávacích políček) existuje několik různých druhů prohlížečů stromu.

TableViewer je velmi podobný prohlížeči seznamů, ale přidává možnost zobrazit více sloupců informací pro každý prvek v tabulce.  Prohlížeče tabulek významně rozšiřují funkci tabulkového prvku widget SWT zavedením konceptu editování buňky. Speciální buňkové editory lze použít k umožnění uživateli editovat buňku tabulky pomocí pole se seznamem, dialogového okna nebo textového prvku widget. Prohlížeč tabulky ošetřuje vytváření a umisťování těchto prvků widget, pokud jsou potřeba k editování uživatelem.  To se provádí pomocí tříd CellEditor jako např. TextCellEditor a CheckboxCellEditor. Virtuální tabulku, která se naplňuje pouze při prohlížení. Prohlížeč tabulek spouští pouze stanovený počet výsledků nezávisle na skutečné podobě. Databáze generuje požadavky na JIT "pomalu" a zároveň realizuje pouze omezený počet dotazů.

Textový prohlížeč

Textové prvky widget mají množství společné sémantiky, jako je např. chování při poklepání, krok zpět, nastavení barev a navigování podle indexů nebo řádků.  TextViewer je adaptérem pro widget SWT StyledText. Textové prohlížeče poskytují model dokumentu klientovi a ošetřují konverzi dokumentu na informace textu se styly poskytované textovým prvkem widget.

Textové prohlížeče jsou podrobněji popsány v Editory modulu Workbench.

Architektura prohlížeče

Abyste porozuměli prohlížeči, musíte se seznámit se vztahy mezi vstupním prvkem prohlížeče, jeho obsahem, jeho výběrem a informací skutečně zobrazenou v prvku widget, kterým je manipulováno.

Vstupní prvky

Vstupní prvek je hlavním objektem, který prohlížeč zobrazuje (nebo edituje). Z hlediska prohlížeče může být vstupním prvkem libovolný objekt. Nepředpokládá se žádná implementace konkrétního rozhraní tímto vstupním prvkem. (Uvidíme proč v okamžiku, kdy se podíváme na poskytovatele obsahu.)

Prohlížeč musí být schopen ošetřit změnu vstupního prvku. Pokud je do prohlížeče poslán nový vstupní prvek, musí prohlížeč znovu naplnit svůj widget v souladu s novým prvkem a zrušit svoji asociaci s předchozím vstupním prvkem. Sémantika pro registraci jako listener na vstupní prvek a naplňování prvku widget na základě prvku jsou rozdílné pro každý druh prohlížeče.

Prohlížeče obsahu

Prohlížeč obsahu je prohlížeč, který má řádně definovaný protokol pro získávání informací ze svého vstupního prvku. Prohlížeče obsahu používají dvě specializované třídy pomocníka, IContentProvider a ILabelProvider, k naplnění svého prvku widget a zobrazení informací o vstupním prvku.

IContentProvider poskytuje základní protokol životního cyklu pro přidružení poskytovatele obsahu ke vstupnímu prvku a k ošetření změny vstupního prvku. Pro různé druhy prohlížečů je implementováno více specializovaných poskytovatelů obsahu. Nejběžnějším poskytovatelem obsahu je IStructuredContentProvider, který může poskytovat seznam objektů daného vstupního prvku. Používá se to u prohlížečů obsahu připomínajícího seznam (seznamy, tabulky nebo stromy). Obecně poskytovatel obsahu ví, jak mapovat mezi vstupním prvkem a očekávaným prohlížečem obsahu.

ILabelProvider jde o krok dále. S obsahem prohlížeče (odvozeným ze vstupního prvku a poskytovatele obsahu) může produkovat specifické prvky uživatelského rozhraní, jako jsou např. názvy a ikony, které jsou potřeba k zobrazení obsahu v prohlížeči. Poskytovatelé štítku mohou pomáhat při ukládání prostředků ikon, jelikož mohou zajistit, aby v prohlížeči byla použita stejná instance ikony pro všechny podobné typy.

Poznámka:  Instance určitého obsahu a poskytovatelé štítku nejsou určeni ke sdílení více prohlížeči. I když všechny vaše prohlížeče používají stejný typ obsahu nebo poskytovatele štítku, každý prohlížeč by měl být inicializován s vlastní instancí třídy poskytovatele. Protokol životního cyklu poskytovatele je navržen pro vztah 1:1 mezi poskytovatelem a jeho prohlížečem.

Vstupní prvky, poskytovatelé obsahu a poskytovatelé štítku umožňují, aby prohlížeče při naplňování prvků widget skrývaly většinu podrobností. Klienti prohlížeče se musí pouze postarat o naplnění prohlížeče správným druhem obsahu a o poskytovatele obsahu. Poskytovatel štítku musí vědět, jak odvodit informace uživatelského rozhraní z obsahu prohlížeče.

Poskytovatel štítku může zobrazit více než pouhý test a obrázek. JFace poskytuje řadu tříd a rozhraní, jež podporují nejpopulárnější přídavné funkce. Následující třídy jsou podporovány třídami TableViewer, AbstractTreeViewer a TableTreeViewer.

Barvy pohledu lze v Eclipse 3.1 ovlivňovat dvěma způsoby - prostřednictvím vlastního poskytovatele štítku nebo dekorátorem, který nastavuje barvy a písma. V obecném případě je lepší použít podporu barev a písma poskytovatele štítku, protože dekorátory ovlivňují všechny pohledy zobrazující určitý typ. Použijete-li dekorátor barvy nebo písma, ujistěte se, že lze jeho hodnoty nastavit na stránce předvoleb Barvy a písma.

Prohlížeče a modul workbench (pracovní plocha)

Flexibilita poskytovaná prohlížeči, poskytovateli obsahu a poskytovateli štítků může být demonstrována při pohledu na to, jak je modul workbench používá.

WorkbenchContentProvider je strukturovaný poskytovatel obsahu, který získává obsah ze vstupního prvku pomocí požadavku na jeho podřízené prvky. Kvůli implementaci generické funkce je použit opět koncept adaptérů. Při vyžadování seznamu prvků ze vstupního prvku obdrží WorkbenchContentProvider pro vstupní prvek IWorkbenchAdapter. Pokud byl IWorkbenchAdapter registrován pro vstupní prvek, může poskytovatel obsahu bezpečně předpokládat, že prvek může být dotazován ohledně podřízených prvků.  WorkbenchContentProvider také provede práci potřebnou k udržení svého prohlížeče v aktuálním stavu, když se změní pracovní prostor. 

Poskytovatel WorkbenchLabelProvider je poskytovatelem štítku, který obdrží od objektu IWorkbenchAdapter kvůli nalezení jeho textu a obrázku. Koncept poskytovatele štítku je zejména užitečný pro objekty pracovní plochy, protože umožňuje, aby jediný poskytovatel štítku mohl uchovávat v mezipaměti obrázky běžně používané v prohlížeči. Například jakmile WorkbenchLabelProvider obdrží nějaký obrázek k použití pro IProject, může obrázek uchovat v mezipaměti a použít jej pro všechny objekty IProject zobrazené v prohlížeči.

Definováním společného adaptéru IWorkbenchAdapter a jeho registrací pro množství typů platforem umožníme, aby tyto typy byly správně reprezentovány v mnoha společných prohlížečích a pohledech modulu, které je obsahují.