UNPKG

monaco-editor

Version:
230 lines (229 loc) • 11.5 kB
/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); } return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); import * as dom from '../../../base/browser/dom.js'; import { EventType, Gesture } from '../../../base/browser/touch.js'; import { MouseHandler } from './mouseHandler.js'; import { EditorMouseEvent } from '../editorDom.js'; function gestureChangeEventMerger(lastEvent, currentEvent) { var r = { translationY: currentEvent.translationY, translationX: currentEvent.translationX }; if (lastEvent) { r.translationY += lastEvent.translationY; r.translationX += lastEvent.translationX; } return r; } /** * Basically IE10 and IE11 */ var MsPointerHandler = /** @class */ (function (_super) { __extends(MsPointerHandler, _super); function MsPointerHandler(context, viewController, viewHelper) { var _this = _super.call(this, context, viewController, viewHelper) || this; _this.viewHelper.linesContentDomNode.style.msTouchAction = 'none'; _this.viewHelper.linesContentDomNode.style.msContentZooming = 'none'; // TODO@Alex -> this expects that the view is added in 100 ms, might not be the case // This handler should be added when the dom node is in the dom tree _this._installGestureHandlerTimeout = window.setTimeout(function () { _this._installGestureHandlerTimeout = -1; if (window.MSGesture) { var touchGesture_1 = new MSGesture(); var penGesture_1 = new MSGesture(); touchGesture_1.target = _this.viewHelper.linesContentDomNode; penGesture_1.target = _this.viewHelper.linesContentDomNode; _this.viewHelper.linesContentDomNode.addEventListener('MSPointerDown', function (e) { // Circumvent IE11 breaking change in e.pointerType & TypeScript's stale definitions var pointerType = e.pointerType; if (pointerType === (e.MSPOINTER_TYPE_MOUSE || 'mouse')) { _this._lastPointerType = 'mouse'; return; } else if (pointerType === (e.MSPOINTER_TYPE_TOUCH || 'touch')) { _this._lastPointerType = 'touch'; touchGesture_1.addPointer(e.pointerId); } else { _this._lastPointerType = 'pen'; penGesture_1.addPointer(e.pointerId); } }); _this._register(dom.addDisposableThrottledListener(_this.viewHelper.linesContentDomNode, 'MSGestureChange', function (e) { return _this._onGestureChange(e); }, gestureChangeEventMerger)); _this._register(dom.addDisposableListener(_this.viewHelper.linesContentDomNode, 'MSGestureTap', function (e) { return _this._onCaptureGestureTap(e); }, true)); } }, 100); _this._lastPointerType = 'mouse'; return _this; } MsPointerHandler.prototype._onMouseDown = function (e) { if (this._lastPointerType === 'mouse') { _super.prototype._onMouseDown.call(this, e); } }; MsPointerHandler.prototype._onCaptureGestureTap = function (rawEvent) { var _this = this; var e = new EditorMouseEvent(rawEvent, this.viewHelper.viewDomNode); var t = this._createMouseTarget(e, false); if (t.position) { this.viewController.moveTo(t.position); } // IE does not want to focus when coming in from the browser's address bar if (e.browserEvent.fromElement) { e.preventDefault(); this.viewHelper.focusTextArea(); } else { // TODO@Alex -> cancel this is focus is lost setTimeout(function () { _this.viewHelper.focusTextArea(); }); } }; MsPointerHandler.prototype._onGestureChange = function (e) { this._context.viewLayout.deltaScrollNow(-e.translationX, -e.translationY); }; MsPointerHandler.prototype.dispose = function () { window.clearTimeout(this._installGestureHandlerTimeout); _super.prototype.dispose.call(this); }; return MsPointerHandler; }(MouseHandler)); /** * Basically Edge but should be modified to handle any pointerEnabled, even without support of MSGesture */ var StandardPointerHandler = /** @class */ (function (_super) { __extends(StandardPointerHandler, _super); function StandardPointerHandler(context, viewController, viewHelper) { var _this = _super.call(this, context, viewController, viewHelper) || this; _this.viewHelper.linesContentDomNode.style.touchAction = 'none'; // TODO@Alex -> this expects that the view is added in 100 ms, might not be the case // This handler should be added when the dom node is in the dom tree _this._installGestureHandlerTimeout = window.setTimeout(function () { _this._installGestureHandlerTimeout = -1; // TODO@Alex: replace the usage of MSGesture here with something that works across all browsers if (window.MSGesture) { var touchGesture_2 = new MSGesture(); var penGesture_2 = new MSGesture(); touchGesture_2.target = _this.viewHelper.linesContentDomNode; penGesture_2.target = _this.viewHelper.linesContentDomNode; _this.viewHelper.linesContentDomNode.addEventListener('pointerdown', function (e) { var pointerType = e.pointerType; if (pointerType === 'mouse') { _this._lastPointerType = 'mouse'; return; } else if (pointerType === 'touch') { _this._lastPointerType = 'touch'; touchGesture_2.addPointer(e.pointerId); } else { _this._lastPointerType = 'pen'; penGesture_2.addPointer(e.pointerId); } }); _this._register(dom.addDisposableThrottledListener(_this.viewHelper.linesContentDomNode, 'MSGestureChange', function (e) { return _this._onGestureChange(e); }, gestureChangeEventMerger)); _this._register(dom.addDisposableListener(_this.viewHelper.linesContentDomNode, 'MSGestureTap', function (e) { return _this._onCaptureGestureTap(e); }, true)); } }, 100); _this._lastPointerType = 'mouse'; return _this; } StandardPointerHandler.prototype._onMouseDown = function (e) { if (this._lastPointerType === 'mouse') { _super.prototype._onMouseDown.call(this, e); } }; StandardPointerHandler.prototype._onCaptureGestureTap = function (rawEvent) { var _this = this; var e = new EditorMouseEvent(rawEvent, this.viewHelper.viewDomNode); var t = this._createMouseTarget(e, false); if (t.position) { this.viewController.moveTo(t.position); } // IE does not want to focus when coming in from the browser's address bar if (e.browserEvent.fromElement) { e.preventDefault(); this.viewHelper.focusTextArea(); } else { // TODO@Alex -> cancel this is focus is lost setTimeout(function () { _this.viewHelper.focusTextArea(); }); } }; StandardPointerHandler.prototype._onGestureChange = function (e) { this._context.viewLayout.deltaScrollNow(-e.translationX, -e.translationY); }; StandardPointerHandler.prototype.dispose = function () { window.clearTimeout(this._installGestureHandlerTimeout); _super.prototype.dispose.call(this); }; return StandardPointerHandler; }(MouseHandler)); var TouchHandler = /** @class */ (function (_super) { __extends(TouchHandler, _super); function TouchHandler(context, viewController, viewHelper) { var _this = _super.call(this, context, viewController, viewHelper) || this; Gesture.addTarget(_this.viewHelper.linesContentDomNode); _this._register(dom.addDisposableListener(_this.viewHelper.linesContentDomNode, EventType.Tap, function (e) { return _this.onTap(e); })); _this._register(dom.addDisposableListener(_this.viewHelper.linesContentDomNode, EventType.Change, function (e) { return _this.onChange(e); })); _this._register(dom.addDisposableListener(_this.viewHelper.linesContentDomNode, EventType.Contextmenu, function (e) { return _this._onContextMenu(new EditorMouseEvent(e, _this.viewHelper.viewDomNode), false); })); return _this; } TouchHandler.prototype.dispose = function () { _super.prototype.dispose.call(this); }; TouchHandler.prototype.onTap = function (event) { event.preventDefault(); this.viewHelper.focusTextArea(); var target = this._createMouseTarget(new EditorMouseEvent(event, this.viewHelper.viewDomNode), false); if (target.position) { this.viewController.moveTo(target.position); } }; TouchHandler.prototype.onChange = function (e) { this._context.viewLayout.deltaScrollNow(-e.translationX, -e.translationY); }; return TouchHandler; }(MouseHandler)); var PointerHandler = /** @class */ (function () { function PointerHandler(context, viewController, viewHelper) { if (window.navigator.msPointerEnabled) { this.handler = new MsPointerHandler(context, viewController, viewHelper); } else if (window.TouchEvent) { this.handler = new TouchHandler(context, viewController, viewHelper); } else if (window.navigator.pointerEnabled || window.PointerEvent) { this.handler = new StandardPointerHandler(context, viewController, viewHelper); } else { this.handler = new MouseHandler(context, viewController, viewHelper); } } PointerHandler.prototype.getTargetAtClientPoint = function (clientX, clientY) { return this.handler.getTargetAtClientPoint(clientX, clientY); }; PointerHandler.prototype.dispose = function () { this.handler.dispose(); }; return PointerHandler; }()); export { PointerHandler };