Для модуля сравнения можно указать специальные программы просмотра, позволяющие просматривать и объединять различия, обнаруженные в элементах без структуры.
Программа просмотра содержимого применяется для обработки одиночного ввода, когда сравнение не требуется. В качестве примера можно привести функцию "Восстановить из локальной хронологии". Точка расширения org.eclipse.compare.contentViewers позволяет задать специальную программу просмотра, которая не выполняет сравнение входных данных.
<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>
Специальные программы просмотра, предоставляемые модулем, указываются с помощью атрибута viewer. Необходимо указать атрибуты id и class, описывающие ИД программы просмотра и класс на основе которого она создается. Кроме того, с помощью атрибута extensions можно указать расширения файлов, связанные с этой программой просмотра содержимого.
Элемент contentTypeBinding позволяет связать с программой просмотра тип содержимого.
Программа просмотра объединения содержимого выполняет двух- или трехстороннее сравнение входных данных и представляет полученные результаты в последовательном, либо другом подходящем виде. С ее помощью пользователь может объединять входные данные. Для текста и изображений применяются одни и те же программы просмотра объединения.
Если стандартные программы просмотра объединения не подходят для функции модуля, вы можете реализовать собственную программу просмотра объединения содержимого. Ее необходимо зарегистрировать в платформе с помощью точки расширения org.eclipse.compare.contentMergeViewers. Ниже приведен пример определения специальных программ просмотра объединения содержимого, предназначенных для просмотра файлов Java и файлов свойств в интегрированной среде разработки 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>
Аналогично стандартным программам просмотра содержимого специальные программы просмотра объединения, предоставляемые модулем, задаются с помощью атрибута viewer. Необходимо указать атрибуты id и class, описывающие ИД программы просмотра и класс на основе которого она создается. Кроме того, с помощью атрибута extensions можно указать расширения файлов, связанные с этой программой просмотра объединения.
Кроме того, аналогично программам просмотра содержимого с помощью contentTypeBinding программу просмотра объединения можно связать с типом содержимого. Модуль JDT связывает программы просмотра объединения содержимого с двумя другими типами содержимого: исходным кодом Java и файлами свойств Java.
ContentMergeViewer - это абстрактная программа просмотра сравнения и объединения с двумя примыкающими друг к другу областями содержимого, а также дополнительной областью содержимого общего предка (случай трехстороннего сравнения). Поскольку реализация не задает тип содержимого, за его обработку отвечает соответствующий производный класс.
В качестве примера реализации простой программы просмотра с помощью ContentMergeViewer можно привести класс ImageMergeViewer из пакета org.eclipse.compare.internal. ContentMergeViewer обращается к модели с помощью источника данных, который должен применять интерфейс IMergeViewerContentProvider.
Если программа просмотра обрабатывает текст, допустимо применение дополнительных классов, сравнивающих и объединяющих текст.
TextMergeViewer - это действительный производный класс ContentMergeViewer, применяемый для сравнения и объединения текста. Программа просмотра объединения текста применяет RangeDifferencer для построкового сравнения двух (или трех) входных документов.
При обнаружении отличающихся строк текста TextMergeViewer вызывает интерфейс ITokenComparator для поиска последовательностей совпадающих и несовпадающих маркеров максимальной длины. Функция сравнения маркеров по умолчанию, предусмотренная в классе TextMergeViewer, поддерживает символы, разделенные пробелами. Если требуется другая стратегия (например, маркеры Java в программе просмотра объединения с поддержкой Java), клиенты могут создать собственные функции сравнения, реализовав интерфейс ITokenComparator.
Класс TextMergeViewer применим как к документам в целом, так и к их фрагментам. Для обработки фрагментов документов вместо параметра IDocument во входных данных программы просмотра должен быть указан параметр IDocumentRange.
RangeDifferencer выполняет в текстовом содержимом поиск последовательности совпадающих или несовпадающих объектов максимальной длины. Его реализация основана на варианте алгоритма, описанного в следующей публикации: A File Comparison Program, Webb Miller and Eugene W. Myers, Software Practice and Experience, Vol. 15, Nov. 1985. Клиенты должны предоставить входные данные службе поиска различий, применяющей интерфейс IRangeComparator. IRangeComparator разбивает входные данные на последовательность объектов и предоставляет способ сравнения отдельных объектов с объектами другого интерфейса IRangeComparator.
Например, для того чтобы сравнить два текстовых документа и найти последовательности совпадающих и несовпадающих строк максимальной длины реализация IRangeComparator должна разбить документ на строки и предоставить метод для проверки совпадения двух строк. Соответствующий пример приведен в разделе org.eclipse.compare.internal.DocLineComparator.
Программа поиска различий возвращает различия между последовательностями в виде массива объектов RangeDifference. Каждый экземпляр RangeDifference описывает тип различия (нет изменений, изменение, добавление, удаление), а также соответствующие диапазоны базовых сравниваемых объектов в двух или трех входных потоках.