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

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

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

汎用の 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 つの範囲に構文解析されます。 これらのセグメントは、「アウトライン」ビューで名前ごとに表示されます。 

Java サンプル・アウトライナー

選択が変更されると、選択されたセグメントが検索されます。 エディターの強調表示範囲を設定するため、そのオフセットが使用されます。 

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();
		}
	}
}