Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# Surcharge de TreeView#getCellText()

Envoyé par : yez

Date : 22/11/2005 17:09

Bonjour,

Voilà le problème : j'ai un arbre alimenté par un fichier RDF. Le TreeBuilder par défaut me convient bien à un détail près (mais y'en a d'autres qui vont sûrement arriver par la suite) : j'aimerais surcharger la méthode d'affichage des cellules de certaines colonnes.

Je vois pas trop comment faire. Le seul moyen que j'ai trouvé, c'est de créer un wrapper sur le TreeBuilder par défaut (cf. code en fin de post). Ca fonctionne pour l'interface nsITreeView, mais pas pour les autres interfaces de TreeBuilder. Concrêtement j'ai bien mon affichage personnalisé, mais j'ai d'autres soucis.

Et puis de toute façon c'est pas très jojo, il doit bien y avoir un moyen de faire ça de manière propre non (et sans créer un nouveau composant XPCOM) ?

Merci d'avance

PS : pour info, mon code wrapper :

 myTree.view = buildCustomTreeView(myTree.view);
 
 function buildCustomTreeView(parentView)
 {
   var treeView = {
     get rowCount()
     {
       return parentView.rowCount;
     },
     setTree: function(treeBox)
     {
       return parentView.setTree(treeBox);
     },
     getCellText: function(idx, column)
     {
       var result = parentView.getCellText(idx, column);
 
       if (column.id == 'xxx')
       {
         result = 'XXX';
       }
       else if (column.id == 'yyy')
       {
         result = 'YYY';
       }
       ...
       return result;
     },
     isContainer: function(idx)
     {
       return parentView.isContainer(idx);
     },
    ...
 } 

# Re: Surcharge de TreeView#getCellText()

Envoyé par : laurentj

Date : 22/11/2005 18:17

Ca fonctionne pour l'interface nsITreeView, mais pas pour les autres interfaces de TreeBuilder.

Si tu veux juste changer le contenu des cellules, changer le view suffit.

Concrêtement j'ai bien mon affichage personnalisé, mais j'ai d'autres soucis.

lesquels ?

# Re: Surcharge de TreeView#getCellText()

Envoyé par : yez

Date : 22/11/2005 20:13

Je débute, il y a donc encore plein de choses qui m'échappent.

Dans un 1er temps, je n'ai surchargé que les méthodes de nsITreeView. Du coup, je me faisais jeter quand j'invoquais des méthodes d'autres interfaces, comme nsIXULTreeBuilder. J'ai donc commencé par implémenter les méthodes de nsIXULTreeBuilder de la même manière, mais là ça ne marche pas : je me choppe des xxxList.builderView.getResourceAtIndex is not a function.

J'ai cherché, je me suis dit que mon wrapper devait peut-être déclarer ses interfaces, j'ai trouvé la métode QueryInterface, j'ai fait quelques tests non concluants et finalement j'ai laissé tombé parce que j'avais l'impression de ne pas suivre la bonne voie.

C'est pourtant comme ça qu'il faudrait faire ?

# Re: Surcharge de TreeView#getCellText()

Envoyé par : laurentj

Date : 23/11/2005 10:12

C'est pourtant comme ça qu'il faudrait faire ?

Non. ne change pas le builder. Le builder est un truc relativement complexe à mettre en place. De plus cette propriété est readonly.

Si tu veux controler l'affichage, c'est le view qu'il faut modifier. Et encore, si tu fait ton propre view, cela veut dire que tu n'utilises pas de source de données RDF, et que tu as ta propre source de données (un tableau JS par exemple). La doc dit bien :

Trees built from RDF or those which use treeitems directly will already have a view.

Si tu utilise une source de données RDF et que tu veux un affichage specifique dans une cellule, c'est dans ton template qu'il faut le faire.

Que veux tu faire de spécial au niveau affichage ? Que veux tu et comment veux tu afficher ton contenu ?

# Re: Surcharge de TreeView#getCellText()

Envoyé par : yez

Date : 23/11/2005 10:39

C'est pourtant comme ça qu'il faudrait faire ?

Non. ne change pas le builder. Le builder est un truc relativement complexe à mettre en place. De plus cette propriété est readonly.

Bon ça me rassure ;-)

Si tu utilise une source de données RDF et que tu veux un affichage specifique dans une cellule, c'est dans ton template qu'il faut le faire.

J'ai peur que les templates soient un peu limités à la longue. J'ai bien défini des concaténations ou ce genre de petites choses mais j'aurais besoin de faire des trucs plus complexes, c'est pour ça que je préférais dés maintenant contrôler la valeur affichée en javascript.

Que veux tu faire de spécial au niveau affichage ? Que veux tu et comment veux tu afficher ton contenu ?

Pour l'instant, je veux juste afficher un libellé (localisé) à la place d'une constante stockée dans mon RDF.

# Re: Surcharge de TreeView#getCellText()

Envoyé par : laurentj

Date : 23/11/2005 17:52

Pour l'instant, je veux juste afficher un libellé (localisé) à la place d'une constante stockée dans mon RDF.

Tu peux avoir plusieurs sources de données RDF pour un même template. Mozilla les combines entre eux pour n'en faire qu'une seule source virtuelle (vive le RDF ! :-) ) .

Donc tu pourrais trés bien avoir ton fichier RDF principale ne contenant pas ces libellés. Et dans un autre, tu as la description avec les libellés. Cet autre fichier, tu le met dans la partie locale de ton application.

du coup, ça donne :

datasources="bar_principal.rdf chrome://foo/locale/bar_locale.rdf"

C'est ainsi que je fais dans l'extension xulref. J'ai mes fichiers RDF principaux dans content et les descriptions de mes ressources dans des fichiers séparés dans locale.

Mon template affiche en fait la liste des elements XUL classés par catégories. J'ai ainsi la classification des eléments dans des catégories dans ce fichier, dans content, et les labels des catégories dans locale, dans ce fichier

# Re: Surcharge de TreeView#getCellText()

Envoyé par : yez

Date : 23/11/2005 22:58

Merci pour cette piste Laurent :-)

Par contre je tombe sur un nouveau problème pour lire mon RDF, avec le lien entre la clé et la valeur (gérée différemment sur ton extension xulref).

Voici mon RDF de démonstration (j'ai mergé mes 2 RDFs pour simplifier les choses) :

 <?xml version="1.0"?>
 <RDF:RDF xmlns:NS1="http://test/RDF/"
          xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
 
   <RDF:Seq RDF:about="urn:test:list">
     <RDF:li RDF:resource="urn:test:res1"/>
   </RDF:Seq>
 
   <RDF:Description RDF:about="urn:test:res1">
     <NS1:name>Nom1</NS1:name>
     <NS1:state RDF:resource="urn:test:states:state1"/>
   </RDF:Description>
 
   <RDF:Description RDF:about="urn:test:states:state1" NS1:label="Etat 1"/>
 
 </RDF:RDF>

Je n'arrive pas à récupérer le label "Etat 1" dans ma définition de template :

 <?xml version="1.0"?>
 
 <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
   <tree flex="1"
         datasources="test1.rdf"
         ref="urn:test:list">
     <treecols>
       <treecol id="fColName" label="col.name" flex="1"/>
       <splitter class="tree-splitter"/>
       <treecol id="fColState" label="col.state" flex="1"/>
     </treecols>
     <template>
       <rule>
         <treechildren flex="1">
           <treeitem uri="rdf:*">
             <treerow>
               <treecell label="rdf:http://test/RDF/name"/>
               <treecell label="rdf:http://test/RDF/state"/>
             </treerow>
           </treeitem>
         </treechildren>
       </rule>
     </template>
   </tree>
 </window>

Dans la colonne col.state est affichée "urn:test:states:state1", j'arrive pas à lui demander son attribut 'label'.

Désolé de faire le boulet mais j'ai pas trouvé de cas similaire sur le Net.

Merci.

# Re: Surcharge de TreeView#getCellText()

Envoyé par : yez

Date : 24/11/2005 10:15

C'est bon j'ai résolu mon problème de template en utilisant les bindings : je mappe la ressource qui contient le libellé, ce qui me permet de récupérer ce libellé par la suite.

 <?xml version="1.0"?> <?xml-stylesheet href="chrome://global/skin" type="text/css"?>
 
 <window xmlns:html="http://www.w3.org/1999/xhtml"
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
   <tree datasources="test.rdf" ref="urn:test:list" flex="1"
         containment="http://test/RDF#list"
     >
     <treecols>
       <treecol id="fColName" label="col.name" flex="1"/>
       <splitter class="tree-splitter"/>
       <treecol id="fColState" label="col.street" flex="1"/>
     </treecols>
     <template>
       <rule>
         <conditions>
           <content uri="?list"/>
           <member container="?list" child="?item"/>
         </conditions>
         <bindings>
           <binding subject="?item"
                    predicate="http://test/RDF#name"
                    object="?name"/>
           <binding subject="?item"
                    predicate="http://test/RDF#state"
                    object="?stateItem"/>
           <binding subject="?stateItem"
                    predicate="http://test/RDF#label"
                    object="?stateLabel"/>
         </bindings>
         <action>
           <treechildren flex="1">
             <treeitem uri="?item">
               <treerow>
                 <treecell label="?name"/>
                 <treecell label="?stateLabel"/>
               </treerow>
             </treeitem>
           </treechildren>
         </action>
       </rule>
     </template>
   </tree>
 </window>

Merci encore pour m'avoir mis sur la piste des RDF composites :-)

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.