Subversion Repositories Applications.papyrus

Rev

Blame | Last modification | View Log | RSS feed

if(!dojo._hasResource["dojo.dnd.Mover"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo._hasResource["dojo.dnd.Mover"] = true;
dojo.provide("dojo.dnd.Mover");

dojo.require("dojo.dnd.common");
dojo.require("dojo.dnd.autoscroll");

dojo.declare("dojo.dnd.Mover", null, {
        constructor: function(node, e, host){
                // summary: an object, which makes a node follow the mouse, 
                //      used as a default mover, and as a base class for custom movers
                // node: Node: a node (or node's id) to be moved
                // e: Event: a mouse event, which started the move;
                //      only pageX and pageY properties are used
                // host: Object?: object which implements the functionality of the move,
                //       and defines proper events (onMoveStart and onMoveStop)
                this.node = dojo.byId(node);
                this.marginBox = {l: e.pageX, t: e.pageY};
                this.mouseButton = e.button;
                var h = this.host = host, d = node.ownerDocument, 
                        firstEvent = dojo.connect(d, "onmousemove", this, "onFirstMove");
                this.events = [
                        dojo.connect(d, "onmousemove", this, "onMouseMove"),
                        dojo.connect(d, "onmouseup",   this, "onMouseUp"),
                        // cancel text selection and text dragging
                        dojo.connect(d, "ondragstart",   dojo, "stopEvent"),
                        dojo.connect(d, "onselectstart", dojo, "stopEvent"),
                        firstEvent
                ];
                // notify that the move has started
                if(h && h.onMoveStart){
                        h.onMoveStart(this);
                }
        },
        // mouse event processors
        onMouseMove: function(e){
                // summary: event processor for onmousemove
                // e: Event: mouse event
                dojo.dnd.autoScroll(e);
                var m = this.marginBox;
                this.host.onMove(this, {l: m.l + e.pageX, t: m.t + e.pageY});
        },
        onMouseUp: function(e){
                if(this.mouseButton == e.button){
                        this.destroy();
                }
        },
        // utilities
        onFirstMove: function(){
                // summary: makes the node absolute; it is meant to be called only once
                this.node.style.position = "absolute";  // enforcing the absolute mode
                var m = dojo.marginBox(this.node);
                m.l -= this.marginBox.l;
                m.t -= this.marginBox.t;
                this.marginBox = m;
                this.host.onFirstMove(this);
                dojo.disconnect(this.events.pop());
        },
        destroy: function(){
                // summary: stops the move, deletes all references, so the object can be garbage-collected
                dojo.forEach(this.events, dojo.disconnect);
                // undo global settings
                var h = this.host;
                if(h && h.onMoveStop){
                        h.onMoveStop(this);
                }
                // destroy objects
                this.events = this.node = null;
        }
});

}