📄 dhtmlxgrid_drag.js
字号:
/*
Copyright Scand LLC http://www.scbr.com
This version of Software is free for using in GNU GPL applications. For other use or to get Professional Edition please contact info@scbr.com to obtain license
*/
/**
* @desc: enable/disable drag-and-drop
* @type: public
* @param: mode - enabled/disabled [ can be true/false/temporary_disabled - last value mean that tree can be D-n-D can be switched to true later ]
* @topic: 0
*/
dhtmlXGridObject.prototype.enableDragAndDrop=function(mode){
if (mode=="temporary_disabled"){
this.dADTempOff=false;
mode=true; }
else
this.dADTempOff=true;
this.dragAndDropOff=convertStringToBoolean(mode);
};
/**
* @desc: set Drag-And-Drop behavior (child - drop as chils, sibling - drop as sibling
* @type: public
* @param: mode - behavior name (child,sibling,complex)
* @topic: 0
*/
dhtmlXGridObject.prototype.setDragBehavior=function(mode){
this.dadmodec=this.dadmodefix=0;
switch (mode) {
case "child": this.dadmode=0; break;
case "sibling": this.dadmode=1; break;
case "complex": this.dadmode=2; break;
} };
/**
* @desc: create html element for dragging
* @type: private
* @param: htmlObject - html node object
* @topic: 1
*/
dhtmlXGridObject.prototype._createDragNode=function(htmlObject){
if (!this.dADTempOff) return null;
htmlObject.parentObject=new Object();
htmlObject.parentObject.treeNod=this;
var z=new Array();
//#__pro_feature:21092006{
//#drag_adv:21092006{
z=(this.getSelectedId()||"").split(",");
var exst=false;
for (var i=0; i<z.length; i++)
if (z[i]==htmlObject.parentNode.idd) exst=true;
if (!exst)
//#}
//#}
z[this.selMultiRows?z.length:0]=htmlObject.parentNode.idd;
this._dragged=new Array();
for (var i=0; i<z.length; i++)
if (this.rowsAr[z[i]]){
this._dragged[this._dragged.length]=this.rowsAr[z[i]];
this.rowsAr[z[i]].treeNod=this;
}
htmlObject.parentObject.parentNode=htmlObject.parentNode;
var dragSpan=document.createElement('div');
dragSpan.innerHTML=this.rowToDragElement(htmlObject.parentNode.idd);
dragSpan.style.position="absolute";
dragSpan.className="dragSpanDiv";
return dragSpan;
}
/**
* @desc: create a drag visual marker
* @type: private
*/
dhtmlXGridObject.prototype._createSdrgc=function(){
this._sdrgc=document.createElement("DIV");
this._sdrgc.innerHTML=" ";
this._sdrgc.className="gridDragLine";
this.objBox.appendChild(this._sdrgc);
}
/**
* @desc: create a drag context object
* @type: private
*/
function dragContext(a,b,c,d,e,f,j,h){
this.source=a||"grid";
this.target=b||"grid";
this.mode=c||"move";
this.dropmode=d||"child";
this.sid=e||0;
this.tid=f||window.unknown;
this.sobj=j||null;
this.tobj=h||null;
return this;
}
/**
* @desc: close context
* @type: private
*/
dragContext.prototype.close=function(){
this.sobj=null;
this.tobj=null;
}
/**
* @desc: return copy of context
* @type: private
*/
dragContext.prototype.copy=function(){
return new dragContext(this.source,this.target,this.mode,this.dropmode,this.sid,this.tid,this.sobj,this.tobj);
this.sobj=null;
this.tobj=null;
}
/**
* @desc: set a lue of context attribute
* @type: private
*/
dragContext.prototype.set=function(a,b){
this[a]=b;
return this;
}
/**
* @desc: generate an Id for new node
* @type: private
*/
dragContext.prototype.uid=function(a,b){
this.nid=this.sid;
while (this.tobj.rowsAr[this.nid])
this.nid=this.nid+((new Date()).valueOf());
return this;
}
/**
* @desc: get data array for grid row
* @type: private
*/
dragContext.prototype.data=function(){
if (this.sobj==this.tobj)
return this.sobj._getRowArray(this.sobj.rowsAr[this.sid]);
if (this.source=="tree")
return this.tobj.treeToGridElement(this.sobj,this.sid,this.tid);
else
return this.tobj.gridToGrid(this.sid,this.sobj,this.tobj);
}
/**
* @desc: return parent id for row in context
* @type: private
*/
dragContext.prototype.pid=function(){
if (this.tid==window.unknown) return window.unknown;
if (this.target=="treeGrid")
if (this.dropmode=="child")
return this.tid;
else
return this.tobj.rowsAr[this.tid].parent_id;
}
/**
* @desc: get index of target position
* @type: private
*/
dragContext.prototype.ind=function(){
if (this.tid==window.unknown) return 0;
if ((this.dropmode=="child")&&(this.target=="treeGrid"))
this.tobj.openItem(this.tid);
var ind=this.tobj.rowsCol._dhx_find(this.tobj.rowsAr[this.tid]);
return (ind+((this.target=="treeGrid")?this.tobj._countBranchLength(ind):1));
}
/**
* @desc: get row related image
* @type: private
*/
dragContext.prototype.img=function(){
if (this.target!="grid")
return this.sobj.getItemImage(this.sid);
else return null;
}
/**
* @desc: return list of rows in context
* @type: private
*/
dragContext.prototype.slist=function(){
var res=new Array();
for (var i=0; i<this.sid.length; i++)
res[res.length]=this.sid[i][(this.source=="tree")?"id":"idd"];
return res.join(",");
}
/**
* @desc: drag entry point
* @type: private
*/
dhtmlXGridObject.prototype._drag=function(sourceHtmlObject,dhtmlObject,targetHtmlObject,innerFlag){
//close unfinished tasks
if (this._autoOpenTimer) window.clearTimeout(this._autoOpenTimer);
//detect details
var r1=targetHtmlObject.parentNode;
var r2=sourceHtmlObject.parentObject;
//drop on heder
if (!r1.grid) { r1.grid=this; this.dadmodefix=0; }
var c=new dragContext(0,0,0,(r1.grid.dadmodec?"sibling":"child"));
if (r2 && r2.childNodes)
c.set("source","tree").set("sobj",r2.treeNod).set("sid",c.sobj._dragged);
else{
if (r2.treeNod.isTreeGrid()) c.set("source","treeGrid");
c.set("sobj",r2.treeNod).set("sid",c.sobj._dragged);
}
if (r1.grid.isTreeGrid())
c.set("target","treeGrid");
c.set("tobj",r1.grid).set("tid",r1.idd);
//#__pro_feature:21092006{
//#drag_adv:21092006{
//complex drag mode
if ((c.tobj.dadmode==2)&&(c.tobj.dadmodec==1)&&(c.tobj.dadmodefix<0))
if (c.tobj.obj._rows(0).idd!=c.tid) c.tid=r1.previousSibling.idd;
else c.tid=window.unknown;
//#}
//#}
if (c.sobj.dpcpy) c.set("mode","copy");
c.tobj._clearMove();
if ((c.tobj.dragFunc)&&(!c.tobj.dragFunc(c.slist(),c.tid,c.sobj,c.tobj))) return;
//all ready, start mantras
var result=new Array();
if (typeof(c.sid)=="object"){
var nc=c.copy();
for (var i=0; i<c.sid.length; i++){
nc.tobj._dragRoutine(nc.set("sid",c.sid[i][(c.source=="tree"?"id":"idd")]));
result[result.lenght]=nc.nid;
}
nc.close();
}
else
c.tobj._dragRoutine(c);
//destroy context
if (c.tobj.dropFunc)
c.tobj.dropFunc(c.slist(),c.tid,result.join(","),c.sobj,c.tobj);
c.close();
}
/**
* @desc: context drag routine
* @type: private
*/
dhtmlXGridObject.prototype._dragRoutine=function(c){
c.uid().tobj.addRow(c.nid,c.data(),c.ind(),c.pid(),c.img());
if (c.source=="tree"){
var sn=c.sobj._globalIdStorageFind(c.sid);
if (sn.childsCount){
var nc=c.copy().set("tid",c.nid).set("dropmode",c.target=="grid"?"sibling":"child");
for(var j=0;j<sn.childsCount;j++){
c.tobj._dragRoutine(nc.set("sid",sn.childNodes[j].id));
if (c.mode=="move") j--;
}
nc.close();
}
}
else{
c.tobj._copyUserData(c);
if ((c.source=="treeGrid")){
var snc=c.sobj.loadedKidsHash.get(c.sid);
if ((snc)&&(snc.length)){
var nc=c.copy().set("tid",c.nid);
if(c.target=="grid")
nc.set("dropmode","sibling");
else {
nc.tobj.openItem(c.tid);
nc.set("dropmode","child");
}
for(var j=0;j<snc.length;j++){
c.tobj._dragRoutine(nc.set("sid",snc[j].idd));
if (c.mode=="move") j--;
}
nc.close();
}
}
}
if (c.mode=="move"){
c.sobj[(c.source=="tree")?"deleteItem":"deleteRow"](c.sid);
if ((c.sobj==c.tobj)&&(!c.tobj.rowsAr[c.sid])) c.tobj.changeRowId(c.nid,c.sid);
}
}
/**
* @desc: redefine this method in your code to define how grid row values should be used in another grid
* @param: rowId - id of draged row
* @param: sgrid - source grid object
* @param: tgrid - target grid object
* @returns: array of values
* @type: public
* @topic: 7
*/
dhtmlXGridObject.prototype.gridToGrid = function(rowId,sgrid,tgrid){
var z=new Array();
for (var i=0; i<sgrid.hdr.rows[0].cells.length; i++)
z[i]=sgrid.cells(rowId,i).getValue();
return z;
}
/**
* @desc: check if d-n-d is in allowed rules
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -