Если возможностей стандартного окна диалога недостаточно для реализации модуля, с помощью класса Dialog можно создать собственное окно диалога. В предыдущих разделах было показано, каким образом утилита readme добавляет действие "Открыть браузер Readme" в набор действий. Этот набор действий доступен на панели инструментов рабочей среды, а также в меню Окно->Редактор файлов Readme.
Теперь можно рассмотреть реализацию этого действия в классе утилиты readme WindowActionDelegate.
public void run(IAction action) { SectionsDialog dialog = new SectionsDialog(window.getShell(), ReadmeModelFactory.getInstance().getSections(selection)); dialog.open(); }
Делегат действия окна, предусмотренный для набора действий, получает список разделов файла readme в соответствии с элементами, выбранными на панели навигатора ресурсов (файл .readme). Этот список и оболочка окна рабочей среды передаются классу SectionsDialog.
В результате выбора пользователем одного из действий открывается окно диалога SectionsDialog.
Класс SectionsDialog реализован в утилите readme путем наследования класса Dialog, входящего в состав пакета org.eclipse.jface.dialogs.
Класс Dialog предоставляет базовую поддержку для создания окна оболочки, общих кнопок, а также запуска окна диалога. Производные классы отвечают непосредственно за обработку содержимого окна диалога:
SectionsDialog создает список SWT для отображения списка разделов. Для заполнения списка применяется программа просмотра JFace. (Программы просмотра JFace рассматриваются в разделе Программы просмотра). Обратите внимание, что окно диалога не обязательно должно создавать кнопки, поскольку за это отвечает базовый класс.
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")); ... }
Сложность окна диалога зависит от предъявляемых к нему требований. В процессе реализации окна диалога основное внимание уделяется созданию управляющих элементов SWT, необходимых для представления областей содержимого, а также обработки поддерживаемых событий. Действия, выполняемые окном диалога в ответ на нажатие пользователем кнопки, определяются в соответствии с состоянием различных управляющих элементов (или программ просмотра), входящих в состав этого окна диалога.
В некоторых случаях, нужно показать какую-либо информацию в окне диалога, но более "простым" способом, чем с помощью запуска обычного окна диалога. Например, окно диалога должно содержать временную информацию, на которую можно не обращать особого внимания пользователя. В этом случае для реализации окна диалога можно использовать класс PopupDialog. PopupDialog в некоторых отношениях выглядит иначе, чем обычный Dialog. У него нет никаких кнопок внизу, нет стандартного заголовка окна, его границы и шрифты имеют меньший размер и более компактны.
Хотя PopupDialog выглядит иначе, чем обычное окно диалога, исходный код в вашем подклассе модуля, который определяет его содержимое, почти такой же. Вам так же необходимо реализовать метод createDialogArea для создания управляющих элементов SWT окна диалога. Основное различие состоит в том, что конструктор, создающий окно диалога, имеет намного больше параметров, чем обычный класс Dialog. Например, SectionsDialog можно превратить в PopupDialog, просто изменив суперкласс окна диалога и настроив окно диалога в конструкторе:
public class SectionsDialog extends PopupDialog { protected IAdaptable input; /** * Создает новый SectionsDialog. */ public SectionsDialog(Shell parentShell, IAdaptable input) { super(parentShell, SWT.DEFAULT, false, // не получать фокус при открытии false, // не сохранять расположения false, // не показывать меню изменения размера false, // не показывать пункт меню для сохранения расположения null, // без заголовка null); // без текста информации this.input = input; } ...