Visningsprogram

Varför skulle du någonsin vilja använda ett visningsprogram när vi redan har sett att arbetsmiljöns användargränssnittsinnehåll, t.ex. vyer, redigare, guider och dialogrutor kan implementeras direkt med hjälp av SWT-gränssnittskontroller?  

Med visningsprogram kan du skapa gränssnittskontroller medan du fortfarande använder dina modellobjekt. Om du använder en SWT-gränssnittskontroll direkt måste du konvertera objekten till de strängar och bilder som förväntas i SWT. Visningsprogram kan fungera som adaptrar i SWT-gränssnittskontroller och hantera vanlig kod för hantering av gränssnittskontrollhändelser som du annars måste implementera själv. 

Första gången vi såg ett visningsprogram var i readme-verktygets vyinnehåll, inuti ReadmeSectionsView.

   public void createPartControl(Composite parent) {
      viewer = new ListViewer(parent);
      ...
   }
Obs! Visningsprogram kan användas för implementering för både arbetsmiljövyer och -redigerare. Termvisningsprogrammet antyder inte att de bara kan användas till att implementera vyer. Exempelvis används TextViewer i implementationen i många arbetsmiljö- och insticksprogramredigerare.

Standardvisningsprogram

I JFace finns visningsprogram för de flesta av de ovanliga gränssnittskontrollerna i SWT. Visningsprogram används oftast för gränssnittskontrollerna listor, träd, tabeller och text. 

Varje visningsprogram har en associerad SWT-gränssnittskontroll. Gränssnittskontrollen kan skapas underförstått genom att tillhandahålla överordnad Composite i en praktisk visningskonstruktör, eller uttryckligen genom att först skapa den och sedan ge den till visningsprogrammet i konstruktören.

Listorienterade visningsprogram

Listor, träd och tabeller delar många gemensamma funktioner från användarens synvinkel, t.ex. att fylla med objekt, urval, sortering och filtrering. 

Dessa visningsprogram behåller en lista över domänobjekt (kallas för element) och visar dem i deras motsvarande SWT-gränssnittskontroller. Ett listvisningsprogram vet hur en textetikett ska hämtas från ett element i listan. Etiketten hämtas från en ILabelProvider som kan ställas in i visningsprogrammet. Listvisningsprogram vet hur man avbildar från återkoppling i gränssnittskontroller tillbaka till den elementvärld som är känd av visningsklienten.

Klienter som använder en vanlig SWT-gränssnittskontroll måste fungera på SWT-nivå, där objekt är strängar och händelser ofta relaterar till ett index inom stränglistan. Visningsprogram ger semantik på högre nivå. Klienter meddelas om urval och ändringar av listan med hjälp av elementen för visningsprogrammet. Visningsprogrammet hanterar allt grundarbete för avbildning av index tillbaka till elementen, ändrar för en filtrerad objektvy och sorterar om när det är nödvändigt.

Filtrering och sortering hanteras genom att utse en visningssorterare (ViewerSorter) och/eller ett visningsfilter (ViewerFilter) för visningsprogrammet. (Dessa kan anges för träd- och tabellvisning, förutom för listvisning). Klienten behöver bara ange en klass som kan jämföra eller filtrera objekten i listan. Visningsprogrammet hanterar detaljerna med att fylla i listan enligt angiven ordning och angivet filter och att underhålla ordning och filter när element läggs till eller tas bort.

Visningsprogram är inte avsedda att utökas av klienter. Om du vill anpassa ett visningsprogram kan du konfigurera det med eget innehåll och egna etikettproviders.

Med en ListViewer avbildas element i en lista till en List-kontroll i SWT.

En TreeViewer visar hierarkiska objekt i en Tree-gränssnittskontroll i SWT. Det hanterar detaljerna för att expandera och komprimera objekt. Det finns flera olika typer av trädvisningar för olika SWT-trädkontroller (vanligt träd, tabellträd, kryssruteträd).

En TableViewer påminner mycket om en listvisning men kan också visa flera kolumner med information för varje element i tabellen. Tabellvisning utökar väsentligt funktionen i SWT-tabellgränssnittskontrollen genom att introducera begreppet med att redigera en cell. Speciella cellredigerare kan användas så att användaren kan redigera en tabellcell med hjälp av en kombinationsruta, en dialogruta eller en textgränssnittskontroll. Tabellvisningen hanterar skapande och placering av de här gränssnittskontrollerna när de behövs för användarredigering. Det görs med klasserna CellEditor, t.ex. TextCellEditor och CheckboxCellEditor. En virtuell tabell, som bara fylls i när den visas. Tabellvisaren kör bara ett bestämt antal resultat oavsett av vad som verkligen skapas. Databasen begär "lättjefullt" JIT och frågar bara ett förbestämt antal gånger i taget.

Textvisningsprogram

Textgränssnittskontroller har mycket vanlig semantik som t.ex. dubbelklickningar, ånga, färglägga och navigera efter index eller rad. En TextViewer är en adapter för en StyledText SWT-gränssnittskontroll. Textvisningsprogram har en dokumentmodell för klienten och hanterar konvertering av dokument till skapad textinformation som tillhandahålls av textgränssnittskontrollen.

Textvisningsprogram beskrivs ytterligare i avsnittet Redigerare i arbetsmiljön.

Visningsarkitektur

Om du vill förstå ett visningsprogram måste du känna till relationen mellan visningsprogrammets indataelement, dess innehåll, urval och den information som verkligen visas i gränssnittskontrollen som manipuleras.

Indataelement

Ett indataelement är det huvudobjekt som visningen visar (eller redigerar). Från visningsprogrammets synpunkt kan ett indataelement vara vilket objekt som helst. Det antas inte att något specifikt gränssnitt implementeras av indataelementet. (Vi kommer att förstå varför om ett ögonblick, när vi tittar på innehållsproviders.)

Ett visningsprogram måste kunna hantera en förändring av indataelement. Om ett nytt indataelement anges i visningsprogrammet måste det åter fylla sin gränssnittskontroll enligt det nya elementet och disassociera sig själv från tidigare indataelement. Semantiken för att registrera som lyssnare för ett indataelement och fylla gränssnittskontrollen baserat på elementet skiljer sig för alla typer av visningsprogram.

Innehållsvisning

En innehållsvisning är ett visningsprogram som har ett väldefinierat protokoll för att få information från sina indataelement. Innehållsvisare använder två specialiserade hjälpklasser, IContentProvider och ILabelProvider för att fylla gränssnittskontrollen och visa information om indataelementet.

En IContentProvider ger ett grundläggande livscykelprotokoll för associering av innehållsprovider med ett indataelement och hantering av en förändring av indataelementet. Mer specialiserade innehållsproviders implementeras för olika typer av visningsprogram. Den vanligaste innehållsprovidern är IStructuredContentProvider, vilken kan ge en lista över objekt som getts i ett indataelement. Det används i listliknande visningar, t.ex. listor, tabeller och träd. I allmänhet känner innehållsprovidern till hur den ska avbilda mellan indataelementet och förväntat visningsinnehåll.

ILabelProvider tar ytterligare ett steg. Med innehållet i en visning (hämtat från indataelementet och innehållsprovidern) kan den skapa de specifika användargränssnittselementen, t.ex. namn och ikoner, som behövs för att visa innehållet i visningsprogrammet. Etikettproviders kan hjälpa till med att spara ikonresurser eftersom de kan se till att samma förekomst av ikonen används för alla liknande typer i ett visningsprogram.

Obs!  Förekomster av ett visst innehåll och en viss etikettprovider är inte avsedda att delas över flera visningsprogram. Även om alla dina visningsprogram använder samma typ av innehåll eller etikettprovider bör varje visningsprogram initieras med sin egen förekomst av providerklassen. Providerns livscykelprotokoll har utformats för en 1-till-1-relation mellan en provider och dess visningsprogram.

Indataelement, innehållsproviders och etikettproviders låter visningsprogram dölja det mesta av implementationsdetaljerna för ifyllande av gränssnittskontroller. Klienter till ett visningsprogram behöver bara bekymra sig om att fylla ett visningsprogram med rätt typ av indata och innehållsprovider. Etikettprovidern måste veta hur användargränssnittsinformationen ska hämtas från visningsinnehållet.

En etikettprovider kan visa mer än bara text och en bild. JFace har flera klasser och gränssnitt som gör det möjligt att använda olika extrafunktioner. Följande klasser kan användas av TableViewer, AbstractTreeViewer och TableTreeViewer.

Det är möjligt att påverka färgen på objekt i en vy antingen från etikettleverantören för vyn eller via en dekorationsfunktion. Vanligen är det bättre att använda färg- och teckensnittssupporten i etikettleverantörer eftersom dekoratörer påverkar varje vy som visar en viss typ. Om du använder en färg- eller teckensnittsdekorationsfunktion ser du till att dess värden kan anges på inställningssidan Färger och teckensnitt.

Visningsprogram och arbetsmiljön

Den flexibilitet som finns i visningsprogram, innehållsproviders och etikettproviders kan visas genom att titta på hur de används i arbetsmiljön.

WorkbenchContentProvider är en strukturerad innehållsprovider som får innehåll från ett indatalement genom att be om underordnade element. Begreppet med adaptrar används igen för att implementera en generisk funktion. När providern WorkbenchContentProvider ber om en lista med element från indataelementet får den en IWorkbenchAdapter för indataelementet. Om en IWorkbenchAdapter har registrerats för indataelementet, kan innehållsprovidern säkert anta att elementets underordnade objekt kan efterfrågas.  WorkbenchContentProvider gör också det jobb som behövs för att visningsprogrammet ska uppdateras när arbetsmiljön förändras. 

WorkbenchLabelProvider är en etikettprovider som får en IWorkbenchAdapter från ett objekt för att hitta dess text och bild. Begreppet med en etikettprovider är speciellt bra för arbetsmiljöobjekt eftersom en enstaka etikettprovider kan cachelagra bilder som används ofta i ett visningsprogram. Exempelvis när WorkbenchLabelProvider får en bild att använda för en IProject kan bilden cachelagras och användas för alla IProject-objekt som visas i visningsprogrammet.

Genom att definiera en vanlig adapter,IWorkbenchAdapter, och registrera den för många plattformstyper kan dessa typer representeras korrekt i många av de vanliga visningsprogram och arbetsmiljövyer som innehåller dem.