Implementazione di un visualizzatore di contenuto

Il plugin di confronto consente di fornire visualizzatori specializzati per la visualizzazione e la funzione delle differenze di contenuto tra elementi non strutturati.

Visualizzatori di contenuto semplici

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.

<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>

I visualizzatori specifici forniti dal plugin sono indicati nell'elemento viewer. È necessario specificare l'id del visualizzatore e la classe. È possibile inoltre specificare qualsiasi estensione file per cui deve essere utilizzato il visualizzatore di contenuto.  

È possibile anche utilizzare l'elemento contentTypeBinding per associare un tipo di contenuto a un visualizzatore di contenuto.

Visualizzatori unione contenuto

Un visualizzatore unione contenuto 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 contenuto sono comuni per testo o immagini.

Se i visualizzatori unione standard non sono adatti alla funzione del proprio plugin, è possibile scegliere di implementare un visualizzatore di unione contenuto personalizzato.  Il visualizzatore di unione 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 contenuto specifici per la visualizzazione di file Java e delle proprietà nell'IDE Java:

<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>

Allo stesso modo dei visualizzatori di contenuto, i visualizzatori di unione specifici forniti dal plugin sono indicati nell'elemento viewer. È necessario specificare l'id del visualizzatore e la classe. È possibile inoltre specificare qualsiasi estensione file per cui deve essere utilizzato il visualizzatore di unione contenuto.

Allo stesso modo dei visualizzatori di contenuto, è possibile utilizzare contentTypeBinding per associare un tipo di contenuto a un visualizzatore di unione. Il plugin JDT collega i visualizzatori di unione contenuto a due tipi di contenuto diversi: i file di origine Java e i file delle proprietà Java.

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.

Unione di testo

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.

Differenziazione degli intervalli

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.