Опубликован: 10.12.2007 | Уровень: специалист | Доступ: платный
Лекция 13:

Списки и Деревья

13.4 Возможности стилевого оформления

Mozilla имеет специальную систему стилей для деревьев. Списки, напротив, оформляются обычными стилями.

13.4.1 Тег <listbox>

Система списков в Mozilla не имеет дополнений, отличных от системы стилей CSS2. Но она, однако, имеет множество стилевых правил и тегов, к которым эти правила применимы. Правила можно посмотреть в файле xul.css в toolkit.jar и в listbox.css глобальной темы (т.е. в classic.jar). Все эти файлы находятся в каталоге chrome.

13.4.2 Тег <tree>

Язык XUL имеет одну дополнительную характерную функциональность. Эта функциональность используется для оформления деревьев, которые оформляются не так, как все иные теги. Тело данного дерева, описанное как тег <treechildren>, может быть оформлено прямо из селектора тега <treechildren>. Такую возможность дают стилевые расширения. Оформление реализуется с помощью новых псевдо-классов. Вот пример стиля дерева, изображающего граф персонала компании. Если служащий был нанят недавно, то строка с его или ее информацией подсвечена желтым:

treechildren:-moz-tree-row(hired) { background-color : yellow };

Псевдо-класс -moz-tree-row указывает то, что должно быть оформлено, в данном случае строку дерева. Этому селектору передается список из нуля или более параметров. Каждый из параметров - текстовая строка. Эта же текстовая строка может быть в числе аргументов ключевого слова properties. Например,

<row properties="hired,causeNewDept,dateJune">...</row>

Любая и каждая из строк дерева, имеющая в property аргумент hired будет оформлена согласно данному правилу, в том числе строка из нашего примера. Если правило будет выглядеть так:

treechildren:-moz-tree-row(hired,dateJuly) { background-color : yellow };

Тогда строка не будет оформлена, потому что она не содержит обоих свойств, перечисленных в правиле.

Чтобы встроенные в систему стили работали, требуются три части информации:

  1. Должно быть выбрано имя правильного псевдо-класса.
  2. Нужно найти имя подходящего свойства.
  3. ****
13.4.2.1 Псевдо-классы деревьев

Таблица 13.6 перечисляет псевдо-селекторы дерева, которые являются дополнением Mozilla к стандарту CSS2.

Таблица 13.6. Псевдо-классы, расширения CSS2 для XUL деревьев
Псевдо-селектор Соответствующая высвеченная часть дерева
:-moz-tree-row Вся строка без отступов
:-moz-tree-cell Ячейка строки
:-moz-tree-column Вся колонка
:-moz-tree-cell-text Текст в ячейке
:-moz-tree-twisty Пиктограмма (twisty), клик открывает поддерево
:-moz-tree-indentation Пространство (отступ) перед строкой
:-moz-tree-line Тонкие линии, соединяющие родительские, дочерние и братские строки дерева
:-moz-tree-image Изображение перед содержанием ячейки
:-moz-tree-separator <treeseparator>
:-moz-tree-drop-feedback Линия, появляющаяся между строками при перетаскивании над ними другой строки
:-moz-tree-progressmeter Ячейка в колонке type="progressmeter"
13.4.2.2 Встроенные имена свойств

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

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

Таблица 13.7. Автоматически создаваемые свойства стилевых псевдо-селекторов XUL деревьев
Строка свойства Значение
container То, что оформляется стилем – часть внутренней ноды
leaf То, что оформляется стилем – часть внешней ноды – листа
open То, что оформляется стилем – часть внутренней раскрытой ноды, так что контент любого поддерева показан
closed То, что оформляется стилем – часть внутренней схлопнутой ноды, так что контент любого поддерева скрыт
selected То, что оформляется стилем – часть выбранной строки
current То, что оформляется стилем – часть выбранной в настоящее время строки
focus Дерево – элемент документа, имеющий фокус в настоящее время
sorted Стоки дерева отсортированы
primary То, что оформляется стилем – часть первичной колонки
progressmeter То, что оформляется стилем – часть a <treecol type="progressmeter">
progressNormal То, что оформляется стилем – часть индикатора в работе
progressUndetermined То, что оформляется стилем – часть индикатора после выполнения работы
progressNone То, что оформляется стилем – часть индикатора до выполнения работы
dragSession Пользователь перетягивает элемент дерева мышкой
dropOn Перетаскиваемый объект над тем, что оформляется стилем
dropBefore Перетаскиваемый объект перед тем, что оформляется стилем
dropAfter Перетаскиваемый объект после того, что оформляется стилем

Вспомним, что в простой древовидной структуре есть два вида узлов, или нод. А именно, внутренние ноды, содержащие другие ноды, и листья, содержащие данные. Узлы в деревьях XUL либо внутренние, либо листья, но не то и другое вместе.

Существует вторая группа автоматически доступных свойств. Все id всех колонок дерева доступны тем же методом, что и свойства строк. Нужно только следить, чтобы эти id были правильными именами в смысле CSS2.

Несмотря на то, что встроенные свойства можно использовать, вы вправе придумать собственные.

13.4.2.3 Соответствующие свойства CSS

Третий аспект этой особенной стилевой системы довольно хитрый. Каждый из псевдо-классов поддерживает лишь небольшое число стилевых свойств CSS2. Если выбрать неподдерживаемое свойство, ожидаемого эффекта не будет. В таблице 13.8 описывается, какие свойства CSS2 доступны для каждого псевдо-класса.

Таблица 13.8. Свойства CSS2, поддерживаемые новыми псевдо-селекторами
Псевдо-селектор Тег Поддерживаемые свойства стилей CSS2
:-moz-tree-row <treerow> Фоны, границы, поля, контуры, отступы, дисплеи
:-moz-tree-cell <treecell> Фоны, границы, поля, контуры, отступы, видимость/невидимость
:-moz-tree-column <treecol> Поля, стили текста, видимость/невидимость
:-moz-tree-cell-text <treecell> Цвет текста, шрифт, видимость/невидимость
:-moz-tree-twisty <treecell> Фоны, границы, поля, контуры, отступы, видимость/невидимость, стили списков, позиционирование
:-moz-tree-indentation <treeitem> Позиционирование
:-moz-tree-line <treeitem> Границы, видимость/невидимость
:-moz-tree-image <treeitem>, <treecell> Стили списков, позиционирование, поля
:-moz-tree-separator <treeseparator> Границы
:-moz-tree-drop-feedback <treerow> Поля, видимость/невидимость
:-moz-tree-progressmeter <treecell> Цвет текста, поля

Совмещая таблицы 13.6, 13.7, и 13.8, получим следующий пример, содержащий только имена, присвоенные Mozilla:

treechildren:-moz-tree-cell(leaf,focus) { background-color : red; }

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

13.4.3 Встроенная поддержка тем

Вплоть до версии 1.4 в деревьях не реализована встроенная поддержка тем на платформе Microsoft Windows XP. Если бы темы поддерживались, стилевое свойство -moz-appearance могло бы иметь следующие значения:

listbox listitem treeview treeitem treetwity treetwistyopen 
treeline treeheader treeheadercell treeheadersortarrow
Дмитрий Гуменюк
Дмитрий Гуменюк
Россия, Звенигород
Konstantin Grishko
Konstantin Grishko
Россия, Москва, Московский финансово-промышленный университет "Синергия", Москва