in optaplanner-docs/src/modules/ROOT/images/website/jstree/jstree.js [4079:4239]
move_node : function (obj, par, pos, callback, is_loaded, skip_redraw, origin) {
var t1, t2, old_par, old_pos, new_par, old_ins, is_multi, dpc, tmp, i, j, k, l, p;
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.move_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.move_node(obj[t1], par, pos, callback, is_loaded, false, 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);
old_pos = 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;
if(old_ins && old_ins._id) {
obj = old_ins._model.data[obj.id];
}
if(is_multi) {
if((tmp = this.copy_node(obj, par, pos, callback, is_loaded, false, origin))) {
if(old_ins) { old_ins.delete_node(obj); }
return tmp;
}
return false;
}
//var m = this._model.data;
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("move_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;
}
if(obj.parent === new_par.id) {
dpc = new_par.children.concat();
tmp = $.inArray(obj.id, dpc);
if(tmp !== -1) {
dpc = $.vakata.array_remove(dpc, tmp);
if(pos > tmp) { pos--; }
}
tmp = [];
for(i = 0, j = dpc.length; i < j; i++) {
tmp[i >= pos ? i+1 : i] = dpc[i];
}
tmp[pos] = obj.id;
new_par.children = tmp;
this._node_changed(new_par.id);
this.redraw(new_par.id === $.jstree.root);
}
else {
// clean old parent and up
tmp = obj.children_d.concat();
tmp.push(obj.id);
for(i = 0, j = obj.parents.length; i < j; i++) {
dpc = [];
p = old_ins._model.data[obj.parents[i]].children_d;
for(k = 0, l = p.length; k < l; k++) {
if($.inArray(p[k], tmp) === -1) {
dpc.push(p[k]);
}
}
old_ins._model.data[obj.parents[i]].children_d = dpc;
}
old_ins._model.data[old_par].children = $.vakata.array_remove_item(old_ins._model.data[old_par].children, obj.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(tmp);
}
dpc = [];
for(i = 0, j = new_par.children.length; i < j; i++) {
dpc[i >= pos ? i+1 : i] = new_par.children[i];
}
dpc[pos] = obj.id;
new_par.children = dpc;
new_par.children_d.push(obj.id);
new_par.children_d = new_par.children_d.concat(obj.children_d);
// update object
obj.parent = new_par.id;
tmp = new_par.parents.concat();
tmp.unshift(new_par.id);
p = obj.parents.length;
obj.parents = tmp;
// update object children
tmp = tmp.concat();
for(i = 0, j = obj.children_d.length; i < j; i++) {
this._model.data[obj.children_d[i]].parents = this._model.data[obj.children_d[i]].parents.slice(0,p*-1);
Array.prototype.push.apply(this._model.data[obj.children_d[i]].parents, tmp);
}
if(old_par === $.jstree.root || new_par.id === $.jstree.root) {
this._model.force_full_redraw = true;
}
if(!this._model.force_full_redraw) {
this._node_changed(old_par);
this._node_changed(new_par.id);
}
if(!skip_redraw) {
this.redraw();
}
}
if(callback) { callback.call(this, obj, new_par, pos); }
/**
* triggered when a node is moved
* @event
* @name move_node.jstree
* @param {Object} 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 old position of the 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('move_node', { "node" : obj, "parent" : new_par.id, "position" : pos, "old_parent" : old_par, "old_position" : old_pos, '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 obj.id;
},