org.eclipse.ui.views

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 ReadmeModelFactoryMarkElement 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.