Een view is een workbenchonderdeel waarmee u kunt bladeren door hiërarchische informatie of weergave-eigenschappen van een object. Van elke view kan in een workbenchpagina slechts één instance geopend zijn. Als u iets selecteert of een item wijzigt in een view, worden deze acties meteen doorgevoerd in de workbench. Views zijn vaak beschikbaar ter ondersteuning van bijbehorende editors. Een overzichtsview bevat bijvoorbeeld een gestructureerde view van de gegevens in een editor. En in een eigenschapenview worden de eigenschappen van een bewerkt object afgebeeld.
Door middel van het extensiepunt org.eclipse.ui.views kunt u met plugins views toevoegen aan de workbench. Views moeten door de plugins worden geregistreerd in het bestand plugin.xml van de plugin met configuratiegegevens over de view, zoals de implementatieklasse, de categorie (groep) waartoe de view behoort en de naam en het pictogram waaraan de view herkenbaar is in menu's en labels.
De interface voor views is gedefinieerd in IViewPart, maar de klasse ViewPart kan door plugins worden uitgebreid, zodat geen volledig nieuwe IViewPart hoeft te worden gemaakt.
Het "Hallo, wereld"-voorbeeld is een minimale viewextensie. Nu komt een view aan bod die op de navigatie door de gebruiker en selectiewijzigingen in de workbench kan reageren. Eerst ziet u hoe de extensie wordt gedeclareerd in het bestand 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>
U hebt hier al eerder kennis mee gemaakt. Een nieuwe view, ReadmeSectionsView, wordt aan de workbench toegevoegd. Het ID (id), de naam (name) en de categorie (category) zijn opgegeven op een manier die al eerder is uitgelegd. Ook wordt een pictogram (icon) aan de view toegewezen door middel van een relatief pad ten opzichte van de installatiedirectory van de plugin.
Nu volgt de view ReadmeSectionsView. U kunt views afbeelden in de workbench door naar
Venster > View afbeelden > Overige... te gaan en een view te kiezen uit de lijst View afbeelden.
Als u de view ReadmeSectionsView afbeeldt, ziet u een view met een lege lijst. Zodra u op een bestand met de extensie .readme klikt, wordt de lijst gevuld met de secties uit het README-bestand.
Hoe herkent de plugin het README-bestand en hoe kan deze op selectiewijzigingen reageren? Als u het antwoord hierop begrijpt, komt het bouwen van geïntegreerde workbenchplugins dichterbij.
Eerst wordt de al bekende methode createPartControl uitgelegd. U hebt in het voorbeeld "Hallo, wereld" al gezien dat met behulp van deze methode de widgets worden gemaakt die de view vertegenwoordigen. Om aan de slag te kunnen gaan, slaan we een deel van de code over.
public void createPartControl(Composite parent) { viewer = new ListViewer(parent); ... // view zelf toevoegen als globale selectie-listener getSite().getPage().addSelectionListener(this); // selectie vaststellen selectionChanged(null, getSite().getPage().getSelection()); }
De view maakt een ListViewer en registreert zichzelf als selectie-listener voor de pagina waarin de view zich bevindt. De pagina wordt opgehaald uit IViewSite, waarin zich meer gegevens bevinden over de context van de view, zoals het workbenchvenster, de workbenchpagina en de plugin. Zodra een selectiewijziging optreedt, wordt de volgende code uitgevoerd:
public void selectionChanged(IWorkbenchPart part, ISelection sel) { // Secties ophalen als de selectie een README-bestand is. AdaptableList input = ReadmeModelFactory.getInstance().getSections(sel); viewer.setInput(input); }
De klasse ReadmeModelFactory zorgt ervoor dat de selectie in README-secties wordt gesplitst; de secties worden als invoer gebruikt voor de viewer die met de methode createPartControl is gemaakt.
Hoe kan de lijst van de view worden gevuld? Gaat u er voorlopig maar van uit dat de viewer zelf weet hoe de lijst moet worden gevuld zodra het invoerelement is doorgegeven. De view is per slot van rekening van het type ListViewer. Wilt u toch de exacte werking van de viewer weten, leest u dan het onderwerp Viewers door.
U weet nog niet hoe de README-bestanden en de sectieposities worden herkend. Hieronder wordt ReadmeModelFactory uitgelegd:
public AdaptableList getSections(ISelection sel) { // Beëindigen als de selectie geen gestructureerde selectie is. if (!(sel instanceof IStructuredSelection)) return null; IStructuredSelection structured = (IStructuredSelection)sel; // Secties ophalen als de selectie een README-bestand is. 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); } } // Het geselecteerde object is geen README-bestand. return null; }
Er wordt gecontroleerd of de selectie gestructureerd (meervoudig) is. (Het concept van een gestructureerde selectie komt uit JFace viewers.) Van het eerste object in de selectie wordt nagegaan of het een bestandsresource (IFile) is. Als dit het geval is, dan wordt gecontroleerd of de extensie ".readme" is. Zodra het README-bestand is gevalideerd, kunnen de secties worden ontleed. U kunt een blik werpen op ReadmeModelFactory, MarkElement en DefaultSectionsParser voor meer informatie over de bestandsontleding.
Een aantal algemene workbenchconcepten zijn bij deze extensie besproken. In verdere onderwerpen vindt u meer informatie over andere workbenchextensies en het verder uitbreiden van de gebruikersinterface van de workbench met plugins.