Implémentation d'un afficheur de contenu

Le plug-in de comparaison vous donne la possibilité de fournir des afficheurs spécialisés permettant de visualiser et de fusionner les différences de contenu entre des éléments non structurés.

Afficheurs de contenu simples

Un afficheur de contenu est employé lorsqu'une seule entrée est disponible et qu'aucune comparaison n'est donc nécessaire.  L'exemple le plus parlant est la fonction de "restauration à partir de l'historique local".  Le point d'extension org.eclipse.compare.contentViewers permet de définir un afficheur de contenu spécialisé qui ne compare pas ses entrées.

Afficheurs de fusion de contenu

Un afficheur de fusion de contenu effectue une comparaison bi et trilatérale de ses entrées, présente les résultats en parallèle ou de toute autre manière synthétique  et laisse l'utilisateur faire le liens entre les entrées. Ces afficheurs sont employés dans le cas de texte et d'images.

Si les afficheurs de fusion standard ne sont pas appropriés à la fonction de votre plug-in, vous pouvez mettre en oeuvre votre propre afficheur de fusion de contenu.  L'afficheur de contenu doit être enregistré sur la plateforme à l'aide du point d'extension org.eclipse.compare.contentMergeViewers.   Les marques suivantes indiquent la définition des afficheurs de fusion de contenu spécialisés destinés à la visualisation des fichiers Java et de propriétés dans un environnement de développement intégré (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>

Les marques permettent d'indiquer l'id de l'afficheur, la classe qui le crée et l'extension de fichier que l'afficheur de contenu doit utiliser.  

ContentMergeViewer correspond à un afficheur abstrait de comparaison et de fusion, composé de deux zones de contenu côte à côte et d'une zone facultative pour un ancêtre commun (pour les comparaisons trilatérales).  Dans la mesure où la mise en oeuvre n'émet aucune hypothèse concernant le type de contenu, il appartient à la sous-classe de prendre en charge le type spécifique du contenu.  

ImageMergeViewer dans org.eclipse.compare.internal illustre comment implémenter un afficheur de fusion pour des images à l'aide de ContentMergeViewerContentMergeViewer accède à son modèle grâce à un fournisseur de contenu devant implémenter l'interface IMergeViewerContentProvider.

Fusion de texte

Si votre afficheur utilise du texte, vous pouvez employer des classes supplémentaires capables de  comparer et fusionner du texte.

TextMergeViewer correspond à la sous-classe concrète de ContentMergeViewer pour la comparaison et la fusion de texte.  Un afficheur de fusion de texte utilise RangeDifferencer pour effectuer une comparaison textuelle ligne par ligne de deux ou trois documents d'entrée. 

Pour les lignes de texte différentes, TextMergeViewer utilise un ITokenComparator pour rechercher les séquences les plus longues des jetons concordants et non concordants. La comparaison de jeton par défaut de TextMergeViewer porte sur les caractères séparés par un espace. Si une stratégie différente est requises (par exemple, des jetons Java dans un afficheur de fusion Java), les clients peuvent créer leurs propres comparateurs de jetons en mettant en oeuvre l'interface ITokenComparator.  

TextMergeViewer fonctionne sur des documents entiers et les sous-ensembles de documents. Dans le cas de documents partiels, l'entrée de l'afficheur doit être un IDocumentRange au lieu d'un IDocument.

Analyse des différences d'entités

RangeDifferencer recherche les plus longues séquences d'entités comparables concordantes ou non concordantes d'un texte. Son implémentation est basée sur une version de l'algorithme décrit dans A File Comparison Program,, de Webb Miller et Eugene W. Myers, Software Practice and Experience, Vol. 15, Nov. 1985.  Les clients doivent fournir l'entrée au module d'analyse des différences comme implémentation de l'interface IRangeComparator. IRangeComparator divise les données d'entrée en une séquence d'entités et fournit une méthode de comparaison d'une entité avec celle d'une autre interface IRangeComparator.

Par exemple, pour comparer deux documents de texte et trouver les séquences courantes les plus longues de lignes concordantes et non concordantes, l'implémentation de IRangeComparator doit diviser le document en lignes et fournir une méthode pour vérifier si deux lignes sont identiques. Observez org.eclipse.compare.internal.DocLineComparator à titre d'exemple.

Le module d'analyse de différences renvoie les différences dans ces séquences sous la forme d'un tableau d'objets RangeDifference. Chaque RangeDifference décrit le type de différence (pas de changement, changement, ajout, suppression) et les ensembles correspondants des entités comparables sous-jacentes dans les deux ou trois entrées.

 

Copyright IBM Corporation and others 2000, 2003.