src/providers/map-modules/events/events.js
module.exports = HereMapsEventsFactory;
HereMapsEventsFactory.$inject = [
'HereMapsUtilsService',
'HereMapsMarkerService',
'HereMapsCONSTS',
'HereMapsInfoBubbleFactory'
];
function HereMapsEventsFactory(HereMapsUtilsService, HereMapsMarkerService, HereMapsCONSTS, HereMapsInfoBubbleFactory) {
function Events(platform, Injector, listeners) {
this.map = platform.map;
this.listeners = listeners;
this.inject = new Injector();
this.events = platform.events = new H.mapevents.MapEvents(this.map);
this.behavior = platform.behavior = new H.mapevents.Behavior(this.events);
this.bubble = HereMapsInfoBubbleFactory.create();
this.setupEventListeners();
}
var proto = Events.prototype;
proto.setupEventListeners = setupEventListeners;
proto.setupOptions = setupOptions;
proto.triggerUserListener = triggerUserListener;
proto.infoBubbleHandler = infoBubbleHandler;
return {
start: function(args) {
if (!(args.platform.map instanceof H.Map))
return console.error('Missed required map instance');
var events = new Events(args.platform, args.injector, args.listeners);
args.options && events.setupOptions(args.options);
}
}
function setupEventListeners() {
var self = this;
HereMapsUtilsService.addEventListener(this.map, 'tap', this.infoBubbleHandler.bind(this));
HereMapsUtilsService.addEventListener(this.map, 'pointermove', this.infoBubbleHandler.bind(this));
HereMapsUtilsService.addEventListener(this.map, 'dragstart', function(e) {
if (HereMapsMarkerService.isMarkerInstance(e.target)) {
self.behavior.disable();
}
self.triggerUserListener(HereMapsCONSTS.USER_EVENTS[e.type], e);
});
HereMapsUtilsService.addEventListener(this.map, 'drag', function(e) {
var pointer = e.currentPointer,
target = e.target;
if (HereMapsMarkerService.isMarkerInstance(target)) {
target.setPosition(self.map.screenToGeo(pointer.viewportX, pointer.viewportY));
}
self.triggerUserListener(HereMapsCONSTS.USER_EVENTS[e.type], e);
});
HereMapsUtilsService.addEventListener(this.map, 'dragend', function(e) {
if (HereMapsMarkerService.isMarkerInstance(e.target)) {
self.behavior.enable();
}
self.triggerUserListener(HereMapsCONSTS.USER_EVENTS[e.type], e);
});
HereMapsUtilsService.addEventListener(this.map, 'mapviewchangestart', function(e) {
self.triggerUserListener(HereMapsCONSTS.USER_EVENTS[e.type], e);
});
HereMapsUtilsService.addEventListener(this.map, 'mapviewchange', function(e) {
self.triggerUserListener(HereMapsCONSTS.USER_EVENTS[e.type], e);
});
HereMapsUtilsService.addEventListener(this.map, 'mapviewchangeend', function(e) {
self.triggerUserListener(HereMapsCONSTS.USER_EVENTS[e.type], e);
});
}
function setupOptions(options) {
if (!options)
return;
this.map.draggable = !!options.draggable;
}
function triggerUserListener(eventName, e) {
if (!this.listeners)
return;
var callback = this.listeners[eventName];
callback && callback(e);
}
function infoBubbleHandler(e){
var ui = this.inject('ui');
if(ui)
this.bubble.toggle(e, ui);
this.triggerUserListener(HereMapsCONSTS.USER_EVENTS[e.type], e);
}
};