From 1e8bbb0ae487bbdb84227bce2512c87ffbd1162d Mon Sep 17 00:00:00 2001 From: tsauerwein Date: Fri, 19 Feb 2016 16:03:35 +0100 Subject: [PATCH] Add `target` property to drag&drop interaction --- externs/olx.js | 11 ++++++++++- src/ol/interaction/draganddropinteraction.js | 8 +++++++- .../interaction/draganddropinteraction.test.js | 16 ++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/externs/olx.js b/externs/olx.js index c0a08ebc42..4253a2082c 100644 --- a/externs/olx.js +++ b/externs/olx.js @@ -2372,7 +2372,8 @@ olx.interaction.DoubleClickZoomOptions.prototype.delta; /** * @typedef {{formatConstructors: (Array.|undefined), - * projection: ol.proj.ProjectionLike}} + * projection: ol.proj.ProjectionLike, + * target: (Element|undefined)}} * @api */ olx.interaction.DragAndDropOptions; @@ -2394,6 +2395,14 @@ olx.interaction.DragAndDropOptions.prototype.formatConstructors; olx.interaction.DragAndDropOptions.prototype.projection; +/** + * The element that is used as the drop target, default is the viewport element. + * @type {Element|undefined} + * @api + */ +olx.interaction.DragAndDropOptions.prototype.target; + + /** * @typedef {{className: (string|undefined), * condition: (ol.events.ConditionType|undefined), diff --git a/src/ol/interaction/draganddropinteraction.js b/src/ol/interaction/draganddropinteraction.js index 3105890983..0ae6c663d5 100644 --- a/src/ol/interaction/draganddropinteraction.js +++ b/src/ol/interaction/draganddropinteraction.js @@ -50,6 +50,12 @@ ol.interaction.DragAndDrop = function(opt_options) { */ this.dropListenKeys_ = null; + /** + * @private + * @type {Element} + */ + this.target = options.target ? options.target : null; + }; goog.inherits(ol.interaction.DragAndDrop, ol.interaction.Interaction); @@ -141,7 +147,7 @@ ol.interaction.DragAndDrop.prototype.setMap = function(map) { } goog.base(this, 'setMap', map); if (map) { - var dropArea = map.getViewport(); + var dropArea = this.target ? this.target : map.getViewport(); this.dropListenKeys_ = [ ol.events.listen(dropArea, ol.events.EventType.DROP, ol.interaction.DragAndDrop.handleDrop_, this), diff --git a/test/spec/ol/interaction/draganddropinteraction.test.js b/test/spec/ol/interaction/draganddropinteraction.test.js index b6d48628b4..16b353e941 100644 --- a/test/spec/ol/interaction/draganddropinteraction.test.js +++ b/test/spec/ol/interaction/draganddropinteraction.test.js @@ -43,6 +43,22 @@ describe('ol.interaction.DragAndDrop', function() { expect(viewport.hasListener(ol.events.EventType.DRAGOVER)).to.be(false); expect(viewport.hasListener(ol.events.EventType.DROP)).to.be(false); }); + + it('registers and unregisters listeners on a custom target', function() { + var customTarget = new ol.events.EventTarget(); + interaction = new ol.interaction.DragAndDrop({ + formatConstructors: [ol.format.GeoJSON], + target: customTarget + }); + interaction.setMap(map); + expect(customTarget.hasListener(ol.events.EventType.DRAGENTER)).to.be(true); + expect(customTarget.hasListener(ol.events.EventType.DRAGOVER)).to.be(true); + expect(customTarget.hasListener(ol.events.EventType.DROP)).to.be(true); + interaction.setMap(null); + expect(customTarget.hasListener(ol.events.EventType.DRAGENTER)).to.be(false); + expect(customTarget.hasListener(ol.events.EventType.DRAGOVER)).to.be(false); + expect(customTarget.hasListener(ol.events.EventType.DROP)).to.be(false); + }); }); describe('#handleDrop_', function() {