Files
openlayers/src/ol/handler/Drag.js

130 lines
3.8 KiB
JavaScript

/**
* @fileoverview Drag Handler.
*
* Provides a class for listening to drag sequences on a DOM element and
* dispatching dragstart, drag and dragend events to a map object.
*
* Calls handleDragEvent on the map if default is not prevented by
* listeners.
*/
goog.provide('ol.handler.Drag');
goog.require('ol.handler.MapHandler');
goog.require('ol.events.MapEvent');
goog.require('ol.events.MapEventType');
goog.require('goog.events');
goog.require('goog.events.Event');
goog.require('goog.events.EventType');
goog.require('goog.fx.Dragger');
/**
* @constructor
* @extends {ol.handler.MapHandler}
* @param {ol.Map} map The map instance.
* @param {ol.handler.states} states An object for the handlers to share
* states.
*/
ol.handler.Drag = function(map, states) {
goog.base(this, map, states);
/**
* @type {goog.fx.Dragger}
*/
this.dragger_ = new goog.fx.Dragger(this.element_);
var dragger = this.dragger_;
dragger.defaultAction = function() {};
/**
* @type {number}
*/
this.prevX_ = 0;
/**
* @type {number}
**/
this.prevY_ = 0;
goog.events.listen(dragger, goog.fx.Dragger.EventType.START,
this.handleDragStart, false, this);
goog.events.listen(dragger, goog.fx.Dragger.EventType.DRAG,
this.handleDrag, false, this);
goog.events.listen(dragger, goog.fx.Dragger.EventType.END,
this.handleDragEnd, false, this);
goog.events.listen(dragger, goog.fx.Dragger.EventType.EARLY_CANCEL,
this.handleDragEarlyCancel, false, this);
};
goog.inherits(ol.handler.Drag, ol.handler.MapHandler);
/**
* @inheritDoc
*/
ol.handler.Drag.prototype.disposeInternal = function() {
goog.base(this, 'disposeInternal');
goog.dispose(this.dragger_);
goog.events.unlisten(this.element_,
[goog.events.EventType.TOUCHMOVE,
goog.events.EventType.MOUSEMOVE],
goog.events.Event.preventDefault, false, this);
};
/**
* @param {goog.fx.DragEvent} e
*/
ol.handler.Drag.prototype.handleDragStart = function(e) {
this.states_.dragged = false;
this.prevX_ = e.clientX;
this.prevY_ = e.clientY;
var newE = new ol.events.MapEvent(ol.events.MapEventType.DRAGSTART, e);
goog.events.dispatchEvent(this.map_, newE);
// this is to prevent page scrolling
goog.events.listen(this.element_,
[goog.events.EventType.TOUCHMOVE,
goog.events.EventType.MOUSEMOVE],
goog.events.Event.preventDefault, false, this);
};
/**
* @param {goog.fx.DragEvent} e
*/
ol.handler.Drag.prototype.handleDrag = function(e) {
this.states_.dragged = true;
var newE = new ol.events.MapEvent(ol.events.MapEventType.DRAG, e);
newE.deltaX = e.clientX - this.prevX_;
newE.deltaY = e.clientY - this.prevY_;
this.prevX_ = e.clientX;
this.prevY_ = e.clientY;
var rt = goog.events.dispatchEvent(this.map_, newE);
if (rt) {
this.map_.handleDragEvent(newE);
}
};
/**
* @param {goog.fx.DragEvent} e
*/
ol.handler.Drag.prototype.handleDragEnd = function(e) {
var newE = new ol.events.MapEvent(ol.events.MapEventType.DRAGEND, e);
goog.events.dispatchEvent(this.map_, newE);
goog.events.unlisten(this.element_,
[goog.events.EventType.TOUCHMOVE,
goog.events.EventType.MOUSEMOVE],
goog.events.Event.preventDefault, false, this);
};
/**
* @param {goog.fx.DragEvent} e
*/
ol.handler.Drag.prototype.handleDragEarlyCancel = function(e) {
goog.events.unlisten(this.element_,
[goog.events.EventType.TOUCHMOVE,
goog.events.EventType.MOUSEMOVE],
goog.events.Event.preventDefault, false, this);
};