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

Первые элементы управления и темы

4.2. Происхождение элементов управления XUL

Иллюстрация в начале лекции дает общий обзор технологий, используемых внутри Mozilla. Прямоугольники на рисунке можно разместить так, чтобы показать анатомию отдельного XUL-элемента управления. XUL содержит большое количество разнообразных тегов, и не все они конструируются одинаковым образом. На рисунке 4.3 показана подсказка, как это делается, которая применима в большинстве случаев.

Стек составляющих графического элемента управления

Рис. 4.3. Стек составляющих графического элемента управления

В нижней части стека находятся ресурсы, предоставляемые операционной системой, например, Windows, MacOS или UNIX. В верхней части - пользовательский элемент управления в готовом приложении. Между ними низкоуровневая функциональность операционной системы постепенно сменяется более абстрактной и превращается в простой XUL-тег.

Самый примитивный элемент управления предоставляется системной библиотекой графических элементов, например, GTK или Win32. Такие элементы управления не переносятся на другие операционные системы. Mozilla поддерживает работу с несколькими графическими библиотеками. Очень сложные библиотеки поддерживают работу с темами рабочего стола, так что определение темы может быть применено к системному элементу управления.

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

Когда элемент управления отображается после загрузки документа в окно, создается фрейм для позиционирования этого элемента управления на экране. Фрейм и все элементы ниже его в стеке написаны на C/C++. Все элементы в стеке, расположенные выше, интерпретируемы и представляют собой XML- или CSS-документы. Как было сказано в "Верстка с XUL" , "Проектирование с XUL", фрейм отвечает за всю информацию о стиле элемента, который он отображает.

Mozilla поддерживает собственную систему тем, отличную от любой, предоставляемой ОС. Каждая тема Mozilla состоит из набора таблиц стилей. Каждая таблица стилей называется скином и по крайней мере один скин предоставляет набор стилей для элементов управления. Эта информация применяется ко всем фреймам, отвечающим за элементы управления.

Очень часто у элементов управления есть определение XBL. Такое определение представляет собой XML-документ, определяющий имя тега XUL для элемента управления, атрибуты, свойства и методы его объекта. Это делается с помощью создания связи с XUL-тегом. Наконец, экземпляр элемента управления появится как часть содержимого в документе приложения в виде самостоятельного тега XUL. Этот тег может сам содержать другие теги (возможно, даже элементы управления).

Хотя рисунок 4.3 выглядит довольно простым и упорядоченным, не все элементы управления Mozilla могут быть представлены так. Имя тега, например, может появиться на любом уровне не ниже "Элемент управления Mozilla", так же, как и где-нибудь еще в платформе. Слои связаны друг с другом; они не могут быть четко разделены.

Из предыдущего описания неясно, почему внутри Mozilla должно быть несколько мест, где определяется элемент управления. Понятно, что Mozilla использует не зависящие от платформы элементы управления, потому что это способствует переносимости, но зачем нужно еще и XBL- определение? Нельзя ли все это сделать в одном месте? В следующем разделе объясняется стратегия Mozilla.

4.2.1. Проектирование частей элемента управления

Реализация множества XUL-элементов управления делится на две части. Тег <button> - типичный тому пример.

Тег <button> обладает как простыми, специфичными, возможностями, так и более сложными, обобщенными. Некоторые из них, например, атрибут type, специфичны для кнопки. Этот атрибут имеет особое значение только для тега, обозначающего кнопку. Другие возможности, такие как возможность находиться в списке навигации, тесно связаны с общими механизмами платформы Mozilla. Между элементами управления, находящимися в списке навигации, пользователь может переходить по нажатию клавиши Tab. Когда пользователь нажимает ее, фокус ввода перемещается от одного элемента управления к другому автоматически. Эти два типа возможностей реализуются по-разному.

Особенности тега <button>, в том числе его атрибуты, информация о состоянии и методах - все они определяются в XBL-файле. Эти данные легко менять с развитием и расширением языка XUL, и они достаточно независимы от изменений внутри самой платформы Mozilla. В "XBL-связки" , "XBL-связки", описывается, как создавать такие файлы. Программисты приложений, которым нужно сильно изменить Mozilla, могут преобразовать или копировать эти файлы. Изменение XBL-файла приведет к изменению внешних свойств данного элемента управления.

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

Есть некоторое сходство между этим разделением и тем, как реляционные базы хранят данные. В реляционной базе данных каждой таблице присваивается тип хранилища. Согласно этому типу данные могут быть помещены в B-дерево, хэш-таблицу или кучу. Доступны только несколько типов хранилищ, так как они реализуются где-то внутри сервера баз данных. Работа с таблицей с такими типами хранилищ гораздо более гибкая, чем работа с таблицами, чья структура фиксирована. Это происходит потому, что у гибкой версии таблицы может быть сколько угодно столбцов и индексов, что кажется неплохой идеей. Как и такая таблица, элемент управления XUL ограничен функциональностью, реализованной на C/C++, но XBL-определение каждого тега может быть создано отдельно (что обеспечивает гибкость), так что в конце концов элемент управления обладает различными характеристиками.