/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { GestureEvent } from 'vs/base/browser/touch'; import { Event as BaseEvent, Emitter } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; export type EventHandler = HTMLElement | HTMLDocument | Window; export interface IDomEvent { (element: EventHandler, type: K, useCapture?: boolean): BaseEvent; (element: EventHandler, type: string, useCapture?: boolean): BaseEvent; } /** * @deprecated Use `DomEmitter` instead */ export const domEvent: IDomEvent = (element: EventHandler, type: string, useCapture?: boolean) => { const fn = (e: Event) => emitter.fire(e); const emitter = new Emitter({ onFirstListenerAdd: () => { element.addEventListener(type, fn, useCapture); }, onLastListenerRemove: () => { element.removeEventListener(type, fn, useCapture); } }); return emitter.event; }; export interface DOMEventMap extends HTMLElementEventMap { '-monaco-gesturetap': GestureEvent; '-monaco-gesturechange': GestureEvent; '-monaco-gesturestart': GestureEvent; '-monaco-gesturesend': GestureEvent; '-monaco-gesturecontextmenu': GestureEvent; } export class DomEmitter implements IDisposable { private emitter: Emitter; get event(): BaseEvent { return this.emitter.event; } constructor(element: EventHandler, type: K, useCapture?: boolean) { const fn = (e: Event) => this.emitter.fire(e as DOMEventMap[K]); this.emitter = new Emitter({ onFirstListenerAdd: () => element.addEventListener(type, fn, useCapture), onLastListenerRemove: () => element.removeEventListener(type, fn, useCapture) }); } dispose(): void { this.emitter.dispose(); } } export interface CancellableEvent { preventDefault(): void; stopPropagation(): void; } export function stopEvent(event: T): T { event.preventDefault(); event.stopPropagation(); return event; } export function stop(event: BaseEvent): BaseEvent { return BaseEvent.map(event, stopEvent); }