Redigeringsprogrammer bruker som regel innholdsdisposisjoner for å strukturere visning av innholdet og hjelpe brukeren med å navigere gjennom innholdet i redigeringsprogrammet.
Arbeidsbenken har en standard disposisjonsvisning til dette formålet. Arbeidsbenkbrukeren kan aktivere og deaktivere visningen ved hjelp av menyen Vindu > Vis visning.
Siden den generiske TextEditor ikke kjenner strukturen i teksten, kan den ikke oppgi funksjonalitet for en nyttig disposisjonsvisning. Standard disposisjonsvisning som du ser nedenfor, har derfor begrenset nytteverdi.
Redigeringsprogrammer i tekstrammeverket kan oppgi sin egen innholdsdisposisjonsside i disposisjonsvisningen. Disposisjonen for et redigeringsprogram angis når arbeidsbenken ber om 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 innholdsdisposisjonsside må implementere IContentOutlinePage. Med dette grensesnittet er det mulig å både varsle lyttere om endrede valg (ISelectionProvider) og samtidig fungere som en side i en visning (IPage). Innholdsdisposisjoner implementeres vanligvis ved hjelp av JFace-visningsprogrammer. Standard implementering av innholdsdisposisjon (ContentOutlinePage) bruker JFace-trevisningen til å vise en hierarkisk representasjon av disposisjonen. Denne representasjonen er egnet for en rekke strukturerte disposisjoner, blant annet JavaContentOutlinePage.
La oss se nærmere på implementeringen av siden. Når disposisjonssiden opprettes av redigeringsprogrammet i snutten ovenfor, settes inndataelementet til inndataelementet for redigeringsprogrammet. Inndataene kan som regel overføres direkte til visningsprogrammet for disposisjonssiden, som vist 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); }
Opprettelsen av trevisningsprogrammet arves fra ContentOutlinePage. Standard etikettleverandør blir brukt. Innholdsleverandøren er oppgitt i JavaContentOutlinePage og analyserer endringer i inndata for redigeringsprogrammet som enkeltsegmenter.
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 i dokumentet analyseres i områder, såkalte segmenter. Disse segmentene vises etter navn i disposisjonsvisningen.
Når valget endres, hentes det valgte segmentet. De relative posisjonene brukes til å angi uthevingsområdet i redigeringsprogrammet.
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(); } } }