blob: c8a708e5adfa44b3390ce511361cb1e23922ffd1 [file] [log] [blame]
/*
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.TreeRPCController");
dojo.require("dojo.event.*");
dojo.require("dojo.json")
dojo.require("dojo.io.*");
dojo.require("dojo.widget.TreeLoadingController");
dojo.widget.defineWidget("dojo.widget.TreeRPCController", dojo.widget.TreeLoadingController, {
/**
* Make request to server about moving children.
*
* Request returns "true" if move succeeded,
* object with error field if failed
*
* I can't leave DragObject floating until async request returns, need to return false/true
* so making it sync way...
*
* Also, "loading" icon is not shown until function finishes execution, so no indication for remote request.
*/
doMove: function(child, newParent, index){
//if (newParent.isTreeNode) newParent.markLoading();
var params = {
// where from
child: this.getInfo(child),
childTree: this.getInfo(child.tree),
// where to
newParent: this.getInfo(newParent),
newParentTree: this.getInfo(newParent.tree),
newIndex: index
};
var success;
this.runRPC({
url: this.getRPCUrl('move'),
/* I hitch to get this.loadOkHandler */
load: function(response){
success = this.doMoveProcessResponse(response, child, newParent, index) ;
},
sync: true,
lock: [child, newParent],
params: params
});
return success;
},
doMoveProcessResponse: function(response, child, newParent, index){
if(!dojo.lang.isUndefined(response.error)){
this.RPCErrorHandler("server", response.error);
return false;
}
var args = [child, newParent, index];
return dojo.widget.TreeLoadingController.prototype.doMove.apply(this, args);
},
doRemoveNode: function(node, callObj, callFunc){
var params = {
node: this.getInfo(node),
tree: this.getInfo(node.tree)
}
this.runRPC({
url: this.getRPCUrl('removeNode'),
/* I hitch to get this.loadOkHandler */
load: function(response){
this.doRemoveNodeProcessResponse(response, node, callObj, callFunc)
},
params: params,
lock: [node]
});
},
doRemoveNodeProcessResponse: function(response, node, callObj, callFunc){
if(!dojo.lang.isUndefined(response.error)){
this.RPCErrorHandler("server", response.error);
return false;
}
if(!response){ return false; }
if(response == true){
/* change parent succeeded */
var args = [ node, callObj, callFunc ];
dojo.widget.TreeLoadingController.prototype.doRemoveNode.apply(this, args);
return;
}else if(dojo.lang.isObject(response)){
dojo.raise(response.error);
}else{
dojo.raise("Invalid response "+response)
}
},
// -----------------------------------------------------------------------------
// Create node stuff
// -----------------------------------------------------------------------------
doCreateChild: function(parent, index, output, callObj, callFunc){
var params = {
tree: this.getInfo(parent.tree),
parent: this.getInfo(parent),
index: index,
data: output
}
this.runRPC({
url: this.getRPCUrl('createChild'),
load: function(response) {
// suggested data is dead, fresh data from server is used
this.doCreateChildProcessResponse( response, parent, index, callObj, callFunc)
},
params: params,
lock: [parent]
});
},
doCreateChildProcessResponse: function(response, parent, index, callObj, callFunc){
if(!dojo.lang.isUndefined(response.error)){
this.RPCErrorHandler("server",response.error);
return false;
}
if(!dojo.lang.isObject(response)){
dojo.raise("Invalid result "+response)
}
var args = [parent, index, response, callObj, callFunc];
dojo.widget.TreeLoadingController.prototype.doCreateChild.apply(this, args);
}
});