diff --git a/packages/task/src/browser/quick-open-task.ts b/packages/task/src/browser/quick-open-task.ts index 330481da74c55..2de0e686b8c83 100644 --- a/packages/task/src/browser/quick-open-task.ts +++ b/packages/task/src/browser/quick-open-task.ts @@ -329,3 +329,47 @@ export class TaskConfigureQuickOpenItem extends QuickOpenGroupItem { return true; } } + +@injectable() +export class TaskTerminateQuickOpen implements QuickOpenModel { + + @inject(QuickOpenService) + protected readonly quickOpenService: QuickOpenService; + + @inject(TaskService) + protected readonly taskService: TaskService; + + async onType(_lookFor: string, acceptor: (items: QuickOpenItem[]) => void): Promise { + const items: QuickOpenItem[] = []; + const runningTasks: TaskInfo[] = await this.taskService.getRunningTasks(); + if (runningTasks.length <= 0) { + items.push(new QuickOpenItem({ + label: 'No task is currently running', + run: (): boolean => false, + })); + } else { + runningTasks.forEach((task: TaskInfo) => { + items.push(new QuickOpenItem({ + label: task.config.label, + run: (mode: QuickOpenMode): boolean => { + if (mode !== QuickOpenMode.OPEN) { + return false; + } + this.taskService.kill(task.taskId); + return true; + } + })); + }); + } + acceptor(items); + } + + async open(): Promise { + this.quickOpenService.open(this, { + placeholder: 'Select task to terminate', + fuzzyMatchLabel: true, + fuzzyMatchDescription: true, + }); + } + +} diff --git a/packages/task/src/browser/task-frontend-contribution.ts b/packages/task/src/browser/task-frontend-contribution.ts index f8b12a0b292e5..6b16f4a3a6ba1 100644 --- a/packages/task/src/browser/task-frontend-contribution.ts +++ b/packages/task/src/browser/task-frontend-contribution.ts @@ -16,7 +16,7 @@ import { inject, injectable, named } from 'inversify'; import { ILogger, ContributionProvider } from '@theia/core/lib/common'; -import { QuickOpenTask } from './quick-open-task'; +import { QuickOpenTask, TaskTerminateQuickOpen } from './quick-open-task'; import { CommandContribution, Command, CommandRegistry, MenuContribution, MenuModelRegistry } from '@theia/core/lib/common'; import { FrontendApplication, FrontendApplicationContribution, QuickOpenContribution, @@ -66,6 +66,12 @@ export namespace TaskCommands { category: TASK_CATEGORY, label: 'Clear History' }; + + export const TASK_TERMINATE: Command = { + id: 'task:terminate', + category: TASK_CATEGORY, + label: 'Terminate Task' + }; } const TASKS_STORAGE_KEY = 'tasks'; @@ -102,6 +108,9 @@ export class TaskFrontendContribution implements CommandContribution, MenuContri @inject(StorageService) protected readonly storageService: StorageService; + @inject(TaskTerminateQuickOpen) + protected readonly taskTerminateQuickOpen: TaskTerminateQuickOpen; + onStart(): void { this.contributionProvider.getContributions().forEach(contrib => { if (contrib.registerResolvers) { @@ -172,6 +181,13 @@ export class TaskFrontendContribution implements CommandContribution, MenuContri execute: () => this.taskService.clearRecentTasks() } ); + + registry.registerCommand( + TaskCommands.TASK_TERMINATE, + { + execute: () => this.taskTerminateQuickOpen.open() + } + ); } registerMenus(menus: MenuModelRegistry): void { diff --git a/packages/task/src/browser/task-frontend-module.ts b/packages/task/src/browser/task-frontend-module.ts index 8e95eba0efddc..eb21be1d6a96c 100644 --- a/packages/task/src/browser/task-frontend-module.ts +++ b/packages/task/src/browser/task-frontend-module.ts @@ -18,7 +18,7 @@ import { ContainerModule } from 'inversify'; import { FrontendApplicationContribution, QuickOpenContribution, KeybindingContribution } from '@theia/core/lib/browser'; import { CommandContribution, MenuContribution, bindContributionProvider } from '@theia/core/lib/common'; import { WebSocketConnectionProvider } from '@theia/core/lib/browser/messaging'; -import { QuickOpenTask } from './quick-open-task'; +import { QuickOpenTask, TaskTerminateQuickOpen } from './quick-open-task'; import { TaskContribution, TaskProviderRegistry, TaskResolverRegistry } from './task-contribution'; import { TaskService } from './task-service'; import { TaskConfigurations } from './task-configurations'; @@ -43,6 +43,7 @@ export default new ContainerModule(bind => { } bind(QuickOpenTask).toSelf().inSingletonScope(); + bind(TaskTerminateQuickOpen).toSelf().inSingletonScope(); bind(TaskConfigurations).toSelf().inSingletonScope(); bind(ProvidedTaskConfigurations).toSelf().inSingletonScope();