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

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

ワークベンチは、この目的のために標準の「アウトライン」ビューを備えています。 ワークベンチのユーザーは、「ウィンドウ」>「ビューの表示」メニューを使用してこのビューを可視にする時点をコントロールします。 

汎用の TextEditor は、 そのテキストの構造については何も認識しないので、 興味を持たせるようなアウトライン・ビューの振る舞いを与えることができません。  したがって、以下に示すデフォルトの「アウトライン」ビューでできることはあまりありません。

デフォルト・コンテンツ・アウトライナー

プラグインは、カスタムのコンテンツ・アウトライナー・ページをアウトライン・ビューに追加するためだけに、 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 アウトライナーが表示されます (ワークベンチ・ユーザーが「アウトライン」ビューを表示している場合)。

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

コンテンツ・アウトライナー・ページは、IContentOutlinePage をインプリメントしなければなりません。  このインターフェースは、選択変更リスナー (ISelectionProvider) に通知する機能と、ビュー (IPage) 内のページとしての振る舞いとを組み合わせます。  コンテンツ・アウトライナーは、通常、JFace ビューアーを使用してインプリメントされます。  コンテンツ・アウトライナーのデフォルトのインプリメンテーション (ContentOutlinePage) は、JFace のツリー・ビューを使用して、アウトラインを階層表示します。  この表示方法は、ReadmeContentOutlinePage を含む多くの構造化されたアウトライナーに適しています。

ReadmeContentOutlinePage の外観は、  readme ビューの拡張をインプリメントするときに説明した、以下に示す 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 エディターは、その垂直ルーラーを更新して、アウトライナー内のエレメントがソース・コードのどこにあるのかを示します。

コンテンツ・アウトライナー付き Java エディター

Copyright IBM Corp. and others 2000,2002.