123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- /*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
- import * as dom from '../../../base/browser/dom.js';
- import * as platform from '../../../base/common/platform.js';
- import { EventType, Gesture } from '../../../base/browser/touch.js';
- import { Disposable } from '../../../base/common/lifecycle.js';
- import { MouseHandler, createMouseMoveEventMerger } from './mouseHandler.js';
- import { EditorMouseEvent, EditorPointerEventFactory } from '../editorDom.js';
- import { BrowserFeatures } from '../../../base/browser/canIUse.js';
- import { TextAreaSyntethicEvents } from './textAreaInput.js';
- /**
- * Currently only tested on iOS 13/ iPadOS.
- */
- export class PointerEventHandler extends MouseHandler {
- constructor(context, viewController, viewHelper) {
- super(context, viewController, viewHelper);
- this._register(Gesture.addTarget(this.viewHelper.linesContentDomNode));
- this._register(dom.addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Tap, (e) => this.onTap(e)));
- this._register(dom.addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Change, (e) => this.onChange(e)));
- this._register(dom.addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Contextmenu, (e) => this._onContextMenu(new EditorMouseEvent(e, this.viewHelper.viewDomNode), false)));
- this._lastPointerType = 'mouse';
- this._register(dom.addDisposableListener(this.viewHelper.linesContentDomNode, 'pointerdown', (e) => {
- const pointerType = e.pointerType;
- if (pointerType === 'mouse') {
- this._lastPointerType = 'mouse';
- return;
- }
- else if (pointerType === 'touch') {
- this._lastPointerType = 'touch';
- }
- else {
- this._lastPointerType = 'pen';
- }
- }));
- // PonterEvents
- const pointerEvents = new EditorPointerEventFactory(this.viewHelper.viewDomNode);
- this._register(pointerEvents.onPointerMoveThrottled(this.viewHelper.viewDomNode, (e) => this._onMouseMove(e), createMouseMoveEventMerger(this.mouseTargetFactory), MouseHandler.MOUSE_MOVE_MINIMUM_TIME));
- this._register(pointerEvents.onPointerUp(this.viewHelper.viewDomNode, (e) => this._onMouseUp(e)));
- this._register(pointerEvents.onPointerLeave(this.viewHelper.viewDomNode, (e) => this._onMouseLeave(e)));
- this._register(pointerEvents.onPointerDown(this.viewHelper.viewDomNode, (e) => this._onMouseDown(e)));
- }
- onTap(event) {
- if (!event.initialTarget || !this.viewHelper.linesContentDomNode.contains(event.initialTarget)) {
- return;
- }
- event.preventDefault();
- this.viewHelper.focusTextArea();
- const target = this._createMouseTarget(new EditorMouseEvent(event, this.viewHelper.viewDomNode), false);
- if (target.position) {
- // this.viewController.moveTo(target.position);
- this.viewController.dispatchMouse({
- position: target.position,
- mouseColumn: target.position.column,
- startedOnLineNumbers: false,
- mouseDownCount: event.tapCount,
- inSelectionMode: false,
- altKey: false,
- ctrlKey: false,
- metaKey: false,
- shiftKey: false,
- leftButton: false,
- middleButton: false,
- });
- }
- }
- onChange(e) {
- if (this._lastPointerType === 'touch') {
- this._context.model.deltaScrollNow(-e.translationX, -e.translationY);
- }
- }
- _onMouseDown(e) {
- if (e.browserEvent.pointerType === 'touch') {
- return;
- }
- super._onMouseDown(e);
- }
- }
- class TouchHandler extends MouseHandler {
- constructor(context, viewController, viewHelper) {
- super(context, viewController, viewHelper);
- this._register(Gesture.addTarget(this.viewHelper.linesContentDomNode));
- this._register(dom.addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Tap, (e) => this.onTap(e)));
- this._register(dom.addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Change, (e) => this.onChange(e)));
- this._register(dom.addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Contextmenu, (e) => this._onContextMenu(new EditorMouseEvent(e, this.viewHelper.viewDomNode), false)));
- }
- onTap(event) {
- event.preventDefault();
- this.viewHelper.focusTextArea();
- const target = this._createMouseTarget(new EditorMouseEvent(event, this.viewHelper.viewDomNode), false);
- if (target.position) {
- // Send the tap event also to the <textarea> (for input purposes)
- const event = document.createEvent('CustomEvent');
- event.initEvent(TextAreaSyntethicEvents.Tap, false, true);
- this.viewHelper.dispatchTextAreaEvent(event);
- this.viewController.moveTo(target.position);
- }
- }
- onChange(e) {
- this._context.model.deltaScrollNow(-e.translationX, -e.translationY);
- }
- }
- export class PointerHandler extends Disposable {
- constructor(context, viewController, viewHelper) {
- super();
- if ((platform.isIOS && BrowserFeatures.pointerEvents)) {
- this.handler = this._register(new PointerEventHandler(context, viewController, viewHelper));
- }
- else if (window.TouchEvent) {
- this.handler = this._register(new TouchHandler(context, viewController, viewHelper));
- }
- else {
- this.handler = this._register(new MouseHandler(context, viewController, viewHelper));
- }
- }
- getTargetAtClientPoint(clientX, clientY) {
- return this.handler.getTargetAtClientPoint(clientX, clientY);
- }
- }
|