Βοήθεια πεδίου

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

Το πακέτο org.eclipse.jface.fieldassist παρέχει βοήθεια με δυο τρόπους. Η υποστήριξη για τα πεδία με διακριτικά σας επιτρέπει να συμπεριλάβετε διακριτικά εικόνας που δίνουν ενδείξεις στο χρήστη για την κατάσταση ενός συγκεκριμένου πεδίου. Η υποστήριξη προτάσεων περιεχομένου σας επιτρέπει να παρέχετε ένα αναδυόμενο παράθυρο αυτόματης συμπλήρωσης περιεχομένου στο οποίο εμφανίζονται επιλογές περιεχομένου για το χρήστη.

Πεδία με διακριτικά

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

Δημιουργία πεδίου με διακριτικά

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

...
// Create a text field
Text text = new Text(parent, SWT.BORDER);
text.setText("some text"); 
...

Προκειμένου να προσθέσετε διακριτικά σε αυτό το πεδίο, το πεδίο θα έπρεπε να δημιουργηθεί κατά τον ακόλουθο τρόπο:

...
// Create a decorated field for a text control
DecoratedField field = new DecoratedField(parent, SWT.BORDER, new TextControlCreator());
Text text = (Text)field.getControl();
text.setText("some text");
...

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

Χρήση των διακριτικών

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

...
// Create a field decoration and add it to the field
Image image = JFaceResources.getImage("myplugin.specialimage");
FieldDecoration mySpecialDecoration = new FieldDecoration(image, "This field is special");
field.addFieldDecoration(mySpecialDecoration, SWT.TOP | SWT.LEFT, false);
...

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

...
// Something has occurred that makes me want to hide the decoration
field.hideDecoration(mySpecialDecoration);
...

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

...
// Something has made the field extra special
mySpecialDecoration.setDescription("This field is extra-special");
field.updateDecoration(mySpecialDecoration);
...

Διάταξη των πεδίων με ή χωρίς διακριτικά

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

...
// Create a text field
Text text = new Text(parent, SWT.BORDER);
text.setText("some text");
// Set the layout data
GridData data = new GridData(IDialogConstants.ENTRY_FIELD_WIDTH, SWT.DEFAULT);
text.setLayoutData(data); 
...

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

...
// Create a decorated field for a text control
DecoratedField field = new DecoratedField(main, SWT.BORDER, new TextControlCreator());
Text text = (Text)field.getControl();
text.setText("some text");
// Set the layout data
GridData data = new GridData(IDialogConstants.ENTRY_FIELD_WIDTH + 
   FieldDecorationRegistry.getDefault().getMaximumDecorationWidth(), SWT.DEFAULT);
field.getLayoutControl().setLayoutData(data); 
...

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

Μητρώο διακριτικών πεδίου

Το μητρώο διακριτικών πεδίου επιτρέπει την καταχώριση των διακριτικών πεδίου και την πρόσβασή σε αυτά με τη χρήση μιας ταυτότητας σειράς χαρακτήρων. Με αυτό τον τρόπο, μπορείτε να παραπέμπετε εύκολα στα διακριτικά που χρησιμοποιούνται στην εφαρμογή σας. Σε περίπτωση που επιθυμείτε να καταστήσετε τα διακριτικά διαθέσιμα σε άλλες πρόσθετες λειτουργίες, μπορείτε να ορίσετε το API που εκθέτει τις ταυτότητες τους. Σημειώστε ότι η καταχώριση ενός διακριτικού δεν διαχειρίζεται τον κύκλο ζωής των εικόνων στο εσωτερικό αυτών των διακριτικών. Η εφαρμογή σας μπορεί να αποφασίσει τον τρόπο με τον οποίο θα διαχειριστεί αυτές τις εικόνες. Για παράδειγμα, το μητρώο εικόνων JFace μπορεί να χρησιμοποιηθεί για την καταχώριση των εικόνων και τη διαχείριση του κύκλου ζωής τους. Εναλλακτικά, οι εικόνες μπορούν να δημιουργούνται κατΆ απαίτηση από την εφαρμογή σας και να διαγράφονται όταν δεν είναι πλέον απαραίτητες. Το javadoc για τις μεθόδους καταχώρισης στην κλάση FieldDecorationRegistry εξηγεί τους διαφορετικούς τρόπους με τους οποίους μπορούν να καθοριστούν οι εικόνες κατά την καταχώριση ενός διακριτικού.

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

...
// Create a text field
Text text = new Text(parent, SWT.BORDER);
text.setText("some text");
// Set the layout data
GridData data = new GridData();
data.horizontalAlignment = SWT.FILL;
data.horizontalIndent = FieldDecorationRegistry.getDefault().getMaximumDecorationWidth();
text.setLayoutData(data); 
...

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

...
// Create a decorated field with a required field decoration.
DecoratedField field = new DecoratedField(main, SWT.BORDER, new TextControlCreator());
FieldDecoration requiredFieldIndicator = FieldDecorationRegistry.getDefault().
   getFieldDecoration(FieldDecorationRegistry.DEC_REQUIRED);
field.addDecoratedField(requiredFieldIndicator, SWT.BOTTOM | SWT.LEFT, false);
...

Προτάσεις περιεχομένου

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

...
autoActivationCharacters = new char[] { '#', '(' };
keyStroke = KeyStroke.getInstance("Ctrl+Space");
// assume that myTextControl has already been created in some way
ContentProposalAdapter adapter = new ContentProposalAdapter(
	myTextControl, new TextContentAdapter(), 
	new SimpleContentProposalProvider(new String [] {"ProposalOne", "ProposalTwo", "ProposalThree"}),
	keyStroke, autoActivationCharacters);

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

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

Στο παραπάνω παράδειγμα, χρησιμοποιείται η κλάση SimpleContentProposalProvider. Ο παροχέας αυτός προσδιορίζεται με τον καθορισμό ενός απλού πίνακα σειρών χαρακτήρων ως προτάσεων περιεχομένου. Ο απλός παροχέας υλοποιεί το απαραίτητο πρωτόκολλο για να αντιστοιχήσει κάθε σειρά χαρακτήρων σε μια διεπαφή IContentProposal. Η ευελιξία της διεπαφής IContentProposalProvider σας επιτρέπει να υλοποιήσετε έναν παροχέα προτάσεων με σύνθετες λειτουργίες, όπως για παράδειγμα το φιλτράρισμα των προτάσεων βάσει του περιεχομένου του στοιχείου ελέγχου, την παροχή επεξηγηματικών ετικετών στο αναδυόμενο πλαίσιο αντί του πραγματικού περιεχομένου που θα εισαχθεί, καθώς και τον καθορισμό της αναμενόμενης θέσης του δρομέα μετά την εισαγωγή μιας πρότασης. Δείτε το Παράδειγμα βοήθειας πεδίου και αναζητήστε υλοποιητές της διεπαφής IContentProposalProvider για τη χρήση σύνθετων λειτουργιών.

Ρύθμιση του προσαρμογέα προτάσεων περιεχομένου

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

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

Βοήθεια πεδίου του πάγκου εργασίας

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

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

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