Страницы схематического представления

Для многих редакторов предусмотрены страницы схематического представления, на которых содержимое редактора отображается в виде иерархической структуры, облегчающей навигацию.

Для этой цели в рабочей среде предусмотрена стандартная панель Схема. Пользователь рабочей среды может закрыть или открыть эту панель с помощью команды Окно > Показать панель.

Поскольку базовый редактор 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);
				}
			}
		}

Текст документа разделяется на диапазоны, называемые сегментами. Эти сегменты отображаются на панели Схема.

Панель Схема для примера 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();
		}
	}
}