Λειτουργίες προβολής

Για ποιo λόγο θα θέλατε ποτέ να χρησιμοποιήσετε μια λειτουργία προβολής, όταν έχουμε ήδη δει ότι οι συνεισφορές του περιβάλλοντος χρήστη, όπως λειτουργίες προβολής, λειτουργίες επεξεργασίας, οδηγοί και πλαίσια διαλόγου μπορούν να υλοποιηθούν απευθείας με τα όργανα SWT;  

Οι λειτουργίες προβολής σας επιτρέπουν να δημιουργείτε όργανα, ενώ εξακολουθείτε να χρησιμοποιείτε τα δικά σας αντικείμενα μοντέλου.  Αν χρησιμοποιήσετε ένα όργανο SWT απευθείας, πρέπει να μετατρέψετε τα αντικείμενά σας σε σειρά χαρακτήρων και εικόνες όπως αναμένεται από το SWT.  Οι λειτουργίες προβολής δρουν ως προσαρμογείς σε όργανα SWT που χειρίζονται τον ίδιο κώδικα για το χειρισμό συμβάντων οργάνων, τα οποία σε διαφορετική περίπτωση θα έπρεπε να τα υλοποιείτε μόνοι σας. 

Είδαμε μια λειτουργία προβολής για πρώτη φορά στη συνεισφορά προβολής εργαλείου διαχείρισης αρχείων readme, μέσα στην κλάση ReadmeSectionsView.

public void createPartControl(Composite parent) {
      viewer = new ListViewer(parent);
      ...
   }
Σημείωση:  Οι λειτουργίες προβολής μπορούν να χρησιμοποιηθούν για την παροχή της υλοποίησης τόσο για προβολές όσο και για λειτουργίες επεξεργασίας του πάγκου εργασίας. Ο όρος "λειτουργία προβολής" δεν σημαίνει ότι χρησιμοποιούνται μόνο για την υλοποίηση προβολών. Για παράδειγμα, η κλάση TextViewer χρησιμοποιείται για την υλοποίηση πολλών λειτουργιών επεξεργασίας πάγκου εργασίας και πρόσθετων λειτουργιών.

Τυπικές λειτουργίες προβολής

Το JFace παρέχει λειτουργίες προβολής για τα περισσότερα από τα μη κοινά όργανα στο SWT. Οι λειτουργίες προβολής χρησιμοποιούνται συνήθως για όργανα λίστας, διακλάδωσης, πίνακα και κειμένου. 

Κάθε λειτουργία προβολής διαθέτει ένα συσχετισμένο όργανο SWT. Το όργανο αυτό μπορεί να δημιουργηθεί έμμεσα με την παροχή της γονικής κλάσης Composite σε μια εύχρηστη λειτουργία κατασκευής προβολής ή ρητά με τη δημιουργία και την παροχή του στη λειτουργία προβολής, μέσα στη λειτουργία κατασκευής του.

Λειτουργίες προβολής προσανατολισμένες σε λίστα

Οι λίστες, οι διακλαδώσεις και οι πίνακες χρησιμοποιούν πολλές κοινές δυνατότητες, από την πλευρά του χρήστη, όπως είναι η συμπλήρωση με αντικείμενα, η επιλογή, η ταξινόμηση και το φιλτράρισμα. 

Αυτές οι λειτουργίες προβολής διατηρούν μια λίστα αντικειμένων τομέα (που καλούνται στοιχεία) και τα εμφανίζουν στο αντίστοιχο όργανο SWT. Μια λειτουργία προβολής λίστας γνωρίζει τον τρόπο με τον οποίο μπορεί να λάβει μια ετικέτα κειμένου από κάθε στοιχείο της λίστας.  Λαμβάνει την ετικέτα από μια διεπαφή ILabelProvider η οποία μπορεί να οριστεί στη λειτουργία προβολής.  Οι λειτουργίες προβολής λίστας γνωρίζουν τον τρόπο αντιστοίχισης από επανακλήσεις οργάνων προς το σύνολο των στοιχείων που είναι γνωστά στον πελάτη της λειτουργίας προβολής.

Οι πελάτες που χρησιμοποιούν ένα απλό όργανο SWT πρέπει να λειτουργούν στο επίπεδο SWT - όπου τα στοιχεία είναι σειρές χαρακτήρων και συμβάντα που συχνά σχετίζονται με ένα δείκτη μέσα στη λίστα σειρών χαρακτήρων. Οι λειτουργίες προβολής παρέχουν σημασιολογία ανώτερου επιπέδου. Οι πελάτες ενημερώνονται για τις επιλογές και τις αλλαγές στη λίστα, χρησιμοποιώντας τα στοιχεία τα οποία παρέχουν στη λειτουργία προβολής. Η λειτουργία προβολής χειρίζεται όλη την εργασία για την αντιστοίχιση δεικτών και πάλι με τα στοιχεία, προσαρμόζοντας μια φιλτραρισμένη προβολή των αντικειμένων και ταξινομώντας τα εκ νέου όποτε χρειάζεται.

Ο χειρισμός της δυνατότητας φιλτραρίσματος και ταξινόμησης πραγματοποιείται με τον καθορισμό ενός τρόπου ταξινόμησης της λειτουργίας προβολής (ViewerSorter) ή/και ενός φίλτρου της λειτουργίας προβολής (ViewerFilter). (Αυτά μπορούν να προσδιοριστούν για λειτουργίες προβολής διακλάδωσης και πίνακα, εκτός από τις λειτουργίες προβολής λίστας.) Ο πελάτης πρέπει μόνο να παρέχει μια κλάση η οποία θα μπορεί να συγκρίνει ή να φιλτράρει τα αντικείμενα της λίστας. Η λειτουργία προβολής χειρίζεται τις λεπτομέρειες συμπλήρωσης της λίστας, ανάλογα με την καθορισμένη σειρά και το φίλτρο, καθώς και τις λεπτομέρειες διατήρησης της σειράς και του φίλτρου, καθώς προστίθενται και αφαιρούνται στοιχεία.

Οι λειτουργίες προβολής δεν είναι σχεδιασμένες ώστε να επεκτείνονται από τους πελάτες.  Για να προσαρμόσετε μια λειτουργία προβολής, μπορείτε να τη ρυθμίσετε με το δικό σας περιεχόμενο και τους παροχείς ετικετών.

Μια κλάση ListViewer αντιστοιχίζει στοιχεία μιας λίστας σε ένα στοιχείο ελέγχου της κλάσης List του SWT.

Μια κλάση TreeViewer εμφανίζει ιεραρχικά στοιχεία σε ένα όργανο της κλάσης Tree του SWT. Χειρίζεται τις λεπτομέρειες για την επέκταση και τη σύμπτυξη στοιχείων. Υπάρχουν πολλά διαφορετικά είδη λειτουργιών προβολής διακλάδωσης για διάφορα στοιχεία ελέγχου διακλάδωσης SWT (απλή διακλάδωση, διακλάδωση πίνακα, διακλάδωση τετραγωνιδίου επιλογής).

Μια κλάση TableViewer είναι παρόμοια με μια λειτουργία προβολής λίστας, αλλά προσθέτει τη δυνατότητα προβολής πολλαπλών στηλών πληροφοριών για κάθε στοιχείο του πίνακα.  Οι λειτουργίες προβολής πίνακα επεκτείνουν σημαντικά τη λειτουργία του εργαλείου πίνακα SWT, εισάγοντας την έννοια της τροποποίησης ενός κελιού. Μπορούν να χρησιμοποιηθούν ειδικές λειτουργίες επεξεργασίας κελιών, ώστε ο χρήστης να έχει τη δυνατότητα να τροποποιεί ένα κελί του πίνακα, χρησιμοποιώντας ένα σύνθετο πλαίσιο, ένα πλαίσιο διαλόγου ή ένα όργανο κειμένου. Η λειτουργία προβολής πίνακα χειρίζεται τη δημιουργία και την τοποθέτηση των οργάνων αυτών, όταν τα χρειάζεται ο χρήστης για να πραγματοποιήσει μια τροποποίηση.  Αυτό γίνεται με τη χρήση των κλάσεων CellEditor, όπως είναι οι TextCellEditor και CheckboxCellEditor. Ένας εικονικός πίνακας συμπληρώνεται μόνο όταν προβάλλεται. Η λειτουργία προβολής πίνακα εκτελεί μόνο ένα καθορισμένο αριθμό αποτελεσμάτων ανεξάρτητα από το τι πραγματικά δημιουργείται. Η βάση δεδομένων ζητά JIT "αργά" και θα θέτει ερωτήματα για ένα προκαθορισμένο πλήθος κάθε φορά.

Λειτουργία προβολής κειμένου

Τα όργανα κειμένου διαθέτουν πολλά κοινά στοιχεία σημασιολογίας, όπως είναι η συμπεριφορά του διπλού πατήματος, η αναίρεση, ο χρωματισμός και η πλοήγηση ανά δείκτη ή ανά γραμμή.  Η κλάση TextViewer είναι ένας προσαρμογέας για ένα όργανο StyledText SWT. Οι λειτουργίες προβολής κειμένου παρέχουν ένα μοντέλο εγγράφου προς τον πελάτη και διαχειρίζονται τη μετατροπή του εγγράφου σε πληροφορίες κειμένου με στυλ που παρέχονται από το όργανο κειμένου.

Οι λειτουργίες προβολής κειμένου καλύπτονται πιο αναλυτικά στην ενότητα Λειτουργίες επεξεργασίας του πάγκου εργασίας.

Αρχιτεκτονική της λειτουργίας προβολής

Για να κατανοήσετε μια λειτουργία προβολής, πρέπει να εξοικειωθείτε με τη σχέση που υπάρχει μεταξύ ενός στοιχείου εισόδου της λειτουργίας προβολής, των περιεχομένων του, της επιλογής του και των πληροφοριών που τελικά εμφανίζονται στο όργανο το οποίο πραγματοποιεί το χειρισμό.

Στοιχεία εισόδου

Ένα στοιχείο εισόδου είναι το κύριο αντικείμενο το οποίο εμφανίζει (ή τροποποιεί) η λειτουργία προβολής. Από την πλευρά της λειτουργίας προβολής, ένα στοιχείο εισόδου μπορεί να είναι οποιοδήποτε αντικείμενο. Δεν υποθέτει την υλοποίηση κάποιας συγκεκριμένης διεπαφής από το στοιχείο εισόδου. (Το λόγο θα τον δούμε όταν ασχοληθούμε με τους παροχείς περιεχομένου.)

Μια λειτουργία προβολής πρέπει να έχει τη δυνατότητα να αλλάζει τα στοιχεία εισόδου. Εάν ορίζεται ένα νέο στοιχείο εισόδου σε μια λειτουργία προβολής, τότε θα πρέπει να συμπληρωθεί εκ νέου το αντίστοιχο όργανο, ανάλογα με το νέο στοιχείο και να αποσυσχετιστεί από το προηγούμενο στοιχείο εισόδου. Η σημασιολογία για την καταχώρηση ως μια λειτουργία ακρόασης σε ένα στοιχείο εισόδου και για τη συμπλήρωση του οργάνου με βάση το στοιχείο είναι διαφορετική για το κάθε είδος λειτουργίας προβολής.

Λειτουργίες προβολής περιεχομένου

Μια λειτουργία προβολής περιεχομένου είναι μια λειτουργία προβολής που διαθέτει ένα σαφώς ορισμένο πρωτόκολλο για τη λήψη πληροφοριών από το στοιχείο εισόδου της. Οι λειτουργίες προβολής περιεχομένου χρησιμοποιούν δύο εξειδικευμένες κλάσεις βοήθειας, τις IContentProvider και ILabelProvider, για τη συμπλήρωση του οργάνου τους και την εμφάνιση πληροφοριών σχετικά με το στοιχείο εισόδου.

Η IContentProvider παρέχει ένα βασικό πρωτόκολλο κύκλου ζωής για τη συσχέτιση ενός παροχέα περιεχομένου με ένα στοιχείο εισόδου και το χειρισμό μιας αλλαγής του στοιχείου εισόδου. Για διάφορα είδη λειτουργιών προβολής υλοποιούνται πιο εξειδικευμένοι παροχείς περιεχομένου. Ο πιο κοινός παροχέας περιεχομένου είναι η διεπαφή IStructuredContentProvider, η οποία μπορεί να παρέχει μια λίστα αντικειμένων για ένα δεδομένο στοιχείο εισόδου. Χρησιμοποιείται σε λειτουργίες προβολής τύπου λίστας, όπως λίστες, πίνακες ή διακλαδώσεις. Γενικά, ο παροχέας περιεχομένου γνωρίζει τον τρόπο αντιστοίχισης μεταξύ του στοιχείου εισόδου και του αναμενόμενου περιεχομένου της λειτουργίας προβολής.

Η κλάση ILabelProvider προχωρά ένα βήμα παρακάτω. Με δεδομένο το περιεχόμενο μιας λειτουργίας προβολής (που προκύπτει από το στοιχείο εισόδου και τον παροχέα περιεχομένου), μπορεί να δημιουργεί συγκεκριμένα στοιχεία περιβάλλοντος χρήστη, όπως ονόματα και εικονίδια, τα οποία χρειάζονται για την εμφάνιση του περιεχομένου της λειτουργίας προβολής. Οι παροχείς ετικετών βοηθούν στην αποθήκευση πόρων εικονιδίων, καθώς μπορούν να διασφαλίσουν την ίδια χρήση του εικονιδίου για όλα τα όμοια είδη σε μια λειτουργία προβολής.

Σημείωση:  Οι χρήσεις συγκεκριμένων παροχέων περιεχομένου και ετικετών δεν θα είναι κοινές σε πολλές λειτουργίες προβολής. Ακόμη κι αν όλες οι λειτουργίες προβολής σας χρησιμοποιούν το ίδιο είδος παροχέα περιεχομένου και ετικετών, κάθε λειτουργία προβολής θα πρέπει να λαμβάνει αρχικές τιμές με τη δική της χρήση της κλάσης του παροχέα. Το πρωτόκολλο κύκλου ζωής του παροχέα είναι σχεδιασμένο για σχέσεις 1-προς-1 μεταξύ παροχέα και λειτουργίας προβολής.

Τα στοιχεία εισόδου, οι παροχείς περιεχομένου και οι παροχείς ετικετών επιτρέπουν στις λειτουργίες προβολής να αποκρύπτουν τις περισσότερες από τις λεπτομέρειες υλοποίησης για τη συμπλήρωση οργάνων. Οι πελάτες μιας λειτουργίας προβολής θα πρέπει να απασχολούνται μόνο με τη συμπλήρωση μιας λειτουργίας προβολής με το σωστό είδος δεδομένων εισόδου και παροχέα περιεχομένου. Ο παροχέας ετικέτας πρέπει να γνωρίζει τον τρόπο με τον οποίο προκύπτουν οι πληροφορίες περιβάλλοντος χρήστη από το περιεχόμενο της λειτουργίας προβολής.

Ένας παροχέας ετικετών μπορεί να εμφανίζει περισσότερα από ένα απλό κείμενο και μια εικόνα. Το JFace παρέχει διάφορες κλάσεις και διεπαφές για την υποστήριξη πρόσθετης λειτουργικότητας. Οι παρακάτω κλάσεις υποστηρίζονται από τις TableViewer, AbstractTreeViewer και TableTreeViewer.

Έχετε τη δυνατότητα να αλλάξετε το χρώμα των αντικειμένων σε μια προβολή είτε από τον παροχέα ετικετών της προβολής είτε μέσω ενός διακριτικού. Γενικά είναι καλύτερο να χρησιμοποιείται η υποστήριξη χρωμάτων και γραμματοσειρών σε παροχείς ετικετών, καθώς τα διακριτικά επηρεάζουν κάθε προβολή που εμφανίζει ένα συγκεκριμένο είδος. Εάν χρησιμοποιείτε ένα διακριτικό χρώματος ή γραμματοσειράς, βεβαιωθείτε ότι οι τιμές του μπορούν να ρυθμιστούν στις σελίδες προτιμήσεων "Χρώματα" και "Γραμματοσειρές"

Λειτουργίες προβολής και πάγκος εργασίας

Η ευελιξία που παρέχεται από λειτουργίες προβολής, παροχείς περιεχομένου και παροχείς ετικετών επιδεικνύεται από τον τρόπο με τον οποίο ο πάγκος εργασίας τα χρησιμοποιεί.

Η κλάση WorkbenchContentProvider είναι ένας παροχέας δομημένου περιεχομένου ο οποίος λαμβάνει τα περιεχόμενα από ένα στοιχείο εισόδου, θέτοντας ερώτηση για τα θυγατρικά του στοιχεία. Η έννοια των προσαρμογέων χρησιμοποιείται και πάλι, προκειμένου να υλοποιηθεί μια γενική λειτουργία. Όταν ζητά τη λίστα των στοιχείων από το στοιχείο εισόδου της, η κλάση WorkbenchContentProvider λαμβάνει μια διεπαφή IWorkbenchAdapter για το στοιχείο εισόδου. Αν έχει καταχωρηθεί μια IWorkbenchAdapter για το στοιχείο εισόδου, τότε ο παροχέας περιεχομένου μπορεί να υποθέσει με ασφάλεια ότι μπορεί να τεθεί ερώτηση στο στοιχείο σχετικά με τα θυγατρικά του στοιχεία.  Η κλάση WorkbenchContentProvider πραγματοποιεί επίσης την εργασία που απαιτείται για την ενημέρωση της λειτουργίας προβολής, όταν ο χώρος εργασίας αλλάζει. 

Η WorkbenchLabelProvider είναι ένας παροχέας ετικέτας που λαμβάνει μια διεπαφή IWorkbenchAdapter από ένα αντικείμενο προκειμένου να βρει το κείμενο και την εικόνα του. Η έννοια ενός παροχέα ετικέτας είναι ιδιαίτερα χρήσιμη για αντικείμενα του πάγκου εργασίας, διότι επιτρέπει σε έναν απλό παροχέα ετικέτας να αποθηκεύσει στη λανθάνουσα μνήμη εικόνες οι οποίες χρησιμοποιούνται συχνά σε μια λειτουργία προβολής. Για παράδειγμα, αφού η WorkbenchLabelProvider λάβει μια εικόνα την οποία θα χρησιμοποιήσει για μια διεπαφή IProject, μπορεί να την αποθηκεύσει στη λανθάνουσα μνήμη και να τη χρησιμοποιήσει για όλα τα αντικείμενα της IProject που εμφανίζονται στη λειτουργία προβολής.

Ορίζοντας έναν κοινό προσαρμογέα, τη διεπαφή IWorkbenchAdapter, και καταχωρώντας τον για πολλά από τα είδη πλατφόρμας, επιτρέπουμε στα είδη αυτά να αναπαρίστανται σωστά σε πολλές από τις κοινές λειτουργίες προβολής και στις προβολές του πάγκου εργασίας στις οποίες περιέχονται.