コンテンツ・アウトライナー

エディターには、多くの場合、対応するコンテンツ・アウトライナーがあります。 コンテンツ・アウトライナーは、エディターの内容を構造化して表示し、エディターの内容をナビゲートする支援を行います。

ワークベンチは、この目的のために標準の「アウトライン (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 エディターは、その垂直ルーラーを更新して、 アウトライナー内のエレメントがソース・コードのどこにあるのかを示します。