monaco-editor
Version:
A browser based code editor
79 lines (78 loc) • 3.26 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { EditorCommand, registerEditorCommand } from '../../../browser/editorExtensions.js';
import { IContextKeyService, RawContextKey } from '../../../../platform/contextkey/common/contextkey.js';
import { CancellationTokenSource } from '../../../../base/common/cancellation.js';
import { LinkedList } from '../../../../base/common/linkedList.js';
import { createDecorator } from '../../../../platform/instantiation/common/instantiation.js';
import { registerSingleton } from '../../../../platform/instantiation/common/extensions.js';
import { localize } from '../../../../nls.js';
const IEditorCancellationTokens = createDecorator('IEditorCancelService');
const ctxCancellableOperation = new RawContextKey('cancellableOperation', false, localize('cancellableOperation', 'Whether the editor runs a cancellable operation, e.g. like \'Peek References\''));
registerSingleton(IEditorCancellationTokens, class {
constructor() {
this._tokens = new WeakMap();
}
add(editor, cts) {
let data = this._tokens.get(editor);
if (!data) {
data = editor.invokeWithinContext(accessor => {
const key = ctxCancellableOperation.bindTo(accessor.get(IContextKeyService));
const tokens = new LinkedList();
return { key, tokens };
});
this._tokens.set(editor, data);
}
let removeFn;
data.key.set(true);
removeFn = data.tokens.push(cts);
return () => {
// remove w/o cancellation
if (removeFn) {
removeFn();
data.key.set(!data.tokens.isEmpty());
removeFn = undefined;
}
};
}
cancel(editor) {
const data = this._tokens.get(editor);
if (!data) {
return;
}
// remove with cancellation
const cts = data.tokens.pop();
if (cts) {
cts.cancel();
data.key.set(!data.tokens.isEmpty());
}
}
}, 1 /* InstantiationType.Delayed */);
export class EditorKeybindingCancellationTokenSource extends CancellationTokenSource {
constructor(editor, parent) {
super(parent);
this.editor = editor;
this._unregister = editor.invokeWithinContext(accessor => accessor.get(IEditorCancellationTokens).add(editor, this));
}
dispose() {
this._unregister();
super.dispose();
}
}
registerEditorCommand(new class extends EditorCommand {
constructor() {
super({
id: 'editor.cancelOperation',
kbOpts: {
weight: 100 /* KeybindingWeight.EditorContrib */,
primary: 9 /* KeyCode.Escape */
},
precondition: ctxCancellableOperation
});
}
runEditorCommand(accessor, editor) {
accessor.get(IEditorCancellationTokens).cancel(editor);
}
});