Editors bevatten vaak een functie voor inhoudsoverzichten. Een inhoudsoverzicht is een gestructureerde view van de editorinhoud en maakt het makkelijk voor de gebruiker om door de inhoud van de editor te navigeren.
De workbench is speciaal voor dit doel voorzien van de standaardview Overzicht. De gebruiker kan zelf instellen wanneer deze view wordt weergegeven via het menu Venster > View afbeelden.
Omdat in de generieke teksteditor (TextEditor) geen informatie aanwezig is over de structuur van de tekst, kan op basis hiervan ook geen gedrag voor een informatieve overzichtsview worden geboden. De standaardview Overzicht heeft daarom niet zo veel voorzieningen.
Editors in het tekstframework kunnen hun eigen inhoudsoverzichtspagina aan de view Overzicht toevoegen. De inhoudsoverzichtspagina in een editor wordt opgegeven via de workbenchaanvraag voor een adapter van het type 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); }
Een inhoudsoverzichtspagina moet IContentOutlinePage implementeren. Deze interface biedt zowel de mogelijkheid om selectiewijzigingslisteners (ISelectionProvider) te initiėren als om een pagina in een view (IPage) af te beelden. Inhoudsoverzichten worden gewoonlijk geļmplementeerd met JFace-viewers. De standaardimplementatie van een inhoudsoverzicht (ContentOutlinePage) maakt gebruik van een JFace-structuurviewer om een hiėrarchische weergave van het overzicht af te beelden. Deze weergave is geschikt voor veel structuuroverzichtspagina's, waaronder JavaContentOutlinePage.
In deze sectie wordt dieper ingegaan op de implementatie van de pagina. Zie de snippet hierboven. Wanneer de overzichtspagina door de editor wordt gemaakt, wordt het invoerelement ingesteld op invoerelement van de editor. Deze invoer kan vaak rechtstreeks aan de viewer voor de overzichtspagina worden doorgegeven, zoals in het voorbeeld hieronder.
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); }
De aanmaakmethode voor de structuurviewer wordt overgenomen van ContentOutlinePage. De standaardlabelprovider wordt gebruikt. De contentprovider wordt aangeleverd in JavaContentOutlinePage en draagt zorg voor het ontleden van de editorinvoer in afzonderlijke segmenten bij elke wijziging.
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); } } }
De tekst in het document wordt ontleed in bereikgedeelten, ook wel segmenten genoemd. Deze segmenten worden in de view Overzicht weergegeven op naam.
Als de selectie wordt gewijzigd, wordt het geselecteerde segment opgehaald. De bijbehorende offsets worden gebruikt om het markeringsbereik in de editor in te stellen.
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(); } } }