コンテンツ・ビューアーの実装

比較プラグインによって、構造化されていないエレメント間のコンテンツの相違点を表示およびマージするための 特殊ビューアーを提供することができます。

単純コンテンツ・ビューアー

コンテンツ・ビューアーは、単一の入力だけが得られるとき、つまり比較が必要ないときにのみ使用されます。 この代表的な例は、「ローカル・ヒストリーからの復元」機能です。  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 を指定する必要があります。 また、コンテンツ・ビューアーを使用する必要があるファイル拡張子も指定します。  

contentTypeBinding エレメントを使用して、コンテンツ型をコンテンツ・ビューアーに関連付けます。

コンテンツ・マージ・ビューアー

コンテンツ・マージ・ビューアーは、その入力について双方向または 3 方向比較を実行し、 結果を横並びまたはその他の適切な方法で表示します。 このビューアーによって、ユーザーは入力をマージできます。  コンテンツ・マージ・ビューアーは、テキストにもイメージにも共通です。

標準マージ・ビューアーがプラグインの機能に適していない場合、独自のコンテンツ・マージ・ビューアーを実装するよう選択できます。 そのコンテンツ・マージ・ビューアーは、 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>

コンテンツ・ビューアーと同様に、プラグインによって提供された特殊マージ・ビューアーは、viewer エレメントに指定されます。 このエレメントを作成するビューアーおよびクラスID を指定する必要があります。 また、コンテンツ・マージ・ビューアーを使用する必要があるファイル拡張子も指定します。

コンテンツ・ビューアーと同様に、contentTypeBinding を使用して、コンテンツ型をマージ・ビューアーに関連付けることができます。 JDT プラグインは、コンテンツ・マージ・ビューアーと 2 つの異なるコンテンツ型 (Java ソースおよび Java プロパティー・ファイル) を結合します。

ContentMergeViewer は抽象比較およびマージのビューアーで、2 つのコンテンツ領域が横並びに表示され、さらにオプションで共通上位 (3 方向比較) のコンテンツ領域が表示されます。 インプリメンテーションにはコンテンツ型に関する前提事項がないため、特定のコンテンツ型を扱うのはサブクラスの役割です。    

org.eclipse.compare.internal 内の ImageMergeViewer は、ContentMergeViewer を使用してイメージの単純なマージ・ビューアーを実装する方法を示します。 ContentMergeViewer は、IMergeViewerContentProvider インターフェースを実装する必要のあるコンテンツ・プロバイダーを使用してそのモデルにアクセスします。

テキスト・マージ

ビューアーでテキストが使用されている場合、テキスト・コンテンツを比較およびマージする、追加クラスを使用できます。 

TextMergeViewer は、 テキスト・コンテンツを比較およびマージするために使用される ContentMergeViewer の 具象サブクラスです。 テキスト・マージ・ビューアーでは、 RangeDifferencer を使用して、 2 つ (または 3 つ) の入力文書のテキストを 1 行ずつ比較していきます。 

テキスト行が異なっている場合、TextMergeViewerITokenComparator を使用して、マッチング・トークンと非マッチング・トークンの最長シーケンスを検索します。 TextMergeViewer のデフォルト・トークン比較は、空白文字で区切られた文字を対象として行われます。 異なる戦略が必要な場合 (例えば、Java 認識マージ・ビューアーで Java トークンを比較する場合など) は、クライアントが ITokenComparator インターフェースをインプリメントすることによって、独自のトークン・コンパレーターを作成できます。

TextMergeViewer は、 文書全体および文書のサブ範囲に機能します。 文書が部分的である場合、ビューアーの入力は IDocument ではなく IDocumentRange でなければなりません。

範囲における相違検出

RangeDifferencer は、 テキスト・コンテンツでマッチングおよび非マッチング比較可能エンティティーの最長シーケンスを検索します。 その実装は、「A File Comparison Program 」(「Software Practice and Experience, Vol. 15」Webb Miller、Eugene W. Myers 共著、1985 年 11 月) で説明されているアルゴリズムのオブジェクト化バージョンを基にしています。 クライアントは、IRangeComparator の 実装としてディファレンサーへの入力を提供する必要があります。  IRangeComparator は、入力データをエンティティーのシーケンスに分割し、あるエンティティーを別の IRangeComparator 内のエンティティーと比較するためのメソッドを提供します。

例えば、2 つのテキスト文書を比較し、マッチングおよび非マッチングの最長共通シーケンスを検索するには、IRangeComparator の実装が、文書を行に分割し、2 つの行が等しいかどうかテストするためのメソッドを提供する必要があります。 この方法の例については、org.eclipse.compare.internal.DocLineComparator を参照してください。

ディファレンサーは、RangeDifference オブジェクトの配列として、これらのシーケンス間の相違を返します。RangeDifference はそれぞれ、相違の種類 (変更なし、変更、追加、削除) と 2 つまたは 3 つの入力内の基となる比較可能エンティティーの対応する範囲を記述します。