Ha a szabványos párbeszédablak túl egyszerű a bedolgozóhoz, akkor saját párbeszédablakot építhet össze a Párbeszédablak osztály segítségével. Korábban láthattuk, hogy a readme eszköz hogyan biztosít egy "Readme böngésző megnyitása" tevékenységet egy tevékenységkészletben. Ez a tevékenységkészlet megjelenik a munkaterület-eszköztárok és a Ablak->Readme fájlszerkesztő menüben.
Most már készen állunk a tevékenység megvalósításának megtekintésére a readme eszköz WindowActionDelegate elemében.
public void run(IAction action) { SectionsDialog dialog = new SectionsDialog(window.getShell(), ReadmeModelFactory.getInstance().getSections(selection)); dialog.open(); }
A jelenlegi ablaktevékenység-átruházása az aktuális kiválasztást használja az erőforrásnavigátor-nézetben (a .readme fájl) a readme fájl szakaszok listájának megjelenítéséhez. Ez a lista és a munkaterület ablak parancsértelmezője átadódik a SectionsDialog párbeszédablaknak.
Amikor a felhasználó kiválasztja a tevékenységet, a SectionsDialog megnyitásra kerül.
A SectionsDialog úgy kerül megvalósításra a readme eszköz bedolgozóban, hogy létrehozásra kerül egy alosztály a Párbeszédablak osztályhoz az org.eclipse.jface.dialogs csomagban.
A Párbeszédablak osztály alap támogatást biztosít a párbeszédablak parancsértelmező ablak létrehozásához, az általános párbeszédablak-gombok létrehozásához és a párbeszédablak elindításához. Az alosztályok felelősek a párbeszédablak tartalmának kezeléséért:
A SectionsDialog létrehoz egy SWT listát a szakaszok listájának megjelenítéséhez. A JFace megjelenítő segítségével tölti fel a listát. (Megtekintjük a JFace megjelenítőket a Megjelenítőkben.) Ne feledje el, hogy a párbeszédablakoknak nem kell létrehozniuk gombokat a párbeszédablakhoz, mivel ezt elvégzi a szülőosztály.
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")); ... }
A párbeszédablakok olyan egyszerűek vagy összetettek lehetnek, amennyire szükséges. Párbeszédablak megvalósításakor a párbeszédablak-kód nagy részével foglalkozni kell az SWT vezérlők létrehozásakor, amelyek a tartalomterületet ábrázolják és kezelik a szükséges eseményeket, miközben a párbeszédablak fent van. Ha a felhasználó megnyomja a gombot, akkor a párbeszédablak le tudja kérdezni a különböző vezérlők (vagy megjelenítők) állapotát, amelyek a párbeszédablak számára megadják, hogy mit kell tenni.
Előfordulhat, hogy valamilyen információt meg akar jeleníteni egy párbeszédablakban, de egy szabályos párbeszédablak megnyitásánál "egyszerűbben". Egy párbeszédablak szolgálhat például arra, hogy könnyen elutasítható átmeneti információkat biztosítson, anélkül, hogy a felhasználó figyelmét elvonná a munkájáról. Ebben az esetben, a párbeszédablak megvalósításához a PopupDialog osztály használható. Egy ilyen PopupDialog kinézete különbözik a szabályos párbeszédablaktól. Nincsenek gombok az ablak alsó részén, nincs a szokásos ablakcímsor; a keretek, a sorköz és a betűtípusok kisebbek és tömörebbek.
Noha a PopupDialog másképp néz ki, mint egy szabályos párbeszédablak, a tartalmát meghatározó bedolgozó alosztályának a kódja majdnem teljesen ugyanaz. Továbbra is a createDialogArea módszert valósítja meg az SWT vezérlők létrehozásához a párbeszédablak számára. A fő különbség az alkalmazáskódban, hogy a párbeszédablak létrehozója sokkal több paraméterrel bír, mint egy szabályos párbeszédablak osztály. Például a SectionsDialog könnyen átalakítható PopupDialog párbeszédablakká a párbeszédablak szülőosztályának megváltoztatásával és a párbeszédablak beállításával a konstruktorban:
public class SectionsDialog extends PopupDialog { protected IAdaptable input; /** * Creates a new SectionsDialog. */ public SectionsDialog(Shell parentShell, IAdaptable input) { super(parentShell, SWT.DEFAULT, false, // nem kap fókuszt, ha meg van nyitva false, // nem tárolja a határokat false, // nem jeleníti meg az átméretezi menüt false, // nem jelenít meg menüpontot a határok tárolásához null, // nincs cím null); // nincs információs szöveg this.input = input; } ...