UNPKG

tui-grid

Version:

TOAST UI Grid : Powerful data grid control supported by TOAST UI

164 lines (137 loc) 4.05 kB
/** * @fileoverview Drag event emitter * @author NHN. FE Development Lab <dl_javascript@nhn.com> */ 'use strict'; var $ = require('jquery'); var _ = require('underscore'); var snippet = require('tui-code-snippet'); var GridEvent = require('./gridEvent'); /* Drag event emitter * @module event/dragEventEmitter * @ignore */ var DragEventEmitter = snippet.defineClass(/** @lends module:event/dragEventEmitter.prototype */{ init: function(options) { _.assign(this, { type: options.type, domEventBus: options.domEventBus, onDragMove: options.onDragMove, onDragEnd: options.onDragEnd, cursor: options.cursor, startData: null }); }, /** * Starts drag * @param {MouseEvent} ev - MouseEvent * @param {Object} data - start data (to be used in dragmove, dragend event) */ start: function(ev, data) { var gridEvent = new GridEvent(ev, data); this.domEventBus.trigger('dragstart:' + this.type, gridEvent); if (!gridEvent.isStopped()) { this._startDrag(ev.target, data); } }, /** * Starts drag * @param {HTMLElement} target - drag target * @param {Object} data - start data * @private */ _startDrag: function(target, data) { this.startData = data; this._attachDragEvents(); if (this.cursor) { $('body').css('cursor', this.cursor); } // for IE8 and under if (target.setCapture) { target.setCapture(); } }, /** * Ends drag * @private */ _endDrag: function() { this.startData = null; this._detachDragEvents(); if (this.cursor) { $('body').css('cursor', 'default'); } // for IE8 and under if (document.releaseCapture) { document.releaseCapture(); } }, /** * Event handler for 'mousemove' event on document * @param {MouseEvent} ev - MouseEvent * @private */ _onMouseMove: function(ev) { var gridEvent; // Prevent 'dragmove' from occuring when mouse button is not pressed. // This can happen when the alert dialog pops up from the the 'blur/mousedown' event handler. if (!ev.buttons) { this._endDrag(); return; } gridEvent = new GridEvent(ev, { startData: this.startData, pageX: ev.pageX, pageY: ev.pageY }); if (_.isFunction(this.onDragMove)) { this.onDragMove(gridEvent); } if (!gridEvent.isStopped()) { this.domEventBus.trigger('dragmove:' + this.type, gridEvent); } }, /** * Event handler for 'mouseup' event on document * @param {MouseEvent} ev - MouseEvent * @private */ _onMouseUp: function(ev) { var gridEvent = new GridEvent(ev, { startData: this.startData }); if (_.isFunction(this.onDragEnd)) { this.onDragEnd(gridEvent); } if (!gridEvent.isStopped()) { this.domEventBus.trigger('dragend:' + this.type, gridEvent); this._endDrag(); } }, /** * Event handler for 'selectstart' event on document * @param {MouseEvent} ev - MouseEvent * @private */ _onSelectStart: function(ev) { ev.preventDefault(); }, /** * Attach mouse event handlers for drag to document * @private */ _attachDragEvents: function() { $(document) .on('mousemove.grid', _.bind(this._onMouseMove, this)) .on('mouseup.grid', _.bind(this._onMouseUp, this)) .on('selectstart.grid', _.bind(this._onSelectStart, this)); }, /** * Detach mouse event handlers drag from document * @private */ _detachDragEvents: function() { $(document).off('.grid'); } }); module.exports = DragEventEmitter;