/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor'; import { Widget } from './widget'; import { TimeoutTimer } from 'common/Async'; import * as dom from '../Dom'; export interface IScrollbarArrowOptions { handleActivate: () => void; className: string; // icon: ThemeIcon; bgWidth: number; bgHeight: number; top?: number; left?: number; bottom?: number; right?: number; } export class ScrollbarArrow extends Widget { private _handleActivate: () => void; public bgDomNode: HTMLElement; public domNode: HTMLElement; private _pointerdownRepeatTimer: dom.WindowIntervalTimer; private _pointerdownScheduleRepeatTimer: TimeoutTimer; private _pointerMoveMonitor: GlobalPointerMoveMonitor; constructor(opts: IScrollbarArrowOptions) { super(); this._handleActivate = opts.handleActivate; this.bgDomNode = document.createElement('div'); this.bgDomNode.className = 'xterm-arrow-background'; this.bgDomNode.style.position = 'absolute'; this.bgDomNode.style.width = opts.bgWidth + 'px'; this.bgDomNode.style.height = opts.bgHeight + 'px'; if (typeof opts.top !== 'undefined') { this.bgDomNode.style.top = '0px'; } if (typeof opts.left !== 'undefined') { this.bgDomNode.style.left = '0px'; } if (typeof opts.bottom !== 'undefined') { this.bgDomNode.style.bottom = '0px'; } if (typeof opts.right !== 'undefined') { this.bgDomNode.style.right = '0px'; } this.domNode = document.createElement('div'); this.domNode.className = opts.className; // this.domNode.classList.add(...ThemeIcon.asClassNameArray(opts.icon)); this.domNode.style.position = 'absolute'; const arrowSize = Math.min(opts.bgWidth, opts.bgHeight); this.domNode.style.width = arrowSize + 'px'; this.domNode.style.height = arrowSize + 'px'; if (typeof opts.top !== 'undefined') { this.domNode.style.top = opts.top + 'px'; } if (typeof opts.left !== 'undefined') { this.domNode.style.left = opts.left + 'px'; } if (typeof opts.bottom !== 'undefined') { this.domNode.style.bottom = opts.bottom + 'px'; } if (typeof opts.right !== 'undefined') { this.domNode.style.right = opts.right + 'px'; } this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor()); this._register(dom.addStandardDisposableListener(this.bgDomNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e))); this._register(dom.addStandardDisposableListener(this.domNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e))); this._pointerdownRepeatTimer = this._register(new dom.WindowIntervalTimer()); this._pointerdownScheduleRepeatTimer = this._register(new TimeoutTimer()); } private _arrowPointerDown(e: PointerEvent): void { if (!e.target || !(e.target instanceof Element)) { return; } const scheduleRepeater = (): void => { this._pointerdownRepeatTimer.cancelAndSet(() => this._handleActivate(), 1000 / 24, dom.getWindow(e)); }; this._handleActivate(); this._pointerdownRepeatTimer.cancel(); this._pointerdownScheduleRepeatTimer.cancelAndSet(scheduleRepeater, 200); this._pointerMoveMonitor.startMonitoring( e.target, e.pointerId, e.buttons, (pointerMoveData) => { /* Intentional empty */ }, () => { this._pointerdownRepeatTimer.cancel(); this._pointerdownScheduleRepeatTimer.cancel(); } ); e.preventDefault(); } }