Implémentation d'un afficheur de structure

Un afficheur de fusion de structure effectue une comparaison bi et trilatérale de ses entrées, présente les résultats sous forme hiérarchique et laisse l'utilisateur faire le lien entre les entrées.  Ces afficheurs sont employés dans le cas de ressources d'espace de travail ou de membres d'un fichier d'archivage.

Afficheurs de structure en arborescence

L'implémentation de la plupart des afficheurs de comparaison de structures étant généralement basée sur une arborescence, le plug-in de comparaison fournit un StructureDiffViewer générique. Le plug-in est chargé de fournir un créateur de structure, qui fragmente un objet d'entrée unique en structure hiérarchique. StructureDiffViewer effectue la comparaison de la structure qui en résulte et affiche le résultat sous forme d'arborescence.

L'extension org.eclipse.compare.structureCreators permet de désigner un créateur de structure pour votre plug-in. Tout comme les afficheurs de contenu, il est possible de spécifier un créateur de structure pour un ensemble d'extensions de fichier ou d'utiliser contentTypeBinding pour associer un type de contenu à un créateur de structure déterminé. Nous ne revenons pas sur le marquage ici car il s'apparente de près à celui des afficheurs de contenu. Le plug-in JDT définit plusieurs contributions pour org.eclipse.compare.structureCreators.

Autres afficheurs de structure hiérarchique

Dans certains cas, le StructureDiffViewer basé sur l'arborescence n'est pas approprié à votre plug-in.  Le point d'extension org.eclipse.compare.structureMergeViewers vous permet de définir votre propre implémentation d'afficheur de fusion de structure. Il est possible de spécifier un afficheur de fusion de structure pour des extensions de fichier ou d'utiliser contentTypeBinding pour associer un type de contenu à un afficheur de fusion de structure. Pour découvrir des exemples de contributions org.eclipse.compare.structureMergeViewers, reportez-vous au plug-in JDT.

Le plug-in de recherche propose plusieurs classes d'utilitaire pour vous aider à implémenter un afficheur de recherche.

Module d'analyse des différences 

Differencer est un moteur d'analyse des différences destiné aux données structurées de façon hiérarchique. Il sélectionne deux ou trois entrées sur lesquelles il effectue une opération de comparaison bidirectionnelle ou tridirectionnelle.

Si les éléments d'entrée du moteur d'analyse des différences mettent en oeuvre l'interface IStructureComparator, le moteur s'applique de manière récursive aux enfants de l'élément d'entrée. Les éléments feuille doivent mettre en oeuvre l'interface IStreamContentAccessor de sorte que l'analyseur des différences les soumettent à une comparaison au niveau des octets.

L'implémentation de la plate-forme inclut quelques bons exemples de modules d'analyse des différences :

Par défaut, le moteur d'analyse des différences renvoie le résultat de l'opération de comparaison sous la forme d'une arborescence d'objets DiffNode. Un DiffNode décrit les changements de deux ou trois entrées. Le type des noeuds résultants peut être modifié en remplaçant une méthode du moteur.

Afficheurs de différences

Une arborescence de plusieurs DiffNode peut être affichée dans un DiffTreeViewer. DiffTreeViewer impose aux noeuds internes l'implémentation de l'interface IDiffContainer et aux feuilles celle de l'interface IDiffElement.

La procédure standard permettant la comparaison hiérarchique des données structurées et l'affichage des différences se présente comme suit :

  1. Mappage des données d'entrées dans une arborescence d'objets implémentant les interfaces IStructureComparator et IStreamContentAccessor.
  2. Exécution de l'opération de comparaison à l'aide de la classe Differencer.
  3. Insertion du résultat de différenciation dans DiffTreeViewer.

StructureDiffViewer correspond à une spécialisation de DiffTreeViewer qui automatise les trois étapes ci-dessus. Il extrait d'un objet d'entrée unique de type ICompareInput les deux ou trois éléments d'entrée à comparer.  Il utilise ensuite un IStructureCreator pour en extraire une arborescence contenant les objets IStructureComparator et IStreamContentAccessor.  Ces arborescences sont ensuite comparées au moteur d'analyse de différences et le résultat apparaît dans l'afficheur d'arborescence.

ZipFileStructureCreator est une implémentation de l'interface IStructureCreator et rend disponible le contenu d'une archive zip sous la forme d'une structure hiérarchique des IStructureComparator pouvant ainsi être facilement comparés par le moteur d'analyse des différences (Differencer). Cet exemple illustre parfaitement comment rendre des fichiers structurés disponibles pour la fonction de comparaison hiérarchique du plug-in de comparaison.