Innehållsdispositionsvyer

Redigerare har ofta motsvarande funktion för innehållsdispositonsvyer som ger en strukturerad visning av redigerarens innehåll och hjälper användaren att navigera genom innehållet.

I arbetsmiljön finns en standarddispositionsvy för detta ändamål. Denna vy, när den visas i arbetsmiljön, kan styras av användaren via menyn Fönster > Visa vy.

Eftersom den allmänna textredigeraren inte känner till sin egen textstruktur kan inte någon intressant dispositionsvy visas. Standarddispositionsvyn nedan gör därför inte mycket.

Standarddispositionsvy för innehåll

 

Redigerare i textramverket kan tillföra en egen innehållsdispositionsvysida till dispositionsvyn. Dispositionsvynför en redigerare specificeras när arbetsmiljön begär en adapter av typen 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);
}

En sida med innehållsdisposition måste implementera IContentOutlinePage. I detta gränssnitt kombineras möjligheten att avisera väljarlyssnare (ISelectionProvider) med beteendet att vara en sida i en vy IPage). Innehållsdisposition implementeras normalt via JFace-visningsprogram. I standardimplementeringen för innehållsdisposition (ContentOutlinePage) används en JFace-trädvisning så att dispositionen visas hierarkiskt. Denna visning är lämplig för många strukturerade dispositioner bl.a. JavaContentOutlinePage.

Låt oss titta på implementeringen av sidan. När dispositionssidan skapas av redigeraren i kodstycket ovan, ställs dess inmatningselement in på redigerarens inmatningselement. Denna inmatning kan ofta skickas direkt till dipositionssidans visningsprogram, så som det görs nedan.

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

Skapande av trädvisningen ärvs från ContentOutlinePage. Standardetikettsprovidern används. Innehållsprovidern i JavaContentOutlinePage tolkar redigerarinmatningen och delar upp den i enskilda segment när förändring sker.

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

Texten tolkas och delas upp i segment i dokumentet. Dessa segment visas efter namn i dispositionsvyn.

Exempel på Java-disposition

När urvalet ändras, hämtas det valda segmentet. Dess offset används för att ställa in det markerade området i redigeraren.

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