Editorer har ofte nogle tilsvarende funktioner til indholdsstrukturering, som medfører en struktureret fremvisningen af og hjælper brugeren med at navigere gennem indholdet i editoren.
Arbejdsbænken indeholder en standardstrukturoversigt til dette formål. Brugeren af arbejdsbænken styrer, hvornår denne oversigt skal være synlig, via menuen Vindue > Vis oversigt.
Da den generiske TextEditor ikke kender noget til strukturen i sin test, kan den ikke angive en funktionsmåde for en interessant strukturoversigt. Derfor sker der ikke så meget i den standard strukturoversigt, som vises nedenfor.
Editorer i tekststrukturen kan levere deres egen indholdsstruktureringsside til strukturoversigten. Strukturen til en editor angives, når arbejdsbænken anmoder om en adapter af 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 indholdsstruktureringsside skal implementere IContentOutlinePage. Denne grænseflade kombinerer evnen til at give lyttere til ændring af valg (ISelectionProvider) besked om funktionsmåden forbundet med at være en side i en oversigt (IPage). Funktioner til indholdsstrukturering implementeres typisk vha. JFace-fremvisningsfunktioner. Standardimplementering af en funktion til indholdsstrukturering (ContentOutlinePage) anvender en JFace-træstruktur til at vise en hierarkisk repræsentation af strukturen. Denne repræsentation egner sig til mange struktureringsfunktioner, herunder JavaContentOutlinePage.
Lad os se på implementeringen af siden. Når struktursiden oprettes af editoren i sekvensen ovenfor, angives dets inputelement til editorens inputelement. Dette input kan ofte sendes direkte til struktureringssidens fremvisningsfunktion, som illustreret nedenfor.
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); }
Oprettelse af træstrukturfremvisningen overtages fra ContentOutlinePage. Udbyderen af standardetiketter bruges. Indholdsudbyderen stilles til rådighed i JavaContentOutlinePage og er ansvarlig for at analysere editorinputtet i individuelle segmenter, hver gang det ændres.
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); } } }
Teksten analyseres i intervaller, som kaldes segmenter, i dokumentet. Disse segmenter vises efter navn i strukturoversigten.
Når valget ændres, hentes det valgte segment. Dets forskydninger bruges til angivelse af fremhævningsintervallet i editoren.
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(); } } }