Ξέρουμε ότι οι πρόσθετες λειτουργίες μπορούν να καθορίσουν ειδικές επεκτάσεις αρχείου και να συνεισφέρουν σε λειτουργίες επεξεργασίας που παρέχουν ειδικές δυνατότητες επεξεργασίας για αυτά τα είδη αρχείων. Κατά τη διαδικασία επεξεργασίας (ή δόμησης) ενός πόρου, μια πρόσθετη λειτουργία ενδέχεται να προσθέσει προσδιοριστικά σε πόρους προκειμένου να κοινοποιήσει προβλήματα ή άλλες πληροφορίες στο χρήστη. Ο μηχανισμός δείκτη πόρου χρησιμοποιείται για τη διαχείριση αυτού του είδους πληροφοριών.
Ένας δείκτης μοιάζει με μια σημείωση η οποία συσχετίζεται με κάποιον πόρο. Στο δείκτη μπορείτε να καταγράψετε πληροφορίες σχετικά με κάποιο πρόβλημα (π.χ. θέση, σοβατότητα) ή μια εργασία προς εκτέλεση.Ή μπορείτε απλά να καταγράψετε μια θέση για ένα δείκτη ως σελιδοδείκτη.
Οι χρήστες μπορούν γρήγορα να μεταβούν στη θέση του δείκτη μέσα στον πόρο. Το περιβάλλον χρήστη του πάγκου εργασίας υποστηρίζει την παρουσίαση σελιδοδεικτών, σημείων διακοπής, εργασιών, και προβλημάτων στη λειτουργία επεξεργασίας. Αυτοί οι δείκτες μπορούν επίσης να εμφανίζονται ως στοιχεία σε προβολές, όπως η προβολή εργασιών ή σελιδοδεικτών.
Οι πόροι API πλατφόρμας καθορίζουν τις μεθόδους δημιουργίας δεικτών, ρυθμίζουν τις τιμές δείκτη και επεκτείνουν την πλατφόρμα με νέα είδη δείκτη. Ενώ η διαχείριση των δεικτών πραγματοποιείται από την πλατφόρμα, ο έλεγχος για τη δημιουργία, αφαίρεση και την αντιστοίχιση τιμών ασκείται από τις πρόσθετες λειτουργίες.
Οι δείκτες προορίζονται να είναι μικρά, διακριτικά αντικείμενα. Ο αριθμός των δεικτών σε ένα μεμονωμένο έργο ενδέχεται να ανέρχεται σε εκατοντάδες ή ακόμα και χιλιάδες. Για παράδειγμα, ο μεταγλωττιστής Java χρησιμοποιεί ένα δείκτη για να επισημάνει κάθε πρόβλημα που εντοπίζει στον πρωτογενή κώδικα.
Η πλατφόρμα απορρίπτει δείκτες οι οποίοι συνδέονται με πόρους που έχουν διαγραφεί, και οι πρόσθετες λειτουργίες είναι υπεύθυνες για την αφαίρεση των ανενεργών δεικτών, όταν αυτοί δεν εφαρμόζονται πλέον σε κάποιον υφιστάμενο πόρο.
Ο χειρισμός ενός δείκτη είναι παρόμοιος με το χειρισμό ενός πόρου. Οι δείκτες είναι αντικείμενα χειρισμού. Μπορείτε να αποκτήσετε ένα δείκτη χειρισμού από έναν πόρο, αλλά δεν ξέρετε εάν υπάρχει πραγματικά μέχρι να χρησιμοποιήσετε το πρωτόκολλο exists() ή να προσπαθήσετε να τον χειριστείτε. Μόλις βεβαιωθείτε ότι ο δείκτης υπάρχει, μπορείτε να υποβάλλετε ένα ερώτημα για ονομασμένα γνωρίσματα τα οποία ενδέχεται να έχουν αντιστοιχιστεί σε αυτόν το δείκτη.
Οι δείκτες ανήκουν στην πλατφόρμα η οποία και τους διαχειρίζεται. Η πλατφόρμα μεριμνά για τη δημιουργία μόνιμων δεικτών και για την ειδοποίηση των λειτουργιών ακρόασης σχετικά με προσθήκες, διαγραφές ή αλλαγές.Οι πρόσθετες λειτουργίες είναι υπεύθυνες για τη δημουργία τυχόν απαραίτητων δεικτών, την αλλαγή των γνωρισμάτων τους και την αφαίρεσή τους όταν η παρουσία τους δεν κρίνεται πλέον απαραίτητη.
Οι δείκτες δεν δημιουργούνται απευθείας με χρήση μιας λειτουργίας κατασκευής. Δημιουργούνται με χρήση μιας μεθόδου κατασκευής (IResource.createMarker()) στο συσχετιζόμενο πόρο.
IMarker marker = file.createMarker(IMarker.TASK);
Για να δημιουργήσετε ένα δείκτη με καθολική εμβέλεια (ο οποίος δεν συσχετίζεται με κανένα συγκεκριμένο πόρο), μπορείτε να χρησιμοποιήσετε τη ρίζα χώρου εργασίας (IWorkspace.getRoot()) ως πόρο.
Ο κώδικας για τη διαγραφή ενός δείκτη είναι σύντομος.
try { marker.delete(); } catch (CoreException e) { // Something went wrong }
Μετά τη διαγραφή ενός δείκτη, το αντικείμενο του δείκτη του (χειρισμός) γίνεται "ανενεργό". Οι πρόσθετες λειτουργίες χρησιμοποιούν το πρωτόκολλο IMarker.exists() για να βεβαιωθούν ότι κάποιο αντικείμενο δείκτη είναι ακόμα έγκυρο.
Οι δείκτες μπορούν να διαγραφούν σε ομάδες ζητώντας από έναν πόρο να διαγράψει τους δείκτες του. Αυτή η μέθοδος είναι χρήσιμη κατά την αφαίρεση πολλών δεικτών ταυτόχρονα ή όταν δεν υπάρχουν διαθέσιμες αναφορές ή ταυτότητες ενός μεμονωμένου δείκτη.
int depth = IResource.DEPTH_INFINITE; try { resource.deleteMarkers(IMarker.PROBLEM, true, depth); } catch (CoreException e) { // something went wrong }
Κατά τη διαγραφή μιας ομάδας δεικτών, ορίζετε τη διαγραφή ποιου είδους δείκτη, όπως IMarker.PROBLEM, ή τη διαγραφή όλων των δεικτών null. Το δεύτερο όρισμα υποδηλώνει εάν θέλετε να διαγράψετε τους δείκτες δευτερεύοντος είδους. (Θα εξετάσουμε τα δευτερεύοντα είδη κατά τον καθορισμό νέων ειδών δείκτη.) Το όρισμα depth ελέγχει την έκταση της διαγραφής.
Μπορείτε επίσης να διαγράψετε δείκτες με χρήση του ορίσματος IWorkspace.deleteMarkers(IMarker []).
Με δεδομένο ένα δείκτη, μπορείτε να ζητήσετε το συσχετιζόμενο πόρο του, την ταυτότητά του (μοναδική και σχετική με αυτόν τον πόρο) καθώς και το είδος του. Επίσης μπορείτε να αποκτήσετε πρόσβαση σε επιπλέον πληροφορίες μέσω γενικών γνωρισμάτων.
Κάθε είδος δείκτη έχει ένα ειδικό σύνολο γνωρισμάτων τα οποία ορίζονται από τη λειτουργία δομής του είδους δείκτη με τη βοήθεια συμβάσεων ονοματοδοσίας. Η διασύνδεση IMarker ορίζει ένα σύνολο σταθερών που περιέχει τα τυπικά ονόματα γνωρισμάτων (και ορισμένες από τις αναμενόμενες τιμές) για τα είδη δείκτη της πλατφόρμας. Η ακόλουθη μέθοδος χειρίζεται γνωρίσματα με τη βοήθεια των σταθερών της πλατφόρμας.
IMarker marker = file.createMarker(IMarker.TASK); if (marker.exists()) { try { marker.setAttribute(IMarker.MESSAGE, "A sample marker message"); marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH); } catch (CoreException e) { // You need to handle the case where the marker no longer exists } }
Τα γνωρίσματα διατηρούνται γενικά ως ζεύγη ονόματος/τιμής, όταν τα ονόματα είναι σειρές χαρακτήρων και η τιμή μπορεί να είναι ένα οποιοδήποτε από τα υποστηριζόμενα είδη τιμών (λογική, ακέραια, αλφαριθμητική). Ο περιορισμός που ισχύει για τα είδη τιμής επιτρέπει τη μονιμοποίηση των δεικτών από την πλατφόρμα με γρήγορο και απλό τρόπο.
Μπορείτε να υποβάλλετε ερωτήματα σε πόρους για τους δείκτες τους καθώς και για τους δείκτες των θυγατρικών τους στοιχείων. Για παράδειγμα, η υποβολή ερωτήματος στη ρίζα του χώρου εργασίας με απεριόριστο βάθος λαμβάνει υπόψη όλους τους δείκτες στο χώρο εργασίας.
IMarker[] problems = null; int depth = IResource.DEPTH_INFINITE; try { problems = resource.findMarkers(IMarker.PROBLEM, true, depth); } catch (CoreException e) { // something went wrong }
Το αποτέλεσμα που επιστρέφεται από τον πόρο findMarkers εξαρτάται από τα ορίσματα που μεταβιβάζονται. Στο παραπάνω τμήμα κώδικα, αναζητούμε όλους τους δείκτες του είδους PROBLEM οι οποίοι εμφανίζονται στον πόρο καθώς και όλες τις άμεσες και έμμεσες εκδοχές προορισμού.
Αν μεταβιβάσετε την τιμή null ως το είδος του δείκτη, θα λάβετε όλα τα είδη δείκτη που συσχετίζονται με τον πόρο. Το δεύτερο όρισμα καθορίζει εάν θέλετε να εξετάσετε το θυγατρικό στοιχείο του πόρου. Τα στοιχεία ελέγχου του ορίσματος depth ελέγχουν το βάθος της αναζήτησης όταν εξετάζετε το θυγατρικό στοιχείο του πόρου. Το βάθος μπορεί να είναι DEPTH_ZERO (μόνο ο δεδομένος πόρος), DEPTH_ONE (ο πόρος και όλα τα θυγατρικά του στοιχεία) ή DEPTH_INFINITE (ο πόρος και όλες οι άμεσες και έμμεσες εκδοχές προοσισμού του).
Οι τυπικοί δείκτες πλατφόρμας (εργασία, πρόβλημα και σελιδοδείκτης) είναι μόνιμοι. Αυτό σημαίνει ότι η κατάστασή τους θα αποθηκεύεται κατά τις διαδικασίες τερματισμού και εκκίνησης. Ωστόσο, οι δείκτες μόνιμου είδους μπορούν επιλεκτικά να μετατρέπονται σε προσωρινούς δείκτες, ρυθμίζοντας το δεσμευμένο γνώρισμα transient στην τιμή true.
Τα νέα είδη δείκτη τα οποία δηλώνονται από τις πρόσθετες λειτουργίες δεν είναι μόνιμα εκτός κι αν δηλώνονται ως τέτοια.
Οι πρόσθετες λειτουργίες μπορούν να δηλώσουν τους δικά τους είδη δείκτη με τη βοήθεια του σημείου επέκτασης org.eclipse.core.resources.markers. Τα τυπικά είδη δείκτη για προβλήματα, εργασίες και σελιδοδείκτες δηλώνονται από την πλατφόρμα στη σήμανση της πρόσθετης λειτουργίας πόρου.
<extension id="problemmarker" point="org.eclipse.core.resources.markers" name="%problemName"> <super type="org.eclipse.core.resources.marker"/> <persistent value="true"/> <attribute name="severity"/> <attribute name="message"/> <attribute name="location"/> </extension><extension id="taskmarker" point="org.eclipse.core.resources.markers" name="%taskName"> <super type="org.eclipse.core.resources.marker"/> <persistent value="true"/> <attribute name="priority"/> <attribute name="message"/> <attribute name="done"/> <attribute name="userEditable"/> </extension><extension id="bookmark" point="org.eclipse.core.resources.markers" name="%bookmarkName"> <super type="org.eclipse.core.resources.marker"/> <persistent value="true"/> <attribute name="message"/> <attribute name="location"/> </extension>
Τα νέα είδη δείκτη προκύπτουν από τα υπάρχοντα με χρήση της πολλαπλής μεταβίβασης. Τα νέα είδη δείκτη μεταβιβάζουν όλα τα γνωρίσματα από τα υπερ-είδη τους και προσθέτουν τυχόν νέα γνωρίσματα ως τμήμα της δήλωσής τους. Επίσης μεταβιβάζουν, σε προσωρινή βάση, γνωρίσματα από τα υπερ-είδη των υπερ-ειδών τους. Η ακόλουθη σήμανση καθορίζει ένα νέο είδος δείκτη σε μια υποθετική πρόσθετη λειτουργία com.example.markers.
<extension id="mymarker" point="org.eclipse.core.resources.markers" /> <extension id="myproblem" point="org.eclipse.core.resources.markers"> <super type="org.eclipse.core.resources.problemmarker"/> <super type="com.example.markers.mymarker"/> <attribute name="myAttribute" /> <persistent value="true"/> </extension>
Σημειώστε ότι το είδος org.eclipse.core.resources.problemmarker είναι στην πραγματικότητα ένα από τα προκαθορισμένα είδη (γνωστό και ως IMarker.PROBLEM).
Η μοναδική πλευρά ενός υπερ-είδους δείκτη που δεν μεταβιβάζεται είναι ο ενδείκτης μονιμοποίησής του. Η προεπιλεγμένη τιμή για τη μονιμοποίηση είναι εσφαλμένη, έτσι οποιοδήποτε είδος δείκτη πρέπει να είναι μόνιμο οφείλει να ορίσει την τιμή <persistent value="true"/>.
Μετά τη δήλωση του νέου είδους δείκτη στο αρχείο δήλωσης της πρόσθετης λειτουργίας σας, μπορείτε να δημιουργήσετε χρήσεις του είδους δείκτη com.example.markers.myproblem και να ρυθμίσετε ελεύθερα ή να λάβετε το όρισμα myAttribute.
Η δήλωση νέων γνωρισμάτων σάς επιτρέπει να συνδέετε δεδομένα με δείκτες που σχεδιάζετε να χρησιμοποιήσετε σε άλλο σημείο (στις προβολές και στις λειτουργίες επεξεργασίας σας). Οι δείκτες ενός συγκεκριμένου είδους δεν χρειάζεται να έχουν τιμές για όλα τα δηλωμένα γνωρίσματα. Οι δηλώσεις γνωρίσματος προορίζονται περισσότερο για την επίλυση προβλημάτων συμβάσεων ονοματοδοσίας (έτσι ώστε όλοι να χρησιμοποιούν ένα "μήνυμα" κατά την περιγραφή ενός δείκτη) παρά για τον περιορισμό περιεχομένου.
public IMarker createMyMarker(IResource resource) { try { IMarker marker = resource.createMarker("com.example.markers.myproblem"); marker.setAttribute("myAttribute", "MYVALUE"); return marker; } catch (CoreException e) { // You need to handle the cases where attribute value is rejected } }
Μπορείτε να υποβάλλετε ερώτημα για τα δικά σας είδη δείκτη με τον ίδιο τρόπο που υποβάλλετε ερωτήματα για τα είδη δείκτη της πλατφόρμας. Η μέθοδος παρακάτω εντοπίζει όλους τους mymarkers που συνδέονται με το δεδομένο πόρο προορισμού και όλες τις εκδοχές προορισμού του. Σημειώστε ότι αυτή η ενέργεια θα εντοπίσει επίσης όλα τα myproblems δεδομένου ότι η τιμή true μεταβιβάζεται για το όρισμα includeSubtypes.
public IMarker[] findMyMarkers(IResource target) { String type = "com.example.markers.mymarker"; IMarker[] markers = target.findMarkers(type, true, IResource.DEPTH_INFINITE); }