En visning er en arbeidsbenkdel som kan navigere i et hierarki av informasjon eller vise egenskaper for et objekt. Bare en forekomst av en gitt visning er åpen på arbeidsbenksiden. Når brukeren foretar valg eller gjør andre endringer i en visning, gjenspeiles endringene umiddelbart i arbeidsbenken. Visningene oppgis ofte for å støtte et tilhørende redigeringsprogram. En disposisjonsvisning viser for eksempel en strukturert visning av informasjonen i et redigeringsprogram. En egenskapsvisning viser egenskapene for et objekt som er i ferd med å bli redigert.
Utvidelsespunktet org.eclipse.ui.views gjør det mulig for plugin-moduler å vise arbeidsbenken. Plugin-moduler som bidrar med en visning, må registrere visningen i filen plugin.xml og oppgi konfigurasjonsinformasjon om visningen, for eksempel implementeringsklassen, kategorien (eller gruppen) med visninger som den tilhører, og navnet og ikonet som skal brukes for å beskrive visningen på menyer og etiketter.
Grensesnittet for visninger er definert i IViewPart, men plugin-moduler kan velge å utvide ViewPart-klassen i stedet for å implementere en IViewPart fra grunnen av.
Vi implementerte en minimal utvidelse i eksempelet "Hello world". Vi skal nå se på en utvidelse som kjenner til andre arbeidsbenkvisninger, og svarer på brukerens navigering og endrede valg i arbeidsbenken. Vi skal først se på deklarasjonen av utvidelsen 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>
Dette bør se nokså kjent ut. Som du ser bidras det med en ny visning, ReadmeSectionsView, i arbeidsbenken. Visning-IDen (view id), navnet (name), og kategorien (category) angis på samme måte som vi har sett tidligere. Det oppgis dessuten et ikon (icon) for visningen via banen som er relativ til installasjonskatalogen for plugin-modulen.
La oss se på ReadmeSectionsView. Du kan få frem enhver visning på arbeidsbenken ved å velge
Vindu > Vis visning > Annet... og deretter velge visningen på listen
Vis visning.
Når vi viser ReadmeSectionsView kommer det frem en visning med en liste. Listen er tom med mindre vi klikker på en fil med filtypen .readme. I så fall fylles listen ut med deler fra readme-filen.
Hvordan gjenkjenner plugin-modulen readme-filen og hvordan kjente den til utvalgsendringer? Hvis vi finner svarene på disse spørsmålene, er vi kommet et godt stykke på vei med å forstå hvordan vi bygger integrerte plugin-moduler i arbeidsbenken.
Vi starter med den kjente createPartControl-metoden. Som vi så i eksempelet "Hello World", er det her widgetene som representerer en visning, opprettes. Vi ignorerer noe av koden for å 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()); }
Visningen oppretter og lagrer en ListViewer og registrerer seg selv som en utvalgslytter på siden. Den henter siden fra en IViewSite, som inneholder informasjon om visningskonteksten, for eksempel arbeidsbenkvinduet, innholdssiden og plugin-modulen. Hva skjer når vi får melding om en valgendring? Følgende kode utfø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 ut som ReadmeModelFactory-klassen er ansvarlig for å endre utvalget til readme-utvalg og disse delene er inndata for visningsprogrammet som vi opprettet i createPartControl-metoden.
Men hvordan fylte visningsprogrammet ut liste-widgetene? Foreløpig går vi ut fra at når det ble angitt inndataelement for visningsprogrammet, visste det hvordan det skulle fylle ut liste-widgeten med informasjon - det er tross alt en ListViewer. Hvis du vil vite nå hva dette visningsprogrammet går ut på, kan du gå til Visningsprogrammer.
Vi vet fortsatt ikke hvordan readme-filer oppdages eller hvor filens seksjonsinformasjon kommer fra. Vi får litt bedre forståelse ved å ta en rask titt på ReadmeModelFactory.
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 utvalget for å se om det er et strukturert (multipelt) utvalg. (Begrepet i et strukturert utvalg kommer fra JFace-visningsprogrammer.) For første objekt i utvalget, kan vi se om det er en filressurs (IFile). Hvis det er tilfelle, kontrollerer vi utvidelsen for å se om den samsvarer med ".readme"-utvidelsen. Når vi vet at vi har en readme-fil, kan vi bruke andre metoder for å analysere seksjonene. Du kan bla deg gjennom resten av ReadmeModelFactory, MarkElement og DefaultSectionsParser hvis du vil ha mer detaljert informasjon om filanalysen.
Vi har nå sett på en rekke vanlig arbeidsbenkbegreper ved å studere denne utvidelsen. Vi skal nå se på noen andre arbeidsbenkutvidelser og studere hvordan plugin-modulen kan bidra ytterligere til brukergrensesnittet i arbeidsbenken.