Files
theia-code-os/packages/terminal/src/browser/terminal-quick-open-service.ts
mawkone 8bb5110148
Some checks failed
Playwright Tests / Playwright Tests (ubuntu-22.04, Node.js 22.x) (push) Has been cancelled
3PP License Check / 3PP License Check (11, 22.x, ubuntu-22.04) (push) Has been cancelled
Publish packages to NPM / Perform Publishing (push) Has been cancelled
deploy: current vibn theia state
Made-with: Cursor
2026-02-27 12:01:08 -08:00

133 lines
5.0 KiB
TypeScript

// *****************************************************************************
// Copyright (C) 2019 Ericsson 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 { inject, injectable, optional } from '@theia/core/shared/inversify';
import {
codiconArray,
QuickAccessContribution,
QuickAccessProvider,
QuickAccessRegistry,
QuickInputService
} from '@theia/core/lib/browser';
import { CancellationToken, CommandContribution, CommandRegistry, CommandService, nls } from '@theia/core/lib/common';
import { TerminalWidget } from './base/terminal-widget';
import { TerminalService } from './base/terminal-service';
import { TerminalCommands } from './terminal-frontend-contribution';
import { filterItems, QuickPickItem, QuickPicks } from '@theia/core/lib/browser/quick-input/quick-input-service';
@injectable()
export class TerminalQuickOpenService implements QuickAccessProvider {
static readonly PREFIX = 'term ';
@inject(QuickInputService) @optional()
protected readonly quickInputService: QuickInputService;
@inject(QuickAccessRegistry)
protected readonly quickAccessRegistry: QuickAccessRegistry;
@inject(CommandService)
protected readonly commandService: CommandService;
@inject(TerminalService)
protected readonly terminalService: TerminalService;
open(): void {
this.quickInputService?.open(TerminalQuickOpenService.PREFIX);
}
async getPicks(filter: string, token: CancellationToken): Promise<QuickPicks> {
const items: QuickPickItem[] = [];
// Get the sorted list of currently opened terminal widgets that aren't hidden from users
const widgets: TerminalWidget[] = this.terminalService.all.filter(widget => !widget.hiddenFromUser)
.sort((a: TerminalWidget, b: TerminalWidget) => this.compareItems(a, b));
for (const widget of widgets) {
items.push(this.toItem(widget));
}
// Append a quick open item to create a new terminal.
items.push({
label: nls.localizeByDefault('Create New Terminal'),
iconClasses: codiconArray('add'),
execute: () => this.doCreateNewTerminal()
});
return filterItems(items, filter);
}
registerQuickAccessProvider(): void {
this.quickAccessRegistry.registerQuickAccessProvider({
getInstance: () => this,
prefix: TerminalQuickOpenService.PREFIX,
placeholder: '',
helpEntries: [{ description: nls.localizeByDefault('Show All Opened Terminals'), needsEditor: false }]
});
}
/**
* Compare two terminal widgets by label. If labels are identical, compare by the widget id.
* @param a `TerminalWidget` for comparison
* @param b `TerminalWidget` for comparison
*/
protected compareItems(a: TerminalWidget, b: TerminalWidget): number {
const normalize = (str: string) => str.trim().toLowerCase();
if (normalize(a.title.label) !== normalize(b.title.label)) {
return normalize(a.title.label).localeCompare(normalize(b.title.label));
} else {
return normalize(a.id).localeCompare(normalize(b.id));
}
}
protected doCreateNewTerminal(): void {
this.commandService.executeCommand(TerminalCommands.NEW.id);
}
/**
* Convert the terminal widget to the quick pick item.
* @param {TerminalWidget} widget - the terminal widget.
* @returns quick pick item.
*/
protected toItem(widget: TerminalWidget): QuickPickItem {
return {
label: widget.title.label,
description: widget.id,
ariaLabel: widget.title.label,
execute: () => this.terminalService.open(widget)
};
}
}
/**
* TODO: merge it to TerminalFrontendContribution.
*/
@injectable()
export class TerminalQuickOpenContribution implements CommandContribution, QuickAccessContribution {
@inject(TerminalQuickOpenService)
protected readonly terminalQuickOpenService: TerminalQuickOpenService;
registerQuickAccessProvider(): void {
this.terminalQuickOpenService.registerQuickAccessProvider();
}
registerCommands(commands: CommandRegistry): void {
commands.registerCommand(TerminalCommands.SHOW_ALL_OPENED_TERMINALS, {
execute: () => this.terminalQuickOpenService.open()
});
}
}