Το σημείο επέκτασης για τις ρουτίνες χειρισμού αποτελεί βελτίωση του πειραματικού στοιχείου handlerSubmission
το οποίο ορίζεται στο Eclipse 3.0. Η ρουτίνα χειρισμού είναι η συμπεριφορά μιας εντολής σε μια συγκεκριμένη στιγμή. Μια εντολή μπορεί να είναι συσχετισμένη με διάφορες ή καμία ρουτίνα χειρισμού. Ωστόσο, σε κάθε χρονικό σημείο μια εντολή θα έχει μία ή καμία ενεργή ρουτίνα χειρισμού. Η ενεργή ρουτίνα χειρισμού είναι υπεύθυνη τη δεδομένη στιγμή για τη διεξαγωγή της συμπεριφοράς της εντολής. Μοιάζει με την έννοια μιας ρουτίνας χειρισμού ενέργειας και μιας ενέργειας με δυνατότητα νέου προορισμού.
Το σημείο επέκτασης για τις ρουτίνες χειρισμού επιτρέπει σε έναν προγραμματιστή πρόσθετων ενεργειών να ορίσει μια ρουτίνα χειρισμού που θα είναι ενεργή και/ή θα τεθεί σε λειτουργία υπό καθορισμένες συνθήκες. Αν μια ρουτίνα χειρισμού είναι ανενεργή, τότε καμιά εντολή δεν θα αναθέσει τη συμπεριφορά της στη ρουτίνα χειρισμού. Αν απενεργοποιηθεί μια ρουτίνα χειρισμού, τότε δεν θα της ζητηθεί να εκτελέσει μια λειτουργία. Η εκτέλεση της ρουτίνας χειρισμού παρεμποδίζεται. Οι συνθήκες ορίζονται με τη λειτουργία της γλώσσας έκφρασης που προστέθηκε στην έκδοση 3.0. Διατυπώνονται με τις συνθήκες activeWhen
και enabledWhen
.
Ο πάγκος εργασίας παρέχει ορισμένες μεταβλητές στις οποίες μπορούν να βασιστούν αυτές οι εκφράσεις. Οι μεταβλητές που υποστηρίζονται είναι: τα ενεργά περιβάλλοντα, η ενεργή λειτουργία επεξεργασίας, το ενεργό τμήμα και η τρέχουσα επιλογή. Παρόλο που δεν υποστηρίζονται στον αρχικό αυτό σχεδιασμό, είναι εύκολο να δει κανείς με ποιό τρόπο θα μπορούσαν να προστεθούν άλλες μεταβλητές ή ακόμη και με ποιό τρόπο θα μπορούσαν οι προγραμματιστές πρόσθετων λειτουργιών να συνεισφέρουν άλλες μεταβλητές.
Μια ρουτίνα χειρισμού η οποία δεν καθορίζει καμία συνθήκη αποτελεί προεπιλεγμένη ρουτίνα χειρισμού. Μια προεπιλεγμένη ρουτίνα χειρισμού ενεργοποιείται μόνο όταν δεν ικανοποιούνται οι συνθήκες κάποιας άλλης ρουτίνας χειρισμού. Αν και πάλι υπάρχουν δύο ρουτίνες χειρισμού με συνθήκες που ικανοποιούνται, τότε γίνεται σύγκριση των συνθηκών. Η ιδέα είναι να επιλέγεται η ρουτίνα χειρισμού της οποία η συνθήκη θα είναι η πιο συγκεκριμένη ή η πιο τοπική. Για να γίνει αυτό, πραγματοποιείται έλεγχος των μεταβλητών στις οποίες αναφέρεται η συνθήκη. Η συνθήκη που αναφέρεται στην πιο συγκεκριμένη μεταβλητή υπερισχύει. Η σειρά προσδιορισιμότητας (από την λιγότερο στην περισσότερο συγκεκριμένη) ορίζεται από τη διεπαφή org.eclipse.ui.ISources
.
Αν η διένεξη παραμένει, τότε δεν ενεργοποιείται καμία ρουτίνα χειρισμού. Αν είναι ενεργή μια ορισμένη επιλογή ιχνηλασίας, τότε αυτό έχει ως αποτέλεσμα την εμφάνιση ενός μηνύματος στο αρχείο καταγραφής. Διένεξη μπορεί να προκύψει και στην περίπτωση που υπάρχουν δύο προεπιλεγμένες ρουτίνες χειρισμού. Η αποφυγή αυτής της διένεξης αποτελεί ευθύνη των προγραμματιστών πρόσθετων λειτουργιών και των λειτουργιών δοκιμής ενοποίησης. Αυτές οι συνθήκες χρησιμοποιούνται για την αποφυγή της άσκοπης φόρτωσης πρόσθετων λειτουργιών. Αυτοί οι ορισμοί για ρουτίνες χειρισμού βρίσκονται σε έναν ενδιάμεσο εξυπηρετητή. Για να φορτωθεί από τον ενδιάμεσο εξυπηρετητή η υποκείμενη ρουτίνα χειρισμού, πρέπει να συμβούν δύο πράγματα: πρέπει να ικανοποιούνται οι συνθήκες για τον ενδιάμεσο εξυπηρετητή, ώστε αυτός να ενεργοποιηθεί και πρέπει να ζητηθεί από την εντολή να πραγματοποιήσει μιαν ενέργεια η οποία θα ανατεθεί (π.χ. εκτέλεση()).
<!ELEMENT extension (handler*)>
<!ATTLIST extension
point CDATA #REQUIRED
id CDATA #IMPLIED
name CDATA #IMPLIED>
<!ELEMENT handler (activeWhen? , class? , enabledWhen?)>
<!ATTLIST handler
commandId CDATA #REQUIRED
class CDATA #IMPLIED
helpContextId CDATA #IMPLIED>
Η ταυτότητα του περιβάλλοντος βοήθειας που σχετίζεται με τη συγκεκριμένη ρουτίνα χειρισμού. Ενώ μια εντολή μπορεί να παρέχει μια γενική περιγραφή της συμπεριφοράς της εντολής, ορισμένες φορές είναι κατάλληλο μια ρουτίνα χειρισμού να παρέχει βοήθεια περισσότερο συγκεκριμένη για τις υλοποιήσεις τους.
Από την έκδοση: 3.2
<!ELEMENT activeWhen (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>
<!ELEMENT enabledWhen (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>
<!ATTLIST class
class CDATA #IMPLIED>
<!ELEMENT parameter EMPTY>
<!ATTLIST parameter
name CDATA #REQUIRED
value CDATA #REQUIRED>
<!ELEMENT enablement (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
Γενικό κεντρικό στοιχείο. Το στοιχείο μπορεί να χρησιμοποιηθεί σε ένα σημείο επέκτασης για τον ορισμό της έκφρασης ενεργοποίησης. Τα θυγατρικά στοιχεία μιας έκφρασης ενεργοποίησης συνδυάζονται με τη χρήση του τελεστή "and".
<!ELEMENT not (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>
Το στοιχείο αυτό εκφράζει ένα λογικό τελεστή ΝΟΤ στο αποτέλεσμα της αποτίμησης της έκφρασης του υποστοιχείου του.
<!ELEMENT and (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
Το στοιχείο αυτό εκφράζει ένα λογικό τελεστή AND στο αποτέλεσμα της αποτίμησης των εκφράσεων των υποστοιχείων του.
<!ELEMENT or (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
Το στοιχείο αυτό εκφράζει ένα λογικό τελεστή OR στο αποτέλεσμα της αποτίμησης των εκφράσεων των υποστοιχείων του.
<!ELEMENT instanceof EMPTY>
<!ATTLIST instanceof
value CDATA #REQUIRED>
Αυτό το στοιχείο χρησιμοποιείται για την εκτέλεση μιας χρήσης ελέγχου του εστιαζόμενου αντικειμένου. Η έκφραση επιστρέφει EvaluationResult.TRUE αν το είδος του αντικειμένου αποτελεί υπο-είδος του του είδους που προσδιορίζεται από την τιμή γνωρίσματος. Διαφορετικά, επιστρέφει EvaluationResult.FALSE.
<!ELEMENT test EMPTY>
<!ATTLIST test
property CDATA #REQUIRED
args CDATA #IMPLIED
value CDATA #IMPLIED>
Αυτό το στοιχείο χρησιμοποιείται για την αποτίμηση γνωρίσματος state του εστιαζόμενου αντικειμένου. Το σύνολο των ιδιοτήτων που μπορούν να τεθούν υπό δοκιμή μπορεί να επεκταθεί με τη χρήση του σημείου επέκτασης λειτουργίας δοκιμής ιδιοτήτων. Η έκφραση δοκιμής επιστρέφει την EvaluationResult.NOT_LOADED αν η λειτουργία δοκιμής ιδιοτήτων που εκτελεί στην ουσία τη δοκιμή δεν έχει φορτωθεί ακόμα.
<!ELEMENT systemTest EMPTY>
<!ATTLIST systemTest
property CDATA #REQUIRED
value CDATA #REQUIRED>
Δοκιμάζει μια ιδιότητα συστήματος καλώντας τη μέθοδο System.getProperty και συγκρίνει το αποτέλεσμα με την τιμή που καθορίζεται μέσω του γνωρίσματος value.
<!ELEMENT equals EMPTY>
<!ATTLIST equals
value CDATA #REQUIRED>
Αυτό το στοιχείο χρησιμοποιείται για την εκτέλεση ενός ελέγχου ισοδυναμίας (equals) του εστιαζόμενου αντικειμένου. Η έκφραση επιστρέφει EvaluationResult.TRUE αν το αντικείμενο ισούται με την τιμή που παρέχεται από την τιμή γνωρίσματος. Διαφορετικά, επιστρέφει EvaluationResult.FALSE.
<!ELEMENT count EMPTY>
<!ATTLIST count
value CDATA #REQUIRED>
Αυτό το στοιχείο χρησιμοποιείται για τη δοκιμή του αριθμού των στοιχείων σε μια συλλογή.
<!ELEMENT with (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST with
variable CDATA #REQUIRED>
Αυτό το στοιχείο αλλάζει το αντικείμενο προς επιθεώρηση για όλα τα θυγατρικά στοιχεία του με το αντικείμενο στο οποίο γίνεται αναφορά από τη δεδομένη μεταβλητή. Αν η μεταβλητή δεν μπορεί να αναλυθεί, τότε η έκφραση θα εμφανίσει ένα ExpressionException κατά την αποτίμησή του. Τα θυγατρικά στοιχεία μιας έκφρασης "with" συνδυάζονται με τη χρήση του τελεστή "and".
<!ELEMENT resolve (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST resolve
variable CDATA #REQUIRED
args CDATA #IMPLIED>
Αυτό το στοιχείο αλλάζει το αντικείμενο προς επιθεώρηση για όλα τα θυγατρικά στοιχεία του με το αντικείμενο στο οποίο γίνεται αναφορά από τη δεδομένη μεταβλητή. Αν η μεταβλητή δεν μπορεί να αναλυθεί, τότε η έκφραση θα εμφανίσει ένα ExpressionException κατά την αποτίμησή του. Τα θυγατρικά στοιχεία μιας έκφρασης "with" συνδυάζονται με τη χρήση του τελεστή "and".
<!ELEMENT adapt (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST adapt
type CDATA #REQUIRED>
Αυτό το στοιχείο χρησιμοποιείται για την προσαρμογή του εστιαζόμενου στο είδος που καθορίζεται από το είδος γνωρίσματος. Η έκφραση επιστρέφει "not loaded" αν ο προσαρμογέας ή το είδος στο οποίο γίνεται παραπομπή δεν έχει φορτωθεί ακόμα. Εμφανίζει ExpressionException κατά την αποτίμηση αν το όνομα είδους δεν υπάρχει. Τα θυγατρικά στοιχεία μιας έκφρασης "adapt" συνδυάζονται με τη χρήση του τελεστή "and".
<!ELEMENT iterate (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST iterate
operator (or|and) >
Αυτό το στοιχείο χρησιμοποιείται για την επαναληπτική προσέγγιση σε μια μεταβλητή του τύπου java.util.Collection. Αν το εστιαζόμενο αντικείμενο δεν είναι του τύπου java.util.Collection, τότε εμφανίζεται μια ExpressionException κατά την αποτίμηση της έκφρασης.
<extension point=
"org.eclipse.ui.handlers"
>
<handler commandId=
"commandId"
class=
"org.eclipse.compare.Command"
>
<activeWhen>
<with variable=
"selection"
>
<count value=
"1"
/>
<iterate operator=
"and"
>
<adapt type=
"IResource"
/>
</iterate>
</with>
</activeWhen>
</handler>
</extension>
Για την αποφυγή φόρτωσης πρόσθετων λειτουργιών στο εξής, είναι δυνατό να ορισθεί ο χρόνος ενεργοποίησης της ρουτίνας χειρισμού. Αν ο ενδιάμεσος εξυπηρετητής δεν έχει φορτώσει ακόμη τη ρουτίνα χειρισμού, τότε χρησιμοποιείται μόνο η σύνταξη των εκφράσεων για να αποφασιστεί αν θα ενεργοποιηθεί η ρουτίνα χειρισμού. Αν ο ενδιάμεσος εξυπηρετητής έχει φορτώσει τη ρουτίνα χειρισμού, τότε τον πρώτο λόγο έχει η σύνταξη των εκφράσεων. Εάν η αποτίμηση της σύνταξης έκφρασης είναι true, τότε γίνεται ερώτηση στη ρουτίνα χειρισμού αν έχει ενεργοποιηθεί. (Πρόκειται για λειτουργία κλειστού κυκλώματος λογικής τιμής "and" ανάμεσα στη σύνταξη εκφράσεων και την ενεργοποιημένη κατάσταση της ρουτίνας χειρισμού.)
<extension point=
"org.eclipse.ui.handlers"
>
<handler commandId=
"commandId"
class=
"org.eclipse.Handler"
>
<enabledWhen>
<with variable=
"context"
>
<property id=
"id"
value=
"debugging"
/>
</with>
</enabledWhen>
</handler>
</extension>
Όλες οι ρουτίνες χειρισμού υλοποιούν τη διεπαφή org.eclipse.core.commands.IHandler
. Από τον πάγκο εργασίας είναι δυνατό να ενεργοποιηθούν και να απενεργοποιηθούν οι ρουτίνες χειρισμού χρησιμοποιώντας τη διεπαφή org.eclipse.ui.handlers.IHandlerService
. Αυτή η διεπαφή μπορεί να ανακτηθεί από δευτερεύοντα αντικείμενα του πάγκου εργασίας, όπως το ίδιο το IWorkbench
. Για την ανάκτηση της υπηρεσίας θα καλούσατε τη μέθοδο IWorkbench.getAdapter(IHandlerService.class)
.
Η ενεργοποίηση και απενεργοποίηση των ρουτινών χειρισμού είναι επίσης δυνατή με χρήση του προϋπάρχοντος κωδικού στον πάγκο εργασίας. Αυτό μπορεί να γίνει με τη βοήθεια του προϋπάρχοντος μηχανισμού που παρατίθεται παρακάτω. Ο μηχανισμός αυτός είναι χρήσιμος σε πελάτες που χρησιμοποιούν ενέργειες για την συνεισφορά σε μενού ή γραμμές εργαλείων.
IWorkbenchPartSite mySite; IAction myAction; myAction.setActionDefinitionId(commandId); IKeyBindingService service = mySite.getKeyBindingService(); service.registerAction(myAction);
Copyright (c) 2005 IBM Corporation και άλλων.
Με την επιφύλαξη παντός δικαιώματος. Αυτό το πρόγραμμα και τα
συνοδευτικά του υλικά διατίθενται βάσει των όρων της κοινής άδειας
χρήσης Eclipse Public License v1.0 που συνοδεύει αυτή τη διανομή και
διατίθεται στην ακόλουθη διεύθυνση:
http://www.eclipse.org/legal/epl-v10.html.