Implementér indholdsfremviser

Plugin-sammenligningsfunktionen gør det muligt for dig at levere specialiserede fremvisere til fremvisning og sammenfletning af indholdsforskelle mellem ikke-strukturerede elementer.

Enkle indholdsfremvisere

En indholdsfremviser bruges de steder, hvor der kun er et enkelt tilgængeligt input, og hvor sammenligning derfor ikke er nødvendig.  Et typisk eksempel er funktionen "Gendan fra lokal historik". Udvidelsespunktetorg.eclipse.compare.contentViewers gør det muligt at definere en specialiseret indholdsfremviser, som ikke sammenligner sit input.

<extension
	point="org.eclipse.compare.contentViewers">
	<viewer
		extensions="java,java2"
		class="org.eclipse.jdt.internal.ui.compare.JavaTextViewerCreator"
		id="org.eclipse.jdt.internal.ui.compare.JavaTextViewerCreator">
	</viewer>
	<contentTypeBinding
		contentTypeId="org.eclipse.jdt.core.javaSource"
		contentViewerId="org.eclipse.jdt.internal.ui.compare.JavaTextViewerCreator">
	</contentTypeBinding>
</extension>   

Specialiserede fremvisere, som er bidraget af din plugin, defineres i elementet viewer. Du skal angive fremviserens id og den klasse, der opretter den. Du kan også angive eventuelle filtyper, som indholdsfremviseren skal bruges til.  

Du skal også bruge elementet contentTypeBinding til at knytte en indholdstype sammen med en indholdsfremviser.

Fremvisere til sammenflettet indhold

En fremviser til sammenflettet indhold udfører en tovejs- eller trevejssammenligning af sit input og præsenterer resultatet side om side eller på en anden passende måde.  I fremvisningen kan brugeren flette de forskellige input sammen. Fremvisere til sammenflettet indhold er fælles for tekst og billeder.

Hvis standardfremviserne til sammenflettet indhold ikke er relevante for din plugins funktioner, kan du implementere din egen fremviser til sammenflettet indhold. Fremviseren til sammenflettet indhold skal registreres sammen med platformen vha. udvidelsespunktet org.eclipse.compare.contentMergeViewers. Følgende kodning viser definitionen på specialiserede fremvisere til sammenflettet indhold til fremvisning af Java-filer og egenskabsfiler i Java IDE:

<extension
	point="org.eclipse.compare.contentMergeViewers">
	<viewer
		extensions="java,java2"
		class="org.eclipse.jdt.internal.ui.compare.JavaContentViewerCreator"
		id="org.eclipse.jdt.internal.ui.compare.JavaContentViewerCreator">
	</viewer>
	<contentTypeBinding
		contentTypeId="org.eclipse.jdt.core.javaProperties"
		contentMergeViewerId="org.eclipse.compare.TextMergeViewerCreator">
	</contentTypeBinding>
	<contentTypeBinding
		contentTypeId="org.eclipse.jdt.core.javaSource"
		contentMergeViewerId="org.eclipse.jdt.internal.ui.compare.JavaContentViewerCreator">
	</contentTypeBinding>
</extension>   

I lighed med indholdsfremvisere defineres specialiserede fremvisere til sammenflettet indhold, som er bidraget af din plugin, i elementet viewer. Du skal angive fremviserens id og den klasse, der opretter den. Du kan også angive eventuelle filtyper, som fremviseren til sammenflettet indhold skal bruges til.

Også i lighed med indholdsfremvisere kan du bruge contentTypeBinding til at knytte en indholdstype sammen med en fremviser til sammenflettet indhold. JDT-plugin-funktionen binder fremvisere af sammenflettet indhold sammen med to forskellige indholdstyper: Java-kilde og Java-egenskabsfiler.

ContentMergeViewer er en abstract-sammenligningsfunktion og en fremviser af sammenflettet indhold med to sidestillede indholdsområder og et valgfrit indholdsområde til en fælles stamklasse (med henblik på trevejssammenligning).  Da implementeringen ikke gør nogen antagelser om indholdstypen, er den underordnede klasse ansvarlig for at håndtere den specifikke indholdstype.   

ImageMergeViewer i org.eclipse.compare.internal viser, hvordan du implementerer en enkel fremviser til sammenflettet indhold til billeder vha. ContentMergeViewerContentMergeViewer opretter adgang til sin model vha. en indholdsudbyder, som skal implementere grænsefladen IMergeViewerContentProvider.

Tekstsammenfletning

Hvis fremviseren bruger tekst, kan du anvende yderligere klasser, som sammenligner og sammenfletter tekstindhold.

TextMergeViewer er den konkrete underordnede klasse til ContentMergeViewer, som bruges til sammenligning og sammenfletning af tekstindhold. En fremviser til sammenflettet tekst bruger RangeDifferencer til at udføre en tekstbaseret, linje for linje-sammenligning af to (eller tre) inputdokumenter.

I tilfælde af forskellige tekstlinjer bruger TextMergeViewer ITokenComparator til at finde de længste sekvenser med matchende og ikke-matchende tokens. TextMergeViewers standard-token sammenligner arbejde udført på tegn adskilt af tom plads. Hvis der er behov for en anden strategi (f.eks. Java-tokens i en Java-relateret fremviser til sammenflettet indhold), kan klienterne oprette deres egne token-sammenligningsfunktioner ved at implementere grænsefladen ITokenComparator.

TextMergeViewer fungerer på hele dokumenter og på underområder af dokumenter. I delvise dokumenter skal fremviserens input være IDocumentRange i stedet for IDocument.

Områdedifferentiering

RangeDifferencer finder de længste sekvenser med matchende og ikke-matchende sammenlignelige entiteter i tekstindholdet. Implementering af funktionen bygger på en objektbaseret version af den algoritme, som beskrives i A File Comparison Program af Webb Miller og Eugene W. Myers, Software Practice and Experience, bind 15, november 1985. Klienterne skal levere et input til den differentieringsfunktion, som implementerer grænsefladen IRangeComparator. IRangeComparator opdeler inputdata i en sekvens af entiteter og stiller en metode til rådighed for sammenligning af en entitet med entiteten i en anden IRangeComparator.

Hvis du f.eks. vil sammenligne to tekstdokumenter og finde de længste fælles sekvenser med matchende og ikke-matchende linjer, skal implementeringen af IRangeComparator opdele dokumentet i linjer og stille en metode til rådighed for test af, om to linjer kan anses for at være lige. org.eclipse.compare.internal.DocLineComparator indeholder et eksempel på, hvordan det kan udføres.

Differentieringsfunktionen returnerer forskellene på disse sekvenser som et array af RangeDifference-objekter. Hver enkelt RangeDifference beskriver typen af forskellene (ingen ændringer, ændringer, tilføjelse, sletning) og de tilsvarende områder for de underliggende sammenlignelige entiteter i de to eller tre input.