Jeśli standardowe okno dialogowe jest zbyt proste dla danej wtyczki, można zbudować własne okno dialogowe przy użyciu klasy Dialog. Wcześniej przedstawiono sposób, w jaki narzędzie pliku readme dostarcza akcję "Otwórz przeglądarkę pliku Readme" do zestawu akcji. Ten zestaw akcji jest wyświetlany na pasku narzędzi obszaru roboczego oraz w menu Okno -> Edytor pliku readme.
Zobaczmy, jak wygląda implementacja tej akcji w klasie narzędzia pliku readme WindowActionDelegate.
public void run(IAction action) { SectionsDialog dialog = new SectionsDialog(window.getShell(), ReadmeModelFactory.getInstance().getSections(selection)); dialog.open(); }
W tym zestawie akcji delegat akcji okna używa bieżącego zaznaczenia w widoku Nawigatora zasobów (plik .readme), aby uzyskać listę sekcji pliku readme. Ta lista oraz powłoka okna obszaru roboczego zostają przekazane do klasy SectionsDialog.
Gdy użytkownik wybiera akcję, zostaje otwarte okno dialogowe SectionsDialog.
Okno dialogowe SectionsDialog jest implementowane we wtyczce narzędzia pliku readme przez utworzenie podklasy klasy Dialog znajdującej się w pakiecie org.eclipse.jface.dialogs.
Klasa Dialog udostępnia podstawową obsługę budowania okien dialogowych powłoki, tworzenia najczęściej używanych przycisków okien dialogowych i uruchamiania okien dialogowych. Podklasy są odpowiedzialne za obsługę treści okien dialogowych:
Klasa SectionsDialog tworzy listę SWT, na której wyświetlana jest lista sekcji. Do zapełnienia listy używana jest przeglądarka JFace. (Przeglądarki JFace zostaną omówione w sekcji Przeglądarki). Należy zwrócić uwagę, że okno dialogowe nie musi tworzyć żadnych przycisków, ponieważ robi to nadklasa.
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")); ... }
Okna dialogowe mogą być proste lub złożone, w zależności od potrzeb. W implementacji okna dialogowego większość kodu dotyczy tworzenia elementów sterujących SWT, które reprezentują obszar treści i obsługują wszelkie zdarzenia występujące w trakcie wyświetlania okna dialogowego. Po naciśnięciu przycisku przez użytkownika okno dialogowe może sprawdzać status różnych elementów sterujących (lub przeglądarek) okna dialogowego, aby zdecydować o dalszym działaniu.
W niektórych przypadkach może zajść potrzeba wyświetlenia informacji w formie okna dialogowego w sposób mniej rozbudowany niż w uruchamianych standardowo oknach. Dotyczy to na przykład okien dialogowych zawierających informacje przejściowe, które można bez trudu odrzucić bez odwracania uwagi użytkownika od wykonywanej pracy. W takich sytuacjach do implementacji okna dialogowego można wykorzystać klasę PopupDialog. Wygląd i zachowanie okna dialogowego realizowanego za pomocą klasy PopupDialog różni się pod kilkoma względami od wyglądu i zachowania standardowego okna typu Dialog. W dolnej części okna nie występują przyciski, a samo okno nie ma standardowego paska tytułu. Ponadto ramka, odstępy i czcionki są mniejsze i bardziej zwarte.
Chociaż okno dialogowe realizowane za pomocą klasy PopupDialog różni się zdecydowanie wyglądem od standardowego okna dialogowego, kod zawarty w podklasie wtyczki, za pomocą którego definiuje się to okno, jest niemal identyczny. W ten sam sposób implementuje się metodę createDialogArea, aby utworzyć elementy sterujące SWT okna. Najważniejsza różnica w kodzie aplikacji polega na tym, że w konstruktorze tworzącym okno dialogowe występuje znacznie więcej parametrów niż w standardowej klasie Dialog. Na poniższym przykładzie przedstawiono sposób przekształcania okna typu SectionsDialog w okno PopupDialog poprzez zmianę nadklasy okna dialogowego i skonfigurowanie tego okna w konstruktorze:
public class SectionsDialog extends PopupDialog { protected IAdaptable input; /** * Tworzy nową klasę SectionsDialog. */ public SectionsDialog(Shell parentShell, IAdaptable input) { super(parentShell, SWT.DEFAULT, false, // bez uaktywniania po otwarciu false, // bez utrwalania granic false, // bez wyświetlania menu zmiany rozmiaru false, // bez wyświetlania elementu menu w odniesieniu do granic trwałych null, // bez tytułu null); // bez tekstu informacji this.input = input; } ...