Edytory często oferują odpowiednie schematy treści, które stanowią strukturalny widok treści edytora i pomagają w nawigowaniu po niej.
Środowisko robocze udostępnia w tym celu standardowy widok Schemat. Użytkownik środowiska roboczego może kontrolować wyświetlanie tego widoku, korzystając z menu Okna > Pokaż widok.
Ponieważ ogólna klasa TextEditor nie ma informacji o strukturze tekstu, nie może udostępnić zachowania dla danego widoku schematu. Dlatego, jak pokazano poniżej, w domyślnym widoku Schemat jest wyświetlanych dość mało elementów.
W środowisku tekstowym edytory mogą dostarczyć dla widoku schematu własną stronę schematu treści. Schemat treści jest określany dla edytora w momencie, gdy środowisko robocze żąda adaptera 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); }
Strona schematu treści musi implementować interfejs IContentOutlinePage. Interfejs ten łączy w sobie możliwość informowania funkcji nasłuchiwania zmian wyboru (interfejs ISelectionProvider) oraz zachowania strony w widoku (interfejs IPage). Schematy treści są zwykle implementowane przy użyciu przeglądarek JFace. Przy domyślnej implementacji schematu treści (klasa ContentOutlinePage) do wyświetlania hierarchicznej prezentacji schematu jest używana przeglądarka drzewa. Taka prezentacja jest odpowiednia w przypadku wielu strukturalnych schematów treści, w tym również w przypadku schematu JavaContentOutlinePage.
Teraz przedstawiona zostanie implementacja strony. W powyższym fragmencie kodu zdefiniowano, że gdy strona schematu jest tworzona przez edytor, element wejściowy zostaje ustawiony jako element wejściowy edytora. Element wejściowy można często przekazać bezpośrednio do przeglądarki strony schematu, tak jak w poniższym przykładzie.
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); }
Tworzenie przeglądarki drzewa jest dziedziczone z klasy ContentOutlinePage. Używany jest standardowy dostawca etykiet. Dostawca treści jest udostępniony przez schemat treści JavaContentOutlinePage i odpowiada za przetwarzanie danych wejściowych edytora na poszczególne segmenty po każdej ich zmianie.
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); } } }
Tekst jest przetwarzany w obrębie dokumentu na zakresy zwane segmentami. Segmenty te są wyświetlane w widoku schematu według nazwy.
Po zmianie zaznaczenia jest wydobywany zaznaczony segment. Jego współrzędne służą do wyróżnienia zakresu w edytorze.
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(); } } }