Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# Impossible d'ajouter un élément a un objet tree

Envoyé par : mhtagada

Date : 01/12/2009 23:03

Bonjour, j'ai un souci, et ça fait déjà un moment que je cherche des explications mais rien n'y fait, j'ai commencé à me créer une extensions pour firefox et j'ai un élément tree, j'arrive à mettre a jour une ligne existante mais je n'arrive pas a ajouter un élément.

le code du tree

   <tree id="siteTree" align="stretch" enableColumnDrag="true" alternatingbackground="true"
           flex="1" style="width: 5em; height: 2em;" seltype="single" 
           onselect="onSiteTreeSelected();">
       <treecols pickertooltiptext="">
           <treecol id="nameCol" name="nameCol" label="Site Name" ordinal="1" persist="width ordinal hidden"/>
           <splitter class="tree-splitter" ordinal="2"/>
           <treecol id="ipCol" label="IP" ordinal="3" minwidth="120" persist="width ordinal hidden"/>
           <splitter class="tree-splitter" ordinal="4"/>
           <treecol id="portCol" label="Port" ordinal="5" minwidth="55" persist="width ordinal hidden"/>
           <splitter class="tree-splitter" ordinal="6"/>
           <treecol id="httpsCol" label="Https" ordinal="7" type="checkbox" minwidth="65" persist="width ordinal hidden"/>
           <splitter class="tree-splitter" ordinal="8"/>
           <treecol id="usernameCol" label="Username" ordinal="9" hidden="true" persist="width ordinal hidden"/>
           <splitter class="tree-splitter" ordinal="10"/>
           <treecol id="passwordCol" label="Password" ordinal="11" hidden="true" persist="width ordinal hidden"/>
           <splitter class="tree-splitter" ordinal="12"/>
       </treecols>
       <treechildren id="siteTreeChildren"/>
   </tree>

la fonction javascript appelée lors du chargement de la fenetre (onload) est la suivante

   function onLoadOption(){
       siteTree = document.getElementById("siteTree");
       sites = [["Solides", "rezf", "zetre", "false", "Solides", "Solides"]];

       var treeView = {
           childData : {
           },
           visibleData : sites,

           treeBox: null,
           selection: null,

           get rowCount()                     { return this.visibleData.length; },

           setTree: function(treeBox)         { this.treeBox = treeBox; },
           getCellText: function(idx, column) { return this.visibleData[idx][column.index]; },
           getCellValue: function(idx, column) { return this.visibleData[idx][column.index]; },


           isContainer: function(idx)         { return false; },
           isContainerOpen: function(idx)     { return false; },
           isContainerEmpty: function(idx)    { return true; },
           isSeparator: function(idx)         { return false; },
           isSorted: function()               { return false; },
           isEditable: function(idx, column)  { return false; },

           getParentIndex: function(idx) {
               if (this.isContainer(idx))
                   return -1;
               for (var t = idx - 1; t >= 0 ; t--) {
                   if (this.isContainer(t))
                       return t;
               }
           },
           getLevel: function(idx) {
               if (this.isContainer(idx)) 
                   return 0;
               return 1;
           },
           hasNextSibling: function(idx, after) {
               var thisLevel = this.getLevel(idx);
               for (var t = after + 1; t < this.visibleData.length; t++) {
                   var nextLevel = this.getLevel(t);
                   if (nextLevel == thisLevel)
                       return true;
                   if (nextLevel < thisLevel)
                       break;
               }
               return false;
           },
           toggleOpenState: function(idx) {
               var item = this.visibleData[idx];
               if (!item[1])
                   return;
               if (item[2]) {
                   item[2] = false;
                   var thisLevel = this.getLevel(idx);
                   var deletecount = 0;
                   for (var t = idx + 1; t < this.visibleData.length; t++) {
                       if (this.getLevel(t) > thisLevel)
                           deletecount++;
                       else
                           break;
                   }
                   if (deletecount) {
                       this.visibleData.splice(idx + 1, deletecount);
                       this.treeBox.rowCountChanged(idx + 1, -deletecount);
                   }
               } else {
                   item[2] = true;
                   var label = this.visibleData[idx][0];
                   var toinsert = this.childData[label];
                   for (var i = 0; i < toinsert.length; i++) {
                       this.visibleData.splice(idx + i + 1, 0, [toinsert[i], false]);
                   }
                   this.treeBox.rowCountChanged(idx + 1, toinsert.length);
               }
               this.treeBox.invalidateRow(idx);
           },

           getImageSrc: function(idx, column) {},
           getProgressMode : function(idx,column) {},
           cycleHeader: function(col, elem) {},
           selectionChanged: function() {},
           cycleCell: function(idx, column) {},
           performAction: function(action) {},
           performActionOnCell: function(action, index, column) {},
           getRowProperties: function(idx, column, prop) {},
           getCellProperties: function(idx, column, prop) {},
           getColumnProperties: function(column, element, prop) {},
       };

       document.getElementById("siteTree").view = treeView;
   }

lorsque je veut modifier une ligne il me suffit de modifié le contenu de la ligne correspondante dans mon tableau "sites", et l'affichage est alors automatiquement mis à jour, par contre lorsque je veux ajouter un élément l'affichage de l'arbre n'est pas mis à jour, et lorsque je fait

   siteTree.builder.rebuild();

alors j'ai une erreur

Erreur : siteTree.builder is null
Fichier Source : chrome://gema/content/options.js
Ligne : 160

lorsque je fait

   siteTree.view.treebox.invalidate();

alors j'ai une erreur

Erreur : siteTree.view.treebox is undefined
Fichier Source : chrome://gema/content/options.js
Ligne : 160

Merci :)

# Re: Impossible d'ajouter un élément a un objet tree

Envoyé par : laurentj

Date : 11/12/2009 17:05

salut,

siteTree.builder is null

normal, y a un builder que lorsqu'il y a un template, ce qui n'est pas le cas ici.

siteTree.view.treebox

siteTree.view est ton treeview, et tu n'as pas de propriété treebox dessus (ce qui est correct), donc normal.

par contre, tu devrais essayer siteTree.treeboxObject.invalidate(); Si ça ne fonctionne pas, tu peux aussi faire un siteTree.view = null; siteTree.view = treeView (que tu devrais d'ailleurs sortir de la fonction onLoadOption)

# Re: Impossible d'ajouter un élément a un objet tree

Envoyé par : mhtagada

Date : 12/12/2009 20:11

Merci

Il n'est plus possible de poster des messages dans ce forum.


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.