コンテンツ・ビューアーのインプリメント

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

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

コンテンツ・ビューアーは、単一の入力だけが得られるとき、つまり比較が必要ないときにのみ使用されます。 この代表的な例は、「ローカル・ヒストリーからの復元」機能です。  org.eclipse.compare.contentViewers 拡張ポイントによって、その入力を比較しない特殊化コンテンツ・ビューアーを定義できます。 

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

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

標準マージ・ビューアーがプラグインの機能に適していない場合、独自のコンテンツ・ビューアーをインプリメントするよう選択できます。 そのコンテンツ・ビューアーは、 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 は抽象比較およびマージのビューアーで、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 は、 テキスト・コンテンツでマッチングおよび非マッチング比較可能エンティティーの最長シーケンスを検索します。 そのインプリメンテーションは、Webb Miller および Eugene W. Myers 著「A File Comparison Program」、および 1985 年 11 月発行の「Software Practice and Experience」に記載されているオブジェクト化されたアルゴリズムに基づいています。 クライアントは、IRangeComparator の インプリメンテーションとしてディファレンサーへの入力を提供する必要があります。  IRangeComparator は、入力データをエンティティーのシーケンスに分割し、あるエンティティーを別の IRangeComparator 内のエンティティーと比較するためのメソッドを提供します。

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

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

 

Copyright IBM Corporation and others 2000, 2003.