Med plugin-modulen for sammenlikning kan du oppgi spesialvisningsprogrammer for visning og sammenslåing av innholdsforskjeller mellom ustrukturerte elementer.
Et innholdsvisningsprogram brukes på steder der det bare er en inndataenhet tilgjengelig og der sammenlikning dermed er overflødig. Et typisk eksempel er funksjonen "Gjenopprett fra lokal historikk". Med utvidelsespunktet org.eclipse.compare.contentViewers kan du definere et spesialvisningprogram for innhold som ikke sammenlikner inndata.
<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>
Du finner spesialvisningsprogrammer fra plugin-modulen i visningsprogramelementet. Oppgi IDen til visningsprogrammet og opprettelsesklassen. Du kan dessuten oppgi hvilke filtyper som skal brukes i innholdsvisningsprogrammet.
Du kan også bruke elementet contentTypeBinding til å knytte en innholdstype til et innholdsvisningprogram.
Et visningsprogram for innholdssammenslåing utfører to- eller treveis sammenlikning av inndata som vises side ved side eller på annen måte. Visningsprogrammet lar brukeren foreta sammenslåing av de ulike inndataene. Visningsprogrammer for innholdssammenslåing brukes vanligvis for tekst eller bilder.
Hvis standard visningsprogrammer for sammenslåing ikke egner seg for plugin-modulens funksjon, kan du implementere ditt eget visningsprogram for innholdssammenslåing. Registrer dette visningsprogrammet sammen med plattformen, via utvidelsespunktet org.eclipse.compare.contentMergeViewers. Kodetypen nedenfor viser hvordan du definerer spesialvisningsprogrammer for innholdssammenslåing for visning av Java-filer og egenskapsfiler, 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>
På samme måte som med innholdsvisningsprogrammer, finner du spesialvisningsprogrammer for sammenslåing fra plugin-modulen, i visningsprogramelementet. Oppgi IDen til visningsprogrammet og opprettelsesklassen. Du kan dessuten oppgi hvilke filtyper som skal brukes i visningsprogrammet for innholdssammenslåing.
På samme måte som med innholdsvisningsprogrammer, kan du bruke contentTypeBinding til å knytte en innholdstype til et visningsprogram for sammenslåing. JDT-plugin-modulen binder visningsprogrammer for innholdssammenslåing til to ulike innholdstyper: Java-kildefiler og Java-egenskapsfiler.
ContentMergeViewer er et abstrakt visningsprogram for sammenlikning og sammenslåing der to innholdsområder vises side ved side, samt et tilleggsinnholdsområde for felles overordnet innhold (ved treveis sammenlikning). Siden implementeringen ikke tar hensyn til innholdstype, håndteres de spesifikke innholdstypene av subklassen.
ImageMergeViewer i org.eclipse.compare.internal viser hvordan du implementerer et enkelt visningsprogram for sammenslåing av bilder, ved hjelp av ContentMergeViewer. ContentMergeViewer får tilgang til modellen ved hjelp av en innholdsleverandør som må implementere grensesnittet IMergeViewerContentProvider.
Hvis det blir brukt tekst i visningsprogrammet, kan du bruke tilleggsklasser som sammenlikner og slår sammen tekstinnhold.
TextMergeViewer er en konkret subklasse av ContentMergeViewer og brukes ved sammenlikning og sammenslåing av tekstinnhold. Et visningsprogram for tekstsammenslåing bruker RangeDifferencer til å sammenlikne hver enkelt linje i teksten i to (eller tre) inndatadokumenter.
Hvis teksten på linjene er forskjellig, bruker TextMergeViewer en ITokenComparator til å finne den lengste mulige sekvensen med samsvar og manglende samsvar mellom symbolene. Sammenlikningen av standardsymboler for TextMergeViewer fungerer på tegn som er atskilt med blanktegn. Hvis det er behov for andre metoder (for eksempel for Java-symboler i et Java-visningsprogram for sammenslåing), er det mulig å opprette en egen symbolsammenlikning ved å implementere grensesnittet ITokenComparator.
TextMergeViewer brukes på hele dokumenter og på delområder av dokumenter. Hvis dokumentet er et deldokument må inndataene for visningsprogrammet være IDocumentRange og ikke IDocument.
RangeDifferencer finner den lengste mulige sekvensen med samsvar og manglende samsvar mellom entiteter i tekstinnhold. Implementeringen bygger på en objektbasert versjon av algoritmen som beskrives i A File Comparison Program av Webb Miller og Eugene W. Myers, Software Practice and Experience, Vol. 15, nov. 1985. Inndata må oppgis i sammenlikneren (defferencer) som implementerer grensesnittet IRangeComparator. IRangeComparator deler inndata inn i en sekvens med entiteter og inneholder en metode for sammenlikning av entiteter med en entitet i en annen IRangeComparator.
Hvis du for eksempel vil sammenlikne to tekstdokumenter og finne den lengste mulige fellessekvensen med samsvarende og ikke-samsvarende linjer, må implementeringen av IRangeComparator dele dokumentet opp i linjer og inneholde en metode der du kan teste om to linjer er like. Du finner et eksempel på hvordan du gjør dette, på org.eclipse.compare.internal.DocLineComparator.
Sammenlikneren returnerer forskjellene mellom disse sekvensene som en tabell med RangeDifference-objekter. Hver enkelt RangeDifference beskriver de ulike forskjellstypene (ingen endring, endring, tillegg, sletting) og de tilsvarende områdene for de underliggende entitetene som sammenliknes i de to eller tre inndatadokumentene.