エディターには、多くの場合、対応するコンテンツ・アウトライナーがあります。 コンテンツ・アウトライナーは、エディターの内容を構造化して表示し、エディターの内容をナビゲートする支援を行います。
ワークベンチは、この目的のために標準の「アウトライン」ビューを備えています。 ワークベンチのユーザーは、「ウィンドウ」>「ビューの表示」メニューを使用してこのビューを可視にする時点をコントロールします。
汎用の TextEditor は、 そのテキストの構造については何も認識しないので、 興味を持たせるような「アウトライン」ビューの振る舞いを与えることができません。 したがって、以下に示すデフォルトの「アウトライン」ビューでできることはあまりありません。
テキスト・フレームワーク内のエディターは、独自のコンテンツ・アウトライナー・ページを「アウトライン」ビューに 提供することができます。 エディターのアウトライナーは、ワークベンチが IContentOutlinePage 型の アダプターを要求したときに指定されます。
public Object getAdapter(Class required) { if (IContentOutlinePage.class.equals(required)) { if (fOutlinePage == null) { fOutlinePage= new JavaContentOutlinePage(getDocumentProvider(), this); if (getEditorInput() != null) fOutlinePage.setInput(getEditorInput()); } return fOutlinePage; } return super.getAdapter(required); }
コンテンツ・アウトライナー・ページは、 IContentOutlinePage を インプリメントしていなければなりません。 このインターフェースは、選択変更リスナーに通知する機能 (ISelectionProvider) と ビューでページとなる動作 (IPage) を組み合わせます。 コンテンツ・アウトライナーは通常、JFace ビューアーでインプリメントされています。 コンテンツ・アウトライナーのデフォルト・インプリメンテーション (ContentOutlinePage) は、 JFace ツリー・ビューアーを使用して、アウトラインの階層表記を表示します。 この表記は、JavaContentOutlinePage を含む多くの構造化アウトライナーに適しています。
ページのインプリメンテーションを調べてみましょう。 上の断片でアウトライン・ページがエディターによって作成されると、その入力エレメントはエディターの入力エレメントに設定されます。 この入力は、多くの場合、以下で示すように、アウトライン・ページのビューアーに直接渡すことができます。
public void createControl(Composite parent) { super.createControl(parent); TreeViewer viewer= getTreeViewer(); viewer.setContentProvider(new ContentProvider()); viewer.setLabelProvider(new LabelProvider()); viewer.addSelectionChangedListener(this); if (fInput != null) viewer.setInput(fInput); }
ツリー・ビューアー作成は ContentOutlinePage から 継承されます。 標準コンテキストおよびラベル・プロバイダーが使用されます。 エディター入力が設定 (変更) されるたび、JavaContentOutlinePage はエディター入力の文書を取得し、テキストを構文解析します。
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { ... if (newInput != null) { IDocument document= fDocumentProvider.getDocument(newInput); if (document != null) { document.addPositionCategory(SEGMENTS); document.addPositionUpdater(fPositionUpdater); parse(document); } } }
文書内で、テキストはセグメントと呼ばれる 2 つの範囲に構文解析されます。 これらのセグメントは、「アウトライン」ビューで名前ごとに表示されます。
選択が変更されると、選択されたセグメントが検索されます。 エディターの強調表示範囲を設定するため、そのオフセットが使用されます。
public void selectionChanged(SelectionChangedEvent event) { super.selectionChanged(event); ISelection selection= event.getSelection(); if (selection.isEmpty()) fTextEditor.resetHighlightRange(); else { Segment segment= (Segment) ((IStructuredSelection) selection).getFirstElement(); int start= segment.position.getOffset(); int length= segment.position.getLength(); try { fTextEditor.setHighlightRange(start, length, true); } catch (IllegalArgumentException x) { fTextEditor.resetHighlightRange(); } } }