Το πακέτο org.eclipse.jface.resource ορίζει κλάσεις που βοηθούν τις πρόσθετες λειτουργίες στη διαχείριση πόρων περιβάλλοντος χρήστη, όπως είναι οι γραμματοσειρές και τα εικονίδια.
Πολλά από τα σημεία επέκτασης του πάγκου εργασίας επιτρέπουν στις πρόσθετες λειτουργίες να παρέχουν εικονίδια τα οποία μπορούν να χρησιμοποιηθούν για την εμφάνιση των συνεισφορών τους στον πάγκο εργασίας. Καθώς τα λειτουργικά συστήματα GUI υποστηρίζουν ένα περιορισμένο αριθμό εικόνων ή γραμματοσειρών κάθε φορά στη μνήμη, η διαχείριση των πόρων περιβάλλοντος χρήστη μιας πρόσθετης λειτουργίας πρέπει να γίνεται με προσοχή και μερικές φορές, οι πόροι αυτοί πρέπει να είναι κοινόχρηστοι μεταξύ των οργάνων.
Έχουμε ήδη δει μερικές παραπομπές σε εικονίδια στην πρόσθετη λειτουργία του εργαλείου διαχείρισης αρχείων readme. Μερικά από τα εικονίδια αυτά προσδιορίζονται στον κώδικα plugin.xml.
<extension point="org.eclipse.ui.views"> <category id="org.eclipse.ui.examples.readmetool" name="%Views.category"> </category> <view id="org.eclipse.ui.examples.readmetool.views.SectionsView" name="%Views.ReadmeSections" icon="icons/view16/sections.png" category="org.eclipse.ui.examples.readmetool" class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView"> </view> </extension>
Έχουμε δει επίσης κώδικα ο οποίος περιγράφει εικόνες κατά τη διάρκεια της λειτουργίας. Το παρακάτω είναι από το ReadmeEditorActionBarContributor του εργαλείου διαχείρισης αρχείων readme.
public ReadmeEditorActionBarContributor() { ... action1 = new EditorAction(MessageUtil.getString("Editor_Action1")); action1.setToolTipText(MessageUtil.getString("Readme_Editor_Action1")); action1.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_DISABLE); action1.setImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_ENABLE); ...
Το JFace παρέχει τις βασικές κλάσεις υποστήριξης οι οποίες επιτρέπουν στις πρόσθετες λειτουργίες τη διαχείριση των εικόνων και των γραμματοσειρών τους, χωρίς να χρειάζεται να ενδιαφέρονται για το πότε τα αντίστοιχα γραφικά αντικείμενα της πλατφόρμας δημιουργούνται ή καταστρέφονται. Αυτές οι κλάσεις υποστήριξης χρησιμοποιούνται άμεσα από πρόσθετες λειτουργίες, όπως φαίνεται παραπάνω, ή έμμεσα, όταν ο πάγκος εργασίας χρησιμοποιεί τις κλάσεις αυτές για τη λήψη αντικειμένων τα οποία περιγράφονται στον κώδικα του σημείου επέκτασης.
Η κλάση Image του SWT αναπαριστά μια εικόνα από την προοπτική του λειτουργικού συστήματος. Καθώς τα περισσότερα λειτουργικά συστήματα GUI έχουν ένα όριο για τον αριθμό των εικόνων που μπορούν να ανοίγουν κάθε φορά, οι πρόσθετες λειτουργίες θα πρέπει να είναι πολύ προσεκτικές όταν τις δημιουργούν και να διασφαλίζουν ότι τις αποδεσμεύουν πάντα με τον κατάλληλο τρόπο όταν δεν τις χρησιμοποιούν πλέον. Με τη χρήση των κλάσεων ImageDescriptor και ImageRegistry JFace, αντί της εικόνας SWT, οι πρόσθετες λειτουργίες μπορούν γενικά να αποφεύγουν την άμεση δημιουργία, διαχείριση και αποδέσμευση αυτών των εικόνων.
Η κλάση ImageDescriptor μπορεί να χρησιμοποιηθεί ως μια περιορισμένων δυνατοτήτων περιγραφή μιας εικόνας. Προσδιορίζει όλα όσα χρειάζονται για τη δημιουργία μιας εικόνας, όπως το URL ή το όνομα αρχείου στο οποίο η εικόνα μπορεί να ληφθεί. Οι κλάσεις ImageDescriptors δεν κατανέμουν μια πραγματική εικόνα πλατφόρμας εκτός κι αν ζητηθεί συγκεκριμένα με τη χρήση της μεθόδου createImage().
Τα αρχεία περιγραφής εικόνων αποτελούν την ιδανική στρατηγική για τις περιπτώσεις κατά τις οποίες ο κώδικάς σας είναι κατασκευασμένος έτσι ώστε να ορίζει όλα τα εικονίδια σε μια θέση και να τα κατανέμει κατάλληλα. Αρχεία περιγραφής εικόνων μπορούν να δημιουργηθούν οποιαδήποτε στιγμή, ανεξάρτητα από τους πόρους του λειτουργικού συστήματος. Έτσι, είναι πολύ εύχρηστη η δημιουργία όλων σε έναν κώδικα απόδοσης αρχικών τιμών.
Η κλάση ImageRegistry χρησιμοποιείται για να διατηρεί μια λίστα των εικόνων με το όνομά τους. Οι πελάτες μπορούν να προσθέτουν αρχεία περιγραφής εικόνων ή εικόνες SWT απευθείας στη λίστα. Όταν ζητείται μια εικόνα με το όνομά της από το μητρώο, το μητρώο επιστρέφει την εικόνα, εάν αυτή έχει δημιουργηθεί, ή δημιουργεί μία εικόνα από το αρχείο περιγραφής. Έτσι οι πελάτες του μητρώου έχουν τη δυνατότητα κοινής χρήσης των εικόνων.
Οι εικόνες που προστίθενται στο μητρώο ή ανακτώνται από αυτό δεν πρέπει να αποδεσμεύονται από κάποιον πελάτη. Το μητρώο είναι υπεύθυνο για την αποδέσμευση της εικόνας, καθώς οι εικόνες είναι κοινόχρηστες σε πολλούς πελάτες. Το μητρώο θα αποδεσμεύει τις εικόνες, όταν η λειτουργία του συστήματος GUI πλατφόρμας τερματίζεται.
Όπου είναι εφικτό, προσδιορίστε το εικονίδιο για τα αντικείμενα περιβάλλοντος χρήστη της πρόσθετης λειτουργίας σας, στο αρχείο plugin.xml. Πολλά από τα σημεία επέκτασης του πάγκου εργασίας συμπεριλαμβάνουν παραμέτρους ρυθμίσεων για ένα αρχείο εικονιδίου. Ορίζοντας τα εικονίδιά σας στη συνεισφορά επέκτασης στο αρχείο plugin.xml, αναθέτετε τη στρατηγική της διαχείρισης εικόνων στην πλατφόρμα. Καθώς τα εικονίδια διατηρούνται συνήθως στον κατάλογο της πρόσθετης λειτουργίας σας, μπορείτε να προσδιορίζετε τα εικονίδια και να διαχειρίζεστε όλα τα αρχεία σε μία θέση.
Τα άλλα μοτίβα θα πρέπει να λαμβάνονται υπόψη μόνο όταν δεν μπορείτε να προσδιορίσετε το εικονίδιο ως τμήμα της συνεισφοράς της επέκτασής σας.
Η ρητή δημιουργία μιας εικόνας αποτελεί την ιδανική στρατηγική όταν η εικόνα δεν χρησιμοποιείται συχνά και δεν είναι κοινόχρηστη. Η εικόνα μπορεί να δημιουργηθεί απευθείας στο SWT και να αποδεσμευτεί μετά τη χρήση της.
Εικόνες μπορούν επίσης να δημιουργηθούν ρητά με τη χρήση μιας κλάσης ImageDescriptor και την επίκληση της μεθόδου createImage(). Όπως στην πρώτη περίπτωση, η μέθοδος dispose() για την εικόνα, πρέπει να κληθεί μόνο αν η εικόνα δεν χρειάζεται πλέον. Για παράδειγμα, εάν ένα πλαίσιο διαλόγου δημιουργεί μια εικόνα όταν ανοίγει, θα πρέπει να αποδεσμεύει την εικόνα όταν κλείνει.
Όταν μια εικόνα χρησιμοποιείται συχνά σε μια πρόσθετη λειτουργία και είναι κοινόχρηστη για πολλά διαφορετικά αντικείμενα στο περιβάλλον χρήστη, τότε είναι χρήσιμο να καταχωρήσετε το αρχείο περιγραφής εικόνας με μια κλάση ImageRegistry. Οι εικόνες που περιέχονται στο μητρώο θα είναι κοινόχρηστες για όλα τα αντικείμενα τα οποία ζητούν μια εικόνα με το ίδιο όνομα. Δεν πρέπει να αποδεσμεύετε τις εικόνες που περιέχονται στο μητρώο, καθώς αυτές είναι κοινόχρηστες από άλλα αντικείμενα.
Η προσθήκη μιας εικόνας στο μητρώο εικόνων αποτελεί την ιδανική στρατηγική όταν η εικόνα χρησιμοποιείται συχνά, ίσως σε όλη τη διάρκεια ζωής της πρόσθετης λειτουργίας και είναι κοινόχρηστη από πολλά αντικείμενα. Το μειονέκτημα της χρήσης του μητρώου είναι ότι οι εικόνες που περιέχονται σε αυτό δεν αποδεσμεύονται αν δεν τερματιστεί η λειτουργία του συστήματος GUI. Καθώς υπάρχει ένα όριο στον αριθμό των εικόνων πλατφόρμας (SWT) που μπορούν να ανοίξουν κάθε φορά, οι πρόσθετες λειτουργίες δεν θα πρέπει να καταχωρούν πολλές εικόνες σε ένα μητρώο.
Η κλάση AbstractUIPlugin συμπεριλαμβάνει ένα πρωτόκολλο για τη δημιουργία ενός μητρώου εικόνων για το σύνολο μιας πρόσθετης λειτουργίας.
Όταν ένα εικονίδιο χρησιμοποιείται συχνά για την εμφάνιση στοιχείων σε μια συγκεκριμένη λειτουργία προβολής, μπορεί να είναι κοινόχρηστο μεταξύ παρόμοιων στοιχείων της λειτουργίας προβολής, με τη χρήση ενός παροχέα ετικέτας. Καθώς ο παροχέας ετικέτας είναι υπεύθυνος για την επιστροφή μιας εικόνας για κάθε αντικείμενο σε μια λειτουργία προβολής, μπορεί να ελέγχει τη δημιουργία της εικόνας και την κοινή χρήση εικόνων μεταξύ των αντικειμένων της λειτουργίας προβολής.
Ο παροχέας ετικέτας μπορεί να χρησιμοποιεί οποιαδήποτε από τις προαναφερθείσες τεχνικές για τη δημιουργία μιας εικόνας. Αν πραγματοποιήσετε αναζήτηση στις διάφορες υλοποιήσεις της getImage() στις υποκλάσεις της LabelProvider, θα δείτε διάφορες προσεγγίσεις, συμπεριλαμβανομένης της αποθήκευσης στη λανθάνουσα μνήμη ενός απλού εικονιδίου για αντικείμενα και της διατήρησης ενός πίνακα εικόνων ανά είδος. Οι εικόνες που δημιουργούνται από έναν παροχέα ετικέτας πρέπει να αποδεσμεύονται στη μέθοδο dispose() του παροχέα, η οποία καλείται κατά την αποδέσμευση της λειτουργίας προβολής.
Η χρήση ενός παροχέα ετικέτας αποτελεί έναν ικανοποιητικό συμβιβασμό μεταξύ ρητής δημιουργίας και μητρώου εικόνων. Προάγει την κοινή χρήση των εικονιδίων, όπως το μητρώο εικόνων, ενώ εξακολουθεί να διατηρεί τον έλεγχο της δημιουργίας και της αποδέσμευσης της πραγματικής εικόνας.
Κατά το λεπτομερή έλεγχο μια πρόσθετης λειτουργίας, συνηθίζεται ο πειραματισμός με όλα αυτά τα διαφορετικά μοτίβα δημιουργίας εικόνων. Μπορεί να είναι χρήσιμη η απομόνωση της διαδικασίας λήψης απόφασης, σχετικά με τη δημιουργία μιας εικόνας σε μια ξεχωριστή κλάση και η καθοδήγηση όλων των πελατών να χρησιμοποιούν την κλάση για τη λήψη όλων των εικόνων. Με τον τρόπο αυτό, η ακολουθία της δημιουργίας μπορεί να ρυθμιστεί ώστε να εκφράζει τα πραγματικά χαρακτηριστικά στοιχεία απόδοσης της πρόσθετης λειτουργίας.
Η κλάση ResourceManager χρησιμοποιείται για τη διατήρηση μιας αντιστοίχισης των κλάσεων ImageDescriptor με τις κλάσεις Image, έτσι ώστε μια εικόνα να μπορεί να επαναχρησιμοποιηθεί, με παραπομπή σε αυτή μέσω του αρχείου περιγραφής της. Όταν ένα αρχείο περιγραφής ζητήσει μια εικόνα από το μητρώο, το μητρώο θα επιστρέψει την εικόνα αν έχει δημιουργηθεί ή θα δημιουργήσει μια εικόνα από το αρχείο περιγραφής. Έτσι οι πελάτες του μητρώου έχουν τη δυνατότητα κοινής χρήσης των εικόνων.
Η ανώτερου επιπέδου ResourceManager είναι μια κλάση DeviceResourceManager η οποία δημιουργείται στην κλάση Display. Η κλάση ResourceManager ορίζεται από την JFaceResources. Η μέθοδος getResources() είναι μια κλάση DeviceResourceManager και μπορεί να χρησιμοποιείται ως ανωτέρου επιπέδου ResourceManager. Εάν χρειάζεστε μια κλάση ResourceManager με συντομότερο κύκλο ζωής από την DeviceResourceManager, μπορείτε να δημιουργήσετε μια κλάση LocalResourceManager ως θυγατρική και να την αποδεσμεύσετε όταν τελειώσετε.
Μια κλάση DeviceResourceManager θα αποδεσμεύεται όταν η κλάση Display που χρησιμοποιείται για τη δημιουργία της αποδεσμεύεται, επομένως δεν απαιτείται κάποιος κωδικός διαχείρισης.
Οι εικόνες που προστίθενται στη λειτουργία διαχείρισης ή ανακτώνται από αυτή δεν πρέπει να αποδεσμεύονται από κάποιον πελάτη. Η λειτουργία διαχείρισης είναι υπεύθυνη για την αποδέσμευση της εικόνας, καθώς οι εικόνες είναι κοινόχρηστες σε πολλούς πελάτες. Το μητρώο θα αποδεσμεύει τις εικόνες, όταν η κλάση ResourceManager που τις περιέχει αποδεσμεύεται.
Οι γραμματοσειρές αποτελούν έναν ακόμη περιορισμένο πόρο στα λειτουργικά συστήματα της πλατφόρμας. Τα θέματα δημιουργίας και αποδέσμευσης είναι τα ίδια για γραμματοσειρές και εικόνες και απαιτούν παρόμοιους συμβιβασμούς ταχύτητας/χώρου. Γενικά, οι γραμματοσειρές κατανέμονται στο SWT με αίτηση μιας γραμματοσειράς με τη χρήση ονόματος γραμματοσειράς το οποίο εξαρτάται από την πλατφόρμα.
Η κλάση FontRegistry διατηρεί έναν πίνακα γραμματοσειρών, με το όνομά τους. Διαχειρίζεται την κατανομή και την αποδέσμευση της γραμματοσειράς.
Γενικά, οι πρόσθετες λειτουργίες θα πρέπει να αποφεύγουν την κατανομή γραμματοσειρών ή την περιγραφή γραμματοσειρών με ονόματα ειδικά για την κάθε πλατφόρμα. Παρόλο που το μητρώο γραμματοσειρών χρησιμοποιείται εσωτερικά στο JFace, συνήθως δεν χρησιμοποιείται από πρόσθετες λειτουργίες. Η κλάση JFaceResources θα πρέπει να χρησιμοποιείται για την πρόσβαση σε κοινές γραμματοσειρές.
Είναι ιδιαίτερα συνηθισμένο, να επιτρέπεται στους χρήστες να προσδιορίζουν τις δικές τους προτιμήσεις για τις γραμματοσειρές της εφαρμογής, σε μια σελίδα προτιμήσεων. Στις περιπτώσεις αυτές, θα πρέπει να χρησιμοποιείται η κλάση FontFieldEditor για τη λήψη του ονόματος γραμματοσειράς, ενώ για τη διατήρηση της γραμματοσειράς μπορεί να χρησιμοποιείται μια κλάση FontRegistry. Η FontFieldEditor χρησιμοποιείται μόνο σε σελίδες προτιμήσεων.
Η κλάση JFaceResources ελέγχει την πρόσβαση σε κοινές γραμματοσειρές και εικόνες της πλατφόρμας. Διατηρεί ένα εσωτερικό μητρώο γραμματοσειρών και εικόνων, έτσι ώστε οι πελάτες να μπορούν να χρησιμοποιούν από κοινού γραμματοσειρές και εικόνες.
Υπάρχουν πολλές τεχνικές που χρησιμοποιούνται στον πάγκο εργασίας και άλλες πρόσθετες λειτουργίες για την κοινή χρήση εικόνων, όπου αυτό απαιτείται. Το μητρώο εικόνων της κλάσης JFaceResources δεν χρησιμοποιείται σε ολόκληρο τον πάγκο εργασίας και τον κώδικα πρόσθετων λειτουργιών.
Η χρήση γραμματοσειρών είναι πολύ πιο απλή. Ο πάγκος εργασίας και οι περισσότερες πρόσθετες λειτουργίες χρησιμοποιούν την κλάση JFaceResources για την αίτηση γραμματοσειρών χρησιμοποιώντας ένα λογικό όνομα. Μέθοδοι, όπως είναι οι getDialogFont() και getDefaultFont() παρέχονται έτσι ώστε οι πρόσθετες λειτουργίες να μπορούν να χρησιμοποιήσουν τις αναμενόμενες γραμματοσειρές στο δικό τους περιβάλλον χρήστη.