123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- import Hooks from './../../pluginHooks';
- import EventManager from './../../eventManager';
- import { registerPlugin } from './../../plugins';
- /**
- * @description
- * Plugin used to scroll Handsontable by selecting a cell and dragging outside of the visible viewport.
- *
- * @private
- * @class DragToScroll
- * @plugin DragToScroll
- */
- function DragToScroll() {
- this.boundaries = null;
- this.callback = null;
- }
- /**
- * @param boundaries {Object} compatible with getBoundingClientRect
- */
- DragToScroll.prototype.setBoundaries = function (boundaries) {
- this.boundaries = boundaries;
- };
- /**
- * @param callback {Function}
- */
- DragToScroll.prototype.setCallback = function (callback) {
- this.callback = callback;
- };
- /**
- * Check if mouse position (x, y) is outside of the viewport
- * @param x
- * @param y
- */
- DragToScroll.prototype.check = function (x, y) {
- var diffX = 0;
- var diffY = 0;
- if (y < this.boundaries.top) {
- // y is less than top
- diffY = y - this.boundaries.top;
- } else if (y > this.boundaries.bottom) {
- // y is more than bottom
- diffY = y - this.boundaries.bottom;
- }
- if (x < this.boundaries.left) {
- // x is less than left
- diffX = x - this.boundaries.left;
- } else if (x > this.boundaries.right) {
- // x is more than right
- diffX = x - this.boundaries.right;
- }
- this.callback(diffX, diffY);
- };
- var dragToScroll;
- var instance;
- var setupListening = function setupListening(instance) {
- instance.dragToScrollListening = false;
- var scrollHandler = instance.view.wt.wtTable.holder; // native scroll
- dragToScroll = new DragToScroll();
- if (scrollHandler === window) {
- // not much we can do currently
- return;
- }
- dragToScroll.setBoundaries(scrollHandler.getBoundingClientRect());
- dragToScroll.setCallback(function (scrollX, scrollY) {
- if (scrollX < 0) {
- scrollHandler.scrollLeft -= 50;
- } else if (scrollX > 0) {
- scrollHandler.scrollLeft += 50;
- }
- if (scrollY < 0) {
- scrollHandler.scrollTop -= 20;
- } else if (scrollY > 0) {
- scrollHandler.scrollTop += 20;
- }
- });
- instance.dragToScrollListening = true;
- };
- Hooks.getSingleton().add('afterInit', function () {
- var instance = this;
- var eventManager = new EventManager(this);
- eventManager.addEventListener(document, 'mouseup', function () {
- instance.dragToScrollListening = false;
- });
- eventManager.addEventListener(document, 'mousemove', function (event) {
- if (instance.dragToScrollListening) {
- dragToScroll.check(event.clientX, event.clientY);
- }
- });
- });
- Hooks.getSingleton().add('afterDestroy', function () {
- new EventManager(this).clear();
- });
- Hooks.getSingleton().add('afterOnCellMouseDown', function () {
- setupListening(this);
- });
- Hooks.getSingleton().add('afterOnCellCornerMouseDown', function () {
- setupListening(this);
- });
- export default DragToScroll;
|