129 lines
3.5 KiB
JavaScript
129 lines
3.5 KiB
JavaScript
|
/*
|
||
|
Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
||
|
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||
|
see: http://dojotoolkit.org/license for details
|
||
|
*/
|
||
|
|
||
|
|
||
|
if(!dojo._hasResource["dojo.dnd.Manager"]){
|
||
|
dojo._hasResource["dojo.dnd.Manager"]=true;
|
||
|
dojo.provide("dojo.dnd.Manager");
|
||
|
dojo.require("dojo.dnd.common");
|
||
|
dojo.require("dojo.dnd.autoscroll");
|
||
|
dojo.require("dojo.dnd.Avatar");
|
||
|
dojo.declare("dojo.dnd.Manager",null,{constructor:function(){
|
||
|
this.avatar=null;
|
||
|
this.source=null;
|
||
|
this.nodes=[];
|
||
|
this.copy=true;
|
||
|
this.target=null;
|
||
|
this.canDropFlag=false;
|
||
|
this.events=[];
|
||
|
},OFFSET_X:16,OFFSET_Y:16,overSource:function(_1){
|
||
|
if(this.avatar){
|
||
|
this.target=(_1&&_1.targetState!="Disabled")?_1:null;
|
||
|
this.canDropFlag=Boolean(this.target);
|
||
|
this.avatar.update();
|
||
|
}
|
||
|
dojo.publish("/dnd/source/over",[_1]);
|
||
|
},outSource:function(_2){
|
||
|
if(this.avatar){
|
||
|
if(this.target==_2){
|
||
|
this.target=null;
|
||
|
this.canDropFlag=false;
|
||
|
this.avatar.update();
|
||
|
dojo.publish("/dnd/source/over",[null]);
|
||
|
}
|
||
|
}else{
|
||
|
dojo.publish("/dnd/source/over",[null]);
|
||
|
}
|
||
|
},startDrag:function(_3,_4,_5){
|
||
|
this.source=_3;
|
||
|
this.nodes=_4;
|
||
|
this.copy=Boolean(_5);
|
||
|
this.avatar=this.makeAvatar();
|
||
|
dojo.body().appendChild(this.avatar.node);
|
||
|
dojo.publish("/dnd/start",[_3,_4,this.copy]);
|
||
|
this.events=[dojo.connect(dojo.doc,"onmousemove",this,"onMouseMove"),dojo.connect(dojo.doc,"onmouseup",this,"onMouseUp"),dojo.connect(dojo.doc,"onkeydown",this,"onKeyDown"),dojo.connect(dojo.doc,"onkeyup",this,"onKeyUp"),dojo.connect(dojo.doc,"ondragstart",dojo.stopEvent),dojo.connect(dojo.body(),"onselectstart",dojo.stopEvent)];
|
||
|
var c="dojoDnd"+(_5?"Copy":"Move");
|
||
|
dojo.addClass(dojo.body(),c);
|
||
|
},canDrop:function(_6){
|
||
|
var _7=Boolean(this.target&&_6);
|
||
|
if(this.canDropFlag!=_7){
|
||
|
this.canDropFlag=_7;
|
||
|
this.avatar.update();
|
||
|
}
|
||
|
},stopDrag:function(){
|
||
|
dojo.removeClass(dojo.body(),"dojoDndCopy");
|
||
|
dojo.removeClass(dojo.body(),"dojoDndMove");
|
||
|
dojo.forEach(this.events,dojo.disconnect);
|
||
|
this.events=[];
|
||
|
this.avatar.destroy();
|
||
|
this.avatar=null;
|
||
|
this.source=this.target=null;
|
||
|
this.nodes=[];
|
||
|
},makeAvatar:function(){
|
||
|
return new dojo.dnd.Avatar(this);
|
||
|
},updateAvatar:function(){
|
||
|
this.avatar.update();
|
||
|
},onMouseMove:function(e){
|
||
|
var a=this.avatar;
|
||
|
if(a){
|
||
|
dojo.dnd.autoScrollNodes(e);
|
||
|
var s=a.node.style;
|
||
|
s.left=(e.pageX+this.OFFSET_X)+"px";
|
||
|
s.top=(e.pageY+this.OFFSET_Y)+"px";
|
||
|
var _8=Boolean(this.source.copyState(dojo.isCopyKey(e)));
|
||
|
if(this.copy!=_8){
|
||
|
this._setCopyStatus(_8);
|
||
|
}
|
||
|
}
|
||
|
},onMouseUp:function(e){
|
||
|
if(this.avatar){
|
||
|
if(this.target&&this.canDropFlag){
|
||
|
var _9=Boolean(this.source.copyState(dojo.isCopyKey(e))),_a=[this.source,this.nodes,_9,this.target,e];
|
||
|
dojo.publish("/dnd/drop/before",_a);
|
||
|
dojo.publish("/dnd/drop",_a);
|
||
|
}else{
|
||
|
dojo.publish("/dnd/cancel");
|
||
|
}
|
||
|
this.stopDrag();
|
||
|
}
|
||
|
},onKeyDown:function(e){
|
||
|
if(this.avatar){
|
||
|
switch(e.keyCode){
|
||
|
case dojo.keys.CTRL:
|
||
|
var _b=Boolean(this.source.copyState(true));
|
||
|
if(this.copy!=_b){
|
||
|
this._setCopyStatus(_b);
|
||
|
}
|
||
|
break;
|
||
|
case dojo.keys.ESCAPE:
|
||
|
dojo.publish("/dnd/cancel");
|
||
|
this.stopDrag();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
},onKeyUp:function(e){
|
||
|
if(this.avatar&&e.keyCode==dojo.keys.CTRL){
|
||
|
var _c=Boolean(this.source.copyState(false));
|
||
|
if(this.copy!=_c){
|
||
|
this._setCopyStatus(_c);
|
||
|
}
|
||
|
}
|
||
|
},_setCopyStatus:function(_d){
|
||
|
this.copy=_d;
|
||
|
this.source._markDndStatus(this.copy);
|
||
|
this.updateAvatar();
|
||
|
dojo.removeClass(dojo.body(),"dojoDnd"+(this.copy?"Move":"Copy"));
|
||
|
dojo.addClass(dojo.body(),"dojoDnd"+(this.copy?"Copy":"Move"));
|
||
|
}});
|
||
|
dojo.dnd._manager=null;
|
||
|
dojo.dnd.manager=function(){
|
||
|
if(!dojo.dnd._manager){
|
||
|
dojo.dnd._manager=new dojo.dnd.Manager();
|
||
|
}
|
||
|
return dojo.dnd._manager;
|
||
|
};
|
||
|
}
|