Toepassingsdialoogvensters

Wanneer een standaarddialoogvenster te eenvoudig is voor uw plugin, kunt u uw eigen dialoogvenster bouwen met de klasse Dialog. Eerder hebt u al gezien hoe de actie "Readme in browser openen" is aangeleverd in een actieset met behulp van de readme-tool. Deze actieset wordt afgebeeld op de werkbalk van de workbench en in het menu Venster > Readme-bestandseditor.  

Bekijk nu de implementatie van deze actie in de WindowActionDelegate van de readme-tool.

public void run(IAction action) {
      SectionsDialog dialog = new SectionsDialog(window.getShell(),
         ReadmeModelFactory.getInstance().getSections(selection));
      dialog.open();
   }

De vensteractie-gemachtigde voor de actieset gebruikt de huidige selectie in de resourcenavigatorview (het bestand .readme) om een lijst met secties in het readme-bestand op te halen. Deze lijst en de shell van het workbenchvenster worden doorgegeven aan het sectiedialoogvenster (SectionsDialog). 

Wanneer de gebruiker de actie selecteert, wordt het sectiedialoogvenster (SectionsDialog) geopend.

SectionsDialog wordt in de readme-toolplugin geïmplementeerd door een subklasse van de klasse Dialog te maken in het pakket org.eclipse.jface.dialogs.

De klasse Dialog levert de basisfuncties om de shell voor een dialoogvenster te bouwen, standaardknoppen in het dialoogvenster te maken en het dialoogvenster te kunnen openen. De subklassen zijn verantwoordelijk voor verwerking van de inhoud van het dialoogvenster:

SectionsDialog implementeert geen exemplaar van de methode okButtonPressed. In plaats daarvan wordt de implementatie "geen actie ondernemen" overgenomen van Dialog. Dit is niet standaard het geval. Gewoonlijk worden bepaalde bewerkingen uitgevoerd als op een knop in het dialoogvenster wordt geklikt.

U kunt dialoogvensters zo eenvoudig of ingewikkeld maken als u wilt. Bij het implementeren van een dialoogvenster is het grootste deel van de code voor het maken van de SWT-besturingselementen van het contentgebied en het afhandelen van de events die kunnen optreden terwijl het dialoogvenster geopend is. Als de gebruiker eenmaal op een knop klikt, kan het dialoogvenster de status opvragen van de besturingselementen (of viewers) om te bepalen wat er moet gebeuren.

Voorgrondvensters

In sommige gevallen wilt u misschien informatie over iets in een dialoogvenster weergeven, maar op een manier die wat "lichter" is dan een gewoon dialoogvenster. Een dialoogvenster kan bijvoorbeeld bestemd zijn om bepaalde informatie te bieden die gemakkelijk kan worden weggeklikt zonder de gebruiker van zijn werk te houden. Als dit het geval is, kunt u de klasse PopupDialog gebruiken om het dialoogvenster te implementeren. Het uiterlijk en de ervaring van een PopupDialog is op verschillende manierenanders dan van een normale Dialog. Het heeft geen knoppen onderin en heeft ook geen standaard Windows-titelbalk en de randen, spatiëring en lettertypen zijn kleiner en compacter.

Hoewel een PopupDialog er heel anders uitziet dan een normaal dialoogvenster, is de code in de subklasse van uw plugin die de content van het dialoogvenster definieert bijna hetzelfde. U moet ook hier de methode createDialogArea implementeren om de SWT-besturingsfuncties voor het dialoogvenster te maken. Het belangrijkste verschil in de toepassingscode is dat de constructor die het dialoogvenster maakt veel meer parameters heeft dan de normale klasse Dialog. De SectionsDialog kan bijvoorbeeld in een PopupDialog worden omgezet door eenvoudigweg de superklasse van het dialoogvenster te wijzigen en het dialoogvenster in de constructor te configureren:

   public class SectionsDialog extends PopupDialog {
      protected IAdaptable input;

      /**
      * Nieuwe SectionsDialog maken.
      */
      public SectionsDialog(Shell parentShell, IAdaptable input) {
        super(parentShell, SWT.DEFAULT, false, // geen focus geven bij openen
        	false, // grenzen niet vasthouden
        	false, // geen menu voor nieuwe grootte afbeelden
        	false, // geen menu voor grenzen vasthouden afbeelden
        	null, //  geen titel
        	null); // geen infotekst
        this.input = input;
      }
      ...