O plug-in de comparação fornece suporte substancial para implementação de seu próprio visualizador de conteúdo:
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 cria hipóteses sobre o tipo de conteúdo, é responsabilidade da subclasse lidar com um tipo específico. ImageMergeViewer em org.eclipse.compare.internal mostra como implementar um visualizador de combinação simples para imagens que utilizam um ContentMergeViewer. Um ContentMergeViewer acessa seu modelo por meio de um provedor de conteúdo que deve implementar a interface IMergeViewerContentProvider.
TextMergeViewer é a subclasse concreta padrão de ContentMergeViewer para comparação e combinação de conteúdo de texto. Um visualizador de combinação de texto utiliza o RangeDifferencer para executar 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 for necessária uma estratégia diferente (por exemplo, tokens Java em um visualizador de combinação com reconhecimento de Java), os clientes poderão criar seus próprios comparadores de token implementando a interface ITokenComparator. O TextMergeViewer funciona em documentos inteiros e em subfaixas 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. Sua implementação baseia-se em uma versão objetivada do algoritmo descrita em: A File Comparison Program, by Webb Miller and Eugene W. Myers, Software Practice and Experience, Vol. 15, Nov. 1985. Os clientes devem fornecer a entrada para o diferenciador como uma implementação da interface IRangeComparator. IRangeComparator divide 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 dividir 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.