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 maakt een SWT-lijst om de lijst met secties weer te geven. De lijst wordt gevuld met een JFace-viewer. (JFace-viewers worden nader besproken in Viewers.) Ons dialoogvenster hoeft trouwens geen knoppen te maken omdat dit al wordt gedaan door onze 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-secties")); ... }
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.
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; } ...