结构合并查看器对其输入执行两方或三方比较,在分层视图中显示结果,并让用户合并输入。结构合并查看器对于工作空间资源或归档文件的成员是公共的。
因为许多结构比较查看器的实现都是基于树状结构的,所以比较插件提供了基于树状结构的类属 StructureDiffViewer。插件负责提供将单个输入对象分为分层结构的结构创建程序。StructureDiffViewer 执行对生成结构的比较并将结果显示为树状结构。
使用 org.eclipse.compare.structureCreators 扩展为插件指定结构创建程序。就象内容查看器一样,可对一组文件扩展指定结构创建程序,或者可使用 contentTypeBinding 以将内容类型与特定结构创建程序进行关联。我们不会查看此处的标记,这是因为它与内容查看器很相似。JDT 插件定义 org.eclipse.compare.structureCreators 的若干添加项。
在某些情况下,基于树状结构的 StructureDiffViewer 可能不适用于您的插件。org.eclipse.compare.structureMergeViewers 扩展点允许您为结构合并查看器定义您自己的实现。可对文件扩展指定结构合并查看器,或者可使用 contentTypeBinding 以将内容类型与特定结构合并查看器进行关联。有关 org.eclipse.compare.structureMergeViewers 添加项的示例,请参阅 JDT 插件。
搜索插件提供若干实用程序类以帮助您实现搜索查看器。
Differencer 是分层结构数据的区分引擎。它接收两个或三个输入并对它们执行两方或三方比较。
如果区分引擎的输入元素实现了 IStructureComparator 接口,则该引擎以递归方式将其本身应用于输入元素的子代。叶元素必须实现 IStreamContentAccessor 接口,以便区分器执行对其内容的字节比较。
有几个示例较好地演示了包括在平台实现中的区分器:
缺省情况下,区分引擎将比较操作的结果作为 DiffNode 对象的树返回。DiffNode 描述两个或三个输入之间的更改。可以通过覆盖引擎的单个方法来更改结果节点的类型。
可以将 DiffNode 树显示在 DiffTreeViewer 中。 DiffTreeViewer 要求树的内部节点实现 IDiffContainer 接口并且各叶实现 IDiffElement 接口。
比较分层结构数据和显示差别的典型步骤如下:
StructureDiffViewer 是一个专用的 DiffTreeViewer,它使上面这些步骤自动化。它接收单个类型为 ICompareInput 的输入对象,并从中检索两个或三个要进行比较的输入元素。它使用 IStructureCreator 来从中抽取包含 IStructureComparator 和 IStreamContentAccessor 对象的树。然后,将这些树与区分引擎作比较,并将结果显示在树查看器中。
ZipFileStructureCreator 是 IStructureCreator 接口的实现,并以 IStructureComparator 的分层结构的形式提供 ZIP 归档的内容,区分引擎 (Differencer)可以很容易地比较它。这个示例很好地演示了如何使结构化文件可供比较插件的分层比较功能使用。