Θυμηθείτε ότι το εργαλείο διαχείρισης αρχείων readme ορίζει τη δική του λειτουργία επεξεργασίας η οποία συνεισφέρει στη γραμμή μενού του πάγκου εργασίας χρησιμοποιώντας τη δική του ReadmeEditorActionBarContributor.
<extension point = "org.eclipse.ui.editors"> <editor id = "org.eclipse.ui.examples.readmetool.ReadmeEditor" name="%Editors.ReadmeEditor" icon="icons/obj16/editor.png" class="org.eclipse.ui.examples.readmetool.ReadmeEditor" extensions="readme" contributorClass="org.eclipse.ui.examples.readmetool.ReadmeEditorActionBarContributor"> </editor> </extension>
Ας εξετάσουμε πιο προσεκτικά τι συμβαίνει στην κλάση της διεργασίας συνεισφοράς
public ReadmeEditorActionBarContributor() { ... action2 = new RetargetAction(IReadmeConstants.RETARGET2, MessageUtil.getString("Editor_Action2")); action2.setToolTipText(MessageUtil.getString("Readme_Editor_Action2")); action2.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_DISABLE); action2.setImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_ENABLE); ... action3 = new LabelRetargetAction(IReadmeConstants.LABELRETARGET3, MessageUtil.getString("Editor_Action3")); action3.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_DISABLE); action3.setImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_ENABLE); ... handler2 = new EditorAction(MessageUtil.getString("Editor_Action2")); ... handler3 = new EditorAction(MessageUtil.getString("Editor_Action3")); ...
Κατά τη δημιουργία της διεργασίας συνεισφοράς, δημιουργούνται δύο ενέργειες μεταβλητής εμβέλειας (μία που επιτρέπει και μία που δεν επιτρέπει την ενημέρωση ετικέτας). Η δημιουργία των ενεργειών χρησιμοποιεί την ίδια τεχνική που χρησιμοποιεί ο πάγκος εργασίας. Δημιουργεί επίσης δύο ρουτίνες χειρισμού που θα χρησιμοποιηθούν για τις ενέργειες όταν η λειτουργία επεξεργασίας είναι το ενεργό τμήμα.
Όμως πού είναι καταχωρημένες οι ρουτίνες χειρισμού για τις ενέργειες;Η ρύθμιση των καθολικών ρουτινών χειρισμού γίνεται λίγο διαφορετικά όταν η λειτουργία επεξεργασίας ορίζει τις ενέργειες αλλαγμένης εμβέλειας. Γιατί; Διότι η διεργασία συνεισφοράς έχει την ευθύνη εντοπισμού της ενεργούς προβολής και δέσμευσης διαφορετικών ρουτινών χειρισμού καθώς καθίστανται ενεργές διαφορετικές προβολές ή η ίδια η λειτουργία επεξεργασίας. (Ο πάγκος εργασίας το κάνει αυτό για εσάς όταν ορίσετε μια ρουτίνα χειρισμού για μία από τις καθολικές του ενέργειες). Να πώς ρυθμίζει τα πράγματα η ReadmeEditorActionBarContributor:
public void init(IActionBars bars, IWorkbenchPage page) { super.init(bars, page); bars.setGlobalActionHandler(IReadmeConstants.RETARGET2, handler2); bars.setGlobalActionHandler(IReadmeConstants.LABELRETARGET3, handler3); ...
Πρώτον, η διεργασία συνεισφοράς καταχωρεί τις ρουτίνες χειρισμού της για τις ενέργειες αλλαγμένης εμβέλειας. Αυτό εξασφαλίζει ότι οι ενέργειες της διεργασίας συνεισφοράς θα εκτελεστούν όταν η ίδια η λειτουργία επεξεργασίας είναι ενεργή. Το επόμενο βήμα είναι η καταχώρηση κάθε RetargetAction ως λειτουργία ακρόασης τμήματος στη σελίδα.
... // Hook retarget actions as page listeners page.addPartListener(action2); page.addPartListener(action3); IWorkbenchPart activePart = page.getActivePart(); if (activePart != null) { action2.partActivated(activePart); action3.partActivated(activePart); } }
Η προσθήκη κάθε RetargetAction ως λειτουργία ακρόασης τμήματος σημαίνει ότι θα ειδοποιηθεί όταν αλλάξει το ενεργό τμήμα. Η ενέργεια μπορεί να λάβει τη σωστή καθολική ρουτίνα χειρισμού από την άρτι ενεργοποιηθείσα ενέργεια. (Δείτε την υλοποίηση RetargetAction για όλες τις λεπτομέρειες.) Σημειώστε ότι για να ξεκινήσει, η ενέργεια τροφοδοτείται με το τρέχον ενεργό τμήμα.
Όταν αποδεσμευτεί η διεργασία συνεισφοράς της λειτουργίας επεξεργασίας, θα πρέπει να αποδεσμεύσει τις ενέργειες μεταβλητής εμβέλειας ως λειτουργίες ακρόασης σελίδων.
public void dispose() { // Remove retarget actions as page listeners getPage().removePartListener(action2); getPage().removePartListener(action3); }
Τέλος, θυμηθείτε ότι γίνεται κοινή χρήση των διεργασιών συνεισφοράς της γραμμής ενεργειών μεταξύ χρήσεων της ίδιας κλάσης λειτουργίας επεξεργασίας. Για το λόγο αυτό, οι ρουτίνες χειρισμού πρέπει να ειδοποιούνται όταν αλλάζει η ενεργή λειτουργία επεξεργασίας, ώστε να συνδέονται με την κατάλληλη χρήση λειτουργίας επεξεργασίας.
public void setActiveEditor(IEditorPart editor) { ... handler2.setActiveEditor(editor); handler3.setActiveEditor(editor); ... }
Αυτό ολοκληρώνει τη ρύθμιση της λειτουργίας επεξεργασίας.Όταν η λειτουργία επεξεργασίας είναι ανοικτή και ενεργή, οι ρουτίνες χειρισμού (και οι ετικέτες τους) όπως ορίζονται από την ReadmeEditorActionBarContributor θα εμφανιστούν στη γραμμή μενού του πάγκου εργασίας.
Τώρα που οι διεργασίες συνεισφοράς της λειτουργίας επεξεργασίας έχουν ρυθμιστεί, τι κάνει μια προβολή για να καταχωρήσει μια ρουτίνα χειρισμού; Ο κώδικας στην πλευρά του πελάτη είναι παρόμοιος με την καταχώρηση ρουτίνας χειρισμού για ενέργεια του πάγκου εργασίας, εκτός του ότι η ταυτότητα ενέργειας είναι αυτή που έχει οριστεί από τη λειτουργία επεξεργασίας της πρόσθετης λειτουργίας. Η ReadmeContentOutlinePage καταχωρεί μια ρουτίνα χειρισμού για τις ενέργειες αυτές.
public void createControl(Composite parent) { super.createControl(parent); ... getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.RETARGET2, new OutlineAction(MessageUtil.getString("Outline_Action2"))); OutlineAction action = new OutlineAction(MessageUtil.getString("Outline_Action3")); action.setToolTipText(MessageUtil.getString("Readme_Outline_Action3")); getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.LABELRETARGET3, action); ...
Σημειώστε ότι η λειτουργία διάρθρωσης ορίζει ένα επεξηγηματικό κείμενο και μια ετικέτα στη δεύτερη ενέργεια, εφόσον επιτρέπει την επαναπόδοση ετικέτας. Όταν καταστεί ενεργή η προβολή λειτουργίας διάρθρωσης αρχείων readme, οι ρουτίνες χειρισμού της (και οι ετικέτες τους) θα εμφανιστούν στη γραμμή μενού του πάγκου εργασίας.
Σημειώστε ότι η μετονομασμένη ενέργεια εμφανίζει τη νέα ετικέτα.