Oops... some bad copy - paste... But the problem is still there.

var tree = new qx.ui.tree.Tree();
tree.controller = new qx.data.controller.Tree(null, tree, "kids", "name");

var store = new qx.data.store.Json();

store.addListener("loaded", function(ev)
{
        var sel = this.controller.getSelection();
                               
        if (sel.getLength()==0)
        {
                this.controller.setModel(ev.getData().getTree());
                var root = this.getRoot();
                if (root)
                {
                        this.addToSelection(root);
                        root.setOpen(true);
                }
        }
        else
        {
                var currentNode = this.controller.getSelection().getItem(0);
                currentNode.setKids(ev.getData().getTree().getKids());
               
                // forces update
               
this.controller.__updateTreeChildren(this.getSelection()[0],currentNode);
        }
},tree); 


benco wrote:
> 
> Thanks for your help, Martin!
> 
> I tried to follow your idea but it didn't work either. So, I investigated
> further and I just noticed a problem with my tree controller. 
> 
> I don't know if it comes from my code (or if it's a bug from the
> TreeController class). When I update my tree model by populating with the
> new kids, the tree widget isn't refreshed correctly and I have to specify
> an additional call to a private method of the tree controller
> "__updateTreeChildren" to make it happen. 
> 
> I verified that I wasn't mistaken: the content of the kids after updating
> the model and the new kids were hence present but the tree didn't reload. 
> 
> As a reminder, my code is like this one:
> 
> var tree = new qx.ui.tree.Tree();
> var tree.controller = new qx.data.controller.Tree(null, tree, "kids",
> "name");
> 
> var store = new qx.data.store.Json();
> 
> store.addListener("loaded", function(ev) 
> {
>       var sel = this.controller.getSelection();
>                               
>       if (sel.getLength()==0)
>       {
>               this.controller.setModel(ev.getData().getTree());
>               var root = this.getRoot();
>               if (root) 
>               {
>                       tree.addToSelection(root);
>                       root.setOpen(true);
>                 }
>       }
>       else
>       {
>               var currentNode = 
> this.tree.controller.getSelection().getItem(0);
>               currentNode.setKids(ev.getData().getTree().getKids());
>                 
>                 // forces update
>                
> tree.controller.__updateTreeChildren(tree.getSelection()[0],currentNode);
>         }
> });
> 
> 
> Am I wrong or the extra function call is mandatory in my case (not a bug)
> ?
> 
> Regards,
> 
> Benoît.
> 
> PS: In fact, I just realised my store is nearly unnecessary as I manage
> all by the loaded event (a simple remote.request is good enough).
> 
> 
> Martin Wittemann wrote:
>> 
>> Good morning Benoît,
>> 
>> no i get what you are planing to do. Thanks for the detailed  
>> description. I guess the best way to load the tree structure on demand  
>> is to always keep the binding to the initial model and just add the  
>> models loaded after the initial model to the initial model:
>> 
>> initial model (m1):
>> a
>> - a1
>> - a2
>> 
>> now you click on a1 and load that (m2):
>> 
>> a1
>> - a11
>> - a12
>> 
>> You have two different models but you can just grab the kids of the  
>> second model and set them in the first model.
>> 
>> m1.getKids()[0].setKids(m2.getKids());
>> 
>> That should keep the whole structure and just add the kids.
>> 
>> The list binding could always take the kids of the current selection.
>> 
>> treeController.bind("selection.kids", listController, "model");
>> 
>> Have you seen the qooxdoo feed reader example? This is based on the  
>> data binding features as well. Perhaps you can get some ideas from  
>> that code.
>> 
>> Best,
>> Martin
>> 
>> 
>> Am 25.07.2009 um 12:06 schrieb benco:
>> 
>>>
>>> Hello Martin,
>>>
>>> Sorry for the lack of precise informations. OK, I explain :). I work  
>>> on a
>>> sort of file manager. It has two parts : a tree and a list (like any  
>>> file
>>> manager window). In order to manage and retreive all the relevant  
>>> datas, I
>>> use a store and link the model to the two widget controllers (the  
>>> tree and
>>> the list).
>>>
>>> My model definition (could evolve but it follows mainly the examples  
>>> on the
>>> demo page):
>>>
>>> {tree:{name:"",kids:[]},currentfolder:[{name:"",type:"folder| 
>>> file"},...]}
>>>
>>> In an initialisation step, the tree must load the first and second  
>>> level. In
>>> the following steps, I delete this behaviour because the goal is to  
>>> display
>>> the currentfolder in the list and populate the tree with additional
>>> sub-folders when we select a tree node.
>>>
>>> But I don't know how to add the new sub-folders in the tree (except  
>>> if I
>>> worked without the new binding features). When I select a treenode,  
>>> the json
>>> store is reloaded with additional parameters. The result is in the  
>>> same kind
>>> of the above described model except that {tree:{name:"",kids:[]}} only
>>> concerns the selected folder in the tree. So, as the name doesn't  
>>> change (I
>>> don't plan to manage concurrence yet), I only need to bind the kids  
>>> of the
>>> model store to the kids of the selection in the tree controller.
>>>
>>> But "this.store.bind('model.tree.kids', this.tree.controller,
>>> 'selection[0].kids'))" seems not to work. Anyway, the content isn't
>>> refreshed (I don't notice any add). And furthermore, the previous  
>>> selected
>>> treenode isn't anymore selected after the bind assignment.
>>>
>>> Regarding my second question, I already noticed that it was  
>>> qx.data.Array
>>> based. In fact you can consider it as a complement to my first  
>>> question. I
>>> tried to do this kind of operation as the
>>> "this.store.bind('model.tree.kids', this.tree.controller,
>>> 'selection[0].kids'))" seemed not work:
>>>
>>> this.store.addListener("loaded", function(ev)
>>> {
>>>     
>>>     ...
>>>     
>>>     ...
>>>     
>>>     var target = this.tree.controller.getSelection();
>>>     target.splice(0,1,ev.getTree());
>>>     
>>>     (or)
>>>     
>>>     var target = this.tree.controller.getSelection();
>>>     target.setName(ev.getTree().getName());
>>>     target.setKids(ev.getTree().getKids());
>>>     
>>>     ...
>>>     
>>> }, this);
>>>
>>>
>>> I hope it's more clear for you :). Have a nice weekend!
>>>
>>> Best,
>>>
>>> Benoît.
>>>
>>>
>>> Martin Wittemann wrote:
>>>>
>>>> Hello Benoît,
>>>>
>>>> I have to admit that I don't get your use case right. You want to use
>>>> "model.tree" on the first load as model for the tree controller and  
>>>> on
>>>> the second load, you want to use "model.tree.kids"? Do you want to  
>>>> set
>>>> the selection with the second bind? :
>>>>> this.store.bind('model.tree.kids', this.tree.controller,
>>>>> 'selection[0].kids')); // this would'nt work
>>>>
>>>> Because thats what the code tries to do.
>>>>
>>>> Perhaps you could tell me what you want to achieve with the code?
>>>> Maybe i can help you more if I know what you want to do.
>>>>
>>>> To your second question: You can just change the model and the data
>>>> binding will populate the the tree. As the model is a set of qooxdoo
>>>> objects with data arrays, you can just manipulate these model objects
>>>> and that should do the job. :)
>>>>
>>>> Best,
>>>> Martin
>>>>
>>>>
>>>> Am 24.07.2009 um 16:08 schrieb benco:
>>>>
>>>>>
>>>>> Hello,
>>>>>
>>>>> I'm a bit stuck and I really need some help here.
>>>>>
>>>>> I'm working on a Tree that can be loaded progressively on deploy and
>>>>> selection events. I also would like using the new binding features
>>>>> with that
>>>>> tree (namely the Tree Controller and the Json Store).
>>>>>
>>>>> The problem is I don't know how to manage the bindings correctly.
>>>>>
>>>>> In the first step (first launch), I bind the store with the tree
>>>>> controller.
>>>>> Then, the behaviour changes. The store should be binded to the tree
>>>>> controller "selection[0]". I really don't know how to do this in a
>>>>> simple
>>>>> way.
>>>>>
>>>>> If it's not possible ... never mind (I'll use the default tree
>>>>> behaviours
>>>>> and functions). But It would be useful and cool.
>>>>>
>>>>> Here's a code example:
>>>>>
>>>>> this.tree.controller = new qx.data.controller.Tree(null,
>>>>> this.browser.tree,
>>>>> "kids", "name");
>>>>>
>>>>> this.store = new qx.data.store.Json();
>>>>>
>>>>> this.tree.bindId =
>>>>> store.bind('model.tree',this.tree.controller,'model');
>>>>>
>>>>> this.store.addListener("loaded", function(ev)
>>>>> {
>>>>>   // first loading
>>>>>   if (this.tree.bindId)
>>>>>   {
>>>>>           this.store.removeBinding(this.tree.bindId);
>>>>>           this.tree.bindId=null;
>>>>>                                   
>>>>>           var root = this.tree.getRoot();
>>>>>           if (root)
>>>>>           {
>>>>>                   this.tree.addToSelection(root);
>>>>>                   root.setOpen(true);
>>>>>           }
>>>>>   }
>>>>>   else
>>>>>   {
>>>>>           this.store.bind('model.tree.kids',this.tree.controller,
>>>>> 'selection[0].kids')); // this would'nt work
>>>>>   }
>>>>> }, this.browser);
>>>>>
>>>>> Furthermore, I'd like to know how I can complete/populate a partial
>>>>> zone of
>>>>> a model in the tree controller by new additional datas without
>>>>> resetting it
>>>>> completely... Any Ideas ?
>>>>>
>>>>> Thanks in advance,
>>>>>
>>>>> Best,
>>>>>
>>>>> Benoît.
>>>>> -- 
>>>>> View this message in context:
>>>>> http://www.nabble.com/Progressive-Tree-on-selection-and-or-deployement-%2B-the-new-binding-features-tp24645160p24645160.html
>>>>> Sent from the qooxdoo-devel mailing list archive at Nabble.com.
>>>>>
>>>>>
>>>>> ------------------------------------------------------------------------------
>>>>> _______________________________________________
>>>>> qooxdoo-devel mailing list
>>>>> [email protected]
>>>>> https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel
>>>>
>>>>
>>>> ------------------------------------------------------------------------------
>>>> _______________________________________________
>>>> qooxdoo-devel mailing list
>>>> [email protected]
>>>> https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel
>>>>
>>>>
>>>
>>> -- 
>>> View this message in context:
>>> http://www.nabble.com/Progressive-Tree-on-selection-and-or-deployement-%2B-the-new-binding-features-tp24645160p24656522.html
>>> Sent from the qooxdoo-devel mailing list archive at Nabble.com.
>>>
>>>
>>> ------------------------------------------------------------------------------
>>> _______________________________________________
>>> qooxdoo-devel mailing list
>>> [email protected]
>>> https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel
>> 
>> 
>> ------------------------------------------------------------------------------
>> _______________________________________________
>> qooxdoo-devel mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel
>> 
>> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Progressive-Tree-on-selection-and-or-deployement-%2B-the-new-binding-features-tp24645160p24685079.html
Sent from the qooxdoo-devel mailing list archive at Nabble.com.


------------------------------------------------------------------------------
_______________________________________________
qooxdoo-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel

Reply via email to