/* Copyright (c) 2016 Jean-Marc VIGLINO,
released under the CeCILL-B license (French BSD license)
(http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt).
*/
import {unByKey as ol_Observable_unByKey} from 'ol/Observable.js'
import ol_interaction_Interaction from 'ol/interaction/Interaction.js'
import ol_Map from 'ol/Map.js'
import ol_Overlay from 'ol/Overlay.js'
/** Interaction synchronize
* @constructor
* @extends {ol_interaction_Interaction}
* @param {*} options
* @param {Array
} options maps An array of maps to synchronize with the map of the interaction
*/
var ol_interaction_Synchronize = class olinteractionSynchronize extends ol_interaction_Interaction {
constructor(options) {
options = options || {}
super({
handleEvent: function (e) {
if (e.type == "pointermove") { this.handleMove_(e)}
return true
}
})
this.maps = options.maps || []
if (options.active === false) this.setActive(false)
}
/**
* Remove the interaction from its current map, if any, and attach it to a new
* map, if any. Pass `null` to just remove the interaction from the current map.
* @param {ol_Map} map Map.
* @api stable
*/
setMap(map) {
if (this._listener) {
ol_Observable_unByKey(this._listener.center)
ol_Observable_unByKey(this._listener.rotation)
ol_Observable_unByKey(this._listener.resolution)
this.getMap().getTargetElement().removeEventListener('mouseout', this._listener.mouseout)
}
this._listener = null
super.setMap(map)
if (map) {
this._listener = {}
this._listener.center = this.getMap().getView().on('change:center', this.syncMaps.bind(this))
this._listener.rotation = this.getMap().getView().on('change:rotation', this.syncMaps.bind(this))
this._listener.resolution = this.getMap().getView().on('change:resolution', this.syncMaps.bind(this))
this._listener.mouseout = this.handleMouseOut_.bind(this)
if (this.getMap().getTargetElement()) {
this.getMap().getTargetElement().addEventListener('mouseout', this._listener.mouseout)
}
this.syncMaps()
}
}
/** Auto activate/deactivate controls in the bar
* @param {boolean} b activate/deactivate
*/
setActive(b) {
super.setActive(b)
this.syncMaps()
}
/** Synchronize the maps
*/
syncMaps() {
if (!this.getActive())
return
var map = this.getMap()
if (map) {
if (map.get('lockView'))
return
for (var i = 0; i < this.maps.length; i++) {
this.maps[i].set('lockView', true)
// sync
if (this.maps[i].getView().getRotation() != map.getView().getRotation()) {
this.maps[i].getView().setRotation(map.getView().getRotation())
}
if (this.maps[i].getView().getCenter() != map.getView().getCenter()) {
this.maps[i].getView().setCenter(map.getView().getCenter())
}
if (this.maps[i].getView().getResolution() != map.getView().getResolution()) {
this.maps[i].getView().setResolution(map.getView().getResolution())
}
this.maps[i].set('lockView', false)
}
}
}
/** Cursor move > tells other maps to show the cursor
* @param {ol.event} e "move" event
*/
handleMove_(e) {
for (var i = 0; i < this.maps.length; i++) {
this.maps[i].showTarget(e.coordinate)
}
this.getMap().showTarget()
}
/** Cursor out of map > tells other maps to hide the cursor
* @param {event} e "mouseOut" event
*/
handleMouseOut_( /*e*/) {
for (var i = 0; i < this.maps.length; i++) {
if (this.maps[i]._targetOverlay)
this.maps[i]._targetOverlay.setPosition(undefined)
}
}
}
/** Show a target overlay at coord
* @param {ol.coordinate} coord
*/
ol_Map.prototype.showTarget = function(coord) {
if (!this._targetOverlay) {
var elt = document.createElement("div");
elt.classList.add("ol-target");
this._targetOverlay = new ol_Overlay({ element: elt });
this._targetOverlay.setPositioning('center-center');
this.addOverlay(this._targetOverlay);
elt.parentElement.classList.add("ol-target-overlay");
// hack to render targetOverlay before positioning it
this._targetOverlay.setPosition([0,0]);
}
this._targetOverlay.setPosition(coord);
};
/** Hide the target overlay
*/
ol_Map.prototype.hideTarget = function() {
this.removeOverlay(this._targetOverlay);
this._targetOverlay = undefined;
};
export default ol_interaction_Synchronize