116 lines
3.1 KiB
JavaScript
116 lines
3.1 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var _ = require('../../lib/helper');
|
||
|
var instances = require('../instances');
|
||
|
var updateGeometry = require('../update-geometry');
|
||
|
var updateScroll = require('../update-scroll');
|
||
|
|
||
|
function bindSelectionHandler(element, i) {
|
||
|
function getRangeNode() {
|
||
|
var selection = window.getSelection ? window.getSelection() :
|
||
|
document.getSelection ? document.getSelection() : '';
|
||
|
if (selection.toString().length === 0) {
|
||
|
return null;
|
||
|
} else {
|
||
|
return selection.getRangeAt(0).commonAncestorContainer;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var scrollingLoop = null;
|
||
|
var scrollDiff = {top: 0, left: 0};
|
||
|
function startScrolling() {
|
||
|
if (!scrollingLoop) {
|
||
|
scrollingLoop = setInterval(function () {
|
||
|
if (!instances.get(element)) {
|
||
|
clearInterval(scrollingLoop);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
updateScroll(element, 'top', element.scrollTop + scrollDiff.top);
|
||
|
updateScroll(element, 'left', element.scrollLeft + scrollDiff.left);
|
||
|
updateGeometry(element);
|
||
|
}, 50); // every .1 sec
|
||
|
}
|
||
|
}
|
||
|
function stopScrolling() {
|
||
|
if (scrollingLoop) {
|
||
|
clearInterval(scrollingLoop);
|
||
|
scrollingLoop = null;
|
||
|
}
|
||
|
_.stopScrolling(element);
|
||
|
}
|
||
|
|
||
|
var isSelected = false;
|
||
|
i.event.bind(i.ownerDocument, 'selectionchange', function () {
|
||
|
if (element.contains(getRangeNode())) {
|
||
|
isSelected = true;
|
||
|
} else {
|
||
|
isSelected = false;
|
||
|
stopScrolling();
|
||
|
}
|
||
|
});
|
||
|
i.event.bind(window, 'mouseup', function () {
|
||
|
if (isSelected) {
|
||
|
isSelected = false;
|
||
|
stopScrolling();
|
||
|
}
|
||
|
});
|
||
|
i.event.bind(window, 'keyup', function () {
|
||
|
if (isSelected) {
|
||
|
isSelected = false;
|
||
|
stopScrolling();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
i.event.bind(window, 'mousemove', function (e) {
|
||
|
if (isSelected) {
|
||
|
var mousePosition = {x: e.pageX, y: e.pageY};
|
||
|
var containerGeometry = {
|
||
|
left: element.offsetLeft,
|
||
|
right: element.offsetLeft + element.offsetWidth,
|
||
|
top: element.offsetTop,
|
||
|
bottom: element.offsetTop + element.offsetHeight
|
||
|
};
|
||
|
|
||
|
if (mousePosition.x < containerGeometry.left + 3) {
|
||
|
scrollDiff.left = -5;
|
||
|
_.startScrolling(element, 'x');
|
||
|
} else if (mousePosition.x > containerGeometry.right - 3) {
|
||
|
scrollDiff.left = 5;
|
||
|
_.startScrolling(element, 'x');
|
||
|
} else {
|
||
|
scrollDiff.left = 0;
|
||
|
}
|
||
|
|
||
|
if (mousePosition.y < containerGeometry.top + 3) {
|
||
|
if (containerGeometry.top + 3 - mousePosition.y < 5) {
|
||
|
scrollDiff.top = -5;
|
||
|
} else {
|
||
|
scrollDiff.top = -20;
|
||
|
}
|
||
|
_.startScrolling(element, 'y');
|
||
|
} else if (mousePosition.y > containerGeometry.bottom - 3) {
|
||
|
if (mousePosition.y - containerGeometry.bottom + 3 < 5) {
|
||
|
scrollDiff.top = 5;
|
||
|
} else {
|
||
|
scrollDiff.top = 20;
|
||
|
}
|
||
|
_.startScrolling(element, 'y');
|
||
|
} else {
|
||
|
scrollDiff.top = 0;
|
||
|
}
|
||
|
|
||
|
if (scrollDiff.top === 0 && scrollDiff.left === 0) {
|
||
|
stopScrolling();
|
||
|
} else {
|
||
|
startScrolling();
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
module.exports = function (element) {
|
||
|
var i = instances.get(element);
|
||
|
bindSelectionHandler(element, i);
|
||
|
};
|