Il plug-in di confronto consente di fornire visualizzatori specializzati per la visualizzazione e la funzione delle differenze di contenuto tra elementi non strutturati.
Un visualizzatore di contenuto viene utilizzato laddove è disponibile un solo input e quindi non è necessario alcun confronto. Un esempio tipico è la funzione "Ripristina da cronologia locale". Il punto di estensione org.eclipse.compare.contentViewers consente di definire un visualizzatore di contenuto specializzato che non confronta gli input.
Un visualizzatore unione contenuti esegue un confronto bidirezionale o a tre vie dei propri input e presenta i risultati affiancati o in un'altra disposizione consona. Il visualizzatore consente all'utente di unire gli input. I visualizzatori unione contenuti sono comuni per testo o immagini.
Se i visualizzatori unione standard non sono adatti alla funzione del proprio plug-in, è possibile scegliere di implementare un visualizzatore di contenuto personalizzato. Il visualizzatore di contenuto dovrebbe essere registrato con la piattaforma mediante il punto di estensione org.eclipse.compare.contentMergeViewers. Il tag che segue mostra la definizione di visualizzatori unione contenuti specializzati per la visualizzazione di file Java e delle proprietà nell'IDE Java:
<extension point="org.eclipse.compare.contentMergeViewers"> <viewer id="org.eclipse.jdt.internal.ui.compare.JavaContentViewerCreator" extensions="java,java2" class="org.eclipse.jdt.internal.ui.compare.JavaContentViewerCreator"> </viewer> <viewer id="org.eclipse.jdt.internal.ui.compare.TextMergeViewerCreator" extensions="properties" class="org.eclipse.jdt.internal.ui.compare.TextMergeViewerCreator"> </viewer> </extension>
Nel tag, viene specificato l'id del visualizzatore, la classe che lo crea e il file di estensione per il quale deve essere utilizzato il visualizzatore di contenuto.
ContentMergeViewer è un visualizzatore di confronto e unione astratto con due aree di contenuto adiacenti e un'area di contenuto facoltativa per un predecessore comune (per il confronto a tre direzioni). Dal momento che l'implementazione non può prevedere il tipo di contenuto, spetta alla sottoclasse gestire il tipo di contenuto specifico.
ImageMergeViewer in org.eclipse.compare.internal mostra come implementare un semplice visualizzatore unione per le immagini mediante ContentMergeViewer. Un ContentMergeViewer accede al proprio modello attraverso un fornitore di contenuti che deve implementare l'interfaccia IMergeViewerContentProvider.
Se il visualizzatore utilizza del testo, è possibile utilizzare classi aggiuntive che confrontano e uniscono il contenuto del testo.
TextMergeViewer è la sottoclasse concreta di ContentMergeViewer che si utilizza per confrontare e unire contenuti di testo. Un visualizzatore di unione testo utilizza RangeDifferencer per eseguire un confronto testuale, riga per riga di due o tre documenti di input.
Per le righe di testo differenti, TextMergeViewer utilizza un ITokenComparator per rilevare le sequenze più lunghe di token corrispondenti e non corrispondenti. Il confronto dei token predefiniti di TextMergeViewer funziona sui caratteri separati da uno spazio. In caso di esigenze particolari (ad esempio, token Java in un visualizzatore di unione che rileva Java), i client possono creare un proprio comparatore di token implementando l'interfaccia ITokenComparator.
TextMergeViewer funziona su documenti completi e su intervalli secondari di documenti. Per i documenti parziali, l'input del visualizzatore deve essere un IDocumentRange al posto di un IDocument.
La classe RangeDifferencer rileva le sequenze più lunghe di entità confrontabili corrispondenti e non corrispondenti nel contenuto del testo. L'implementazione si basa su una versione oggettiva dell'algoritmo descritto nella pubblicazione: A File Comparison Program, di Webb Miller e Eugene W. Myers, Software Practice and Experience, Vol. 15, Nov. 1985. I client devono fornire un input al differenziatore che implementa l'interfaccia IRangeComparator. IRangeComparator interrompe i dati di input in una sequenza di entità e fornisce un metodo per il confronto di un'entità con l'entità in un altro IRangeComparator.
Ad esempio, per confrontare due documenti di testo e trovare le sequenze comuni più lunghe di righe corrispondenti e non corrispondenti, l'implementazione di IRangeComparator deve suddividere il documento in righe e fornire un metodo per il test se due righe sono considerate uguali. Per un esempio di come si possa eseguire tale operazione, vedere org.eclipse.compare.internal.DocLineComparator.
Questa classe riporta le differenze tra queste sequenze come una matrice di oggetti RangeDifference. Ogni singolo RangeDifference descrive il tipo di differenza (nessuna modifica, modifica, aggiunta, eliminazione) e gli intervalli corrispondenti di entità confrontabili sottostanti in due o tre input.