Prohlížeče osnovy obsahu

Editory často mají odpovídající prohlížeče osnovy obsahu, které poskytují strukturované zobrazení obsahu editoru a pomáhají uživateli v navigaci obsahem editoru.

Pracovní plocha k tomuto účelu nabízí standardní pohled Osnova.  Uživatel pracovní plochy řídí, kdy je tento pohled viditelný, pomocí nabídky Okno > Zobrazit pohled.

Protože obecný textový editor TextEditor neví nic o struktuře svého textu, nemůže poskytovat chování pro zajímavé zobrazení osnovy.  Takže výchozí pohled Osnova, zobrazený níže, nic moc nedělá.

Výchozí prohlížeč osnovy obsahu

 

Editory v textovém rámci mohou do zobrazení osnovy dodat svou vlastní stránku s osnovou obsahu.   Prohlížeč osnovy se pro editor uvádí, když pracovní plocha požaduje adaptér typu 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);
}

Stránka prohlížeče osnovy dokumentu musí implementovat rozhraní IContentOutlinePage.  Toto rozhraní spojuje schopnost upozorňovat listenery změny výběru (ISelectionProvider) s chováním stránky v pohledu (IPage).  Prohlížeče osnovy obsahu se typicky implementují pomocí prohlížečů JFace.  Výchozí implementace prohlížeče osnovy obsahu (ContentOutlinePage) používá prohlížeč stromů modulu JFace k zobrazení hierarchické reprezentace osnovy.   Tato reprezentace je vhodná pro mnoho strukturovaných prohlížečů osnovy, včetně JavaContentOutlinePage.

Podívejme se na implementaci stránky. Když editor ve výše uvedenému úseku kódu vytvoří stránku osnovy, její vstupní prvek se nastaví na vstupní prvek editoru.  Tento vstup lze často přímo předat prohlížeči stránky osnovy, jak je to provedeno níže.

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

Vytvoření prohlížeče stromu se dědí od třídy ContentOutlinePage.  Používá se standardní poskytovatel štítku. Poskytovatel obsahu je poskytnut uvnitř stránky JavaContentOutlinePage a zodpovídá za analýzu a rozklad vstupu editoru na jednotlivé segmenty, kdykoliv se změní.

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

Text se analýzou dělí na úseky, nazývané segmenty, v rámci dokumentu.  Tyto segmenty jsou v zobrazení osnovy zobrazeny podle názvu.

Prohlížeč osnovy ukázek kódu Java

Když se výběr změní, vybraný segment se načte.   Jeho offsety se použijí k nastavení rozsahu zvýraznění v editoru.

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