Pohled je část pracovní plochy, která může procházet hierarchií informací a zobrazovat vlastnosti objektu. Na stránce pracovní plochy se otevírá pouze jediná instance konkrétního pohledu. Provede-li uživatel volbu nebo jiné změny v pohledu, tyto změny se neprodleně uplatní v pracovní ploše. Pohledy často poskytují podporu příslušnému editoru. Například pohled Osnova poskytuje strukturované zobrazení informací v editoru. Pohled Vlastnosti zobrazuje vlastnosti právě editovaného objektu.
Bod rozšíření org.eclipse.ui.views umožňuje modulům plug-in přidávat pohledy do pracovní plochy. Moduly plug-in vkládající pohled musejí tento pohled registrovat ve svém souboru plugin.xml a poskytnout konfigurační informace pohledu, tj. implementační třídu, kategorii (či skupinu) pohledů, do které pohled patří, a dále název a ikonu, která má být použita k popisu pohledu v nabídkách a štítcích.
Rozhraní pohledů je definováno v IViewPart, avšak moduly plug-in mohou rozšiřovat třídu ViewPart a ušetřit tak práci s úplnou implementací IViewPart.
Ve vzorovém programu Ahoj světe jsme implementovali minimální rozšíření pohledu. Nyní se věnujme rozšíření, které má k dispozici informace o ostatních pohledech pracovní plochy a reaguje na změny uživatele v navigaci a volbách na pracovní ploše. Nejprve si prohlédneme deklaraci rozšíření v souboru 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>
Tato deklarace má důvěrně známou podobu. Jak je patrné, vkládá do pracovní plochy nové zobrazení ReadmeSectionsView. ID pohledu, název a kategorie jsou zadány dle popisu uvedeného výše. Pomocí cesty relativní k adresáři instalace modulu plug-in je stanovena rovněž ikona pohledu.
Podívejme se na ReadmeSectionsView. Jakýkoli pohled pracovní plochy můžete zobrazit volbou Okno->Zobrazit pohled->Další... a výběrem pohledu ze seznamu Zobrazit pohled.
Po zobrazení ReadmeSectionsView se rozevře pohled obsahující seznam. Dokud neklepneme na soubor s příponou .readme, je seznam prázdný; to pak způsobí naplnění seznamu oddíly ze souboru README.
Jakým způsobem modul plug-in rozpoznává soubor README a jakým způsobem se dozvídá o změnách výběru? Budeme-li sledovat odpovědi na tyto otázky, jsme na dobré cestě k porozumění způsobu sestavování modulů plug-in zabudovaných do pracovní plochy.
Začněme s důvěrně známou metodou createPartControl. Jak jsme viděli v příkladu Ahoj světe, jde o místo vytvoření prvků widget, které představují pohled. Nebudeme si všímat předchozí části kódu.
public void createPartControl(Composite parent) { viewer = new ListViewer(parent); ... // vložit toto jako globální listener volby getSite().getPage().addSelectionListener(this); // naplnění volby selectionChanged(null, getSite().getPage().getSelection()); }
Vytváří pohled, ukládá ListViewer a registruje ho jako listener volby na své stránce. Získává z IViewSite stránku, která obsahuje informaci o kontextu pohledu, tj. o svém okně pracovní plochy, o své stránce a svém modulu plug-in. Co se stane, když jsme upozorněni na změnu výběru? Provede se následující kód:
public void selectionChanged(IWorkbenchPart part, ISelection sel) { //je-li volbou soubor README, získat jeho sekce. AdaptableList input = ReadmeModelFactory.getInstance().getSections(sel); viewer.setInput(input); }
Je patrné, že třída ReadmeModelFactory odpovídá za přepnutí volby na oddíly README, které jsou vstupem prohlížeče, který jsme vytvořili v metodě createPartControl.
Jakým způsobem však prohlížeč zaplňuje své seznamové prvky widget? Pro tento moment předpokládejme, že po převzetí informace o svém vstupním prvku již prohlížeč ví, jak naplnit své seznamové prvky widget informacemi - koneckonců jde o prohlížeč seznamů. Potřebujete-li podrobné informace o tomto prohlížeči, přejděte na Prohlížeče.
Dosud nevíme, jakým způsobem jsou rozpoznávány soubory README ani odkud pochází informace o oddílech souboru. Mnohé se vyjasní při prohlédnutí ReadmeModelFactory.
public AdaptableList getSections(ISelection sel) { // Návrat, pokud není "sel" strukturovaná volba. if (!(sel instanceof IStructuredSelection)) return null; IStructuredSelection structured = (IStructuredSelection)sel; //je-li volbou soubor README, získat jeho sekce. Object object = structured.getFirstElement(); if (object instanceof IFile) { IFile file = (IFile) object; String extension = file.getFileExtension(); if (extension != null && extension.equals(IReadmeConstants.EXTENSION)) { return getSections(file); } } //zvolený objekt není souborem README return null; }
Zkontrolujme volbu a zjistěme, zda jde o strukturovanou (vícenásobnou) volbu. (Koncept strukturované volby pochází z prohlížečů JFace.) Pro první objekt volby ověříme, zda jde o souborový prostředek (IFile). Pokud ano, zkontrolujeme příponu jeho názvu a ověříme, zda se shoduje s příponou ".readme". Po ověření, že jde o soubor README, můžeme použít jiné metody k analýze sekcí. Další informace o analýze souboru získáte prohlídkou zbytku ReadmeModelFactory, MarkElement a DefaultSectionsParser.
Studiem tohoto rozšíření jsme se seznámili s řadou obecných konceptů pracovní plochy. Nyní věnujme svou pozornost jiným rozšířením pracovní plochy a prozkoumejme další způsoby, kterými může váš modul plug-in přispívat do uživatelského rozhraní pracovní plochy.