/* Copyright (c) 2004-2006, The Dojo Foundation All Rights Reserved. Licensed under the Academic Free License version 2.1 or above OR the modified BSD license. For more information on Dojo licensing, see: http://dojotoolkit.org/community/licensing.shtml */ dojo.provide("dojo.widget.TreeLoadingControllerV3"); dojo.require("dojo.widget.TreeBasicControllerV3"); dojo.require("dojo.event.*"); dojo.require("dojo.json") dojo.require("dojo.io.*"); dojo.require("dojo.Deferred"); dojo.require("dojo.DeferredList"); dojo.declare( "dojo.Error", Error, function(message, extra) { this.message = message; this.extra = extra; this.stack = (new Error()).stack; } ); dojo.declare( "dojo.CommunicationError", dojo.Error, function() { this.name="CommunicationError"; } ); dojo.declare( "dojo.LockedError", dojo.Error, function() { this.name="LockedError"; } ); dojo.declare( "dojo.FormatError", dojo.Error, function() { this.name="FormatError"; } ); dojo.declare( "dojo.RpcError", dojo.Error, function() { this.name="RpcError"; } ); dojo.widget.defineWidget( "dojo.widget.TreeLoadingControllerV3", dojo.widget.TreeBasicControllerV3, { RpcUrl: "", RpcActionParam: "action", // used for GET for RpcUrl preventCache: true, checkValidRpcResponse: function(type, obj) { if (type != "load") { var extra = {} for(var i=1; i-1 ? "&" : "?") + this.RpcActionParam+"="+action; }, /** * Add all loaded nodes from array obj as node children and expand it */ loadProcessResponse: function(node, result) { //dojo.debug("Process response "+node); if (!dojo.lang.isArray(result)) { throw new dojo.FormatError('loadProcessResponse: Not array loaded: '+result); } node.setChildren(result); }, /** * kw = { url, sync, params } */ runRpc: function(kw) { var _this = this; var deferred = new dojo.Deferred(); dojo.io.bind({ url: kw.url, handle: this.getDeferredBindHandler(deferred), mimetype: "text/javascript", preventCache: this.preventCache, sync: kw.sync, content: { data: dojo.json.serialize(kw.params) } }); return deferred; }, /** * Load children of the node from server * Synchroneous loading doesn't break control flow * I need sync mode for DnD */ loadRemote: function(node, sync){ var _this = this; var params = { node: this.getInfo(node), tree: this.getInfo(node.tree) }; var deferred = this.runRpc({ url: this.getRpcUrl('getChildren'), sync: sync, params: params }); deferred.addCallback(function(res) { return _this.loadProcessResponse(node,res) }); return deferred; }, batchExpandTimeout: 0, recurseToLevel: function(widget, level, callFunc, callObj, skipFirst, sync) { if (level == 0) return; if (!skipFirst) { var deferred = callFunc.call(callObj, widget, sync); } else { var deferred = dojo.Deferred.prototype.makeCalled(); } //dojo.debug("expand deferred saved "+node+" sync "+sync); var _this = this; var recurseOnExpand = function() { var children = widget.children; var deferreds = []; for(var i=0; i