Når en standarddialogboks er for enkel til din plugin, kan du bygge din egen dialogboks vha. klassen Dialog. Vi har tidligere set, hvordan Readme-værktøjet har bidraget til funktionen "Åbn Readme-browser" i et funktionssæt. Dette funktionssæt vises på værktøjslinjen til arbejdsbænken og på menuen Vindue->Editor til Readme-fil.
Nu er vi parate til at se på implementeringen af denne funktion i Readme-værktøjets WindowActionDelegate.
public void run(IAction action) { SectionsDialog dialog = new SectionsDialog(window.getShell(), ReadmeModelFactory.getInstance().getSections(selection)); dialog.open(); }
Vinduesfunktionens delegerede til funktionssættet bruger det aktuelle valg i ressourcenavigator-oversigten ( .readme-filen) til at hente en liste over afsnit i Readme-filen. Denne liste og arbejdsbænkens vindues-shell sendes videre til SectionsDialog.
Når brugeren vælger funktionen, åbnes SectionsDialog.
SectionsDialog implementeres i Readme-værktøjets plugin ved at oprette en underklasse til klassen Dialog i pakken org.eclipse.jface.dialogs.
Klassen Dialog omfatter basisfunktioner til bygning af et shell-vindue i en dialogboks, hvor de almindelige dialogboks-knapper oprettes, og dialogboksen startes. Underklasserne er ansvarlige for at håndtere indholdet af selve dialogboksen:
SectionsDialog opretter en SWT-liste til fremvisning af listen over afsnit. Den bruger en JFace-fremvisningsfunktion til at udfylde listen. (Vi ser på JFace-fremvisningsfunktioner under Fremvisere.) Bemærk, at vores dialogboks ikke skal oprette nogen knapper til dialogboksen, da det gøres af vores superklasse.
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")); ... }
Dialogbokse kan være så enkle eller komplicerede, som det er nødvendigt. Når du implementerer en dialogboks, drejer størsteparten af dialogkoden sig om at oprette de SWT-kontroller, som repræsenterer indholdsområdet, og om at håndtere de nødvendige aktiviteter, når dialogboksen er oppe. Når en bruger trykker på en knap, kan dialogboksen sende en forespørgsel om tilstanden af de forskellige kontroller (eller fremvisere), der udgør dialogboksen, for at afgøre, hvad der skal gøres.
I visse tilfælde kan du have brug for at få vist oplysninger om noget i en dialogboks, blot ikke så meget som hvis du åbner en almindelig dialogboks. F.eks kan en dialogboks indeholde midlertidige oplysninger, der kan ignoreres for ikke at forstyrre brugerens arbejde. Hvis det er tilfældet, kan du anvende Pop op-dialogboks-klassen til at implementere dialogboksen. Udseendet på en Pop op-dialogboks adskiller sig fra en almindelig dialogboks på flere måder. Den har ikke nogen knapper i bunden og ikke en Windows-standardtitellinje. Rammer, afstande og fonte er mindre og mere kompakte.
Selvom en Pop op-dialogboks ser meget anderledes ud end en almindelig dialogboks, er den kode, der angiver dialogboksens indhold i underklassen for plugin'en, næsten den samme. Du kan stadig implementere metoden createDialogArea for at oprette SWT-kontroller til dialogboksen. Hovedforskellen i programkoden er, at konstruktøren, der opretter dialogboksen, har mange flere parametre end den almindelige dialogboksklasse. SectionsDialog kan f.eks. ændres til en pop op-dialogboks blot ved at ændre superklassen for dialogboksen og konfigurere dialogboksen i konstruktøren.
public class SectionsDialog extends PopupDialog { protected IAdaptable input; /** * Opretter en ny SectionsDialog. */ public SectionsDialog(Shell parentShell, IAdaptable input) { super(parentShell, SWT.DEFAULT, false, // fokusér ikke ved åbning false, // bevar ikke grænserne false, // vis ikke en menu for tilpasning af størrelse false, // vis ikke menupunkt for bevarelse af grænser null, // ingen titel null); // ingen infotekst this.input = input; } ...