summaryrefslogtreecommitdiff
path: root/lib/dojo/dnd/Manager.js.uncompressed.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dojo/dnd/Manager.js.uncompressed.js')
-rw-r--r--lib/dojo/dnd/Manager.js.uncompressed.js223
1 files changed, 223 insertions, 0 deletions
diff --git a/lib/dojo/dnd/Manager.js.uncompressed.js b/lib/dojo/dnd/Manager.js.uncompressed.js
new file mode 100644
index 000000000..4b6a12acd
--- /dev/null
+++ b/lib/dojo/dnd/Manager.js.uncompressed.js
@@ -0,0 +1,223 @@
+define("dojo/dnd/Manager", [
+ "../_base/array", "../_base/declare", "../_base/event", "../_base/lang", "../_base/window",
+ "../dom-class", "../Evented", "../has", "../keys", "../on", "../topic", "../touch",
+ "./common", "./autoscroll", "./Avatar"
+], function(array, declare, event, lang, win, domClass, Evented, has, keys, on, topic, touch,
+ dnd, autoscroll, Avatar){
+
+// module:
+// dojo/dnd/Manager
+
+var Manager = declare("dojo.dnd.Manager", [Evented], {
+ // 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: has("touch") ? 0 : 16,
+ OFFSET_Y: has("touch") ? -64 : 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();
+ }
+ topic.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();
+ topic.publish("/dnd/source/over", null);
+ }
+ }else{
+ topic.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
+
+ // Tell autoscroll that a drag is starting
+ autoscroll.autoScrollStart(win.doc);
+
+ this.source = source;
+ this.nodes = nodes;
+ this.copy = Boolean(copy); // normalizing to true boolean
+ this.avatar = this.makeAvatar();
+ win.body().appendChild(this.avatar.node);
+ topic.publish("/dnd/start", source, nodes, this.copy);
+ this.events = [
+ on(win.doc, touch.move, lang.hitch(this, "onMouseMove")),
+ on(win.doc, touch.release, lang.hitch(this, "onMouseUp")),
+ on(win.doc, "keydown", lang.hitch(this, "onKeyDown")),
+ on(win.doc, "keyup", lang.hitch(this, "onKeyUp")),
+ // cancel text selection and text dragging
+ on(win.doc, "dragstart", event.stop),
+ on(win.body(), "selectstart", event.stop)
+ ];
+ var c = "dojoDnd" + (copy ? "Copy" : "Move");
+ domClass.add(win.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
+ domClass.remove(win.body(), ["dojoDndCopy", "dojoDndMove"]);
+ array.forEach(this.events, function(handle){ handle.remove(); });
+ 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 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){
+ autoscroll.autoScrollNodes(e);
+ //autoscroll.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(dnd.getCopyKeyState(e)));
+ if(this.copy != copy){
+ this._setCopyStatus(copy);
+ }
+ }
+ if(has("touch")){
+ // Prevent page from scrolling so that user can drag instead.
+ e.preventDefault();
+ }
+ },
+ 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(dnd.getCopyKeyState(e)));
+ topic.publish("/dnd/drop/before", this.source, this.nodes, copy, this.target, e);
+ topic.publish("/dnd/drop", this.source, this.nodes, copy, this.target, e);
+ }else{
+ topic.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 keys.CTRL:
+ var copy = Boolean(this.source.copyState(true));
+ if(this.copy != copy){
+ this._setCopyStatus(copy);
+ }
+ break;
+ case keys.ESCAPE:
+ topic.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 == 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();
+ domClass.replace(win.body(),
+ "dojoDnd" + (this.copy ? "Copy" : "Move"),
+ "dojoDnd" + (this.copy ? "Move" : "Copy"));
+ }
+});
+
+// dnd._manager:
+// The manager singleton variable. Can be overwritten if needed.
+dnd._manager = null;
+
+Manager.manager = dnd.manager = function(){
+ // summary:
+ // Returns the current DnD manager. Creates one if it is not created yet.
+ if(!dnd._manager){
+ dnd._manager = new Manager();
+ }
+ return dnd._manager; // Object
+};
+
+return Manager;
+});