New file |
0,0 → 1,188 |
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 |
} |
}); |
|
} |