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.
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.
<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>
Les afficheurs spécialisés auxquels ont contribué le plug-in sont signalés dans l'élément viewer. Vous devez indiquer l'id de l'afficheur et la class qui le crée. Vous pouvez également indiquer des extensions de fichier pour lesquelles l'afficheur de contenu doit être utilisé.
Vous pouvez également utiliser l'élément contentTypeBinding afin d'associer un type de contenu à un afficheur 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 pour la fonction du plug-in, vous pouvez choisir d'implémenter votre propre afficheur de fusion de contenu. L'afficheur de fusion de contenu doit être enregistré avec la plate-forme à l'aide du point d'extension org.eclipse.compare.contentMergeViewers. Le marquage ci-dessous indique la définition des afficheurs de fusion de contenu spécialisés, destinés à l'affichage de fichiers Java et de fichiers properties dans l'environnement 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>
Tout comme les afficheurs de contenu, les afficheurs de fusion spécialisés auxquels ont contribué le plug-in sont signalés dans l'élément viewer. Vous devez indiquer l'id de l'afficheur et la class qui le crée. Vous pouvez également indiquer des extensions de fichier pour lesquelles l'afficheur de fusion doit être utilisé.
Comme avec les afficheurs de contenu, vous pouvez utiliser contentTypeBinding pour associer un type de contenu à un afficheur de fusion. Le plug-in JDT lie les afficheurs de fusion de contenu aux deux différents types de contenu : fichier source Java et fichiers properties Java.
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 ContentMergeViewer. ContentMergeViewer accède à son modèle grâce à un fournisseur de contenu devant implémenter l'interface IMergeViewerContentProvider.
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.
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.