SemanticScuttle/includes/js/dojox/wire/TreeAdapter.js

189 lines
5.5 KiB
JavaScript
Raw Normal View History

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
}
});
}