/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { Disposable } from 'vs/base/common/lifecycle'; import { MouseTarget } from 'vs/editor/browser/controller/mouseTarget'; import { IEditorMouseEvent, IMouseTarget, IPartialEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { IViewModel, ICoordinatesConverter } from 'vs/editor/common/viewModel/viewModel'; import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent'; export interface EventCallback { (event: T): void; } export class ViewOutgoingEvents extends Disposable { public onKeyDown: EventCallback | null = null; public onKeyUp: EventCallback | null = null; public onContextMenu: EventCallback | null = null; public onMouseMove: EventCallback | null = null; public onMouseLeave: EventCallback | null = null; public onMouseDown: EventCallback | null = null; public onMouseUp: EventCallback | null = null; public onMouseDrag: EventCallback | null = null; public onMouseDrop: EventCallback | null = null; public onMouseWheel: EventCallback | null = null; private readonly _viewModel: IViewModel; constructor(viewModel: IViewModel) { super(); this._viewModel = viewModel; } public emitKeyDown(e: IKeyboardEvent): void { if (this.onKeyDown) { this.onKeyDown(e); } } public emitKeyUp(e: IKeyboardEvent): void { if (this.onKeyUp) { this.onKeyUp(e); } } public emitContextMenu(e: IEditorMouseEvent): void { if (this.onContextMenu) { this.onContextMenu(this._convertViewToModelMouseEvent(e)); } } public emitMouseMove(e: IEditorMouseEvent): void { if (this.onMouseMove) { this.onMouseMove(this._convertViewToModelMouseEvent(e)); } } public emitMouseLeave(e: IPartialEditorMouseEvent): void { if (this.onMouseLeave) { this.onMouseLeave(this._convertViewToModelMouseEvent(e)); } } public emitMouseDown(e: IEditorMouseEvent): void { if (this.onMouseDown) { this.onMouseDown(this._convertViewToModelMouseEvent(e)); } } public emitMouseUp(e: IEditorMouseEvent): void { if (this.onMouseUp) { this.onMouseUp(this._convertViewToModelMouseEvent(e)); } } public emitMouseDrag(e: IEditorMouseEvent): void { if (this.onMouseDrag) { this.onMouseDrag(this._convertViewToModelMouseEvent(e)); } } public emitMouseDrop(e: IPartialEditorMouseEvent): void { if (this.onMouseDrop) { this.onMouseDrop(this._convertViewToModelMouseEvent(e)); } } public emitMouseWheel(e: IMouseWheelEvent): void { if (this.onMouseWheel) { this.onMouseWheel(e); } } private _convertViewToModelMouseEvent(e: IEditorMouseEvent): IEditorMouseEvent; private _convertViewToModelMouseEvent(e: IPartialEditorMouseEvent): IPartialEditorMouseEvent; private _convertViewToModelMouseEvent(e: IEditorMouseEvent | IPartialEditorMouseEvent): IEditorMouseEvent | IPartialEditorMouseEvent { if (e.target) { return { event: e.event, target: this._convertViewToModelMouseTarget(e.target) }; } return e; } private _convertViewToModelMouseTarget(target: IMouseTarget): IMouseTarget { return ViewOutgoingEvents.convertViewToModelMouseTarget(target, this._viewModel.coordinatesConverter); } public static convertViewToModelMouseTarget(target: IMouseTarget, coordinatesConverter: ICoordinatesConverter): IMouseTarget { return new ExternalMouseTarget( target.element, target.type, target.mouseColumn, target.position ? coordinatesConverter.convertViewPositionToModelPosition(target.position) : null, target.range ? coordinatesConverter.convertViewRangeToModelRange(target.range) : null, target.detail ); } } class ExternalMouseTarget implements IMouseTarget { public readonly element: Element | null; public readonly type: MouseTargetType; public readonly mouseColumn: number; public readonly position: Position | null; public readonly range: Range | null; public readonly detail: any; constructor(element: Element | null, type: MouseTargetType, mouseColumn: number, position: Position | null, range: Range | null, detail: any) { this.element = element; this.type = type; this.mouseColumn = mouseColumn; this.position = position; this.range = range; this.detail = detail; } public toString(): string { return MouseTarget.toString(this); } }