Hvorfor skulle man få brug for at benytte en fremviser, når man ved, at arbejdsbænkens grænseflade bl.a. indeholder oversigter, editorer, guider og dialogbokse, som kan implementeres direkte vha. SWT-elementer?
Ved hjælp fremvisere kan du oprette elementer, mens du fortsat benytter modelobjektet. Hvis du bruger et SWT-element direkte, skal du konvertere objekterne til de strenge og billeder, som forventes af SWT. Fremvisere fungerer som adaptere på SWT-elementer og håndterer den fælleskode for håndtering af elementaktiviteter, som du ellers ville skulle implementere selv.
Den første fremviser så vi i Readme-værktøjet i ReadmeSectionsView.
public void createPartControl(Composite parent) { viewer = new ListViewer(parent); ... }
Bemærk: Fremvisere kan bruges til at stille implementeringen for både arbejdsbænkoversigter og -editorer til rådighed. Begrebet 'fremviser' udelukker ikke, at en fremviser kan bruges til andet end at implementere oversigter. TextViewer bruges f.eks. ved implementeringen af mange arbejdsbænk- og plugin-editorer.
JFace stiller fremvisere til rådighed for de fleste ikke-almindelige elementer i SWT. Fremvisere benyttes oftest til oversigts-, træstruktur-, tabel- og tekstelementer.
Alle fremvisere har et tilknyttet SWT-element. Dette element kan oprettes implicit, ved at den overordnede Composite leveres i en fremviserkonstruktøren, eller eksplicit ved at det oprettes først og derefter leveres til fremviseren i sin konstruktør.
Oversigter, træstrukturer og tabeller har mange fælles egenskaber set fra brugerens side, f.eks. udfyldning med objekter, valg, sortering og filtrering.
Disse fremvisere opbevarer en oversigt over domæneobjekter (kaldet elementer) og viser dem i deres tilhørende SWT-element. En listefremviser ved, hvordan en tekstetiket skal hentes fra et hvilket som helst element i oversigten. Den henter etiketten fra en ILabelProvider, som kan angives for fremviseren. Listefremvisere kan tilknytte vha. mapping tilbage til alle elementerne, som fremviserklienten kender, fra elementtilbagekaldene.
Klienter, der bruger et almindeligt SWT-element, skal fungere på det SWT-niveau - hvor elementer er strenge og aktiviteter ofte relaterer til et indeks i oversigten over strenge. Fremvisere stiller semantik på højere niveau til rådighed. Klienter underrettes om valg og ændringer til oversigten vha. de elementer, de har stillet til rådighed for fremviseren. Fremviseren håndterer alt arbejdet med at tilknytte indekser vha. mapping tilbage til elementer, foretage justeringer til brug for en filtreret oversigt over objekterne og foretage gensortering, når det er nødvendigt.
Filtrerings- og sorteringsfunktioner håndteres ved at angive en fremvisersortering (ViewerSorter) og/eller et fremviserfilter (ViewerFilter) for fremviseren. (Disse kan angives for træstruktur- og tabelfremvisere foruden listefremvisere.) Klienten skal blot stille en klasse til rådighed, der kan sammenligne eller filtrere objekterne i listen. Fremviseren håndterer udfyldning af listen i henhold til den angivne rækkefølge og det angivne filter og vedligeholdelse af rækkefølge og filter, efterhånden som elementer tilføjes og fjernes.
Det er ikke meningen, at fremvisere skal udvides af klienter. Du kan tilpasse en fremviser ved at konfigurere den med eget indhold og egne etiketudbydere.
En ListViewer tilknytter elementer på en liste vha. mapping til en SWT List-kontrol.
En TreeViewer viser hierarkiske objekter i et SWT Tree-element. Den håndterer oplysninger til brug for at vise og skjule elementer. Der er flere forskellige slags træstrukturfremvisere for forskellige SWT-træstrukturkontroller (almindelig træstruktur, tabeltræstruktur, afkrydsningsfelttræstruktur).
En TableViewer ligner en listefremviser, men tilføjer muligheden for at vise flere kolonner oplysninger for hvert element i tabellen. Tabelfremvisere udvider SWT-tabelelementets funktionalitet væsentligt ved at introducere redigering af en celle. Særlige celleeditorer kan bruges til at give brugere mulighed for at redigere en tabelcelle vha. en kombinationsboks, dialogboks eller tekstelement. Tabelfremviseren håndterer oprettelsen og placeringen af disse elementer, når der brug for dem til brugerredigering. Dette gøres vha. CellEditor-klasser, f.eks. TextCellEditor og CheckboxCellEditor. En virtuel tabel, som kun udfyldes, når den vises. Tabelfremviseren udfører kun et bestemt antal resultater, uanset hvad der egentlig oprettes. Databasen anmoder "lazily" JIT og forespørger kun på et forudbestemt antal ad gangen.
Tekstelementer har meget semantik til fælles, f.eks. hvordan dobbeltklik fungerer, fortryd, farver og navigation efter indeks eller linje. En TextViewer er en adapter for et SWT StyledText-element. Tekstfremvisere stiller en dokumentmodel til rådighed for klienten og administrerer konverteringen af dokumentet til de layoutoplysninger, som tekstelementet stiller til rådighed.
Der er flere oplysninger om tekstfremvisere i Arbejdsbænk - editorer.
For at forstå en fremviser skal du være bekendt med relationen mellem en fremvisers inputelement, dens indhold, dens valg og de oplysninger, der faktisk vises i det element, som der arbejdes med.
Et inputelement er hovedobjektet, som fremviseren viser (eller redigerer). Set fra fremviseren kan et inputelement være et hvilket som helst objekt. Det antager ikke, at en bestemt grænseflade implementeres af inputelementet. (Dette forklares senere i forbindelse med indholdsudbydere.)
En fremviser skal kunne håndtere en ændring af inputelementet. Hvis et nyt inputelement angives i en fremviser, skal elementet udfyldes igen iht. det nye element, og tilknytningen fra det forrige element skal fjernes. Semantikken til brug for registrering som lytter for et inputelement og udfyldning af elementet på basis af elementet er forskellig for hver type fremviser.
En indholdsfremviser er en fremviser, der har en veldefineret protokol til brug for hentning af oplysninger fra dets inputelement. Indholdsfremvisere bruger to særlige hjælpeklasser, IContentProvider og ILabelProvider, til at udfylde elementet og fremvisningsoplysningerne om inputelementet.
IContentProvider stiller basislivscyklusprotokol til rådighed for tilknytning af en indholdsudbyder med et inputelement og for håndtering af en ændring af inputelementet. Mere specialiserede indholdsudbydere implementeres for forskellige typer fremvisere. Den mest almindelige indholdsudbyder er IStructuredContentProvider, som kan stille en liste over objekter til rådighed for et givet inputelement. Den benyttes i listelignende fremvisere, f.eks. lister, tabeller eller træstrukturer. Normalt ved indholdsudbyderen, hvordan den skal oprette tilknytninger vha. mapping mellem inputelementet og det forventede fremviserindhold.
ILabelProvider går et trin videre. Ud fra indholdet af en fremviser (afledt fra inputelementet og indholdsudbyderen) kan den producere de specifikke grænsefladeelementer f.eks. navne og ikoner, der bruges til at vise indholdet af oversigten. Etiketleveradører kan hjælpe med at gemme ikonressourcer, da de kan sikre, at den samme forekomst af en ikon benyttes til alle like-typer i en fremviser.
Bemærk: Det er ikke meningen, at forekomster af bestemt indhold og etiketudbydere skal deles på tværs af flere fremvisers. Selvom om dine fremvisere bruger den samme type indholds- eller etiketudbyder, skal hver fremviserinitialiseres med sin egen forekomst af udbyderklassen. Udbyderens livscyklusprotokol er designet til en 1 til 1-relation mellem en udbyder og dennes fremviser.
Inputelementer, indholdsudbydere og etiketudbydere giver fremvisere mulighed for at skjule de fleste implementeringsoplysninger til brug for udfyldning af elementer. Klienterne til en fremviser skal kun bekymre sig om at udfylde en fremviser med den korrekte slags input- og indholdsudbyder. Etiketudbyderen skal kunne aflede grænsefladeoplysninger fra fremviserindholdet.
En etiketudbyder kan vise mere end blot tekst og et billede. JFace stiller flere klasser og grænseflader til rådighed for understøttelse af ekstra funktionalitet. Følgende klasser understøttes af TableViewer, AbstractTreeViewer og TableTreeViewer.
Det er muligt at påvirke farven af elementer i en oversigt enten inde fra oversigtens etiketudbyder eller via en dekoratør. Generelt er det bedst at bruge farve- og fontunderstøttelsen i etiketudbydere, da dekoratører påvirker hver eneste oversigt, der viser en bestemt type. Hvis du bruger en farve- eller fontdekoratør, skal du sikre dig, at dens værdier kan angives på indstillingssiden Farver og fonte.
Den fleksibilitet, der stilles til rådighed af fremvisere, indholdsudbydere og etiketudbydere kan demonstreres ved at se på, hvordan arbejdsbænke bruger dem.
WorkbenchContentProvider er en struktureret indholdsudbyder, som henter indholdet fra et inputelement ved at spørge efter de underordnede elementer. Adapterbegrebet bruges igen for at implementere generisk funktion. Når der bliver bedt om listen over elementer fra inputelementet, henter WorkbenchContentProvider en IWorkbenchAdapter til inputelementet. Hvis en IWorkbenchAdapter er registreret for inputelementet, kan indholdsudbyderen antage, at der kan forespørges på elementet efter underordnede elementer. WorkbenchContentProvider udfører også arbejde, der kræves for at bevare fremviseren opdateret, når arbejdsområdet ændres.
WorkbenchLabelProvider er en etiketudbyder, der henter en IWorkbenchAdapter fra et objekt for at finde tekst og billede. En etiketudbyder er især nyttig for arbejdsbænkobjekter, fordi den tillader en enkelt etiketudbyder at cache billeder, der normalt benyttes i en fremviser. Når først WorkbenchLabelProvider henter et billede til brug for et IProject, kan den cache det billede og bruge det til alle IProject-objekter, der vises i fremviseren.
Ved at definere en fælles adapter, IWorkbenchAdapter, og registrere den til brug for mange platformtyper, er det muligt for disse typer at blive repræsenteret korrekt i mange af de fælles fremvisere og arbejdsbænkoversigter, som indeholder dem.