實作內容檢視器

比較外掛程式可讓您提供特殊化檢視器,來檢視及合併未結構化元素之間的內容差異。

簡單內容檢視器

內容檢視器在只有單一輸入可用的地方使用,因此不需要比較。 這是由本端歷程還原功能的一般範例。  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>

檢視器元素中指出您的外掛程式所提供的特殊檢視器。您必須指定檢視器的 id 以及建立它的類別。您也可以任意指定應該用於內容檢視器的副檔名。  

您也可以使用 contentTypeBinding 元素,建立內容類型與內容檢視器的關聯性。

內容合併檢視器

內容合併檢視器執行雙向或三向的輸入比較,用並列的或任何適合的方式來呈現結果。 檢視器可讓使用者在輸入間合併資料。 對文字或影像來說,內容合併檢視器是常見的。

如果標準合併檢視器不適用於您的外掛程式的功能, 您可能選擇要實作您自己的內容合併檢視器。您應該使用 org.eclipse.compare.contentMergeViewers 延伸點, 搭配平台來登錄內容合併檢視器。 下列標記顯示特殊化內容合併檢視器的定義, 用來檢視 Java 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>

與內容檢視器相似,檢視器元素中指出您的外掛程式所提供的特殊合併檢視器。您必須指定檢視器的 id 以及建立它的類別。您也可以任意指定應該用於內容合併檢視器的副檔名

與內容檢視器類似,您可以使用 contentTypeBinding 建立內容類型與合併檢視器的關聯性。JDT 外掛程式連結內容合併檢視器與兩種不同的內容類型:Java 程式碼與 Java 內容檔。

ContentMergeViewer 是一個抽象的比較與合併檢視器,具有兩個並列的內容區域,以及一個供共用上代使用的選用內容區域(用於三向比較)。  因為實作不做任何有關內容類型的假設,所以子類別將負責處理特定內容類型。  

org.eclipse.compare.internal 中的 ImageMergeViewer 顯示如何使用 ContentMergeViewer 為影像實作一個簡單合併檢視器。ContentMergeViewer 可利用必須實作 IMergeViewerContentProvider 介面的內容提供者,來存取它的模型。

文字合併

如果您的檢視器使用文字,將可以使用其他比較和合併文字內容的類別。

TextMergeViewerContentMergeViewer 的具體子類別,用來比較與合併文字內容。文字合併檢視器可使用 RangeDifferencer,對兩個(或三個)輸入文件進行逐行的文字比較。

對於不同的文字行, TextMergeViewer 使用 ITokenComparator 尋找相符和不相符記號最長的序列關係。 TextMergeViewer 的 預設記號比較對於利用空格分隔的字元有效。如果需要不同的策略(例如,有 Java 的合併檢視器中的 Java 記號), 用戶端可以藉由實作 ITokenComparator 介面來建立它們自己的記號比較子。

TextMergeViewer 運用於整份文件以及文件的子範圍。對部分文件而言,檢視器的輸入必須是 IDocumentRange, 而不是 IDocument

範圍差異

RangeDifferencer 會在文字內容中尋找最長系列的相符及不相符可比較實體。其實作是根據 A File Comparison Program, by 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 說明差異的種類(不變、變更、新增、刪除),以及在兩個或三個輸入中,基礎可比較實體的對應範圍。