Опубликован: 10.12.2007 | Доступ: свободный | Студентов: 822 / 20 | Оценка: 5.00 / 5.00 | Длительность: 58:33:00
Лекция 10:

Окна и панели

10.3. Диалоговые окна

Если в ходе работы приложения возникает необходимость вывести на экран простенький фрагмент данных, логично использовать диалоговое окно. Диалоговое окно представляет собой обычное окно XUL, имеющее весьма ограниченную область применения. Как правило, диалоговые окна не являются независимыми и существуют в контексте какого-либо другого, более значительного окна (т.е. используют его ресурсы).

Диалоговые окна используются в приложениях с двумя основными целями. Первая из них – получить от пользователя данные, необходимые для дальнейшей работы программы. Однако при этом пользователь сталкивается со сложностью логики приложения. Оптимальным для пользователя вариантом является немедленное выполнение отданной команды без каких-либо дополнительных действий с его стороны. Диалоговое окно требует от пользователя принятия дополнительных решений, необходимых для выполнения команды. С точки зрения пользователя это нарушает непрерывность исполнения программы.

Вторая цель применения диалоговых окон – необходимость привлечь внимание пользователя к какой-либо частной задаче или аспекту работы приложения. Как правило, такие диалоговые окна являются модальными – они приводят к остановке работы приложения до тех пор, пока пользователь не решит возникшую проблему. Этот способ нарушает процесс нормальной работы пользователя с программой.

Обе цели не слишком хорошо согласуются с идеей приложения, рассчитанного на высокопроизводительную работу. В идеальном мире диалоговых окон не существовало бы вовсе. Опытные разработчики приложений сводят использование диалоговых окон к минимуму и избегают отображения бессмысленных для пользователя конфигурационных параметров. Большое количество диалоговых окон, используемых для конфигурации, указывает на ошибки в моделировании взаимодействия пользователя с приложением, допущенные на этапе проектирования. Если система требует большого количества конфигурационных параметров, целесообразно предусмотреть отдельное мини-приложение для конфигурации, подобное системе настроек Mozilla.

Однако если диалоговые окна действительно необходимы, Mozilla представляет развитые средства для работы с ними.

10.3.1. Тег <dialog>

Основой создания диалоговых окон является тег <dialog>. Он во многом подобен тегу <window>, однако обладает дополнительной функциональностью по сравнению с ним. По умолчанию тег <dialog> создает немодальное окно, которое не блокирует возможность работы с другими окнами приложения.

Для знакомства с тегом <dialog> достаточно в любом документе XUL заменить тег <window> на <dialog>. Нужно иметь в виду, что тег <dialog> рассчитан на использование в chrome, и его применение в документах, запускаемых в системе Microsoft Windows из других каталогов, может привести к зависанию Mozilla. В системах семейства UNIX этой проблемы не возникает.

На рисунке 10.1 показаны различные примеры использования тега <dialog>. При этом стандартные диагностические стили включены, а единственным содержимым документа является слово Content внутри тега <description>. Два окна в первом ряду имеют одно и то же содержимое, заключенное в тег верхнего уровня <dialog> и <window> соответственно. Как мы видим, <dialog> при отображении автоматически добавляет тег <box> для своего содержимого, а также два тега <button>. Во втором ряду показано диалоговое окно со всеми кнопками, которые предусмотрены для тега <dialog>. Для отображения кнопок использовался атрибут buttons этого тега. В примере, приведенном в последнем ряду, к диалоговому окну было добавлено дополнительное содержимое – шесть кнопок. Эти кнопки заменяют стандартные кнопки, которые в данном случае не отображаются. Обратите внимание на то, что текст у кнопок во втором и третьем ряду различается. Давайте рассмотрим, каким образом это сделано.

Различные примеры использования тега <dialog>.

Рис. 10.1. Различные примеры использования тега <dialog>.

Тег <dialog> определен при помощи XBL. Это определение предусматривает дополнительные контейнеры для содержимого и кнопки. Отображение тега также зависит от файла свойств, входящего в состав chrome. Этот файл содержит подписи для кнопок, соответствующие различным платформам. Возможность доступа к этому файлу – одна из причин, чтобы использовать диалоговые окна в chrome. Тег <dialog> поддерживает следующие атрибуты:

buttonpack buttondir buttonalign buttonorient title buttons

Значением атрибута buttons является список строк, разделенных запятыми. Также допускаются пробелы между строками. Это строка параметров, подобная используемой методом window.open(), но в данном случае ее синтаксис проще. Допустимы следующие значения строк:

accept cancel extra1 extra2 help disclosure

Нужные строки следует просто перечислить через запятую, например:

<dialog buttons="accept,cancel,help"/>

В дополнение к обработчикам событий, предусмотренным для тега <window>, для <dialog> можно использовать следующие обработчики:

ondialogaccept ondialogcancel ondialogextra1 ondialogextra2 
ondialoghelp ondialogdisclosure

Атрибут title, как и в случае тега <window>, задает текст заголовка окна. Атрибуты buttonpack/dir/align/orient служат для управления контейнером <hbox> диалогового окна, предназначенным для размещения кнопок. Они аналогичны атрибутам pack/dir/align/orient обычного контейнера. Атрибут buttons указывает, следует ли отображать стандартные кнопки диалогового окна.

Эти кнопки отображаются с предопределенным содержимым и имеют предопределенное поведение. Например, нажатие на кнопку cancel закрывает диалоговое окно. Кнопки extra1 и extra2 зарезервированы для использования приложением, однако чтобы задать для них метки, необходимо переопределить значения, задаваемые в файле свойств. Каждый из обработчиков событий, перечисленных выше, соответствует одной из кнопок и запускается при ее активизации (например, при щелчке мышью по кнопке).

Перечисленные атрибуты тега <dialog> позволяют создать все окна, показанные на рисунке 10.1, кроме последнего. При его создании был использован атрибут dlgtype, который обычно применяется с тегом <button>.

Значением атрибута dlgtype может быть любой из стандартных типов кнопок:

accept cancel extra1 extra2 help disclosure

Атрибут dlgtype никак не влияет на отображение кнопки или другого элемента, с которым он используется. Фактически он служит указанием для объемлющего тега <dialog>. При отображении диалогового окна его содержимое просматривается на предмет тегов, имеющих атрибут dlgtype. Если такой тег найден, он используется вместо соответствующей стандартной кнопки диалогового окна. Это обеспечивает необходимую гибкость при создании диалогов, позволяя разработчику управлять размещением элементов. В качестве замены стандартных кнопок могут использоваться только элементы интерфейса, поддерживающие событие command. Если для такого элемента не задана метка, будет использоваться стандартная строка, заданная для диалогового окна в файле свойств.

Окно, основанное на теге <dialog>, можно открыть тем же способом, что и любое другое окно. Чтобы создать модальное окно, используйте метод window.openDialog(), описанный ниже.

Не следует в явном виде задавать размер диалогового окна при помощи атрибутов width и height.

10.3.2. Тег <dialogheader>

Хотя определение тега <dialogheader> (заголовок диалогового окна) включено в chrome, фактически он представляет собой не средство разметки, а разновидность содержимого. Он используется для создания заголовков разделов в диалоговом окне настроек Mozilla, и представляет собой обычный контейнер <box> с текстовым содержимым. Он не имеет специального значения в контексте диалогового окна.

10.3.3. Тег <wizard>

Тег <wizard> (мастер) представляет собой специализированный вариант тега <dialog>. <wizard>, а также тег <wizardpage>, обсуждаются в "Система распространения и установки - XPInstall" "Развертывание приложений".

10.3.4. Java, JavaScript и другие языки

Диалоговые окна могут создаваться Java-апплетами. Фактически при этом используется платформа Java – виртуальная машина и стандартные библиотеки классов – которая не имеет ничего общего с платформой Mozilla. Такие диалоговые окна могут открываться за пределами прямоугольной области браузера, занимаемой встроенным апплетом, и существовать после уничтожения создавшего их окна. Они могут существовать в отдельных окнах подобно консоли Java.

Диалоговые окна могут создаваться и из программ на JavaScript с использованием ресурсов XPCOM и АОМ/DOM. Некоторые способы сделать это рассматриваются ниже.

Разработчики встраиваемых приложений также могут использовать такие языки как Perl или Python для управления окнами, которые создаются средствами платформы Mozilla. Такие подходы выходят за рамки этой книги.