Implementando um Visualizador de Estrutura

Um visualizador de mesclagem de estrutura desempenha uma comparação de duas ou três vias de suas entradas, apresenta o resultado em uma exibição hierárquica e permite que o usuário mescle entre as entradas.  Os visualizadores de mesclagem de estrutura são comuns para os recursos de espaço de trabalho ou para os membros de um arquivo archive.

Visualizadores de Estrutura Semelhante a uma Árvore

Como a implementação de vários visualizadores de comparação de estrutura baseia-se em uma árvore, o plug-in de comparação fornece um StructureDiffViewer baseado em uma árvore genérica. Seu plug-in é responsável pelo suprimento de um criador de estrutura que divide um único objeto de entrada em uma estrutura hierárquica. O StructureDiffViewer executa a comparação na estrutura resultante e exibe o resultado como uma árvore.

Você designa um criador de estrutura para seu plug-in utilizando a extensão org.eclipse.compare.structureCreators.Muito parecido com os visualizadores de conteúdo, um criador de estrutura pode ser especificado para um conjunto das extensões de arquivo ou um contentTypeBinding pode ser utilizado para associar um tipo de conteúdo a um criador de estrutura específico. Não revisaremos a marcação aqui já que é tão semelhante aos visualizadores de conteúdo. O plug-in do JDT define várias contribuições para org.eclipse.compare.structureCreators.

Outros Visualizadores de Estrutura Hierárquica

Em alguns casos, o StructureDiffViewer baseado em árvore pode não ser apropriado para seu plug-in.  O ponto de extensão org.eclipse.compare.structureMergeViewers permite definir sua própria implementação para um visualizador de mesclagem de estrutura. Um visualizador de mesclagem de estrutura pode ser especificado para as extensões de arquivo ou um contentTypeBinding pode ser utilizado para associar um tipo de conteúdo a um visualizador de mesclagem de estrutura específico. Consulte o plug-in do JDT para obter exemplos de contribuições do org.eclipse.compare.structureMergeViewers.

O plug-in de procura fornece várias classes do utilitário para ajudar a implementar um visualizador de procura.

Diferenciador 

Diferenciador é um mecanismo de diferenciação para dados estruturados hierarquicamente. Ele obtém duas ou três entradas e executa uma comparação em duas ou três vias.

Se os elementos de entrada para o mecanismo de diferenciação implementarem a interface IStructureComparator, o mecanismo aplicará recursivamente a si mesmo nos filhos do elemento de entrada. Os elementos folha devem implementar a interface IStreamContentAccessor para que o diferenciador possa executar uma comparação de bytes em seu conteúdo.

Há alguns bons exemplos de diferenciadores incluídos na implementação da plataforma:

Por padrão, o mecanismo de diferenciação retorna o resultado da operação de comparação como uma árvore de objetos DiffNode.  Um DiffNode descreve as alterações entre duas ou três entradas.  O tipo dos nós de resultado pode ser alterado substituindo um único método do mecanismo.

Visualizadores de Diferença

Uma árvore de DiffNodes pode ser exibida em um DiffTreeViewer. O DiffTreeViewer requer que os nós internos da árvore implementem a interface IDiffContainer e as folhas implementem a interface IDiffElement.

As etapas comuns para comparar dados estruturados hierarquicamente e para exibir as diferenças são as seguintes:

  1. Mapeie os dados de entrada em uma árvore de objetos implementando as interfaces IStructureComparator e IStreamContentAccessor
  2. Desempenhe a operação de comparação por meio do Diferenciador
  3. Alimente o resultado de diferenciação para o DiffTreeViewer

O StructureDiffViewer é um DiffTreeViewer especializado que automatiza as três etapas descritas acima. Ele obtém um único objeto de entrada do tipo ICompareInput do qual recupera os dois ou três elementos de entrada para comparação.   Ele utiliza um IStructureCreator para extrair uma árvore contendo os objetos IStructureComparator e IStreamContentAccessor deles.  Essas árvores são comparadas com o mecanismo de diferenciação e o resultado é exibido no visualizador de árvore.

O ZipFileStructureCreator é uma implementação da interface IStructureCreator e disponibiliza o conteúdo de um archive zip como uma estrutura hierárquica de IStructureComparators que podem ser facilmente comparados pelo mecanismo de diferenciação (Diferenciador). É um bom exemplo de como disponibilizar arquivos estruturados para a funcionalidade de comparação hierárquica do plug-in de comparação.