@theia/monaco
Version:
Theia - Monaco Extension
113 lines (100 loc) • 5.2 kB
text/typescript
// *****************************************************************************
// Copyright (C) 2021 Red Hat and others.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License v. 2.0 which is available at
// http://www.eclipse.org/legal/epl-2.0.
//
// This Source Code may also be made available under the following Secondary
// Licenses when the conditions for such availability set forth in the Eclipse
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
// with the GNU Classpath Exception which is available at
// https://www.gnu.org/software/classpath/license.html.
//
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
// *****************************************************************************
import { KeybindingRegistry, QuickPickItem, QuickPickSeparator } from '@theia/core/lib/browser';
import { QuickAccessProviderDescriptor, QuickAccessRegistry } from '@theia/core/lib/browser/quick-input/quick-access';
import { CancellationToken, Disposable } from '@theia/core/lib/common';
import { inject, injectable } from '@theia/core/shared/inversify';
import { MonacoQuickPickItem } from './monaco-quick-input-service';
import {
IPickerQuickAccessProviderOptions, PickerQuickAccessProvider, Picks, Pick, IPickerQuickAccessItem
} from '@theia/monaco-editor-core/esm/vs/platform/quickinput/browser/pickerQuickAccess';
import {
Extensions,
IQuickAccessProvider,
IQuickAccessProviderDescriptor,
IQuickAccessProviderHelp,
IQuickAccessRegistry,
QuickAccessRegistry as VSCodeQuickAccessRegistry,
} from '@theia/monaco-editor-core/esm/vs/platform/quickinput/common/quickAccess';
import { IQuickPickItem, IQuickPickItemWithResource } from '@theia/monaco-editor-core/esm/vs/platform/quickinput/common/quickInput';
import { Registry } from '@theia/monaco-editor-core/esm/vs/platform/registry/common/platform';
interface IAnythingQuickPickItem extends IPickerQuickAccessItem, IQuickPickItemWithResource { }
abstract class MonacoPickerAccessProvider extends PickerQuickAccessProvider<IQuickPickItem> {
constructor(prefix: string, options?: IPickerQuickAccessProviderOptions<IQuickPickItem>) {
super(prefix, options);
}
abstract getDescriptor(): QuickAccessProviderDescriptor;
}
class TheiaQuickAccessDescriptor implements IQuickAccessProviderDescriptor {
constructor(
public readonly theiaDescriptor: QuickAccessProviderDescriptor,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
readonly ctor: { new(...services: any /* TS BrandedService but no clue how to type this properly */[]): IQuickAccessProvider },
readonly prefix: string,
readonly helpEntries: IQuickAccessProviderHelp[],
readonly placeholder?: string) { }
}
()
export class MonacoQuickAccessRegistry implements QuickAccessRegistry {
(KeybindingRegistry)
protected readonly keybindingRegistry: KeybindingRegistry;
private get monacoRegistry(): IQuickAccessRegistry {
return Registry.as<IQuickAccessRegistry>(Extensions.Quickaccess);
}
registerQuickAccessProvider(descriptor: QuickAccessProviderDescriptor): Disposable {
const toMonacoPick = (item: QuickPickItem): Pick<IAnythingQuickPickItem> => {
if (QuickPickSeparator.is(item)) {
return item;
} else {
return new MonacoQuickPickItem(item, this.keybindingRegistry);
}
};
const inner =
class extends MonacoPickerAccessProvider {
getDescriptor(): QuickAccessProviderDescriptor {
return descriptor;
}
constructor() {
super(descriptor.prefix);
}
protected override async _getPicks(filter: string, disposables: unknown, token: CancellationToken): Promise<Picks<IQuickPickItem>> {
const result = await Promise.resolve(descriptor.getInstance().getPicks(filter, token));
return result.map(toMonacoPick);
}
};
return this.monacoRegistry.registerQuickAccessProvider(new TheiaQuickAccessDescriptor(
descriptor,
inner,
descriptor.prefix,
descriptor.helpEntries,
descriptor.placeholder
));
}
getQuickAccessProviders(): QuickAccessProviderDescriptor[] {
return this.monacoRegistry.getQuickAccessProviders()
.filter(provider => provider instanceof TheiaQuickAccessDescriptor)
.map(provider => (provider as TheiaQuickAccessDescriptor).theiaDescriptor);
}
getQuickAccessProvider(prefix: string): QuickAccessProviderDescriptor | undefined {
const monacoDescriptor = this.monacoRegistry.getQuickAccessProvider(prefix);
return monacoDescriptor ? (monacoDescriptor as TheiaQuickAccessDescriptor).theiaDescriptor : undefined;
}
clear(): void {
if (this.monacoRegistry instanceof VSCodeQuickAccessRegistry) {
this.monacoRegistry.clear();
}
}
}