O plug-in de comparação permite fornecer visualizadores especializados para exibir e mesclar as diferenças de conteúdo entre os elementos não estruturados.
Um visualizador de conteúdo é utilizado em locais em que apenas uma única entrada está disponível e, portanto, a comparação não é necessária. Um exemplo típico disso é a função "Restaurar do Histórico Local". O ponto de extensão org.eclipse.compare.contentViewers permite definir um visualizador especializado de conteúdo que não compara suas entradas.
Um visualizador de mesclagem de conteúdo desempenha uma comparação em duas ou três vias de suas entradas e apresenta o resultado lado a lado ou de qualquer outra maneira adequada. O visualizador permite que o usuário mescle entre as entradas. Os visualizadores de mesclagem de conteúdo são comuns para texto ou imagens.
Se os visualizadores padrão de mesclagem não forem apropriados para a função de seu plug-in, você poderá optar por implementar seu próprio visualizador de conteúdo. Seu visualizador de conteúdo deve ser registrado com a plataforma utilizando o ponto de extensão org.eclipse.compare.contentMergeViewers . A marcação a seguir mostra a definição de visualizadores especializados de mesclagem de conteúdo para visualizar arquivos Java e de propriedades no 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>
Na marcação, você especifica o id do visualizador, a classe que o cria e a extensão do arquivo para a qual o visualizador de conteúdo deve ser utilizado.
ContentMergeViewer é um visualizador abstrato de comparação e combinação com duas áreas de conteúdo lado a lado e uma área de conteúdo opcional para um ascendente comum (para a comparação em três vias). Como a implementação não faz suposições sobre o tipo de conteúdo, a subclasse é responsável por lidar com o tipo específico de conteúdo.
ImageMergeViewer em org.eclipse.compare.internal mostra como implementar um visualizador de mesclagem simples para imagens utilizando um ContentMergeViewer. Um ContentMergeViewer acessa seu modelo por meio de um provedor de conteúdo que deve implementar a interface IMergeViewerContentProvider.
Se o seu visualizador utiliza texto, classes adicionais que comparam e mesclam conteúdo de texto podem ser utilizadas.
TextMergeViewer é a subclasse concreta de ContentMergeViewer utilizada para comparar e mesclar conteúdo de texto. Um visualizador de mesclagem de texto utiliza o RangeDifferencer para desempenhar uma comparação textual linha por linha de dois (ou três) documentos de entrada.
Para linhas de texto diferentes, o TextMergeViewer utiliza um ITokenComparator para localizar as seqüências mais longas de tokens correspondentes e não correspondentes. O token padrão do TextMergeViewer compara trabalhos em caracteres separados por espaço em branco. Se uma estratégia diferente for necessária (por exemplo, tokens de Java em um visualizador de combinação ciente do Java), os clientes poderão criar seus próprios comparadores de token através da implementação da interface ITokenComparator.
TextMergeViewer trabalha com documentos inteiros e subintervalos de documentos. Para partes de documentos, a entrada do visualizador deve ser um IDocumentRange, em vez de um IDocument.
RangeDifferencer localiza as seqüências mais longas de entidades comparáveis correspondentes e não-correspondentes no conteúdo de texto. Sua implementação está baseada em uma versão objetivada do algoritmo descrito em: A File Comparison Program, by Webb Miller and Eugene W. Myers, Software Practice and Experience, Vol. 15, Nov. 1985. Os clientes devem fornecer uma entrada para o diferenciador que implemente a interface IRangeComparator. IRangeComparator quebra os dados de entrada em uma seqüência de entidades e fornece um método para comparação de uma entidade com a entidade em outro IRangeComparator.
Por exemplo, para comparar dois documentos de texto e localizar as seqüências de linhas correspondentes e não correspondentes comuns mais longas, a implementação de IRangeComparator deve quebrar o documento em linhas e fornecer um método para testar se as duas linhas são consideradas iguais. Consulte org.eclipse.compare.internal.DocLineComparator para obter um exemplo de como isso pode ser feito.
O diferenciador retorna as diferenças entre essas seqüências como uma matriz de objetos RangeDifference. Cada RangeDifference única descreve o tipo de diferença (sem alteração, alteração, inclusão, exclusão) e as faixas correspondentes das entidades de base comparáveis nas duas ou três entradas.