Η πρόσθετη λειτουργία σας μπορεί να χρησιμοποιήσει διακριτικά για την προσθήκη σημειώσεων για τις εικόνες των πόρων και άλλων αντικειμένων που εμφανίζονται στις προβολές του πάγκου εργασίας. Τα διακριτικά είναι χρήσιμα όταν η πρόσθετη λειτουργία σας προσθέτει λειτουργίες για υπάρχοντα είδη πόρων. Πολλές από τις τυπικές προβολές του πάγκου εργασίας συμμετέχουν στην εμφάνιση διακριτικών.
Για παράδειγμα, το PDE συνεισφέρει διακριτικά που σας επιτρέπουν τη διάκριση μεταξύ δυαδικών και έργων πρωτογενούς κώδικα.
Το έργο com.example.helloworld είναι το μόνο έργο πρωτογενούς κώδικα που εμφανίζεται στη λειτουργία πλοήγησης. Σημειώστε πώς όλα τα άλλα δυαδικά έργα εμφανίζουν το δυαδικό διακριτικό στην κορυφή και αριστερά στο εικονίδιο έργου Java. Αυτό το διακριτικό το συνεισφέρει το PDE χρησιμοποιώντας το σημείο επέκτασης org.eclipse.ui.decorators.
<extension point="org.eclipse.ui.decorators"> <decorator lightweight="true" quadrant="TOP_LEFT" adaptable="true" label="%decorator.label" icon="icons/full/ovr16/binary_co.png" state="false" id="org.eclipse.pde.ui.binaryProjectDecorator"> <description> %decorator.desc </description> <enablement> ... </enablement> </decorator> </extension>
Υπάρχουν αρκετοί διαφορετικοί τρόποι παροχής μιας υλοποίησης διακριτικού. Αυτή η μορφοποίηση χρησιμοποιεί τον πιο απλό τρόπο, γνωστό ως δηλωτικό διακριτικό μειωμένων λειτουργιών. Όταν ορίζεται ένα δηλωτικό διακριτικό μειωμένων λειτουργιών, η μορφοποίηση περιέχει μια πλήρη περιγραφή του εικονιδίου, της θέσης και των συνθηκών ενεργοποίησης του διακριτικού. Τα δηλωτικά διακριτικά είναι χρήσιμα μόνο όταν χρησιμοποιείται ένα εικονίδιο για την προσθήκη διακριτικών στην ετικέτα. Η πρόσθετη λειτουργία χρειάζεται μόνο να προσδιορίσει το τεταρτημόριο όπου το διακριτικό θα επικαλύψει το κανονικό εικονίδιο και το εικονίδιο για επικάλυψη. Όπως φαίνεται στην εικόνα, το δυαδικό εικονίδιο PDE επικαλύπτεται στο άνω αριστερά τεταρτημόριο του εικονιδίου πακέτου.
Εάν η πρόσθετη λειτουργία σας πρέπει να χειριστεί το κείμενο ετικέτας επιπλέον του εικονιδίου ή εάν το είδος του εικονιδίου καθορίζεται δυναμικά, μπορείτε να χρησιμοποιήσετε ένα μη δηλωτικό διακριτικό μειωμένων λειτουργιών. Στην περίπτωση αυτή, πρέπει να οριστεί μια κλάση υλοποίησης που υλοποιεί τηILightweightLabelDecorator. Η καθορισμένη κλάση έχει την ευθύνη παροχής προθήματος, επιθήματος και εικόνας επικάλυψης σε χρόνο εκτέλεσης που εφαρμόζονται στην ετικέτα. Τη διαχείριση της μηχανικής συνένωσης προθήματος και επιθήματος με το κείμενο ετικέτας και της εκτέλεσης της επικάλυψης έχει ο κώδικας του πάγκου εργασίας σε νήμα παρασκηνίου. Έτσι, κάθε εργασία που εκτελείται από την πρόσθετη λειτουργία σας στην υλοποίησή της ILightweightLabelDecorator πρέπει να είναι ασφαλής από νήματα περιβάλλοντος χρήστη. (Δείτε Εκτέλεση κώδικα από νήμα που δεν σχετίζεται με το περιβάλλον χρήστη για περισσότερες λεπτομέρειες.)
Η ακόλουθη μορφοποίηση εμφανίζει πώς ο πελάτης CVS ορίζει το διακριτικό του χρησιμοποιώντας αυτή την τεχνική:
<extension point="org.eclipse.ui.decorators"> <decorator objectClass="org.eclipse.core.resources.IResource" adaptable="true" label="%DecoratorStandard.name" state="false" lightweight= "true" quadrant = "BOTTOM_RIGHT" class="org.eclipse.team.internal.ccvs.ui.CVSLightweightDecorator" id="org.eclipse.team.cvs.ui.decorator"> <description> %DecoratorStandard.desc </description> </decorator> </extension>
Ο τελικός έλεγχος των διακριτικών ανήκει στο χρήστη μέσω της σελίδας προτιμήσεων Διακριτικά ετικέτας του πάγκου εργασίας. Τα μεμονωμένα διακριτικά ενεργοποιούνται και απενεργοποιούνται. Ακόμα κι έτσι, μια καλή ιδέα είναι η σχεδίαση των διακριτικών σας με τρόπο που δεν επικαλύπτει ή έρχεται σε διένεξη με τα υπάρχοντα διακριτικά της πλατφόρμας SDK. Εάν πολλαπλές πρόσθετες λειτουργίες συνεισφέρουν διακριτικά μειωμένων δυνατοτήτων στο ίδιο τεταρτημόριο, οι διενέξεις επιλύονται με μη ντετερμινιστικό τρόπο.
Η πρόσθετη λειτουργία σας μπορεί να αναλάβει μόνη της όλη τη διαχείριση εικόνας και ετικέτας. Στην περίπτωση αυτή, το γνώρισμα lightweight θα πρέπει να οριστεί στο false και το γνώρισμα class θα πρέπει να ονομάσει μια υποκλάση που υλοποιεί τη ILabelDecorator. Αυτή η κλάση σας επιτρέπει να προσθέσετε διακριτικά στην εικόνα και το κείμενο της αρχικής ετικέτας με τις δικές σας σημειώσεις. Σας δίνει αυξημένη ευελιξία αφού δεν περιορίζεστε σε προθήματα, επιθήματα και απλές επικαλύψεις τεταρτημορίου.
Άλλα γνωρίσματα διακριτικού είναι ανεξάρτητα από το επιμέρους στυλ υλοποίησης. Τα γνωρίσματα label και description καθορίζουν το κείμενο που θα χρησιμοποιείται για την ονομασία και την περιγραφή του διακριτικού στο πλαίσιο διαλόγου προτιμήσεων. Η objectClass ονομάζει την κλάση των αντικειμένων στην οποία πρέπει να εφαρμοστεί το διακριτικό. Το γνώρισμα enablement σας επιτρέπει να περιγράψετε τις συνθήκες κάτω από τις οποίες πρέπει να προστεθεί διακριτικό στο αντικείμενο. Ο ενδείκτης adaptable υποδεικνύει εάν πρέπει να προστεθεί διακριτικό σε αντικείμενα που προσαρμόζονται στην IResource. Ο ενδείκτης state ελέγχει εάν το διακριτικό είναι ορατό ως προεπιλογή.
Εάν τα διακριτικά σας περιλαμβάνουν πληροφορίες των οποίων ο υπολογισμός είναι ακριβός ή αποσπά δυνητικά την προσοχή, μπορείτε να συνεισφέρετε τις δικές σας προτιμήσεις που επιτρέπουν στο χρήστη να ρυθμίσει περαιτέρω το διακριτικό μόλις ενεργοποιηθεί. Αυτή η τεχνική χρησιμοποιείται από τον πελάτη CVS .
Κύκλος ενημέρωσης διακριτικού
Η προσθήκη διακριτικού ξεκινά με την ανανέωση των παροχέων ετικέτας που χρησιμοποιούν τη DecoratorManager για την παροχή διακριτικού. Καθώς πραγματοποιείται η επεξεργασία διακριτικού στο παρασκήνιο, θα υπάρχει μια περίοδος μεταξύ του αιτήματος για την ετικέτα και της ενεργοποίησης του συμβάντος labelProviderChanged που θα αναλάβει ο υπολογισμός διακριτικού. Εκείνη την περίοδο, το διακριτικό σε ένα "Αντικείμενο" θα υπολογιστεί μόνο μια φορά για λόγους απόδοσης. Εάν το διακριτικό αλλάξει τότε, είναι δυνατή η μετάδοση ενός ανενεργού αποτελέσματος καθώς θα αγνοούνται οι δεύτερες και επακόλουθες κλήσεις για προσθήκη διακριτικού σε στοιχείο.
Οι διεργασίες συνεισφοράς διακριτικών πρέπει να αποφεύγουν την αλλαγή των διακριτικών τους την ώρα της προσθήκης διακριτικού. Εάν αυτό δεν είναι εφικτό, θα απαιτηθεί μια δεύτερη κλήση για την προσθήκη διακριτικού σε ένα στοιχείο μετά την επεξεργασίας της labelProviderChanged.