比较插件允许您提供用于查看和合并非结构化元素之间的内容差别的专用查看器。
内容查看器用于仅有一个可用输入而无需比较的情况。其典型示例为“从本地历史记录恢复”功能。org.eclipse.compare.contentViewers 扩展点允许您定义不对其输入进行比较的专用内容查看器。
内容合并查看器对其输入执行两方或三方比较,并行显示结果或以其它合适的方式显示。查看器允许用户合并输入。内容合并查看器适用于文本或图像。
如果标准合并查看器不适用于插件的功能,则可选择实现您自己的内容查看器。应使用 org.eclipse.compare.contentMergeViewers 扩展点向平台注册您的内容查看器。以下标记显示用于查看 Java 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>
在该标记中,您指定查看器的 id,创建它的 class 和内容查看器应使用的文件 extension。
ContentMergeViewer 是一个抽象比较与合并查看器,它有两个并排的内容区以及一个公共祖先的可选内容区(用于三方比较)。由于此实现不作任何关于内容类型的假定,所以由子类负责处理特定的内容类型。
org.eclipse.compare.internal 中的 ImageMergeViewer 显示如何使用 ContentMergeViewer 对图像实现简单合并查看器。ContentMergeViewer 通过内容提供程序访问它的模型,该提供程序必须实现 IMergeViewerContentProvider 接口。
如果查看器使用文本,则可以使用比较和合并文本内容的附加类。
TextMergeViewer 是 ContentMergeViewer 的具体子类,它用于比较和合并文本内容。文本合并查看器使用 RangeDifferencer 来执行两个(或三个)输入文档的逐行文本比较。
对于不同的文本行,TextMergeViewer 使用 ITokenComparator 来查找匹配和不匹配标记的最长序列。TextMergeViewer 对由空格分隔的字符执行缺省标记比较。如果需要另一战略(例如,Java 感知合并查看器中的 Java 标记),则客户机可以通过实现 ITokenComparator 接口来创建它们自己的标记比较器。
TextMergeViewer 处理整个文档,也可以处理文档的某些部分。对于部分文档,查看器的输入必须是 IDocumentRange 而不是 IDocument。
RangeDifferencer 查找文本内容中匹配和不匹配的可比较实体的最长序列。它的实现基于以下内容中所描述算法的对象化版本: A File Comparison Program(出自 Software Practice and Experience,Vol. 15, Nov. 1985,作者为 Webb Miller 和 Eugene W. Myers)。 客户机必须向实现 IRangeComparator 接口的区分器提供输入。IRangeComparator 将输入数据分割为实体序列并提供用于将一个实体与另一 IRangeComparator 中的实体进行比较的方法。
例如,要对两个文本文档进行比较并查找匹配和不匹配行的最长公共序列,IRangeComparator 的实现必须将文档分割成若干行并提供用于测试是否认为两行相同的方法。有关如何完成它的示例,参见 org.eclipse.compare.internal.DocLineComparator。
区分器将这些序列之间的差别作为 RangeDifference 对象的数组返回。每一个 RangeDifference 都描述差别类型(无更改、更改、添加或删除)以及两个或三个输出中的基本可比较实体的对应范围。