diff options
author | Andrew Dolgov <[email protected]> | 2011-03-04 19:02:28 +0300 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2011-03-04 19:02:59 +0300 |
commit | a089699c8915636ba4f158d77dba9b012bc93208 (patch) | |
tree | b2d7d051f1f55d44a6be07d3ee137e5a7ccfcefb /lib/dojo/dnd/Manager.js | |
parent | cfad9259a6feacfa8194b1312770ae6db1ecce50 (diff) |
build custom layer of Dojo to speed up loading of tt-rss (refs #293)
Diffstat (limited to 'lib/dojo/dnd/Manager.js')
-rw-r--r-- | lib/dojo/dnd/Manager.js | 322 |
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 }; + } |