Subversion Repositories Applications.papyrus

Rev

Blame | Last modification | View Log | RSS feed

if(!dojo._hasResource["dojox.wire.TreeAdapter"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo._hasResource["dojox.wire.TreeAdapter"] = true;
dojo.provide("dojox.wire.TreeAdapter");

dojo.require("dojox.wire.CompositeWire");

dojo.declare("dojox.wire.TreeAdapter", dojox.wire.CompositeWire, {
        //      summary:
        //              A composite Wire for tree nodes
        //      description:
        //              This class has multiple child Wires for tree nodes, their title and
        //              child nodes.
        //              The root object for this class must be an array.
        //              'node' Wires in 'nodes' property is used to identify an object
        //              representing a node.
        //              'title' Wires in 'nodes' property is used to get the title string
        //              of a node.
        //              'children' Wires in 'nodes' property is used to iterate over child
        //              node objects.
        //              The node values are returned in an array as follows:
        //                      [
        //                              {title: title1,
        //                              children: [
        //                                      {title: title2,
        //                                       child: ...},
        //                                      {title: title3,
        //                                       child: ...},
        //                                      ...
        //                              ]},
        //                              ...
        //                      ]
        //              This class only supports getValue(), but not setValue().
        
        _wireClass: "dojox.wire.TreeAdapter",
        
        constructor: function(/*Object*/args){
                //      summary:
                //              Initialize properties
                //      description:
                //              If object properties ('node', 'title' and 'children') of array
                //              elements specified in 'nodes' property are not Wires, Wires are
                //              created from them as arguments, with 'parent' property set to
                //              this Wire instance.
                //      args:
                //              Arguments to initialize properties
                //              nodes:
                //                      An array containing objects for child Wires for node values
                this._initializeChildren(this.nodes);
        },
        _getValue: function(/*Array*/object){
                //      summary:
                //              Return an array of tree node values
                //      description:
                //              This method iterates over an array specified to 'object'
                //              argument and calls getValue() method of 'node' Wires with each
                //              element of the array to get object(s) that represetns nodes.
                //              (If 'node' Wires are omitted, the array element is used for
                //              further processing.)
                //              Then, getValue() method of 'title' Wires are called to get
                //              title strings for nodes.
                //              (If 'title' Wires are omitted, the objects representing nodes
                //              are used as title strings.)
                //              And if an array of objects with 'node' and 'title' Wires is
                //              specified to 'children', it is used to gather child nodes and
                //              their title strings in the same way recursively.
                //              Finally, an array of the top-level node objects are retuned.
                //      object:
                //              A root array
                //      returns:
                //              An array of tree node values
                if(!object || !this.nodes){
                        return object; //Array
                }

                var array = object;
                if(!dojo.isArray(array)){
                        array = [array];
                }

                var nodes = [];
                for(var i in array){
                        for(var i2 in this.nodes){
                                nodes = nodes.concat(this._getNodes(array[i], this.nodes[i2]));
                        }
                }
                return nodes; //Array
        },

        _setValue: function(/*Array*/object, /*Array*/value){
                //      summary:
                //              Not supported
                throw new Error("Unsupported API: " + this._wireClass + "._setValue");
        },

        _initializeChildren: function(/*Array*/children){
                //      summary:
                //              Initialize child Wires
                //      description:
                //              If 'node' or 'title' properties of array elements specified in
                //              'children' argument are not Wires, Wires are created from them
                //              as arguments, with 'parent' property set to this Wire instance.
                //              If an array element has 'children' property, this method is
                //              called recursively with it.
                //      children:
                //              An array of objects containing child Wires
                if(!children){
                        return; //undefined
                }

                for(var i in children){
                        var child = children[i];
                        if(child.node){
                                child.node.parent = this;
                                if(!dojox.wire.isWire(child.node)){
                                        child.node = dojox.wire.create(child.node);
                                }
                        }
                        if(child.title){
                                child.title.parent = this;
                                if(!dojox.wire.isWire(child.title)){
                                        child.title = dojox.wire.create(child.title);
                                }
                        }
                        if(child.children){
                                this._initializeChildren(child.children);
                        }
                }
        },

        _getNodes: function(/*Object*/object, /*Object*/child){
                //      summary:
                //              Return an array of tree node values
                //      description:
                //              This method calls getValue() method of 'node' Wires with
                //              'object' argument to get object(s) that represents nodes.
                //              (If 'node' Wires are omitted, 'object' is used for further
                //              processing.)
                //              Then, getValue() method of 'title' Wires are called to get
                //              title strings for nodes.
                //              (If 'title' Wires are omitted, the objects representing nodes
                //              are used as title strings.)
                //              And if an array of objects with 'node' and 'title' Wires is
                //              specified to 'children', it is used to gather child nodes and
                //              their title strings in the same way recursively.
                //              Finally, an array of node objects are returned.
                //      object:
                //              An object
                //      child:
                //              An object with child Wires
                //      returns:
                var array = null;
                if(child.node){
                        array = child.node.getValue(object);
                        if(!array){
                                return [];
                        }
                        if(!dojo.isArray(array)){
                                array = [array];
                        }
                }else{
                        array = [object];
                }

                var nodes = [];
                for(var i in array){
                        object = array[i];
                        var node = {};
                        if(child.title){
                                node.title = child.title.getValue(object);
                        }else{
                                node.title = object;
                        }
                        if(child.children){
                                var children = [];
                                for(var i2 in child.children){
                                        children = children.concat(this._getNodes(object, child.children[i2]));
                                }
                                if(children.length > 0){
                                        node.children = children;
                                }
                        }
                        nodes.push(node);
                }
                return nodes; //Array
        }
});

}