Implementar um visualizador de conteúdos

O plug-in de comparação permite fornecer visualizadores especializados para ver e intercalar diferenças de conteúdos entre elementos desestruturados.

Visualizadores de conteúdos simples

Um visualizador de conteúdos utiliza-se em lugares onde esteja disponível uma simples entrada de dados e, por conseguinte, não seja necessário comparação alguma.  Um exemplo típico disto é a função "Restaurar a partir do Histórico Local".  O ponto de extensão org.eclipse.compare.contentViewers permite definir um visualizador de conteúdos especializado que não compare as respectivas entradas de dados.

   <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>

Os visualizadores especializados com que o plug-in em questão contribuiu estão designados no elemento visualizador. É necessário especificar o id do visualizador e a classe que o criou. Também poderá especificar quaisquer extensões de ficheiros para as quais deve ser utilizado o visualizador de conteúdos.   

Também poderá utilizar o elemento contentTypeBinding para associar um tipo de conteúdo a um visualizador de conteúdos.

Visualizadores de intercalação de conteúdos

Um visualizador de intercalação de conteúdos realiza uma comparação em dois sentidos ou em três sentidos das respectivas entradas de dados e apresenta o resultado lado a lado ou em qualquer outra forma adequada.  O visualizador deixa o utilizador intercalar entre as entradas de dados. Os visualizadores de intercalação de conteúdos são comuns para texto ou imagens.

Se os visualizadores de intercalação de conteúdos padrão não forem apropriados para a função do plug-in, poderá optar por implementar o seu próprio visualizador de intercalação de conteúdos.  O seu visualizador de intercalação de conteúdos deve estar registado na plataforma através do ponto de extensão org.eclipse.compare.contentMergeViewers.  A marcação seguinte mostra a definição de visualizadores de intercalação de conteúdos especializados para ver ficheiros Java e ficheiros de propriedades no IDE Java:

   <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>

Similares aos visualizadores de conteúdos, os visualizadores de intercalação de conteúdos especializados com que o plug-in em questão contribuiu estão designados no elemento visualizador. É necessário especificar o id do visualizador e a classe que o criou. Também poderá especificar quaisquer extensões de ficheiros para as quais deve ser utilizado o visualizador de intercalação de conteúdos.

Também semelhante aos visualizadores de conteúdos, poderá utilizar contentTypeBinding para associar um tipo de conteúdo a um visualizador de intercalação. O plug-in JDT associa visualizadores de intercalação a dois tipos de conteúdo diferentes: ficheiros origem Java e ficheiros de propriedades Java.

ContentMergeViewer é um visualizador de intercalação e comparação abstracto com duas áreas de conteúdos lado a lado e uma área de conteúdos opcional para um antepassado comum (para comparação de três sentidos).  Dado que a implementação não infere o tipo de conteúdo, a subclasse é responsável por tratar do tipo de conteúdo específico.   

ImageMergeViewer em org.eclipse.compare.internal mostra como implementar um único visualizador de conteúdos para imagens através de um ContentMergeViewer.  Um ContentMergeViewer acede ao respectivo modelo mediante um fornecedor de conteúdos que deve implementar a interface IMergeViewerContentProvider.

Intercalação de texto

Se o visualizador utilizar texto, podem utilizar-se classes  adicionais que comparem e intercalem conteúdo textual.

TextMergeViewer é a subclasse concreta de ContentMergeViewer utilizada para comparar e intercalar conteúdo textual.  Um visualizador de intercalação de texto utiliza o RangeDifferencer para realizar uma comparação textual, linha a linha de dois (ou três) documentos de entrada de dados.

Para linhas de texto díspares, o TextMergeViewer utiliza um ITokenComparator para localizar as sequências mais longas de sinais correspondentes e não correspondentes. A comparação de sinal predefinida de TextMergeViewer funciona em caracteres separados por espaços em branco. Se for necessária uma estratégia diferente (por exemplo, sinais Java num visualizador de intercalação sensível a Java), os clientes podem criar os seus próprios comparadores de sinais, implementando a interface ITokenComparator.

TextMergeViewer funciona em documentos inteiros e em sub-intervalos de documentos. No caso de documentos parciais, a entrada de dados do visualizador deve ser um IDocumentRange em vez de um IDocument.

Diferenciação de intervalos

O RangeDifferencer localiza as sequências mais longas de entidades comparáveis correspondentes e não correspondentes no conteúdo textual. A sua implementação baseia-se numa versão objectificada do algoritmo descrito em A File Comparison Program (programa de comparação de ficheiros) da autoria de Webb Miller e Eugene W. Myers, Software Practice and Experience, Vol. 15, Nov. 1985. Os clientes devem proporcionar uma entrada de dados ao diferenciador que implemente a interface IRangeComparator. IRangeComparator divide os dados de entrada numa sequência de entidades e faculta um método para comparar uma entidade com a entidade noutro IRangeComparator.

Por exemplo, para comparar dois documentos de texto e localizar as mais longas sequências comuns de linhas correspondentes e não correspondentes, a implementação de IRangeComparator deve dividir o documento em linhas e facultar um método para testar se as duas linhas são ou não consideradas iguais. Consulte org.eclipse.compare.internal.DocLineComparator para um exemplo de execução deste teste.

O diferenciador devolve as diferenças entre estas sequências como matriz de objectos RangeDifference. Cada RangeDifference descreve a espécie de diferença (sem alteração, alteração, adição, eliminação) e os intervalos correspondentes das entidades comparáveis subjacentes nas duas ou três entradas de dados.