Syntaksfarger er lagt til i tekstrammeverket i plattformen ved hjelp av en skade-, reparasjons- og avstemmingsmodell. For hver endring som er utført i et dokument, angir en presentasjonsavstemmer (reconciler) hvilket område i den visuelle presentasjonen som skal gjøres ugyldig, og hvordan denne delen skal repareres. Det kan brukes ulike strategier for ulike innholdstyper i dokumentet.
Det er valgfritt å implementere syntaksfarger (ved hjelp av en presentasjonsavstemmer). Som standard installerer ikke SourceViewerConfiguration noen presentasjonsavstemmer fordi dokumentmodellen som brukes for et bestemt redigeringsprogram, ikke er kjent, og fordi det ikke finnes generiske funksjoner for syntaksutheving.
Hvis du vil bruke avstemmingsklasser for å implementere syntaksutheving, må redigeringskildevisningsprogrammet være konfigurert på en slik måte at det er mulig å definere en presentasjonsavstemmer. Vi skal se hvordan en presentasjonsavstemmer defineres for redigeringsprogrammet ved nok en gang å først se på JavaSourceViewerConfiguration.
public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) { PresentationReconciler reconciler= new PresentationReconciler(); ... return reconciler; }
For å forstå hvordan denne funksjonen fungerer må vi først se nærmere på begrepene skade, reparasjon og avstemming.
Når en bruker endrer tekst i et redigeringsprogram, må redigeringsprogrammet vises på nytt slik at endringene vises. Behandling av tekst som skal vises på nytt, kalles behandling av skade. Når det blir brukt syntaksfarger, er skadene som forårsakes av en redigeringsoperasjon mer omfattende, siden ett enkelt tegn eller manglende tegn kan endre fargen på teksten rundt.
Skadegjørere (IPresentationDamager) fastsetter hvilket område i dokumentpresentasjonen som skal bygges på nytt på grunn av en dokumentendring. Det forutsettes at en skadegjører for presentasjon, er spesifikk for en bestemt dokumentinnholdstype (eller dokumentområde). Funksjonen må kunne returnere et skadeområde som er gyldig inndata for en presentasjonsreparatør (IPresentationRepairer). En reparatør må kunne avlede all nødvendig informasjon fra et skadeområde for å beskrive de nødvendige reparasjonene for en bestemt innholdstype.
Avstemming beskriver den generelle prosessen med å holde presentasjonen av dokumentet oppdatert etter hvert som det blir utført endringer i redigeringsprogrammet. En presentasjonsavstemmer (IPresentationReconciler) følger med på endringer i teksten via det tilknyttede visningsprogrammet. Den bruker dokumentområdene til å fastslå hvilke innholdstyper som påvirkes av endringen og varsler en skadegjører for den innholdstypen som berøres. Når skaden er beregnet, overføres den til en reparatør som utformer reparasjonsbeskrivelsene som brukes i visningsprogrammet for synkronisering med det underliggende innholdet.
Klassene i org.eclipse.jface.text.reconciler definerer flere støtteklasser for synkronisering av en dokumentmodell med ekstern manipulering av dokumentet.
Presentasjonsavstemmere skal oppgis sammen med et reparatør- og skadegjørerpar for hver innholdstype som finnes i dokumentet. Det enkelte redigeringsprogrammet avgjør hvordan en presentasjonsavstemmer skal implementeres. Plattformen støtter imidlertid bruk av regelbaserte dokumentskannere til å beregne og reparere skader, i org.eclipse.jface.text.rules. Det er definert skadegjørere og reparatører i denne pakken. De kan brukes sammen med standardavstemmere i org.eclipse.jface.text.presentation for å implementere syntaksfarger ved å definere skanningsregler for dokumentet.
Vi har nå den kunnskapen vi trenger for å opprette et eksempel på presentasjonsavstemmer. Husk at Java-redigeringsprogrameksempelet implementerer en JavaPartitionScanner som deler dokumentet inn i innholdstypene for Javadoc, kommentarer på flere linjer og det øvrige dokumentinnholdet.
For hver av disse innholdstypene må det angis et reparatør/skadegjørerpar. Vi har gjort dette nedenfor ved hjelp av PresentationReconciler og DefaultDamagerRepairer.
JavaColorProvider provider= JavaEditorEnvironment.getJavaColorProvider(); PresentationReconciler reconciler= new PresentationReconciler(); DefaultDamagerRepairer dr= new DefaultDamagerRepairer(JavaEditorEnvironment.getJavaCodeScanner()); reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE); reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE); dr= new DefaultDamagerRepairer(new SingleTokenScanner(new TextAttribute(provider.getColor(JavaColorProvider.JAVADOC_DEFAULT)))); reconciler.setDamager(dr, JavaPartitionScanner.JAVA_DOC); reconciler.setRepairer(dr, JavaPartitionScanner.JAVA_DOC); dr= new DefaultDamagerRepairer(new SingleTokenScanner(new TextAttribute(provider.getColor(JavaColorProvider.MULTI_LINE_COMMENT)))); reconciler.setDamager(dr, JavaPartitionScanner.JAVA_MULTILINE_COMMENT); reconciler.setRepairer(dr, JavaPartitionScanner.JAVA_MULTILINE_COMMENT); return reconciler;
Merk at eksempelet oppgir skannere for hver innholdstype.
Standard innholdstype konfigureres med en JavaCodeScanner slik at nøkkelord kan søkes etter og farges. JavaCodeScanner lager regler for søking etter ulike symboler, for eksempel kommentarer på en enkelt linje, blanktegn og ord. Her beskrives fargene som skal brukes på ord av forskjellige symboltyper.
De andre innholdstypene konfigureres med en SingleTokenScanner og tildeles farge for symboler i disse innholdstypene.
DefaultDamagerRepairer håndterer alle detaljer rundt skader og reparasjoner av de ulike delene i et dokument, i henhold til skanningsreglene. Disse detaljene trenger vanligvis ikke å bli forstått av plugin-koden. Fokuset i plugin-modulen bør være på å lage et sett med regler som er egnet for partisjonering og skanning av innholdet i redigeringsprogrammet.
Java-redigeringsprogrameksempelet inneholder en subklasse for SourceViewerConfiguration , som brukes ved installasjon av presentasjonsavstemmeren, som vist tidligere. Denne funksjonen kan også installeres dynamisk i et tekstvisningsprogram ved hjelp av protokollen IPresentationReconciler. Det er ingen bestemte kjøretidsfordeler for noen av metodene, men ved å plassere overstyringer for all pluggbar funksjonalitet i en subklasse for SourceViewerConfiguration, kan alle funksjonsoverstyringer konsolideres på ett sted. Den dynamiske protokollen kan være nyttig når ulike presentasjonsavstemmere er tilknyttet et visningsprogram i hele perioden redigeringsprogrammet brukes.