Όταν ένα τυποποιημένο πλαίσιο διαλόγου είναι πολύ απλό για την πρόσθετη λειτουργία σας, μπορείτε να δημιουργήσετε τα δικά σας πλαίσια διαλόγου χρησιμοποιώντας την κλάση Dialog. Νωρίτερα, είδαμε τον τρόπο με τον οποίο το εργαλείο διαχείρισης αρχείων readme παρείχε μια ενέργεια "Άνοιγμα προγράμματος πλοήγησης αρχείων readme" σε ένα σύνολο ενεργειών. Αυτό το σύνολο ενεργειών εμφανίζεται στη γραμμή εργαλείων του πάγκου εργασίας και στο μενού Παράθυρο->Λειτουργία επεξεργασίας αρχείου readme.
Πλέον είμαστε έτοιμοι να εξετάσουμε την υλοποίηση αυτής της ενέργειας στην κλάση WindowActionDelegate του εργαλείου διαχείρισης αρχείων readme.
public void run(IAction action) { SectionsDialog dialog = new SectionsDialog(window.getShell(), ReadmeModelFactory.getInstance().getSections(selection)); dialog.open(); }
Ο εκπρόσωπος της ενέργειας παραθύρου για το σύνολο ενεργειών χρησιμοποιεί την τρέχουσα επιλογή στην προβολή της λειτουργίας πλοήγησης πόρων (το αρχείο .readme) για τη λήψη μιας λίστας ενοτήτων στο αρχείο readme. Αυτή η λίστα και το κέλυφος του παραθύρου του πάγκου εργασίας μεταβιβάζονται στο SectionsDialog.
Όταν ο χρήστης επιλέγει την ενέργεια, ανοίγει το SectionsDialog.
Το SectionsDialog υλοποιείται στην πρόσθετη λειτουργία του εργαλείου διαχείρισης αρχείων readme θέτοντας ως υπο-κλάση την κλάση Dialog στο org.eclipse.jface.dialogs πακέτο.
Η κλάση Dialog παρέχει βασική υποστήριξη για τη δημιουργία ενός παραθύρου κελύφους πλαισίου διαλόγου, δημιουργώντας τα κοινά κουμπιά πλαισίου διαλόγου και την εκκίνηση του πλαισίου διαλόγου. Οι υπο-κλάσεις ευθύνονται για το χειρισμό του περιεχομένου του πλαισίου διαλόγου:
Η SectionsDialog δημιουργεί μια λίστα SWT για την εμφάνιση της λίστας των ενοτήτων. Χρησιμοποιεί μια λειτουργία προβολής JFace για τη συμπλήρωση της λίστας. (Θα εξετάσουμε τις λειτουργίες προβολής JFace στην ενότητα Λειτουργίες προβολής.) Σημειώστε ότι το πλαίσιο διαλόγου μας δεν χρειάζεται να δημιουργήσει κανένα από τα κουμπιά για το πλαίσιο διαλόγου αφού αυτό γίνεται από την υπερ-κλάση μας.
protected Control createDialogArea(Composite parent) { Composite composite = (Composite)super.createDialogArea(parent); List list = new List(composite, SWT.BORDER); ... ListViewer viewer = new ListViewer(list); ... return composite; }
protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setText(MessageUtil.getString("Readme Sections")); ... }
Τα πλαίσια διαλόγου μπορούν να είναι όσο απλά ή όσο πολύπλοκα είναι απαραίτητο. Όταν υλοποιείτε ένα πλαίσιο διαλόγου, το μεγαλύτερο μέρος του κώδικα του πλαισίου διαλόγου σας αναφέρεται στη δημιουργία των στοιχείων ελέγχου SWT που αντιπροσωπεύουν την περιοχή περιεχομένου και στο χειρισμό οποιωνδήποτε συμβάντων είναι απαραίτητα ενώ το πλαίσιο διαλόγου είναι ενεργό. Μόλις πατήσει ο χρήστης ένα κουμπί, το πλαίσιο διαλόγου μπορεί να εκτελέσει ερώτηση για την κατάσταση των διαφόρων στοιχείων ελέγχου (ή λειτουργιών προβολής) που συγκροτούν το πλαίσιο διαλόγου για να καθορίσει τα στοιχεία ενεργειών.
Σε ορισμένες περιπτώσεις, αντί των κανονικών πλαισίων διαλόγου, ενδείκνυται η χρήση "απλούστερων" πλαισίων διαλόγου για την εμφάνιση πληροφοριών σχετικά με ένα ζήτημα. Για παράδειγμα, μπορείτε να επιλέξετε τη χρήση πλαισίων διαλόγου που θα παρέχουν συνοπτικές πληροφορίες και θα εμφανίζονται/αποκρύπτονται ευκολότερα ώστε να μην αποσπούν την προσοχή του χρήστη από την εργασία του. Για να υλοποιήσετε τέτοια πλαίσια διαλόγου, μπορείτε να χρησιμοποιήσετε την κλάση αναδυόμενων πλαισίων διαλόγου PopupDialog. Τα πλαίσια διαλόγου που δημιουργούνται με την κλάση PopupDialog διαφέρουν από τα κανονικά πλαίσια διαλόγου που δημιουργούνται με την κλάση Dialog. Σε αυτά τα πλαίσια διαλόγου δεν υπάρχουν κουμπιά στο κάτω μέρος και δεν εμφανίζεται η τυπική γραμμή τίτλου, ενώ τα περιγράμματα, η ρύθμιση αποστάσεων και οι γραμματοσειρές είναι μικρότερα και πιο συμπτυγμένα.
Παρόλο που ένα πλαίσιο διαλόγου της κλάσης PopupDialog έχει πολύ διαφορετική όψη από ένα κανονικό πλαίσιο διαλόγου, ο κώδικας στην υποκλάση της πρόσθετης λειτουργίας που προσδιορίζει το περιεχόμενο του πλαισίου διαλόγου είναι σχεδόν ο ίδιος. Για τη δημιουργία των στοιχείων ελέγχου SWT για το πλαίσιο διαλόγου, εξακολουθεί να χρησιμοποιείται η μέθοδος createDialogArea. Η κύρια διαφορά στον κώδικα εφαρμογής συνίσταται στο ότι η λειτουργία κατασκευής που δημιουργεί αυτό το πλαίσιο διαλόγου έχει πολύ περισσότερες παραμέτρους από την κανονική κλάση Dialog. Για παράδειγμα, η SectionsDialog θα μπορούσε να μετατραπεί σε PopupDialog αλλάζοντας απλώς την υπερκλάση του πλαισίου διαλόγου και ρυθμίζοντας το πλαίσιο διαλόγου στη λειτουργία κατασκευής:
public class SectionsDialog extends PopupDialog { protected IAdaptable input; /** * Creates a new SectionsDialog. */ public SectionsDialog(Shell parentShell, IAdaptable input) { super(parentShell, SWT.DEFAULT, false, // do not take focus when opened false, // do not persist the bounds false, // do not show a resize menu false, // do not show a menu item for persisting bounds null, // no title null); // no info text this.input = input; } ...