org.eclipse.ui.views

En oversigt er en del af arbejdsbænken, som kan navigere et hierarki af oplysninger eller vise egenskaber for et objekt.  Kun én forekomst af en hvilket som helst oversigt er åben på en arbejdsbænksside.  Når brugeren foretager valg eller andre ændringer i en oversigt, afspejles disse ændringer straks på arbejdsbænken. Oversigter stilles ofte til rådighed for at understøtte en tilsvarende editor.   En strukturoversigt viser f.eks. en struktureret oversigt over oplysningerne i en editor. En egenskabsoversigt viser egenskaberne for et objekt, der er ved at blive redigeret.

Udvidelsespunktet org.eclipse.ui.views giver plugins mulighed for at tilføje oversigter til arbejdsbænken. Plugins, der bidrager med en oversigt, skal registrere oversigten i deres plugin.xml-fil og angive konfigurationsoplysninger om oversigten, som f.eks. implementeringsklassen, den kategori (eller gruppe) af oversigter, som den tilhører, og det navn og den ikon, der skal bruges til at beskrive oversigten i menuer og etiketter.

Grænsefladen til editorer er defineret i IViewPart, men plugins kan vælge at udvide klassen ViewPart i stedet for at implementere en IViewPart fra ny.

Der blev implementeret en minimal oversigtsudvidelse i Hello World-eksemplet. Vi skal nu se på en, som har kendskab til andre oversigter på arbejdsbænken og som svarer på brugernavigationer og valgændringer på arbejdsbænken. Se først på erklæringen af udvidelsen i 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>   

Den bør være bekendt. Det ses, at der bidrages med en ny oversigt til arbejdsbænken, som kaldes ReadmeSectionsView. view id, name og category er angivet, som det er set før. Der stilles også en ikon til rådighed for oversigten med en sti, som er relativ i forhold til plugin'ens installationsbibliotek.

Lad os se på ReadmeSectionsView. Du kan få alle oversigter på arbejdsbænken vist ved at vælge Vindue > Vis oversigt > Andet... og vælge oversigten på listen Vis oversigt.

Når ReadmeSectionsView fremvises, vises der en oversigt med en liste i. Listen er tom, medmindre du klikker på en fil med filtypen .readme, hvorefter listen udfyldes med afsnit fra Readme-filen.

Hvordan genkender plugin'en Readme-filen, og hvordan kendte den til valgændringer? Hvis vi kan få svar på disse spørgsmål, er vi godt på vej til at forstå, hvordan man bygger integrerede arbejdsbænk-plugins.

Vi starter med den kendte createPartControl-metode. Som det blev vist i Hello World-eksempel, er det her, hvor de widgets, der repræsenterer en oversigt, bliver oprettet. Noget af koden ignoreres for at komme i gang.

public void createPartControl(Composite parent) {
      viewer = new ListViewer(parent);
      ...
      // add myself as a global selection listener
      getSite().getPage().addSelectionListener(this);

      // prime the selection
      selectionChanged(null, getSite().getPage().getSelection());
   }

Oversigten opretter og gemmer en ListViewer og registrerer sig selv som valglytter på dens side. Den henter siden fra en IViewSite, som indeholder oplysninger om oversigtens kontekst, som f.eks. dens arbejdsbænksvindue, dens indeholdende side og dens plugin. Hvad sker der, hvis der kommer besked om en valgændring?  Følgende kode udføres:

   public void selectionChanged(IWorkbenchPart part, ISelection sel) {
      //if the selection is a readme file, get its sections.
      AdaptableList input = ReadmeModelFactory.getInstance().getSections(sel);
      viewer.setInput(input);
   }

Det ser ud til, at klassen ReadmeModelFactory har ansvaret for at omdanne valget til Readme-afsnit, og at disse afsnit er input for den fremviser, der blev oprettet i createPartControl-metoden.

Men hvordan udfyldte fremviseren sine liste-widgets? Antag for øjeblikket, at da først fremviseren fik sit inputelement at vide, vidste den, hvordan dens liste-widget skulle opfyldes med oplysningerne - det er jo en ListViewer. Se Fremvisere, hvis du har brug for at vide, hvad denne fremviser handler om. 

Vi ved stadig ikke, hvordan Readme-filer findes, eller hvor filens afsnitsoplysninger kommer fra. Et blik på ReadmeModelFactory kaster lidt lys.

   public AdaptableList getSections(ISelection sel) {
      // If sel is not a structured selection just return.
      if (!(sel instanceof IStructuredSelection))
         return null;
      IStructuredSelection structured = (IStructuredSelection)sel;

      //if the selection is a readme file, get its sections.
      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);
         }
      }

      //the selected object is not a readme file
         return null;
   }

Vi kontrollerer valget for at se, om det er struktureret (flere) valg. Begrebet struktureret valg stammer fra JFace-fremvisere. Hvad angår det første objekt i valget, bliver det undersøgt, om det er en filressource (IFile). Hvis det er tilfældet, undersøges filtypen for at se, om den matcher udvidelsen ".readme". Når det vides, at det er en Readme-fil, kan der bruges andre metoder til at analysere afsnittet.Du kan se i resten af ReadmeModelFactoryMarkElement og DefaultSectionsParser for at få oplysninger om filanalysen.  

Vi har dækket mange af de generelle arbejdsbænksbegreber ved at studere denne udvidelse. Vi fortsætter nu til nogle andre arbejdsbænksudvidelser for at undersøge, hvordan din plugin kan bidrage yderligere til arbejdsbænkens brugergrænseflade.