98 lines
3.4 KiB
JavaScript
98 lines
3.4 KiB
JavaScript
|
dojo.provide("dojox.gfx.Moveable");
|
||
|
|
||
|
dojo.require("dojox.gfx.Mover");
|
||
|
|
||
|
dojo.declare("dojox.gfx.Moveable", null, {
|
||
|
constructor: function(shape, params){
|
||
|
// summary: an object, which makes a shape moveable
|
||
|
// shape: dojox.gfx.Shape: a shape object to be moved
|
||
|
// params: Object: an optional object with additional parameters;
|
||
|
// following parameters are recognized:
|
||
|
// delay: Number: delay move by this number of pixels
|
||
|
// mover: Object: a constructor of custom Mover
|
||
|
this.shape = shape;
|
||
|
this.delay = (params && params.delay > 0) ? params.delay : 0;
|
||
|
this.mover = (params && params.mover) ? params.mover : dojox.gfx.Mover;
|
||
|
this.events = [
|
||
|
this.shape.connect("onmousedown", this, "onMouseDown")
|
||
|
// cancel text selection and text dragging
|
||
|
//, dojo.connect(this.handle, "ondragstart", dojo, "stopEvent")
|
||
|
//, dojo.connect(this.handle, "onselectstart", dojo, "stopEvent")
|
||
|
];
|
||
|
},
|
||
|
|
||
|
// methods
|
||
|
destroy: function(){
|
||
|
// summary: stops watching for possible move, deletes all references, so the object can be garbage-collected
|
||
|
dojo.forEach(this.events, this.shape.disconnect, this.shape);
|
||
|
this.events = this.shape = null;
|
||
|
},
|
||
|
|
||
|
// mouse event processors
|
||
|
onMouseDown: function(e){
|
||
|
// summary: event processor for onmousedown, creates a Mover for the shape
|
||
|
// e: Event: mouse event
|
||
|
if(this.delay){
|
||
|
this.events.push(this.shape.connect("onmousemove", this, "onMouseMove"));
|
||
|
this.events.push(this.shape.connect("onmouseup", this, "onMouseUp"));
|
||
|
this._lastX = e.clientX;
|
||
|
this._lastY = e.clientY;
|
||
|
}else{
|
||
|
new this.mover(this.shape, e, this);
|
||
|
}
|
||
|
dojo.stopEvent(e);
|
||
|
},
|
||
|
onMouseMove: function(e){
|
||
|
// summary: event processor for onmousemove, used only for delayed drags
|
||
|
// e: Event: mouse event
|
||
|
if(Math.abs(e.clientX - this._lastX) > this.delay || Math.abs(e.clientY - this._lastY) > this.delay){
|
||
|
this.onMouseUp(e);
|
||
|
new this.mover(this.shape, e, this);
|
||
|
}
|
||
|
dojo.stopEvent(e);
|
||
|
},
|
||
|
onMouseUp: function(e){
|
||
|
// summary: event processor for onmouseup, used only for delayed delayed drags
|
||
|
// e: Event: mouse event
|
||
|
this.shape.disconnect(this.events.pop());
|
||
|
this.shape.disconnect(this.events.pop());
|
||
|
},
|
||
|
|
||
|
// local events
|
||
|
onMoveStart: function(/* dojox.gfx.Mover */ mover){
|
||
|
// summary: called before every move operation
|
||
|
dojo.publish("/gfx/move/start", [mover]);
|
||
|
dojo.addClass(dojo.body(), "dojoMove");
|
||
|
},
|
||
|
onMoveStop: function(/* dojox.gfx.Mover */ mover){
|
||
|
// summary: called after every move operation
|
||
|
dojo.publish("/gfx/move/stop", [mover]);
|
||
|
dojo.removeClass(dojo.body(), "dojoMove");
|
||
|
},
|
||
|
onFirstMove: function(/* dojox.gfx.Mover */ mover){
|
||
|
// summary: called during the very first move notification,
|
||
|
// can be used to initialize coordinates, can be overwritten.
|
||
|
|
||
|
// default implementation does nothing
|
||
|
},
|
||
|
onMove: function(/* dojox.gfx.Mover */ mover, /* Object */ shift){
|
||
|
// summary: called during every move notification,
|
||
|
// should actually move the node, can be overwritten.
|
||
|
this.onMoving(mover, shift);
|
||
|
this.shape.applyLeftTransform(shift);
|
||
|
this.onMoved(mover, shift);
|
||
|
},
|
||
|
onMoving: function(/* dojox.gfx.Mover */ mover, /* Object */ shift){
|
||
|
// summary: called before every incremental move,
|
||
|
// can be overwritten.
|
||
|
|
||
|
// default implementation does nothing
|
||
|
},
|
||
|
onMoved: function(/* dojox.gfx.Mover */ mover, /* Object */ shift){
|
||
|
// summary: called after every incremental move,
|
||
|
// can be overwritten.
|
||
|
|
||
|
// default implementation does nothing
|
||
|
}
|
||
|
});
|