@sussudio/platform
Version:
Internal APIs for VS Code's service injection the base services.
144 lines (143 loc) • 6.36 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
var __decorate =
(this && this.__decorate) ||
function (decorators, target, key, desc) {
var c = arguments.length,
r = c < 3 ? target : desc === null ? (desc = Object.getOwnPropertyDescriptor(target, key)) : desc,
d;
if (typeof Reflect === 'object' && typeof Reflect.decorate === 'function')
r = Reflect.decorate(decorators, target, key, desc);
else
for (var i = decorators.length - 1; i >= 0; i--)
if ((d = decorators[i])) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __param =
(this && this.__param) ||
function (paramIndex, decorator) {
return function (target, key) {
decorator(target, key, paramIndex);
};
};
import { FindInput } from '@sussudio/base/browser/ui/findinput/findInput.mjs';
import { ReplaceInput } from '@sussudio/base/browser/ui/findinput/replaceInput.mjs';
import { HistoryInputBox } from '@sussudio/base/browser/ui/inputbox/inputBox.mjs';
import { ContextKeyExpr, IContextKeyService, RawContextKey } from '../../contextkey/common/contextkey.mjs';
import { KeybindingsRegistry } from '../../keybinding/common/keybindingsRegistry.mjs';
import { localize } from 'vscode-nls.mjs';
import { DisposableStore, toDisposable } from '@sussudio/base/common/lifecycle.mjs';
export const historyNavigationVisible = new RawContextKey(
'suggestWidgetVisible',
false,
localize('suggestWidgetVisible', 'Whether suggestion are visible'),
);
const HistoryNavigationWidgetFocusContext = 'historyNavigationWidgetFocus';
const HistoryNavigationForwardsEnablementContext = 'historyNavigationForwardsEnabled';
const HistoryNavigationBackwardsEnablementContext = 'historyNavigationBackwardsEnabled';
let lastFocusedWidget = undefined;
const widgets = [];
export function registerAndCreateHistoryNavigationContext(scopedContextKeyService, widget) {
if (widgets.includes(widget)) {
throw new Error('Cannot register the same widget multiple times');
}
widgets.push(widget);
const disposableStore = new DisposableStore();
const historyNavigationWidgetFocus = new RawContextKey(HistoryNavigationWidgetFocusContext, false).bindTo(
scopedContextKeyService,
);
const historyNavigationForwardsEnablement = new RawContextKey(
HistoryNavigationForwardsEnablementContext,
true,
).bindTo(scopedContextKeyService);
const historyNavigationBackwardsEnablement = new RawContextKey(
HistoryNavigationBackwardsEnablementContext,
true,
).bindTo(scopedContextKeyService);
const onDidFocus = () => {
historyNavigationWidgetFocus.set(true);
lastFocusedWidget = widget;
};
const onDidBlur = () => {
historyNavigationWidgetFocus.set(false);
if (lastFocusedWidget === widget) {
lastFocusedWidget = undefined;
}
};
// Check for currently being focused
if (widget.element === document.activeElement) {
onDidFocus();
}
disposableStore.add(widget.onDidFocus(() => onDidFocus()));
disposableStore.add(widget.onDidBlur(() => onDidBlur()));
disposableStore.add(
toDisposable(() => {
widgets.splice(widgets.indexOf(widget), 1);
onDidBlur();
}),
);
return {
historyNavigationForwardsEnablement,
historyNavigationBackwardsEnablement,
dispose() {
disposableStore.dispose();
},
};
}
let ContextScopedHistoryInputBox = class ContextScopedHistoryInputBox extends HistoryInputBox {
constructor(container, contextViewProvider, options, contextKeyService) {
super(container, contextViewProvider, options);
const scopedContextKeyService = this._register(contextKeyService.createScoped(this.element));
this._register(registerAndCreateHistoryNavigationContext(scopedContextKeyService, this));
}
};
ContextScopedHistoryInputBox = __decorate([__param(3, IContextKeyService)], ContextScopedHistoryInputBox);
export { ContextScopedHistoryInputBox };
let ContextScopedFindInput = class ContextScopedFindInput extends FindInput {
constructor(container, contextViewProvider, options, contextKeyService) {
super(container, contextViewProvider, options);
const scopedContextKeyService = this._register(contextKeyService.createScoped(this.inputBox.element));
this._register(registerAndCreateHistoryNavigationContext(scopedContextKeyService, this.inputBox));
}
};
ContextScopedFindInput = __decorate([__param(3, IContextKeyService)], ContextScopedFindInput);
export { ContextScopedFindInput };
let ContextScopedReplaceInput = class ContextScopedReplaceInput extends ReplaceInput {
constructor(container, contextViewProvider, options, contextKeyService, showReplaceOptions = false) {
super(container, contextViewProvider, showReplaceOptions, options);
const scopedContextKeyService = this._register(contextKeyService.createScoped(this.inputBox.element));
this._register(registerAndCreateHistoryNavigationContext(scopedContextKeyService, this.inputBox));
}
};
ContextScopedReplaceInput = __decorate([__param(3, IContextKeyService)], ContextScopedReplaceInput);
export { ContextScopedReplaceInput };
KeybindingsRegistry.registerCommandAndKeybindingRule({
id: 'history.showPrevious',
weight: 200 /* KeybindingWeight.WorkbenchContrib */,
when: ContextKeyExpr.and(
ContextKeyExpr.has(HistoryNavigationWidgetFocusContext),
ContextKeyExpr.equals(HistoryNavigationBackwardsEnablementContext, true),
historyNavigationVisible.isEqualTo(false),
),
primary: 16 /* KeyCode.UpArrow */,
secondary: [512 /* KeyMod.Alt */ | 16 /* KeyCode.UpArrow */],
handler: (accessor) => {
lastFocusedWidget?.showPreviousValue();
},
});
KeybindingsRegistry.registerCommandAndKeybindingRule({
id: 'history.showNext',
weight: 200 /* KeybindingWeight.WorkbenchContrib */,
when: ContextKeyExpr.and(
ContextKeyExpr.has(HistoryNavigationWidgetFocusContext),
ContextKeyExpr.equals(HistoryNavigationForwardsEnablementContext, true),
historyNavigationVisible.isEqualTo(false),
),
primary: 18 /* KeyCode.DownArrow */,
secondary: [512 /* KeyMod.Alt */ | 18 /* KeyCode.DownArrow */],
handler: (accessor) => {
lastFocusedWidget?.showNextValue();
},
});