エディターには、多くの場合、対応するコンテンツ・アウトライナーがあります。 コンテンツ・アウトライナーは、エディターの内容を構造化して表示し、エディターの内容をナビゲートする支援を行います。
ワークベンチは、この目的のために標準の「アウトライン (Outline)」ビューを備えています。 ワークベンチのユーザーは、「パースペクティブ (Perspective)」->「ビューの表示 (Show View)」メニューを使用して このビューを可視にする時点をコントロールします。
汎用の TextEditor は、 そのテキストの構造については何も認識しないので、 興味を持たせるようなアウトライン・ビューの振る舞いを与えることができません。 したがって、以下に示すデフォルトの「アウトライン (Outline)」ビューでできることはあまりありません。
プラグインは、カスタムのコンテンツ・アウトライナー・ページをアウトライン・ビューに追加するためだけに、 TextEditor を 拡張することができます。 このアプローチは、ワークベンチの readme ツールの例で使用されています。 ReadmeEditor は、TextEditor の いくつかのメソッドをオーバーライドして、独自のアウトライナーを提供します。
エディターのアウトライナーは、ワークベンチが IContentOutlinePage 型の アダプターを要求したときに指定されます。
public Object getAdapter(Class key) {
if (key.equals(IContentOutlinePage.class)) {
IEditorInput input = getEditorInput();
if (input instanceof IFileEditorInput) {
page = new
ReadmeContentOutlinePage(
((IFileEditorInput)input).getFile());
return page;
}
}
return super.getAdapter(key);
}
ReadmeEditor が (.readme ファイルに対して) 開くと、 それに対応する readme アウトライナーが表示されます (ワークベンチ・ユーザーが「アウトライン (Outline)」ビューを表示している場合)。
コンテンツ・アウトライナー・ページは、 IContentOutlinePage を インプリメントしなければなりません。 このインターフェースは、選択変更リスナー (ISelectionProvider) に 通知する機能と、ビュー (IPage) 内の ページとしての振る舞いとを組み合わせます。 コンテンツ・アウトライナーは、通常、JFace ビューアーを使用してインプリメントされます。 コンテンツ・アウトライナーのデフォルトのインプリメンテーション (ContentOutlinePage) は、 JFace のツリー・ビューを使用して、アウトラインを階層表示します。 この表示方法は、ReadmeContentOutlinePage を含む多くの構造化されたアウトライナーに適しています。
ReadmeContentOutlinePage の外観は、 readme ビューの拡張を インプリメントするときに説明した、以下に示す readme のセクション・ビューに類似しています。
実際、唯一の違いは、アウトライナーはセクションの階層ビューを表示するのに対し、readme のセクション・ビューは、 セクションを平面的なリストで表示する点です。 アウトライナーのインプリメンテーションがセクション・ビューのインプリメンテーションに類似していることは、 大きな驚きではないはずです。 唯一の違いは、アウトライナーはリスト・ビューアーではなく、ツリー・ビューアーを使用する点だけです。
エディターによりアウトライン・ページが作成されたときに、 コンストラクターにおいて、アウトライン・ページにエディターの入力エレメントが渡されました。 この入力は、多くの場合、以下で示すように、アウトライン・ページのビューアーに直接渡すことができます。
public void createControl(Composite parent) {
...
TreeViewer viewer = getTreeViewer();
viewer.setContentProvider(new WorkbenchContentProvider());
viewer.setLabelProvider(new WorkbenchLabelProvider());
viewer.setInput(getContentOutline(input));
...
}
ツリー・ビューアーの作成は、 ContentOutlinePage から 継承されます。 readme セクション・ビューで使用されたものと同じ内容とラベル・プロバイダーがここで使用され、 内容のアウトラインは、そのビューのセクションを構成したものと同じ ReadmeModelFactory を使用して 構成されます。
private IAdaptable getContentOutline(IAdaptable input) {
return
ReadmeModelFactory.getInstance().getContentOutline(input);
}
これで終了です。
もちろん、アウトライナー自体は、興味ある振る舞いは何も提供しません。 セクションを選択しても、エディター内のテキストをナビゲートすることもありません。 では、このコンテンツ・アウトライナーの何が優れているのでしょうか。 コンテンツ・アウトライナーは、セクション・ビューでは説明しなかった (階層表示以外の) 振る舞いを全く提供していない、 とも言えます。 何もしないアウトライナーを提供する代わりに、セクション・ビューでツリー・ビューだけを使用することができないのでしょうか。
これは単に 1 つの例に過ぎません。 実際、ReadmeContentOutlinePage は、 コンテンツ・アウトライナーを、テキスト・エディター用にカスタマイズする方法を示すために 提供されたものです。 これは、コンテンツ・アウトライナー自体の例としては良いものではありません。 ユーザーは、コンテンツ・アウトライナーが、エディターの内容のナビゲーションを支援するものと期待しています。 したがって、内容の構造を表示することだけが目的であれば、セクション・ビューを使用する方が良いでしょう。
では、興味を持たせるようなコンテンツ・アウトライナーはどこにあるのでしょうか。 ContentOutlinePage の サブクラスとそれに対応するエディターを見てください。 さらに一般的なパターンは、エディターがアウトライン・ページを提供し、そこで発生する選択イベントを登録するというものです。 項目がコンテンツ・アウトラインで選択されると、エディターはそれ自体を適切に更新します。
(JDT で提供される) Java ソース・コード・エディターは、興味深いコンテンツ・アウトライナーの例です。 Java アウトライナーは、Java のソース・コードを構造化して表示し、それに対応するエディター内で、 宣言、メソッド、およびフィールドをナビゲートできるようにしています。 アウトライナーが選択イベントを報告すると、Java エディターは、その垂直ルーラーを更新して、 アウトライナー内のエレメントがソース・コードのどこにあるのかを示します。