'use strict'; import { Functions } from './system'; import { commands, Disposable, TextEditor, window } from 'vscode'; import { BuiltInCommands } from './constants'; export class ActiveEditorTracker extends Disposable { private _disposable: Disposable; private _resolver: ((editor: TextEditor | undefined) => void) | undefined; constructor() { super(() => this.dispose()); const fn = Functions.debounce((e: TextEditor | undefined) => this._resolver && this._resolver(e), 50); this._disposable = window.onDidChangeActiveTextEditor(fn); } dispose() { this._disposable && this._disposable.dispose(); } async awaitClose(timeout: number = 500): Promise<TextEditor | undefined> { this.close(); return this.wait(timeout); } async awaitNext(timeout: number = 500): Promise<TextEditor | undefined> { this.next(); return this.wait(timeout); } async close(): Promise<{} | undefined> { return commands.executeCommand(BuiltInCommands.CloseActiveEditor); } async next(): Promise<{} | undefined> { return commands.executeCommand(BuiltInCommands.NextEditor); } async wait(timeout: number = 500): Promise<TextEditor | undefined> { const editor = await new Promise<TextEditor>((resolve, reject) => { let timer: any; this._resolver = (editor: TextEditor | undefined) => { if (timer) { clearTimeout(timer as any); timer = 0; resolve(editor); } }; timer = setTimeout(() => { resolve(window.activeTextEditor); timer = 0; }, timeout) as any; }); this._resolver = undefined; return editor; } }