Οι λειτουργίες επεξεργασίας έχουν συνήθως αντίστοιχες λειτουργίες διάρθρωσης περιεχομένου οι οποίες παρέχουν μια δομημένη προβολή των περιεχομένων της λειτουργίας επεξεργασίας και βοηθούν το χρήστη στην πλοήγηση στα περιεχόμενα της λειτουργίας επεξεργασίας.
Ο πάγκος εργασίας παρέχει για αυτό το σκοπό μια τυπική προβολή Διάρθρωσης. Όταν αυτή η προβολή είναι ορατή χρησιμοποιώντας το μενού Παράθυρο > Εμφάνιση προβολής, ο χρήστης του πάγκου εργασίας μπορεί να πραγματοποιήσει ελέγχους.
Εφόσον το γενικό πρόγραμμα TextEditor δε γνωρίζει τίποτα για τη δομή του κειμένου, δεν μπορεί να παρέχει συμπεριφορά για μια προβολή ενδιαφέρουσας διάρθρωσης. Συνεπώς, η προεπιλεγμένη προβολή Διάρθρωσης που παρουσιάζεται παρακάτω δεν βοηθά ιδιαίτερα.
Οι λειτουργίες επεξεργασίας στο πλαίσιο κειμένου μπορούν να παρέχουν ξεχωριστή σελίδα λειτουργίας διάρθρωσης περιεχομένου στην προβολή διάρθρωσης. Η λειτουργία διάρθρωσης για μια λειτουργία επεξεργασίας προσδιορίζεται όταν ο πάγκος εργασίας ζητά έναν προσαρμογέα του είδους 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); }
Μια σελίδα λειτουργίας διάρθρωσης περιεχομένου πρέπει να υλοποιεί τη διεπαφή IContentOutlinePage. Αυτή η διεπαφή συνδυάζει την ικανότητα να ενημερώνει τις λειτουργίες ακρόασης αλλαγών στις επιλογές(ISelectionProvider) με τη συμπεριφορά σελίδας προβολής (IPage). Οι λειτουργίες διάρθρωσης περιεχομένου υλοποιούνται συνήθως με τη χρήση προβολών JFace. Η προεπιλεγμένη υλοποίηση μιας λειτουργίας επεξεργασίας (ContentOutlinePage) χρησιμοποιεί μια προβολή διακλάδωσης JFace για την εμφάνιση ιεραρχικής παρουσίασης της διάρθρωσης. Αυτή η αναπαράσταση είναι κατάλληλη για πολλές δομημένες λειτουργίες διάρθρωσης, συμπεριλαμβανομένης της JavaContentOutlinePage.
Ας δούμε την υλοποίηση της σελίδας. Κατά τη δημιουργία της σελίδας διάρθρωσης από τη λειτουργία επεξεργασίας στο παραπάνω τμήμα κώδικα, το στοιχείο δεδομένων εισόδου ορίζεται για το στοιχείο δεδομένων εισόδου της λειτουργίας επεξεργασίας. Αυτό το στοιχείο συχνά μεταβιβάζεται απευθείας στην προβολή της σελίδας λειτουργίας διάρθρωσης, όπως γίνεται παρακάτω.
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); }
Η δημιουργία προβολής διακλάδωσης μεταβιβάζεται από την κλάση ContentOutlinePage. Χρησιμοποιείται ο τυπικός παροχέας ετικέτας. Ο παροχέας περιεχομένου είναι διαθέσιμος στην κλάση JavaContentOutlinePage και ευθύνεται για τη συντακτική ανάλυση των δεδομένων εισόδου της λειτουργίας επεξεργασίας σε ξεχωριστά τμήματα κάθε φορά που αλλάζουν.
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); } } }
Το κείμενο αναλύεται σε περιοχές τιμών του εγγράφου, οι οποίες ονομάζονται "τμήματα". Αυτά τα τμήματα εμφανίζονται κατά όνομα στην προβολή διάρθρωσης.
Όταν αλλάζει η επιλογή, γίνεται ανάκτηση του επιλεγμένου τμήματος. Τα σημεία εκκίνησης χρησιμοποιούνται για τον ορισμό της περιοχής επισήμανσης στη λειτουργία επεξεργασίας.
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(); } } }