|
|
- ;(function(undefined) {
- 'use strict';
-
- if (typeof sigma === 'undefined')
- throw 'sigma is not declared';
-
- // Initialize packages:
- sigma.utils.pkg('sigma.captors');
-
- /**
- * The user inputs default captor. It deals with mouse events, keyboards
- * events and touch events.
- *
- * @param {DOMElement} target The DOM element where the listeners will be
- * bound.
- * @param {camera} camera The camera related to the target.
- * @param {configurable} settings The settings function.
- * @return {sigma.captor} The fresh new captor instance.
- */
- sigma.captors.mouse = function(target, camera, settings) {
- var _self = this,
- _target = target,
- _camera = camera,
- _settings = settings,
-
- // CAMERA MANAGEMENT:
- // ******************
- // The camera position when the user starts dragging:
- _startCameraX,
- _startCameraY,
- _startCameraAngle,
-
- // The latest stage position:
- _lastCameraX,
- _lastCameraY,
- _lastCameraAngle,
- _lastCameraRatio,
-
- // MOUSE MANAGEMENT:
- // *****************
- // The mouse position when the user starts dragging:
- _startMouseX,
- _startMouseY,
-
- _isMouseDown,
- _isMoving,
- _hasDragged,
- _downStartTime,
- _movingTimeoutId;
-
- sigma.classes.dispatcher.extend(this);
-
- sigma.utils.doubleClick(_target, 'click', _doubleClickHandler);
- _target.addEventListener('DOMMouseScroll', _wheelHandler, false);
- _target.addEventListener('mousewheel', _wheelHandler, false);
- _target.addEventListener('mousemove', _moveHandler, false);
- _target.addEventListener('mousedown', _downHandler, false);
- _target.addEventListener('click', _clickHandler, false);
- _target.addEventListener('mouseout', _outHandler, false);
- document.addEventListener('mouseup', _upHandler, false);
-
-
-
-
- /**
- * This method unbinds every handlers that makes the captor work.
- */
- this.kill = function() {
- sigma.utils.unbindDoubleClick(_target, 'click');
- _target.removeEventListener('DOMMouseScroll', _wheelHandler);
- _target.removeEventListener('mousewheel', _wheelHandler);
- _target.removeEventListener('mousemove', _moveHandler);
- _target.removeEventListener('mousedown', _downHandler);
- _target.removeEventListener('click', _clickHandler);
- _target.removeEventListener('mouseout', _outHandler);
- document.removeEventListener('mouseup', _upHandler);
- };
-
-
-
-
- // MOUSE EVENTS:
- // *************
-
- /**
- * The handler listening to the 'move' mouse event. It will effectively
- * drag the graph.
- *
- * @param {event} e A mouse event.
- */
- function _moveHandler(e) {
- var x,
- y,
- pos;
-
- // Dispatch event:
- if (_settings('mouseEnabled')) {
- _self.dispatchEvent('mousemove',
- sigma.utils.mouseCoords(e));
-
- if (_isMouseDown) {
- _isMoving = true;
- _hasDragged = true;
-
- if (_movingTimeoutId)
- clearTimeout(_movingTimeoutId);
-
- _movingTimeoutId = setTimeout(function() {
- _isMoving = false;
- }, _settings('dragTimeout'));
-
- sigma.misc.animation.killAll(_camera);
-
- _camera.isMoving = true;
- pos = _camera.cameraPosition(
- sigma.utils.getX(e) - _startMouseX,
- sigma.utils.getY(e) - _startMouseY,
- true
- );
-
- x = _startCameraX - pos.x;
- y = _startCameraY - pos.y;
-
- if (x !== _camera.x || y !== _camera.y) {
- _lastCameraX = _camera.x;
- _lastCameraY = _camera.y;
-
- _camera.goTo({
- x: x,
- y: y
- });
- }
-
- if (e.preventDefault)
- e.preventDefault();
- else
- e.returnValue = false;
-
- e.stopPropagation();
- return false;
- }
- }
- }
-
- /**
- * The handler listening to the 'up' mouse event. It will stop dragging the
- * graph.
- *
- * @param {event} e A mouse event.
- */
- function _upHandler(e) {
- if (_settings('mouseEnabled') && _isMouseDown) {
- _isMouseDown = false;
- if (_movingTimeoutId)
- clearTimeout(_movingTimeoutId);
-
- _camera.isMoving = false;
-
- var x = sigma.utils.getX(e),
- y = sigma.utils.getY(e);
-
- if (_isMoving) {
- sigma.misc.animation.killAll(_camera);
- sigma.misc.animation.camera(
- _camera,
- {
- x: _camera.x +
- _settings('mouseInertiaRatio') * (_camera.x - _lastCameraX),
- y: _camera.y +
- _settings('mouseInertiaRatio') * (_camera.y - _lastCameraY)
- },
- {
- easing: 'quadraticOut',
- duration: _settings('mouseInertiaDuration')
- }
- );
- } else if (
- _startMouseX !== x ||
- _startMouseY !== y
- )
- _camera.goTo({
- x: _camera.x,
- y: _camera.y
- });
-
- _self.dispatchEvent('mouseup',
- sigma.utils.mouseCoords(e));
-
- // Update _isMoving flag:
- _isMoving = false;
- }
- }
-
- /**
- * The handler listening to the 'down' mouse event. It will start observing
- * the mouse position for dragging the graph.
- *
- * @param {event} e A mouse event.
- */
- function _downHandler(e) {
- if (_settings('mouseEnabled')) {
- _startCameraX = _camera.x;
- _startCameraY = _camera.y;
-
- _lastCameraX = _camera.x;
- _lastCameraY = _camera.y;
-
- _startMouseX = sigma.utils.getX(e);
- _startMouseY = sigma.utils.getY(e);
-
- _hasDragged = false;
- _downStartTime = (new Date()).getTime();
-
- switch (e.which) {
- case 2:
- // Middle mouse button pressed
- // Do nothing.
- break;
- case 3:
- // Right mouse button pressed
- _self.dispatchEvent('rightclick',
- sigma.utils.mouseCoords(e, _startMouseX, _startMouseY));
- break;
- // case 1:
- default:
- // Left mouse button pressed
- _isMouseDown = true;
-
- _self.dispatchEvent('mousedown',
- sigma.utils.mouseCoords(e, _startMouseX, _startMouseY));
- }
- }
- }
-
- /**
- * The handler listening to the 'out' mouse event. It will just redispatch
- * the event.
- *
- * @param {event} e A mouse event.
- */
- function _outHandler(e) {
- if (_settings('mouseEnabled'))
- _self.dispatchEvent('mouseout');
- }
-
- /**
- * The handler listening to the 'click' mouse event. It will redispatch the
- * click event, but with normalized X and Y coordinates.
- *
- * @param {event} e A mouse event.
- */
- function _clickHandler(e) {
- if (_settings('mouseEnabled')) {
- var event = sigma.utils.mouseCoords(e);
- event.isDragging =
- (((new Date()).getTime() - _downStartTime) > 100) && _hasDragged;
- _self.dispatchEvent('click', event);
- }
-
- if (e.preventDefault)
- e.preventDefault();
- else
- e.returnValue = false;
-
- e.stopPropagation();
- return false;
- }
-
- /**
- * The handler listening to the double click custom event. It will
- * basically zoom into the graph.
- *
- * @param {event} e A mouse event.
- */
- function _doubleClickHandler(e) {
- var pos,
- ratio,
- animation;
-
- if (_settings('mouseEnabled')) {
- ratio = 1 / _settings('doubleClickZoomingRatio');
-
- _self.dispatchEvent('doubleclick',
- sigma.utils.mouseCoords(e, _startMouseX, _startMouseY));
-
- if (_settings('doubleClickEnabled')) {
- pos = _camera.cameraPosition(
- sigma.utils.getX(e) - sigma.utils.getCenter(e).x,
- sigma.utils.getY(e) - sigma.utils.getCenter(e).y,
- true
- );
-
- animation = {
- duration: _settings('doubleClickZoomDuration')
- };
-
- sigma.utils.zoomTo(_camera, pos.x, pos.y, ratio, animation);
- }
-
- if (e.preventDefault)
- e.preventDefault();
- else
- e.returnValue = false;
-
- e.stopPropagation();
- return false;
- }
- }
-
- /**
- * The handler listening to the 'wheel' mouse event. It will basically zoom
- * in or not into the graph.
- *
- * @param {event} e A mouse event.
- */
- function _wheelHandler(e) {
- var pos,
- ratio,
- animation,
- wheelDelta = sigma.utils.getDelta(e);
-
- if (_settings('mouseEnabled') && _settings('mouseWheelEnabled') && wheelDelta !== 0) {
- ratio = wheelDelta > 0 ?
- 1 / _settings('zoomingRatio') :
- _settings('zoomingRatio');
-
- pos = _camera.cameraPosition(
- sigma.utils.getX(e) - sigma.utils.getCenter(e).x,
- sigma.utils.getY(e) - sigma.utils.getCenter(e).y,
- true
- );
-
- animation = {
- duration: _settings('mouseZoomDuration')
- };
-
- sigma.utils.zoomTo(_camera, pos.x, pos.y, ratio, animation);
-
- if (e.preventDefault)
- e.preventDefault();
- else
- e.returnValue = false;
-
- e.stopPropagation();
- return false;
- }
- }
- };
- }).call(this);
|