ソース・ビューアーおよび注釈

エディターとその対応するテキスト・ビューアーは、文書の表示および必要なヘルパー・クラスの構成のインプリメンテーションについて責任があります。 (ビューアーの概念がよく分からない場合、「ビューアー」を参照してください。)   

TextViewer は、文書モデルおよびその区画を、 ユーザーが見る色の付いた書式化テキストにマッピングする際の、すべての低レベル詳細を処理します。 ソース・コード・スタイル・エディターには、 SourceViewer が用意されています。  ソース・ビューアーには、ソース・コード注釈の表記が採用されています。  これらの注釈は、テキストの左にある垂直表示域に、テキストの右にある全体ルーラーに、またはテキストの下にある色付きの曲線として 表示できます。  

SourceViewer および そのヘルパー・クラスは、AbstractTextEditor 階層の全体にわたって使用されます。 パッケージ org.eclipse.jface.text.source は、 このビューアー、また注釈表記をサポートしている他のクラスを定義します。 

注釈およびルーラー

注釈は、区画と同様に、編集される文書の種類によって大きく異なります。 文書の IAnnotationModel が、注釈を保管し、要求に従ってそれらを列挙し、注釈をテキストに合わせて最新の状態に保っておくために テキスト変更を listen します。 注釈モデルは、org.eclipse.core.filebuffers.annotationModelCreation 拡張に登録されています。 この拡張ポイントを使用すると、プラグインは、指定されたファイル拡張子に対する適切な注釈モデルを作成するクラスを登録できます。Java エディターのサンプルでは、この拡張ポイントを使用していないため、プラットフォームで定義された注釈モデルを継承します。

<extension
	point="org.eclipse.core.filebuffers.annotationModelCreation">
	<factory
		extensions="*"
		class="org.eclipse.ui.texteditor.ResourceMarkerAnnotationModelFactory">
	</factory>
</extension>

提供されるファクトリー・クラスは、任意の拡張子を持つファイルに対して ResourceMarkerAnnotationModel を作成します。 このクラスは、ワークスペースのリソースにマーカーを表示する注釈を表示します。(マーカーについて詳しくは、「リソース・マーカー」を参照してください。)  これは、イメージと記述を各マーカーに割り当て、マーカーの変更についてそのリソースをモニターします。 

どのように注釈モデルがテキスト・エディターに表示されるかを調べるため、プラットフォーム・テキスト・エディター、 およびそのルーラーおよび注釈の使用について見てみましょう。 さまざまな注釈がルーラーおよびテキストに表示される方法は、 「一般」>「エディター」>「テキスト・エディター」>「注釈」設定でユーザーが制御します。 

垂直表示域

編集域の右側にある垂直表示域は、プラットフォーム・テキスト・エディターによって使用され、そのテキスト行に隣接する テキスト範囲および行ベースの注釈を表示します。

垂直方向ルーラー

これらの注釈は、与えられた ResourceMarkerAnnotationModel に 記述されています。 このモデルは、ソース・ビューアーがエディターによって開始されたときに、 SourceViewer に設定されます。  以下の AbstractTextEditor からの 断片は、どのように文書および注釈モデルがビューアーに関連しているかを示しています。 

private void initializeSourceViewer(IEditorInput input) {
		
	IAnnotationModel model= getDocumentProvider().getAnnotationModel(input);
	IDocument document= getDocumentProvider().getDocument(input);
		
	if (document != null) {
		fSourceViewer.setDocument(document, model);
		...

ソース・ビューアーが適切な文書および注釈モデルで構成されると、文書を表すために十分な情報を持ち、 左側の垂直表示域に正しい情報が表示されることを確実にします。 文書が設定されるとき、このモデルはルーラーに関連付けられます。  以下の断片は、文書がソース・ビューアーに設定されるとき、何が行われるかを示しています。  明確化のため、これは SourceViewer の 実際のコードによって単純化されています。 

public void setDocument(IDocument document, IAnnotationModel annotationModel) {
	...
	// create visual annotation model from the supplied model and store
	// in fVisualAnnotationModel
	...
	if (fVerticalRuler != null)
		fVerticalRuler.setModel(fVisualAnnotationModel);

このようにして、ルーラーは該当する注釈モデルに関連しています。   

ルーラーそれ自身を見てみましょう。 これはテキスト・エディターによって作成され、さらにエディターのビューアーに関連付けられます。  Java エディター・サンプルはルーラー用の特殊な振る舞いを定義していないため、 TextEditor に定義されているように ルーラーを継承します。 

protected IVerticalRuler createVerticalRuler() {
	CompositeRuler ruler= new CompositeRuler();
	ruler.addDecorator(0, new AnnotationRulerColumn(VERTICAL_RULER_WIDTH));
	if (isLineNumberRulerVisible())
		ruler.addDecorator(1, createLineNumberRulerColumn());
	return ruler;
}

テキスト・エディターは CompositeRuler を使用します。 このルーラーは、それ自身のビジュアル表示を持っていません。 この表示は、ルーラーに列 (IVerticalRulerColumn) を 表示するデコレーターのリストによって提供されます。  この例では、注釈を表示するルーラー列 (AnnotationRulerColumn) が常に追加され、 行番号表示域列はユーザー設定に基づいて追加されます。  注釈ルーラー列は、注釈イメージが正しいロケーションに表示されるという特性を操作しています。

クラスすべてがルーラーの表示に関係していますが、サンプル・エディターは、ルーラー動作を行うため、 サブクラス・フレームワーク・クラスにのみ必要であることに注意してください。 JavaDocumentProvider は、該当するマーカー注釈モデルを FileDocumentProvider から 継承します。   JavaTextEditor は、ルーラー表示を TextEditor から継承します。 

概要表示域

編集域の右側にある概要表示域は、文書全体に関する注釈を表示するために使用されます。 これらの注釈は文書内の位置に対応していて、ユーザーが文書をスクロールしても動くことはありません。  通常、文書の一部が見えている場合、対応する注釈が垂直表示域にあります。     

下部にある垂直表示域は、文書に 2 つのタスクと 1 つのブックマークがあることを示しています。 ブックマークが付けられたテキストは見えているため、その注釈も左側に表示されます。 

Java エディターでの垂直方向概要ルーラー

注釈それ自身をクリックすることによって、ユーザーは、コード内の注釈のロケーションをナビゲートできます。

概要表示域に示されている注釈タイプは、ルーラーに注釈タイプを追加することによって決定されます。 以下の SourceViewerDecorationSupport からの 断片では、注釈タイプはルーラーに動的に追加されます。  (SourceViewerDecorationSupport について 詳しくは、次のセクションを参照してください。)

private void showAnnotationOverview(Object annotationType) {
if (fOverviewRuler != null) { Color c= getAnnotationTypeColor(annotationType);
fOverviewRuler.setAnnotationTypeColor(annotationType, c); int l= getAnnotationTypeLayer(annotationType);
fOverviewRuler.setAnnotationTypeLayer(annotationType, l);
fOverviewRuler.addAnnotationType(annotationType);
fOverviewRuler.update();
} }

全体ルーラーは、特定の注釈 (その型、表示される方法など) に関する情報を提供するために使用される IAnnotationAccess でも提供されています。 TextEditor は、そのマーカー型に 従って注釈を解釈する DefaultMarkerAnnotationAccess を 使用し、ユーザー設定を調べて全体ルーラーに表示されるマーカー型を確認します。 

protected IAnnotationAccess createAnnotationAccess() {
	return new DefaultMarkerAnnotationAccess(fAnnotationPreferences);
}

全体ルーラーにマーカーを表示する際の詳細については、DefaultMarkerAnnotationAccess および MarkerAnnotation のインプリメンテーションを参照してください。

テキスト注釈

ルーラーへの注釈の表示に加え、ソース・ビューアーは色の付いた曲線マークとして注釈を表示できます。   

Java エディターでの曲線マーク

もう一度、TextEditor での ソース・ビューアーの作成を調べてみましょう。

protected ISourceViewer createSourceViewer(Composite parent, IVerticalRuler ruler, int styles) {
		
	... 
	ISourceViewer sourceViewer= new SourceViewer(parent, ruler, fOverviewRuler, isOverviewRulerVisible(), styles);
	fSourceViewerDecorationSupport= new SourceViewerDecorationSupport(sourceViewer, fOverviewRuler, fAnnotationAccess, sharedColors);
	configureSourceViewerDecorationSupport();
		
	return sourceViewer;
}

クラス SourceViewerDecorationSupport は、ソース・ビューアーに表示される装飾 (テキスト注釈、色付きマージン、色付きカーソル行など) の多くを処理します。 これはユーザー設定で構成されているため、ユーザー設定変更の動的更新に対応します。  多くのエディターは、このような装飾が表示される方法については詳しく考慮していません  (必要であれば、SourceViewerDecorationSupport、 および AnnotationPainter のような関連クラスを参照してください)。  知っておかなければならないことは、SourceViewer およびサポートされている SourceViewerDecorationSupport が 正しく構成されるため、どの装飾が使用可能かということです。 

SourceViewerDecorationSupport の構成

装飾サポートについては、TextEditor が使用する構成を調べてみましょう。

protected void configureSourceViewerDecorationSupport() {

	Iterator e= fAnnotationPreferences.getAnnotationPreferences().iterator();
	while (e.hasNext())
		fSourceViewerDecorationSupport.setAnnotationPreference((AnnotationPreference) e.next());
	fSourceViewerDecorationSupport.setAnnotationPainterPreferenceKeys(DefaultMarkerAnnotationAccess.UNKNOWN, UNKNOWN_INDICATION_COLOR, UNKNOWN_INDICATION, UNKNOWN_INDICATION_IN_OVERVIEW_RULER, 0);
		
	fSourceViewerDecorationSupport.setCursorLinePainterPreferenceKeys(CURRENT_LINE, CURRENT_LINE_COLOR);
	fSourceViewerDecorationSupport.setMarginPainterPreferenceKeys(PRINT_MARGIN, PRINT_MARGIN_COLOR, PRINT_MARGIN_COLUMN);
	fSourceViewerDecorationSupport.setSymbolicFontName(getFontPropertyPreferenceKey());
}

注釈設定は、ユーザー設定に表示される注釈すべての注釈タイプを定義するために使用されます。 ここには、プラグインによって提供されている注釈が含まれており、ワークベンチ提供の注釈に限られていません。  使用可能な注釈すべてをエディターに表示したくない場合、このメソッドをオーバーライドして、 SourceViewerDecorationSupport を 表示したい型だけで構成しなければなりません。