Met de vergelijkingsplugin kunt u gespecialiseerde viewers aanleveren waarmee de gebruikers contentverschillen tussen ongestructureerde elementen kunnen bekijken en samenvoegen.
Een contentviewer wordt gebruikt wanneer er slechts één invoerelement beschikbaar is en dus geen vergelijking nodig is. Een goed voorbeeld hiervan is de functie "Herstellen uit lokale historie". Met het extensiepunt org.eclipse.compare.contentViewers kunt u een speciale contentviewer definiëren waarvan de invoerelementen niet met elkaar worden vergeleken.
<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>
Speciale viewers die worden aangeleverd door uw plugin worden aangewezen in het element viewer. Hiertoe geeft u het ID (id) van de viewer op en de klasse (class) die de viewer maakt. U kunt ook alle bestandsextensies (extensions) opgeven waarvoor de contentviewer moet worden gebruikt.
Desgewenst gebruikt u het element contentTypeBinding om de contentviewer te koppelen aan een inhoudtype.
Een contentsamenvoegingsviewer voert een vergelijking van twee of drie invoerstromen uit en geeft de resultaten naast elkaar of op een andere overzichtelijke manier weer. De gebruiker kan de verschillende invoerstromen vervolgens samenvoegen tot één stroom. Contentsamenvoegingsviewers worden vaak gebruikt voor tekst of afbeeldingen.
Als de standaard samenvoegingsviewers ongeschikt zijn voor de beoogde functie van uw plugin, kunt u ervoor kiezen om uw eigen contentsamenvoegingsviewer te implementeren. Uw contentsamenvoegingsviewer moet bij het platform worden geregistreerd met behulp van het extensiepunt org.eclipse.compare.contentMergeViewers. In de volgende markup ziet u de definitie van speciale contentsamenvoegingsviewers voor de weergave van Java-bestanden en eigenschappenbestanden in de 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>
Net als bij contentviewers worden speciale samenvoegingsviewers die door uw plugin worden aangeleverd, aangewezen in het element viewer. Hiertoe geeft u het ID (id) van de viewer op en de klasse (class) die de viewer maakt. U kunt ook alle bestandsextensies (extensions) opgeven waarvoor de contentsamenvoegingsviewer moet worden gebruikt.
Net als bij contentviewers kunt u contentTypeBinding gebruiken om een samenvoegingsviewer aan een inhoudtype te koppelen. In de JDT-plugin kunnen contentsamenvoegingsviewers aan twee inhoudtypen worden gekoppeld: Java-bronbestanden en Java-eigenschappenbestanden.
ContentMergeViewer is een abstracte vergelijkings- en samenvoegingsviewer met twee naast elkaar gelegen contentgebieden en één optioneel contentgebied voor een gemeenschappelijke item op hoger niveau (voor drierichtingsvergelijkingen). Omdat bij de implementatie geen veronderstellingen worden gemaakt over het inhoudtype, is de subklasse verantwoordelijk voor de verwerking van het specifieke inhoudtype.
ImageMergeViewer in org.eclipse.compare.internal laat zien hoe u een eenvoudige samenvoegingsviewer voor afbeeldingen kunt implementeren met ContentMergeViewer. Een ContentMergeViewer verkrijgt toegang tot het bijbehorende model door middel van een contentprovider die de interface IMergeViewerContentProvider moet implementeren.
Als uw viewer gebruikmaakt van tekst, kunnen aanvullende klassen voor het vergelijken en samenvoegen van tekstinhoud worden gebruikt.
TextMergeViewer is de concrete subklasse van ContentMergeViewer die wordt gebruikt voor het vergelijken en samenvoegen van tekstinhoud. Een tekstsamenvoegingsviewer maakt gebruik van de RangeDifferencer (bereikvergelijkingsprogramma) om de tekst van twee (of drie) invoerdocumenten regel voor regel te vergelijken.
Voor tekstregels die verschillen, maakt de TextMergeViewer gebruik van een ITokenComparator om de langste reeksen van overeenkomende en niet-overeenkomende tokens te bepalen. De standaardtokenvergelijkingsroutine van TextMergeViewer werkt op tekens die worden gescheiden door witruimte. Als u een andere strategie wilt gebruiken (bijvoorbeeld Java-tokens in een Java-samenvoegingsviewer), kunt u clients hun eigen tokenvergelijkingsroutines (comparators) laten definiëren door de interface ITokenComparator te implementeren.
TextMergeViewer kan zowel worden toegepast op volledige als gedeeltelijke documenten. Voor gedeeltelijke documenten moet de invoer van de viewer een IDocumentRange zijn in plaats van een IDocument.
RangeDifferencer wordt gebruikt om de langste reeksen overeenkomende en niet-overeenkomende vergelijkbare entiteiten in teksten te bepalen. De implementatie ervan is gebaseerd op een object-georiënteerde versie van het algoritme dat wordt beschreven in A File Comparison Program van Webb Miller en Eugene W. Myers, Software Practice and Experience, Vol. 15, Nov. 1985. Clients moeten invoergegevens voor het vergelijkingsprogramma aanleveren waarmee de interface IRangeComparator wordt geïmplementeerd. De invoergegevens worden door IRangeComparator onderverdeeld in een reeks entiteiten, waarna de entiteiten met elkaar kunnen worden vergeleken in een ander exemplaar van IRangeComparator.
Als u bijvoorbeeld twee tekstdocumenten wilt vergelijken en de langste gemeenschappelijke reeksen van overeenkomende en niet-overeenkomende regels wilt bepalen, moet de implementatie van IRangeComparator het document onderverdelen in regels en een methode aanleveren om te testen of twee regels als zijnde identiek moeten worden beschouwd. Zie org.eclipse.compare.internal.DocLineComparator voor een voorbeeld van hoe u dit kunt doen.
Het vergelijkingsprogramma retourneert de verschillen tussen de reeksen als een array van RangeDifference-objecten. Elk exemplaar van RangeDifference geeft een beschrijving van het soort verschil (geen wijziging, wijziging, toevoeging, verwijdering) en het bijbehorende bereik van de onderliggende vergelijkbare entiteiten in de twee of drie invoerstromen.