57 lines
1.8 KiB
TypeScript
57 lines
1.8 KiB
TypeScript
import {Inject, Injectable, NgZone, OpaqueToken} from '@angular/core';
|
|
|
|
import {ListWrapper} from '../../facade/collection';
|
|
import {BaseException} from '../../facade/exceptions';
|
|
|
|
|
|
export const EVENT_MANAGER_PLUGINS: OpaqueToken = new OpaqueToken('EventManagerPlugins');
|
|
|
|
@Injectable()
|
|
export class EventManager {
|
|
private _plugins: EventManagerPlugin[];
|
|
|
|
constructor(@Inject(EVENT_MANAGER_PLUGINS) plugins: EventManagerPlugin[], private _zone: NgZone) {
|
|
plugins.forEach(p => p.manager = this);
|
|
this._plugins = ListWrapper.reversed(plugins);
|
|
}
|
|
|
|
addEventListener(element: HTMLElement, eventName: string, handler: Function): Function {
|
|
var plugin = this._findPluginFor(eventName);
|
|
return plugin.addEventListener(element, eventName, handler);
|
|
}
|
|
|
|
addGlobalEventListener(target: string, eventName: string, handler: Function): Function {
|
|
var plugin = this._findPluginFor(eventName);
|
|
return plugin.addGlobalEventListener(target, eventName, handler);
|
|
}
|
|
|
|
getZone(): NgZone { return this._zone; }
|
|
|
|
/** @internal */
|
|
_findPluginFor(eventName: string): EventManagerPlugin {
|
|
var plugins = this._plugins;
|
|
for (var i = 0; i < plugins.length; i++) {
|
|
var plugin = plugins[i];
|
|
if (plugin.supports(eventName)) {
|
|
return plugin;
|
|
}
|
|
}
|
|
throw new BaseException(`No event manager plugin found for event ${eventName}`);
|
|
}
|
|
}
|
|
|
|
export class EventManagerPlugin {
|
|
manager: EventManager;
|
|
|
|
// That is equivalent to having supporting $event.target
|
|
supports(eventName: string): boolean { return false; }
|
|
|
|
addEventListener(element: HTMLElement, eventName: string, handler: Function): Function {
|
|
throw 'not implemented';
|
|
}
|
|
|
|
addGlobalEventListener(element: string, eventName: string, handler: Function): Function {
|
|
throw 'not implemented';
|
|
}
|
|
}
|