エディターとその対応するテキスト・ビューアーは、文書の表記および必要なヘルパー・クラスの構成のインプリメンテーションについて責任があります。 ビューアーの概念がよく分からない場合、「ビューアー」を参照してください。)
TextViewer は、文書モデルおよびその区画を、 ユーザーが見る色の付いた書式化テキストにマッピングする際の、すべての低レベル詳細を処理します。 ソース・コード・スタイル・エディターには、 SourceViewer が用意されています。 ソース・ビューアーには、ソース・コード注釈の表記が採用されています。 これらの注釈は、テキストの左にある垂直ルーラーに、テキストの右にある全体ルーラーに、またはテキストの下にある色付きの曲線として 表示できます。
SourceViewer および そのヘルパー・クラスは、AbstractTextEditor 階層の全体にわたって使用されます。 パッケージ org.eclipse.jface.text.source は、 このビューアー、また注釈表記をサポートしている他のクラスを定義します。
文書プロバイダーが、その文書それ自体に加え、文書の注釈のモデル IAnnotationModel を提供することについては 前述しました。 この注釈モデルは注釈を保管し、要求に従ってそれらを列挙し、注釈をテキストに合わせて最新の状態に保っておくために テキスト変更を聴取します。 JavaDocumentProvider は、FileDocumentProvider (さらに、その注釈モデル) に定義されている動作を継承します。
protected IAnnotationModel createAnnotationModel(Object element) throws CoreException { if (element instanceof IFileEditorInput) { IFileEditorInput input= (IFileEditorInput) element; return new ResourceMarkerAnnotationModel(input.getFile()); } return super.createAnnotationModel(element); }
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 つのブックマークがあることを示しています。 ブックマークが付けられたテキストは見えているため、その注釈も左側に表示されます。
注釈それ自身をクリックすることによって、ユーザーは、コード内の注釈のロケーションをナビゲートできます。
表示用ルーラーに示されている注釈の型は、ルーラーに注釈型を追加することによって決定されます。 以下の 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 の インプリメンテーションを参照してください。
ルーラーへの注釈の表示に加え、ソース・ビューアーは色の付いた曲線マークとして注釈を表示できます。
もう一度、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 が 正しく構成されるため、どの装飾が使用可能かということです。
装飾サポートのため、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 を 表示したい型だけで構成しなければなりません。