Hvorfor bruke et visningsprogram når vi allerede har sett at bidrag til arbeidsbenkens brukergrensesnitt, for eksempel visninger, redigeringsprogrammer, veivisere og dialogbokser, kan implementeres direkte med SWT-widgeter?
Med visningsprogrammer kan du opprette widgeter mens du fortsatt bruker modellobjektene. Hvis du bruker en SWT-widget direkte, må du konvertere objektene til strenger og bilder som forventes av SWT. Visningsprogrammer fungerer som adaptere på SWT-widgeter, og håndterer felleskoden for widget-hendelser som du ellers måtte ha implementert selv.
Vi så først et visningsprogram i readme-verktøyets visning i ReadmeSectionsView.
public void createPartControl(Composite parent) { viewer = new ListViewer(parent); ... }
Merk: Visningsprogrammer kan brukes til å oppgi implementeringen både for arbeidsbenkvisninger og redigeringsprogrammer. Begrepet visningsprogram indikerer ikke at de bare kan brukes til å implementere visninger. For eksempel brukes TextViewer i implementeringen i en rekke av arbeidsbenkens og plugin-modulenes redigeringsprogrammer.
JFace tilbyr visningsprogrammer for de fleste viktige widgeter i SWT. Visningsprogrammer brukes vanligvis til å vise lister, trær, tabeller og tekst-widgeter.
Hvert visningsprogram har en tilknyttet SWT-widget. Denne widgeten kan opprettes implisitt ved å støtte overordnet Composite i en bekvemmelig visningsprogramkonstruktør, eller eksplisitt ved å opprette den først og oppgi den til visningsprogrammet i konstruktøren.
Fra et brukerperspektiv deler lister, trær og tabeller mye fellesfunksjonalitet, for eksempel utfylling med objekter, valg, sortering og filtrering.
Disse visningsprogrammene oppbevarer en liste over domeneobjekter (kalt elementer) og viser dem i den tilhørende SWT-widgeten. Et listevisningsprogram kan hente en tekstetikett fra et hvilket som helst element på listen. Den henter en etikett fra en ILabelProvider, som kan defineres i visningsprogrammet. Listevisningsprogrammer vet hvordan de kan bruke tilordning fra widget-tilbakekall til de ulike elementene som er kjent av visningsprogramklienten.
Klienter som bruker en vanlig SWT-widget, må brukes på SWT-nivå - der elementer er strenger og hendelser ofte er knyttet til en indeks på listen over strenger. Visningsprogrammer inneholder semantikk på høyere nivå. Klienter får melding om valg og endringer på listen via elementene de oppgav for visningsprogrammet. Visningsprogrammet håndterer alt rutinearbeidet i forbindelse med tilordning av indekser tilbake til elementer, justering av en filtrert visning av objektene og en eventuell ny sortering.
Filtrerings- og sorteringsfunksjonalitet håndteres ved å angi en visningsprogramsorterer (ViewerSorter) og/eller et visningsprogramfilter (ViewerFilter) for visningsprogrammet. (Dette kan oppgis for tre- og tabellvisningsprogrammer i tillegg til listevisningsprogrammer.) Det eneste klienten trenger å gjøre, er å oppgi en klasse som kan sammenlikne eller filtrere objektene på listen. Visningsprogrammet håndterer detaljene rundt utfylling av listen i henhold til den oppgitte rekkefølgen og filteret, og vedlikeholder rekkefølgen og filteret etter hvert som elementer legges til og fjernes.
Klienter er ikke ment å utvide visningsprogrammer. Hvis du vil tilpasse et visningsprogram, kan du konfigurere det med egne innholds- og etikettleverandører.
ListViewer tilordner listeelementer til en SWT-kontroll av typen Liste.
TreeViewer viser hierarkiske objekter i en SWT-widget av typen tre. Den håndterer oppgaver i forbindelse med utvidelse og komprimering av elementer. Det finnes flere ulike typer trevisningsprogrammer for ulike SWT-trekontroller (vanlig tre, tabelltre og avmerkingsbokstre).
TableViewer er svært lik på et listevisningsprogram, men kan i tillegg brukes til å vise flere kolonner med informasjon om hvert element i tabellen. Tabellvisningsprogrammer utvider funksjonen i SWT-tabell-widgeten ved å introdusere utvidelse av en celle. Ved hjelp av bestemte celleredigeringsprogrammer kan brukeren få tillatelse til å redigere en tabellcelle via en kombinasjonsboks, dialogboks eller tekst-widget. Tabellvisningsprogrammet håndterer opprettelsen og plasseringen av disse widgetene når de skal redigeres av brukeren. Dette gjøres ved hjelp av CellEditor-klassene, for eksempel TextCellEditor og CheckboxCellEditor. Siden en virtuell tabell bare fylles ut når den vises, kjøres tabellvisningsprogrammet bare et angitt antall resulter uavhengig av hva som faktisk opprettes. Databasen oppretter en JIT-forespørsel ("lazily") og foretar spørringer bare et forhåndsbestemt antall ganger.
Tekst-widgeter har mye felles semantikk, for eksempel dobbeltklikk-funksjonalitet, angring, farger og navigering etter indeks eller linje. TextViewer er en adapter for SWT-widgeten StyledText. Tekstvisningsprogrammer tilbyr klientene en dokumentmodell og håndterer konverteringen av dokumentet til den opprettede tekstinformasjonen fra tekst-widgeten.
Vi kommer nærmere inn på tekstvisningsprogrammer under Redigeringsprogrammer i arbeidsbenken.
Hvis du vil forstå hvordan et visningsprogram fungerer, må du gjøre deg kjent med forholdet mellom visningsprogrammets inndataelement, innholdet, valget og informasjonen som faktisk vises i widgeten som programmet manipulerer.
Et inndataelement er hovedobjektet som visningsprogrammet viser (eller redigerer). For visningsprogrammet kan et inndataelement være et hvilket som helst objekt. Det er ikke krav om at et bestemt grensesnitt må implementeres av inndataelementet. (Vi kommer snart tilbake til dette når vi ser nærmere på innholdsleverandører.)
Et visningsprogram må kunne håndtere en endring i inndataelement. Hvis et nytt inndataelement defineres i et visningsprogram, må visningsprogrammet fylle ut widgeten på nytt med det nye elementet og fjerne tilknytning til det gamle inndataelementet. Semantikken som brukes ved registrering som lytter i et inndataelement og utfylling av widgeten basert på elementet, er forskjellig for de ulike visningsprogramtypene.
Et innholdsvisningsprogram er et visningsprogram med en definert protokoll for henting av informasjon fra inndataelementet. Innholdsvisningsprogrammer bruker de to spesialhjelpeklassene IContentProvider og ILabelProvider til å fylle ut widgetene og vise informasjon om inndataelementet.
IContentProvider har en grunnleggende livssyklusprotokoll for tilknytning av en innholdsleverandør til et inndataelement og håndtering av en endring i inndataelementet. Det kan implementeres mer spesialiserte innholdsleverandører for ulike typer visningsprogrammer. Den vanligste innholdsleverandøren er IStructuredContentProvider, som kan oppgi en liste med objekter i et gitt inndataelement. Den brukes i listeliknende visningsprogrammer, for eksempel lister, tabeller eller trær. Generelt vet innholdsleverandøren hvordan den skal opprette tilordning mellom inndataelementet og det forventede visningsprograminnholdet.
ILabelProvider går enda et skritt videre. Avhengig av innholdet i et visningsprogram (avledet fra inndataelementet og innholdsleverandøren), kan den lage de spesifikke brukergrensesnittelementene (som navn og ikoner) som trengs for å vise innholdet i visningsprogrammet. Etikettleverandører gjør det enklere å lagre ikonressurser ved å sikre at den samme forekomsten av ikonet, blir brukt for alle like typer i et visningsprogram.
Merk: Forekomster av bestemte innholds- og etikettleverandører er ikke ment å deles på tvers av flere visningsprogrammer. Selv om alle visningsprogrammene bruker samme type innholds- eller etikettleverandør, bør hvert enkelt visningsprogram initialiseres med sin egen forekomst av leverandørklassen. Livssyklusprotokollen for leverandøren er beregnet på et en-til-en-forhold mellom leverandøren og visningsprogrammet
Med inndataelementer, innholdsleverandører og etikettleverandører kan visningsprogrammer skjule mesteparten av implementeringsopplysningene for widgeter som fylles ut. De som bruker visningsprogrammet, trenger ikke å fylle ut et visningsprogram med riktig type inndata- og innholdsleverandør. Etikettleverandøren må vite hvordan brukergrensesnittinformasjonen skal avledes fra innholdet i visningsprogrammet.
En etikettleverandør kan vise mer enn bare tekst og et bilde. JFace har flere klasser og grensesnitt som støtter tilleggsfunksjonalitet. Følgende klasser støttes av TableViewer, AbstractTreeViewer og TableTreeViewer.
Det er mulig å påvirke fargen til elementer i en visning snarere enn fra inne i visningens etikettleverandør, eller via en dekoratør. Det er vanligvis best å bruke farge- og fontstøtten i etikettleverandører siden dekoratører påvirker alle visninger som viser en bestemt type. Hvis du ikke bruker en farge- eller fontdekoratør, må du forsikre deg om at verdiene kan defineres på preferansesiden Farger og fonter.
At både visningsprogrammer, innholdsleverandører og etikettleverandører har stor grad av fleksibilitet, vises tydelig når du ser på hvordan arbeidsbenken bruker dem.
WorkbenchContentProvider er en strukturert innholdsleverandør som henter innhold fra et inndataelement ved å be om underordnede elementer. Adapterbegrepet brukes på nytt for å implementere generisk funksjon. Når det kommer forespørsel om listen over elementer fra inndataelementet, henter WorkbenchContentProvider en IWorkbenchAdapter for inndataelementet. Hvis en IWorkbenchAdapter er registrert for inndataelementet, kan innholdsleverandøren trygt anta at det er mulig å foreta en spørring om de underordnede elementene. WorkbenchContentProvider utfører også de oppgaver som kreves for å holde visningsprogrammet oppdatert når arbeidsområdet endres.
WorkbenchLabelProvider er en etikettleverandør som henter en IWorkbenchAdapter fra et objekt for å finne tekst og bilde. Her er etikettleverandøren spesielt nyttig for arbeidsbenkobjekter fordi den tillater at en enkelt etikettleverandør bufrer bilder som er hyppig brukt i et visningsprogram. For eksempel er det slik at når WorkbenchLabelProvider har hentet et bilde som skal brukes for IProject, kan bildet bufres og brukes for alle IProject-objekter som vises i visningsprogrammet.
Ved å definere en felles adapter, IWorkbenchAdapter, og registrere den for en rekke av plattformtypene, kan disse typene representeres på riktig måte i mange av de vanlige visningsprogrammene og arbeidsbenkvisningene som inneholder dem.