Écrit par Neil Deakin.
Traduit par Durandal (13/08/2004).
Page originale :
http://www.xulplanet.com/tutorials/xultu/treestyle.html
Cette section explique comment styler un arbre.
Vous pouvez styler la bordure de l'arbre et les en-têtes de colonnes de la
même manière que pour d'autres éléments. Les styles ajoutés à l'élément tree
seront appliqué à l'arbre entier. Ajouter un style à l'élément treecol
n'applique
pas le style à la colonne mais seulement à l'en-tête.
Le corps de l'arbre doit être stylé d'une manière un peu différente des
autres éléments, parce que le corps de l'arbre est stocké d'une manière
différente des autres éléments. Le treechildren
extérieur est le seul vrai élément du corps de l'arbre. Les éléments intérieurs
n'ont qu'un rôle de conteneurs.
Vous devez donc utiliser l'attribut properties
sur les lignes ou les cellules pour modifier une ou plusieurs propriétés
nommées. Cela peut être utilisé avec des arbres à contenu statique ou produit
par RDF ou avec des arbres à vue personnalisée. Supposons que nous voulions
donner une couleur de fond bleue à une ligne particulière, comme il est
possible de le remarquer sur les libellés dans Mozilla Mail. Nous allons utiliser une
propriété appelée makeItBlue
. Vous pouvez utiliser le nom que vous voulez.
Vous pouvez modifier plusieurs propriétés en les séparant par des espaces.
Modifiez la propriété sur une ligne ou une cellule, comme dans l'exemple suivant :
<treerow properties="makeItBlue">
La feuille de style peut récupérer cette propriété et l'utiliser pour changer l'apparence d'une ligne pour les messages non lus ou les libellés. Les propriétés fonctionnent en quelque sorte comme les classes de style, bien qu'elles nécessitent une syntaxe un peu plus complexe à utiliser dans une feuille de style. Ceci parce qu'il est possible de spécifier un style pour chaque partie d'une cellule. Vous pouvez styler non seulement la cellule et son texte, mais aussi le "twisty" (NdT : petit '+' ou '-' permettant de développer et replier l'arborescence) et l'indentation. La syntaxe à utiliser est la suivante :
treechildren::-moz-tree-row(makeItBlue)
{
background-color: blue;
}
Ce pseudo-style spécial est utilisé pour styler la couleur de fond des
lignes qui ont la propriété makeItBlue. Cette syntaxe spéciale est nécessaire
parce que les cellules elles-mêmes ne sont pas des éléments séparés. Tout le
contenu intérieur au corps de l'arbre est rendu par l'élément treechildren
(Notez que les styles de la règle ci-dessus concernent l'élément treechildren
). Le pseudo-style met des règles de style pour des parties
particulières de ce qu'il affiche. Cette règle de style signifie, dans un
élément treechildren : mettre une couleur de fond bleue à toutes les lignes de
l'arbre qui ont la propriété 'makeItBlue'.
Le texte ::-moz-tree-row
spécifie quelle est la zone de contenu désirée,
qui est dans ce cas une ligne. Vous pouvez aussi utiliser les valeurs suivantes :
::-moz-tree-cell
::-moz-tree-cell-text
::-moz-tree-twisty
::-moz-tree-image
list-style-image
.::-moz-tree-row
::-moz-tree-indentation
::-moz-tree-column
::-moz-tree-line
::-moz-tree-separator
::-moz-tree-progressmeter
type
de la colonne à
progressmeter.::-moz-tree-drop-feedback
Vous pouvez tester la présence de plusieurs propriétés en les séparant par des virgules. L'exemple ci-dessous met une couleur de fond grise aux lignes qui ont les propriétés readonly et unread. Pour les propriétés qui sont readonly, il ajoute une bordure rouge autour de la ligne. Notez que la première règle s'appliquera à toute ligne qui est readonly, peu importe la présence d'autres propriétés comme unread.
treechildren::-moz-tree-row(readonly)
{
border: 1px solid red;
}
treechildren::-moz-tree-row(readonly, unread)
{
background-color: rgb(80%, 80%, 80%);
}
La liste des propriétés des éléments tree contient un petit nombre de propriétés par défaut, que vous pouvez aussi utiliser dans une feuille de style. Vous pouvez utiliser ces propriétés supplémentaires pour modifier l'apparence des conteneurs ou des lignes sélectionnées. Les propriétés suivantes sont modifiées automatiquement en cas de besoin :
focus
selected
current
container
leaf
open
closed
primary
sorted
even
odd
even
, vous permettent, par exemple, d'alterner les
couleurs entre chaque ligne.dragSession
dropOn
dropBefore
dropAfter
progressNormal
progressUndetermined
progressNone
Les propriétés sont mises pour les lignes ou les cellules d'une ligne à
l'état correspondant. Pour les colonnes et les cellules, une propriété
additionnelle, l'id
de la colonne ou la colonne
dans laquelle est la cellule, sera mis.
Pour les arbres générés par RDF, vous pouvez utiliser la même syntaxe. Cependant, vous mettrez souvent les propriétés en vous basant sur des valeurs dans la source de données.
Pour des arbres avec un script de vue personnalisée, vous pouvez modifier des
propriétés en fournissant les fonctions getRowProperties
,
getColumnProperties
et getCellProperties
dans la vue. Elles renvoient des
informations à propos d'une ligne, d'une colonne et d'une cellule individuelle.
Les arguments à ces fonctions indiquent quelle ligne et/ou colonne. Le dernier
argument de chacune de ces fonctions est une liste de propriétés que la vue est
supposée remplir avec une liste de propriétés. La fonction getColumnProperties
fournit aussi l'élément treecol
correspondant pour la colonne.
getRowProperties : function(row,prop){}
getColumnProperties : function(column,columnElement,prop){}
getCellProperties : function(row,column,prop){}
Regardons un exemple de modification d'une cellule spécifique. Rendons le
texte d'une ligne sur quatre bleu, en utilisant l'exemple d'une section
précédente. Nous allons avoir besoin d'ajouter du code à la fonction
getCellProperties
, pour ajouter une propriété 'makeItBlue' aux cellules toutes les quatres lignes. (Nous n'utilisons pas getRowProperties
puisque la couleur
du texte ne sera pas héritée dans chaque cellule).
L'objet properties
qui est passé en dernier argument de getCellProperties
est
un objet XPCOM qui implémente nslSupportsArray
. Il s'agit en fait une version
XPCOM d'un tableau. Il contient une fonction AppendElement
qui peut être
utilisée pour ajouter un élément au tableau. Nous pouvons utiliser l'interface
nslAtomService
pour construire des atomes de chaînes pour les propriétés.
getCellProperties: function(row,col,props){
if ((row %4) == 0){
var aserv=Components.classes["@mozilla.org/atom-service;1"].
getService(Components.interfaces.nsIAtomService);
props.AppendElement(aserv.getAtom("makeItBlue"));
}
}
Cette fonction sera définie comme partie d'un objet de vue. Elle vérifie
d'abord quelle ligne est demandée et affecte une propriété pour les cellules toutes les quatres lignes.
La liste des propriétés requiert un tableau d'objets atom,
qui peuvent être considérés comme des chaînes de caractères constantes. Nous les
créons en utilisant l'interface XPCOM nslAtomService
et nous les ajoutons au
tableau en utilisant la fonction AppendElement
. Ici, nous créons un atome
'makeItBlue'. Vous pouvez appeler AppendElement
à nouveau pour ajouter des
propriétés additionnelles.
Dans la suite, nous allons voir comment modifier le thème par défaut.