67 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
		
			
		
	
	
			67 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
| 
								 | 
							
								var Param = (function () {
							 | 
						||
| 
								 | 
							
								    function Param(target, e) {
							 | 
						||
| 
								 | 
							
								        this.target = target;
							 | 
						||
| 
								 | 
							
								        this.topTarget = e && e.topTarget;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return Param;
							 | 
						||
| 
								 | 
							
								}());
							 | 
						||
| 
								 | 
							
								var Draggable = (function () {
							 | 
						||
| 
								 | 
							
								    function Draggable(handler) {
							 | 
						||
| 
								 | 
							
								        this.handler = handler;
							 | 
						||
| 
								 | 
							
								        handler.on('mousedown', this._dragStart, this);
							 | 
						||
| 
								 | 
							
								        handler.on('mousemove', this._drag, this);
							 | 
						||
| 
								 | 
							
								        handler.on('mouseup', this._dragEnd, this);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    Draggable.prototype._dragStart = function (e) {
							 | 
						||
| 
								 | 
							
								        var draggingTarget = e.target;
							 | 
						||
| 
								 | 
							
								        while (draggingTarget && !draggingTarget.draggable) {
							 | 
						||
| 
								 | 
							
								            draggingTarget = draggingTarget.parent || draggingTarget.__hostTarget;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (draggingTarget) {
							 | 
						||
| 
								 | 
							
								            this._draggingTarget = draggingTarget;
							 | 
						||
| 
								 | 
							
								            draggingTarget.dragging = true;
							 | 
						||
| 
								 | 
							
								            this._x = e.offsetX;
							 | 
						||
| 
								 | 
							
								            this._y = e.offsetY;
							 | 
						||
| 
								 | 
							
								            this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragstart', e.event);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    Draggable.prototype._drag = function (e) {
							 | 
						||
| 
								 | 
							
								        var draggingTarget = this._draggingTarget;
							 | 
						||
| 
								 | 
							
								        if (draggingTarget) {
							 | 
						||
| 
								 | 
							
								            var x = e.offsetX;
							 | 
						||
| 
								 | 
							
								            var y = e.offsetY;
							 | 
						||
| 
								 | 
							
								            var dx = x - this._x;
							 | 
						||
| 
								 | 
							
								            var dy = y - this._y;
							 | 
						||
| 
								 | 
							
								            this._x = x;
							 | 
						||
| 
								 | 
							
								            this._y = y;
							 | 
						||
| 
								 | 
							
								            draggingTarget.drift(dx, dy, e);
							 | 
						||
| 
								 | 
							
								            this.handler.dispatchToElement(new Param(draggingTarget, e), 'drag', e.event);
							 | 
						||
| 
								 | 
							
								            var dropTarget = this.handler.findHover(x, y, draggingTarget).target;
							 | 
						||
| 
								 | 
							
								            var lastDropTarget = this._dropTarget;
							 | 
						||
| 
								 | 
							
								            this._dropTarget = dropTarget;
							 | 
						||
| 
								 | 
							
								            if (draggingTarget !== dropTarget) {
							 | 
						||
| 
								 | 
							
								                if (lastDropTarget && dropTarget !== lastDropTarget) {
							 | 
						||
| 
								 | 
							
								                    this.handler.dispatchToElement(new Param(lastDropTarget, e), 'dragleave', e.event);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                if (dropTarget && dropTarget !== lastDropTarget) {
							 | 
						||
| 
								 | 
							
								                    this.handler.dispatchToElement(new Param(dropTarget, e), 'dragenter', e.event);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    Draggable.prototype._dragEnd = function (e) {
							 | 
						||
| 
								 | 
							
								        var draggingTarget = this._draggingTarget;
							 | 
						||
| 
								 | 
							
								        if (draggingTarget) {
							 | 
						||
| 
								 | 
							
								            draggingTarget.dragging = false;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragend', e.event);
							 | 
						||
| 
								 | 
							
								        if (this._dropTarget) {
							 | 
						||
| 
								 | 
							
								            this.handler.dispatchToElement(new Param(this._dropTarget, e), 'drop', e.event);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        this._draggingTarget = null;
							 | 
						||
| 
								 | 
							
								        this._dropTarget = null;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    return Draggable;
							 | 
						||
| 
								 | 
							
								}());
							 | 
						||
| 
								 | 
							
								export default Draggable;
							 |