in optaplanner-docs/src/modules/ROOT/images/website/jstree/jstree.js [4252:4368]
copy_node : function (obj, par, pos, callback, is_loaded, skip_redraw, origin) {
var t1, t2, dpc, tmp, i, j, node, old_par, new_par, old_ins, is_multi;
par = this.get_node(par);
pos = pos === undefined ? 0 : pos;
if(!par) { return false; }
if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {
return this.load_node(par, function () { this.copy_node(obj, par, pos, callback, true, false, origin); });
}
if($.isArray(obj)) {
if(obj.length === 1) {
obj = obj[0];
}
else {
//obj = obj.slice();
for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
if((tmp = this.copy_node(obj[t1], par, pos, callback, is_loaded, true, origin))) {
par = tmp;
pos = "after";
}
}
this.redraw();
return true;
}
}
obj = obj && obj.id ? obj : this.get_node(obj);
if(!obj || obj.id === $.jstree.root) { return false; }
old_par = (obj.parent || $.jstree.root).toString();
new_par = (!pos.toString().match(/^(before|after)$/) || par.id === $.jstree.root) ? par : this.get_node(par.parent);
old_ins = origin ? origin : (this._model.data[obj.id] ? this : $.jstree.reference(obj.id));
is_multi = !old_ins || !old_ins._id || (this._id !== old_ins._id);
if(old_ins && old_ins._id) {
obj = old_ins._model.data[obj.id];
}
if(par.id === $.jstree.root) {
if(pos === "before") { pos = "first"; }
if(pos === "after") { pos = "last"; }
}
switch(pos) {
case "before":
pos = $.inArray(par.id, new_par.children);
break;
case "after" :
pos = $.inArray(par.id, new_par.children) + 1;
break;
case "inside":
case "first":
pos = 0;
break;
case "last":
pos = new_par.children.length;
break;
default:
if(!pos) { pos = 0; }
break;
}
if(pos > new_par.children.length) { pos = new_par.children.length; }
if(!this.check("copy_node", obj, new_par, pos, { 'core' : true, 'origin' : origin, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id) })) {
this.settings.core.error.call(this, this._data.core.last_error);
return false;
}
node = old_ins ? old_ins.get_json(obj, { no_id : true, no_data : true, no_state : true }) : obj;
if(!node) { return false; }
if(node.id === true) { delete node.id; }
node = this._parse_model_from_json(node, new_par.id, new_par.parents.concat());
if(!node) { return false; }
tmp = this.get_node(node);
if(obj && obj.state && obj.state.loaded === false) { tmp.state.loaded = false; }
dpc = [];
dpc.push(node);
dpc = dpc.concat(tmp.children_d);
this.trigger('model', { "nodes" : dpc, "parent" : new_par.id });
// insert into new parent and up
for(i = 0, j = new_par.parents.length; i < j; i++) {
this._model.data[new_par.parents[i]].children_d = this._model.data[new_par.parents[i]].children_d.concat(dpc);
}
dpc = [];
for(i = 0, j = new_par.children.length; i < j; i++) {
dpc[i >= pos ? i+1 : i] = new_par.children[i];
}
dpc[pos] = tmp.id;
new_par.children = dpc;
new_par.children_d.push(tmp.id);
new_par.children_d = new_par.children_d.concat(tmp.children_d);
if(new_par.id === $.jstree.root) {
this._model.force_full_redraw = true;
}
if(!this._model.force_full_redraw) {
this._node_changed(new_par.id);
}
if(!skip_redraw) {
this.redraw(new_par.id === $.jstree.root);
}
if(callback) { callback.call(this, tmp, new_par, pos); }
/**
* triggered when a node is copied
* @event
* @name copy_node.jstree
* @param {Object} node the copied node
* @param {Object} original the original node
* @param {String} parent the parent's ID
* @param {Number} position the position of the node among the parent's children
* @param {String} old_parent the old parent of the node
* @param {Number} old_position the position of the original node
* @param {Boolean} is_multi do the node and new parent belong to different instances
* @param {jsTree} old_instance the instance the node came from
* @param {jsTree} new_instance the instance of the new parent
*/
this.trigger('copy_node', { "node" : tmp, "original" : obj, "parent" : new_par.id, "position" : pos, "old_parent" : old_par, "old_position" : old_ins && old_ins._id && old_par && old_ins._model.data[old_par] && old_ins._model.data[old_par].children ? $.inArray(obj.id, old_ins._model.data[old_par].children) : -1,'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id), 'old_instance' : old_ins, 'new_instance' : this });
return tmp.id;
},