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

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

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

汎用の 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();
		}
	}
}
Copyright IBM Corporation and others 2000, 2003.