Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# avertissements désagréables avec un tree

Envoyé par : mothsart

Date : 02/08/2011 15:36

Bonjour, j'utilise un arbre tree comme ceci :

 <?xml version="1.0" encoding="utf-8" ?>
 <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
 <window onload="init();"
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 <tree id="elementList" flex="1">
   <treecols>
     <treecol id="element" label="Élément" primary="true" flex="1"/>
     <treecol id="color" label="Couleur" flex="1"/>
     <treecol id="beauty" label="Beauté" flex="1"/>
     <treecol id="price" label="Prix" flex="1"/>
   </treecols>
   <treechildren/>
 </tree>
 <script>
 <![CDATA[
 var treeView = {
   childData : {
     Bijoux: [
       ["Collier de saphirs",["bleu", "extra", "1000€"]],
       ["Boucles d'oreilles", ["or", "belles", "200€"]],
       ["Bague", ["argent", "peu apprécié", "150€"]]
     ],
     Vêtements: [
       ["Jeans", ["bleu", "cool", "30€"]],
       ["T-shirt", ["blanc", "sobre", "10€"]],
       ["chaussettes", ["multicolore", "superbe", "20€"]]
     ],
     Jouets: [
       ["Legos", ["rouge", "sympa", "80€"]],
       ["Nounours", ["marron", "attachant", "10€"]],
       ["balançoire", ["verte et jaune", "géant", "320€"]],
       ["vélo", ["gris", "très moche", "170€"]]
     ]
   },
   visibleData : [
     ["Bijoux", true, false],
     ["Vêtements", true, false],
     ["Jouets", true, false]
   ],
   colorData : [
     "",
     "",
     ""
   ],
   beautyData : [
     "",
     "",
     ""
   ],
   priceData : [
     "",
     "",
     ""
   ],
   treeBox: null,
   selection: null,
   get rowCount()                     { return this.visibleData.length; },
   setTree: function(treeBox)         { this.treeBox = treeBox; },
   getCellText: function(idx, column) {
     if(column.id == 'element'){
       return this.visibleData[idx][0];
     }
     else if(column.id == 'color'){
       return this.colorData[idx];
     }
     else if(column.id == 'beauty'){
       return this.beautyData[idx];
     }
     else if(column.id == 'price'){
       return this.priceData[idx];
     }
   },
   isContainer: function(idx)         { return this.visibleData[idx][1]; },
   isContainerOpen: function(idx)     { return this.visibleData[idx][2]; },
   isContainerEmpty: function(idx)    { return false; },
   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 = idx + 1; t < this.visibleData.length; t++) {
       var nextLevel = this.getLevel(t)
       if (nextLevel == thisLevel) return true;
       else if (nextLevel < thisLevel) 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.colorData.splice(idx + 1, deletecount);
         this.beautyData.splice(idx + 1, deletecount);
         this.priceData.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][0], false]);
         this.colorData.splice(idx + i + 1, 0, toinsert[i][1][0]);
         this.beautyData.splice(idx + i + 1, 0, toinsert[i][1][1]);
         this.priceData.splice(idx + i + 1, 0, toinsert[i][1][2]);
       }
       this.treeBox.rowCountChanged(idx + 1, toinsert.length);
     }
   },
   getImageSrc: function(idx, column) { return null; },
   getProgressMode : function(idx,column) {},
   getCellValue: 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) {},
 };
 function test(){
   dump('test\n');
 }
 function init() {
   document.getElementById("elementList").view =  treeView;
   document.getElementById("elementList").onmousedown = function(){ test(); };
 }
 ]]></script>
 </window>

Ca marche comme je le désires, cependant j'ai 3 warnings lorsque je clique dessus :

Avertissement : reference to undefined property b.view
Fichier Source : chrome://global/content/bindings/tree.xml
Ligne : 1022

et 3 autres warnings quand je les déplies :

Avertissement : reference to undefined property this.treeBoxObject.view
Fichier Source : chrome://global/content/bindings/tree.xml
Ligne : 0

C'est assez pénible... il y aurait-il une solution pour les enrayer?

# Re: avertissements désagréables avec un tree

Envoyé par : Raphael

Date : 03/08/2011 07:15

Content de voir que je ne suis pas le seul.

Même chose ici depuis mon passage à Xulrunner 2, et ça m'énerve un peu.

J'ai un treeview simple (sans +/- à déplier) et de temps à autres, ces 2 messages arrivent par bloc de 3 sur un click ou un select.

Si quelqu'un a une solution, merci d'avance.

# Re: avertissements désagréables avec un tree

Envoyé par : mothsart

Date : 03/08/2011 11:01

Bon, un début de réponse légèrement inquiétant : https://bugzilla.mozilla.org/show_bug.cgi?id=654998 C'est thunderbird qui est touché ici mais le problème me semble en effet plus profond.

Ma première idée était de créer un patch de chrome://global/content/bindings/tree.xml et d'appeler chrome://monappli/content/tree.xml à la place. Pour ce faire, j'ai changé tous les appels internes vers chrome://global/etc et j'ai mis un try{}catch(e){} aux endroits concernés...

j'avoue que c'est assez crade comme solution mais ça m'aurait bien dépanné tout de même. Malheureusement, ça ne marche pas...

J'ai peu être un début de solution car mes warnings ont un peu changés :

3 warnings :

Avertissement : reference to undefined property this.treeBoxObject.view
Fichier Source : chrome://admin/content/tree.xml
Ligne : 0

et 3 warnings :

Avertissement : reference to undefined property b.view
Fichier Source : chrome://global/content/bindings/tree.xml
Ligne : 1022

En revanche, je n'arrive pas à comprendre comment chrome://global/content/bindings/tree.xml peut encore être appelé. Je l'ai logiquement court-circuité...

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.