quickOpen.ts 5.8 KB
Newer Older
1 2 3 4 5 6 7 8 9
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
'use strict';

import nls = require('vs/nls');
import Filters = require('vs/base/common/filters');
import { TPromise } from 'vs/base/common/winjs.base';
D
Dirk Baeumer 已提交
10
import { Action, IAction } from 'vs/base/common/actions';
11 12 13 14 15
import Quickopen = require('vs/workbench/browser/quickopen');
import QuickOpen = require('vs/base/parts/quickopen/common/quickOpen');
import Model = require('vs/base/parts/quickopen/browser/quickOpenModel');
import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen';

16
import { Task, TaskSourceKind, computeLabel } from 'vs/workbench/parts/tasks/common/tasks';
17
import { ITaskService } from 'vs/workbench/parts/tasks/common/taskService';
18
import { ActionBarContributor, ContributableActionProvider } from 'vs/workbench/browser/actionBarRegistry';
19 20 21

export class TaskEntry extends Model.QuickOpenEntry {

22 23
	private _label: string;

D
Dirk Baeumer 已提交
24
	constructor(protected taskService: ITaskService, protected _task: Task, highlights: Model.IHighlight[] = []) {
25
		super(highlights);
26
		this._label = computeLabel(_task);
27 28 29
	}

	public getLabel(): string {
30
		return this._label;
31 32 33 34 35
	}

	public getAriaLabel(): string {
		return nls.localize('entryAriaLabel', "{0}, tasks", this.getLabel());
	}
D
Dirk Baeumer 已提交
36 37 38 39

	public get task(): Task {
		return this._task;
	}
40 41
}

42 43 44 45 46 47
export class TaskGroupEntry extends Model.QuickOpenEntryGroup {
	constructor(entry: TaskEntry, groupLabel: string, withBorder: boolean) {
		super(entry, groupLabel, withBorder);
	}
}

48 49
export abstract class QuickOpenHandler extends Quickopen.QuickOpenHandler {

50 51 52
	private tasks: TPromise<Task[]>;


53
	constructor(
54 55
		protected quickOpenService: IQuickOpenService,
		protected taskService: ITaskService,
56 57 58 59 60 61 62
	) {
		super();

		this.quickOpenService = quickOpenService;
		this.taskService = taskService;
	}

63 64 65 66 67 68 69 70
	public onOpen(): void {
		this.tasks = this.getTasks();
	}

	public onClose(canceled: boolean): void {
		this.tasks = undefined;
	}

71
	public getResults(input: string): TPromise<Model.QuickOpenModel> {
72 73 74 75 76 77 78 79 80
		return this.tasks.then((tasks) => {
			let entries: Model.QuickOpenEntry[] = [];
			if (tasks.length === 0) {
				return new Model.QuickOpenModel(entries);
			}
			tasks = tasks.sort((a, b) => {
				let aKind = a._source.kind;
				let bKind = b._source.kind;
				if (aKind === bKind) {
81 82 83 84 85 86
					if (aKind === TaskSourceKind.Extension) {
						let compare = a._source.label.localeCompare(b._source.label);
						if (compare !== 0) {
							return compare;
						}
					}
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
					return a.name.localeCompare(b.name);
				}
				if (aKind === TaskSourceKind.Workspace) {
					return -1;
				} else {
					return +1;
				}
			});
			let hasWorkspace: boolean = tasks[0]._source.kind === TaskSourceKind.Workspace;
			let hasExtension: boolean = tasks[tasks.length - 1]._source.kind === TaskSourceKind.Extension;
			let groupWorkspace = hasWorkspace && hasExtension;
			let groupExtension = groupWorkspace;
			let hadWorkspace = false;
			for (let task of tasks) {
				let highlights = Filters.matchesContiguousSubString(input, task.name);
				if (!highlights) {
					continue;
				}
				if (task._source.kind === TaskSourceKind.Workspace && groupWorkspace) {
					groupWorkspace = false;
					hadWorkspace = true;
D
Dirk Baeumer 已提交
108
					entries.push(new TaskGroupEntry(this.createEntry(this.taskService, task, highlights), nls.localize('configured', 'Configured Tasks'), false));
109 110
				} else if (task._source.kind === TaskSourceKind.Extension && groupExtension) {
					groupExtension = false;
D
Dirk Baeumer 已提交
111
					entries.push(new TaskGroupEntry(this.createEntry(this.taskService, task, highlights), nls.localize('detected', 'Detected Tasks'), hadWorkspace));
112 113 114 115
				} else {
					entries.push(this.createEntry(this.taskService, task, highlights));
				}
			}
116
			return new Model.QuickOpenModel(entries, new ContributableActionProvider());
117
		});
118 119 120 121 122 123 124 125 126 127 128
	}

	protected abstract getTasks(): TPromise<Task[]>;

	protected abstract createEntry(taskService: ITaskService, task: Task, highlights: Model.IHighlight[]): TaskEntry;

	public getAutoFocus(input: string): QuickOpen.IAutoFocus {
		return {
			autoFocusFirstEntry: !!input
		};
	}
D
Dirk Baeumer 已提交
129 130 131 132 133 134 135
}

class CustomizeTaskAction extends Action {

	private static ID = 'workbench.action.tasks.customizeTask';
	private static LABEL = nls.localize('customizeTask', "Customize Task");

D
Dirk Baeumer 已提交
136
	constructor(private taskService: ITaskService, private quickOpenService: IQuickOpenService, private task: Task) {
D
Dirk Baeumer 已提交
137 138 139 140 141
		super(CustomizeTaskAction.ID, CustomizeTaskAction.LABEL);
		this.updateClass();
	}

	public updateClass(): void {
142
		this.class = 'quick-open-task-configure';
D
Dirk Baeumer 已提交
143 144
	}

D
Dirk Baeumer 已提交
145 146 147 148
	public run(context: any): TPromise<any> {
		return this.taskService.customize(this.task, true).then(() => {
			this.quickOpenService.close();
		});
D
Dirk Baeumer 已提交
149 150 151 152 153
	}
}

export class QuickOpenActionContributor extends ActionBarContributor {

D
Dirk Baeumer 已提交
154
	constructor( @ITaskService private taskService: ITaskService, @IQuickOpenService private quickOpenService: IQuickOpenService) {
D
Dirk Baeumer 已提交
155 156 157 158
		super();
	}

	public hasActions(context: any): boolean {
D
Dirk Baeumer 已提交
159
		let task = this.getTask(context);
D
Dirk Baeumer 已提交
160

D
Dirk Baeumer 已提交
161
		return !!task;
D
Dirk Baeumer 已提交
162 163 164
	}

	public getActions(context: any): IAction[] {
D
Dirk Baeumer 已提交
165 166 167 168
		let actions: Action[] = [];
		let task = this.getTask(context);
		if (task && task._source.kind === TaskSourceKind.Extension) {
			actions.push(new CustomizeTaskAction(this.taskService, this.quickOpenService, task));
D
Dirk Baeumer 已提交
169 170 171 172
		}
		return actions;
	}

D
Dirk Baeumer 已提交
173 174
	private getTask(context: any): Task {
		if (!context) {
D
Dirk Baeumer 已提交
175 176
			return undefined;
		}
D
Dirk Baeumer 已提交
177 178 179 180 181 182 183
		let element = context.element;
		if (element instanceof TaskEntry) {
			return element.task;
		} else if (element instanceof TaskGroupEntry) {
			return (element.getEntry() as TaskEntry).task;
		}
		return undefined;
D
Dirk Baeumer 已提交
184
	}
185
}