Attention : Le contenu de ces pages n'a pas été mis à jour depuis longtemps. Il est probablement obsolète pour Firefox 4.0/Gecko 4.0 et supérieur. Pour du contenu plus récent, allez consulter developer.mozilla.org.

Tree view complet

Voici un exemple de vue personnalisée qui affiche un arbre dont la forme est :

 item 0
     item 0.1
     item 0.2
     item 0.3
 item 1
     item 1.1
     item 1.2
     item 1.3
 ...

Pour chaque ligne à afficher dans l'arbre, il y a lieu de construire une structure de données qui comprend au minimum les champs suivants :

 var item = {
    uri    : null,
    index  : null,
    chld   : new Array(),
    isOpen : null,
    isCntn : null,
    level  : null,
    parent : null,
    offSet : null
 }
  • *uri** : représente l'uri, dans une datasource, de la ressource à partir de laquelle seront retrouvés les éléments à afficher sur la ligne, pour les différentes colonnes de l'arbre. Si la vue n'est pas liée à une datasource, ce champ peut être remplacé par un ou plusieurs autres permettant de retrouver les libellés à afficher.
  • *index** : est l'indice de la structure dans un tableau (Array) qui reprend tous les éléments à afficher, visibles ou non, dans l'ordre où ils doivent être présentés. Ce tableau est un tableau d'indices absolus (variable abslList dans l'exemple). Il ne tient pas compte de la structure hiérarchique des éléments.
  • *chld** : est un tableau ordonné qui reprend toutes les structures correspondant à des entités qui sont directement filles de l'entité représentée par la structure item.
  • *isCntn** : est un boléen qui indique si l'élément est un conteneur.
  • *isOpen** : est un boléen qui indique si le conteneur est ouvert.
  • *level** : indique le niveau d'indentation dans l'arborescence. Il est incrémenté de 1 chaque fois qu'un élément a des fils.
  • *parent** : est l'indice dans la liste d'incices absolus du père de l'élément. Il est null si l'élément n'a pas de père (et est donc de level 0).
  • *offset** : est une variable qui indique à tout moment la différence entre l'indice absolu de l'élément dans le tableau abslList et son indice variable dans la vue de l'arborescence. L'indice d'une ligne dans l'arbre varie en effet chaque fois qu'un conteneur qui la précède est ouvert ou fermé.

Pour reprendre l'exemple de départ limité aux trois premières lignes, il y a lieu de créer trois structures de données :

 var item_0 = {
    uri    : "[[urn:item:0"]],
    index  : 0,
    chld   : new Array(),
    isOpen : true,
    isCntn : true,
    level  : 0,
    parent : null,
    offSet : 0
 }
 var item_0_1 = {
    uri    : "[[urn:item:0:1"]],
    index  : 1,
    chld   : new Array(),
    isOpen : false,
    isCntn : false,
    level  : 1,
    parent : 0,
    offSet : 0
 }
 var item_0_2 = {
    uri    : "[[urn:item:0:2"]],
    index  : 2,
    chld   : new Array(),
    isOpen : false,
    isCntn : false,
    level  : 1,
    parent : 0,
    offSet : 0
 }

un tableau d'indices absolus :

 var abslList = new Array();

et d'organiser le tout comme suit :

 abslList[0] = item_0;
 abslList[1] = item_0_1;
 abslList[2] = item_0_2;
 item_0.chld[0] = item_0_1;
 item_0.chld[1] = item_0_2;

%%%

Fonctionnement

La fonction intl créée une structure de test du style de celle décrite ci-avant.

Les indices des lignes affichées dans un arbre changent dès qu'un élément contenant des fils est ouvert ou fermé. Ce changement est répercuté dans les structures en faisant varier leur offset. Ce sont les fonctions expand et collapse qui s'en chargent. Elles sont appelées au départ de la fonction toggleOpenState, c'est à dire chaque fois qu'un conteneur est ouvert ou fermé.

La fonction getItemAtIndex est chargée de récupérer un élément dans la liste abslList au départ de l'indice du même élément dans l'arbre.

Les fonctions getCellText et getCellValue reçoivent l'indice de la ligne d'un élément dans l'arbre. Elles font appel à la fonction getItemAtIndex pour retrouver la structure qui lui correspond dans le tableau abslList. Une fois cette structure trouvée, on peut appeler les fonctionnalités des datasources (ou autre) pour retrouver sur base de l'uri les informations que l'on veut afficher dans les différentes colonnes.

Enfin, les fonctions addChld et removeItem permettent d'ajouter ou de supprimer des éléments dans l'arbre. La fonction addChld ajoute un élément comme fils d'un autre élément. La fonction removeItem supprime l'élément sélectionné ainsi que tous ses fils.

Le XUL

 <?xml version="1.0"?>
 <?xml-stylesheet href="[[chrome://global/skin/]]" type="text/css"?>
 <window width="500" height="500" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
       onload="intl();">
 <script type="application/x-javascript" src="[[chrome://test/test_view.js"/]]>
   <tree id="treeTest"
         flex="1">
     <treecols>
       <treecol id="col_0"
                label="Col_0"
                primary="true"
                flex="1"/>
       <splitter class="tree-splitter"/>
       <treecol id="col_1"
                label="Col_1"
                flex="1"/>
       <splitter class="tree-splitter"/>
       <treecol id="col_2"
                label="Col_2"
                flex="1"/>
     </treecols>
     <treechildren/>
   </tree>
 </window>

%%%

Le JS

Voir http://xulfr.org/sources/treeviewcomplet(..)


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.