summaryrefslogtreecommitdiff
path: root/lib/dojo/dnd/Manager.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dojo/dnd/Manager.js')
-rw-r--r--lib/dojo/dnd/Manager.js322
1 files changed, 207 insertions, 115 deletions
diff --git a/lib/dojo/dnd/Manager.js b/lib/dojo/dnd/Manager.js
index c6f91aac3..70754f93f 100644
--- a/lib/dojo/dnd/Manager.js
+++ b/lib/dojo/dnd/Manager.js
@@ -5,124 +5,216 @@
*/
-if(!dojo._hasResource["dojo.dnd.Manager"]){
-dojo._hasResource["dojo.dnd.Manager"]=true;
+if(!dojo._hasResource["dojo.dnd.Manager"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+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;
+
+dojo.declare("dojo.dnd.Manager", null, {
+ // summary:
+ // the manager of DnD operations (usually a singleton)
+ constructor: function(){
+ this.avatar = null;
+ this.source = null;
+ this.nodes = [];
+ this.copy = true;
+ this.target = null;
+ this.canDropFlag = false;
+ this.events = [];
+ },
+
+ // avatar's offset from the mouse
+ OFFSET_X: 16,
+ OFFSET_Y: 16,
+
+ // methods
+ overSource: function(source){
+ // summary:
+ // called when a source detected a mouse-over condition
+ // source: Object
+ // the reporter
+ if(this.avatar){
+ this.target = (source && source.targetState != "Disabled") ? source : null;
+ this.canDropFlag = Boolean(this.target);
+ this.avatar.update();
+ }
+ dojo.publish("/dnd/source/over", [source]);
+ },
+ outSource: function(source){
+ // summary:
+ // called when a source detected a mouse-out condition
+ // source: Object
+ // the reporter
+ if(this.avatar){
+ if(this.target == source){
+ this.target = null;
+ this.canDropFlag = false;
+ this.avatar.update();
+ dojo.publish("/dnd/source/over", [null]);
+ }
+ }else{
+ dojo.publish("/dnd/source/over", [null]);
+ }
+ },
+ startDrag: function(source, nodes, copy){
+ // summary:
+ // called to initiate the DnD operation
+ // source: Object
+ // the source which provides items
+ // nodes: Array
+ // the list of transferred items
+ // copy: Boolean
+ // copy items, if true, move items otherwise
+ this.source = source;
+ this.nodes = nodes;
+ this.copy = Boolean(copy); // normalizing to true boolean
+ this.avatar = this.makeAvatar();
+ dojo.body().appendChild(this.avatar.node);
+ dojo.publish("/dnd/start", [source, nodes, 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"),
+ // cancel text selection and text dragging
+ dojo.connect(dojo.doc, "ondragstart", dojo.stopEvent),
+ dojo.connect(dojo.body(), "onselectstart", dojo.stopEvent)
+ ];
+ var c = "dojoDnd" + (copy ? "Copy" : "Move");
+ dojo.addClass(dojo.body(), c);
+ },
+ canDrop: function(flag){
+ // summary:
+ // called to notify if the current target can accept items
+ var canDropFlag = Boolean(this.target && flag);
+ if(this.canDropFlag != canDropFlag){
+ this.canDropFlag = canDropFlag;
+ this.avatar.update();
+ }
+ },
+ stopDrag: function(){
+ // summary:
+ // stop the DnD in progress
+ 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(){
+ // summary:
+ // makes the avatar; it is separate to be overwritten dynamically, if needed
+ return new dojo.dnd.Avatar(this);
+ },
+ updateAvatar: function(){
+ // summary:
+ // updates the avatar; it is separate to be overwritten dynamically, if needed
+ this.avatar.update();
+ },
+
+ // mouse event processors
+ onMouseMove: function(e){
+ // summary:
+ // event processor for onmousemove
+ // e: Event
+ // mouse event
+ var a = this.avatar;
+ if(a){
+ dojo.dnd.autoScrollNodes(e);
+ //dojo.dnd.autoScroll(e);
+ var s = a.node.style;
+ s.left = (e.pageX + this.OFFSET_X) + "px";
+ s.top = (e.pageY + this.OFFSET_Y) + "px";
+ var copy = Boolean(this.source.copyState(dojo.isCopyKey(e)));
+ if(this.copy != copy){
+ this._setCopyStatus(copy);
+ }
+ }
+ },
+ onMouseUp: function(e){
+ // summary:
+ // event processor for onmouseup
+ // e: Event
+ // mouse event
+ if(this.avatar){
+ if(this.target && this.canDropFlag){
+ var copy = Boolean(this.source.copyState(dojo.isCopyKey(e))),
+ params = [this.source, this.nodes, copy, this.target, e];
+ dojo.publish("/dnd/drop/before", params);
+ dojo.publish("/dnd/drop", params);
+ }else{
+ dojo.publish("/dnd/cancel");
+ }
+ this.stopDrag();
+ }
+ },
+
+ // keyboard event processors
+ onKeyDown: function(e){
+ // summary:
+ // event processor for onkeydown:
+ // watching for CTRL for copy/move status, watching for ESCAPE to cancel the drag
+ // e: Event
+ // keyboard event
+ if(this.avatar){
+ switch(e.keyCode){
+ case dojo.keys.CTRL:
+ var copy = Boolean(this.source.copyState(true));
+ if(this.copy != copy){
+ this._setCopyStatus(copy);
+ }
+ break;
+ case dojo.keys.ESCAPE:
+ dojo.publish("/dnd/cancel");
+ this.stopDrag();
+ break;
+ }
+ }
+ },
+ onKeyUp: function(e){
+ // summary:
+ // event processor for onkeyup, watching for CTRL for copy/move status
+ // e: Event
+ // keyboard event
+ if(this.avatar && e.keyCode == dojo.keys.CTRL){
+ var copy = Boolean(this.source.copyState(false));
+ if(this.copy != copy){
+ this._setCopyStatus(copy);
+ }
+ }
+ },
+
+ // utilities
+ _setCopyStatus: function(copy){
+ // summary:
+ // changes the copy status
+ // copy: Boolean
+ // the copy status
+ this.copy = copy;
+ 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:
+// The manager singleton variable. Can be overwritten if needed.
+dojo.dnd._manager = null;
+
+dojo.dnd.manager = function(){
+ // summary:
+ // Returns the current DnD manager. Creates one if it is not created yet.
+ if(!dojo.dnd._manager){
+ dojo.dnd._manager = new dojo.dnd.Manager();
+ }
+ return dojo.dnd._manager; // Object
};
+
}