Když je standardní dialogové okno pro váš modul plug-in příliš jednoduché, můžete sestavit své vlastní dialogové okno pomocí třídy Dialog. V předchozích tématech jsme viděli, jak nástroj README přispěl do akční sady akcí "Otevřít prohlížeč README". Tato akční sada se zobrazuje v panelu nástrojů pracovní plochy a v nabídce Okno->Editor souborů README.
Nyní jsme připraveni se podívat na implementaci této akce ve třídě WindowActionDelegate v nástroji README.
public void run(IAction action) { SectionsDialog dialog = new SectionsDialog(window.getShell(), ReadmeModelFactory.getInstance().getSections(selection)); dialog.open(); }
Delegát akce okna pro akční sadu používá aktuální výběr v zobrazení navigátoru prostředků (soubor .readme) k získání seznamu oddílů v souboru README. Tento seznam a nadstavba okna pracovní plochy se předají objektu SectionsDialog.
Když uživatel akci vybere, otevře se SectionsDialog.
SectionsDialog se v nástroji README implementuje vytvořením podtřídy třídy Dialog z balíčku org.eclipse.jface.dialogs.
Třída Dialog poskytuje základní podporu pro sestavení dialogového okna nadstavby, vytvoření běžných tlačítek a spuštění dialogového okna. Podtřídy zodpovídají za práci s vlastním obsahem dialogového okna:
SectionsDialog vytvoří seznam SWT pro zobrazení seznamu oddílů. K naplnění seznamu používá prohlížeč modulu JFace. (Na prohlížeče modulu JFace se podíváme v tématu Prohlížeče.) Všimněte si, že naše dialogové okno nemusí vytvářet žádná tlačítka, protože to udělá naše supertřída.
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("Oddíly README")); ... }
Dialogová okna mohou být tak jednoduchá nebo tak složitá, jak je třeba. Když implementujete dialogové okno, většina kódu okna se týká vytváření obslužných prvků SWT, které reprezentují oblast jeho obsahu, a obsluhy případných událostí, které jsou potřebné po dobu zobrazení dialogu. Jakmile jednou uživatel stiskne tlačítko, dialogové okno se může dotázat na stav různých obslužných prvků (nebo prohlížečů), ze kterých se skládá, aby zjistilo, co se má provést.
V některých případech můžete chtít zobrazit určité informace v dialogovém okně, ale poněkud "jednodušším" způsobem, než jakým je spuštění běžného dialogového okna. Dialogové okno může například poskytnout dočasné informace, které lze jednoduše vypnout, aniž by musel uživatel přesouvat svoji pozornost od prováděné práce. V takovém případě můžete pro implementaci dialogového okna použít třídu PopupDialog. Vzhled a chování rozevíracího dialogového okna PopupDialog se v několika ohledech liší od dialogového okna Dialog. Nemá žádná tlačítka ve spodní části, nemá standardní pruh titulku okna a jeho okraje, rozteč a písmo jsou menší a kompaktnější.
Přestože okno PopupDialog vypadá jinak než běžné dialogové okno, kód v podtřídě modulu plug-in, který definuje obsah dialogového okna je téměř stejný. Stále implementujete metodu createDialogArea pro vytvoření obslužných prvků SWT pro dialogové okno. Hlavní rozdíl v kódu aplikace spočívá v tom, že konstruktor vytvářející dialogové okno má mnohem více parametrů než třída běžného okna Dialog. Například SectionsDialog lze jednoduše změnit na PopupDialog upravením supertřídy a nakonfigurováním dialogového okna v konstruktoru:
public class SectionsDialog extends PopupDialog { protected IAdaptable input; /** * Vytvoří nové okno SectionsDialog. */ public SectionsDialog(Shell parentShell, IAdaptable input) { super(parentShell, SWT.DEFAULT, false, // nepoutá pozornost při otevření false, // nezachovává meze false, // nezobrazuje nabídku změny velikosti false, // nezobrazuje položku nabídky pro zachování mezí null, // bez titulku null); // bez informačního textu this.input = input; } ...