En vy är en del av arbetsmiljön som kan navigera i en hierarki av information eller visa egenskaper för ett objekt. Endast en förekomst av en given vy är öppen i en arbetsmiljösida. När användaren gör val eller andra ändringar i en vy återspeglas de direkt i arbetsmiljön. Vyer tillhandahålls ofta som stöd till en motsvarande redigerare. Ett exempel: en dispositionsvy visar en strukturerad vy av informationen i en redigerare. En egenskapsvy visar egenskaperna för ett objekt som redigeras.
Utökningspunkten org.eclipse.ui.views gör det möjligt för insticksprogram att lägga till vyer i arbetsmiljön. Insticksprogram som bidrar med en vy måste registrera vyn i sin plugin.xml-fil och tillhandahålla konfigurationsinformation om vyn, t.ex. dess implementationsklass, kategorin (eller gruppen) av vyer som den tillhör och namnet och ikonen som ska användas till att beskriva vyn på menyer och etiketter.
Gränssnittet för vyer definieras i IViewPart, men insticksprogram kan välja att utöka klassen ViewPart istället för att implementera en IViewPart från början.
Vi implementerade en minimal vyutökning i exemplet 'hello world'. Nu ska vi ta en titt på en som är medveten om andra arbetsmiljövyer och svarar på användarens navigation och markeringar i arbetsmiljön. Först tar vi en titt på deklareringen av utökningen 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>
Detta ska se ganska bekant ut. Vi ser att en ny vy, ReadmeSectionsView, bidragits till arbetsmiljön. Vyns id view id, namn namn och kategori category anges som vi sett tidigare. Dessutom tillhandahålls ikonen icon för vyn, med en sökväg i förhållande till insticksprogrammets installationskatalog.
Låt oss ta en titt på ReadmeSectionsView. Du kan visa valfri vy i arbetsmiljön genom att välja
Fönster > Visa vy > Annan...
och välja en vy i listan Visa vy.
När vi visar ReadmeSectionsView, visas en vy med en lista i sig. Listan är tom såvida vi inte klickar på en fil med filtillägget .readme. I så fall fylls listan med avsnitt från readme-filen.
Hur känner insticksprogrammet igen readme-filen och hur visste den om urvalsändringarna? Om vi kan svara på dessa frågor är vi en god bit på väg att förstå hur man bygger integrerade insticksprogram till arbetsmiljön.
Vi börjar med den bekanta metoden createPartControl. Som vi såg i exemplet 'Hello World' är det här kontrollerna som betecknar en vy skapas. Vi kommer att ignorera en del av koden så att vi kommer igång.
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()); }
Vyn skapar och sparar en ListViewer och registrerar sig själv som en urvalslyssnare på dess sida. Den erhåller sidan från en IViewSite, som innehåller information om vyns kontext, t.ex. dess arbetsmiljöfönster, dess innehållande sida och dess insticksprogram. När vi meddelas om en urvalsändring, vad händer då? Följande kod körs:
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 ut som om klassen ReadmeModelFactory ansvarar för att ändra urvalet till readme-avsnitt och sedan skicka dessa avsnitt som indata till visningsprogrammet som vi skapade i metoden createPartControl.
Men hur befolkade visningsprogrammet dess listkontroller? Låt oss för tillfället anta att visningsprogrammet, så snart det fick reda på sitt indatalemenet, visste hur det skulle befolka sina listkontroller med informationen - det är trots allt en ListViewer. Om du just nu vill få reda på vad detta visningsprogram handlar om kan du läsa i Visningsprogram.
Vi vet fortfarande inte hur readme-filer upptäcks eller var filens avsnittsinformation kommer ifrån. En snabb titt på ReadmeModelFactory sprider lite ljus i saken.
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 kontrollerar urvalet för att se om det är ett strukturerat (multipelt) urval. (Begreppet strukturerat urval kommer från JFace-visningsprogram.) För det första objektet i urvalet kontrollerar vi om det är en fil-resurs(IFile). Om det är det kontrollerar vi dess filtillägg för att se om det matchar filtillägget ".readme". När vi vet att vi har en readme-fil kan vi använda andra metoder till att tolka avsnitten. Du kan bläddra i resten av ReadmeModelFactory, MarkElement och DefaultSectionsParser om du vill få mer information om filtolkningen.
Vi har täckt en hel del av vanliga arbetsmiljöbegrepp genom att studera denna utökning. Nu går vi vidare till en del andra arbetsmiljöutökningar och undersöker hur insticksprogrammet kan bidra ytterligare till arbetsmiljöns användargränssnitt.