workspaceCommands.ts 5.3 KB
Newer Older
I
isidor 已提交
1 2 3 4 5
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

6
import * as nls from 'vs/nls';
M
Martin Aeschlimann 已提交
7
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
I
isidor 已提交
8
import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing';
I
isidor 已提交
9
import * as resources from 'vs/base/common/resources';
I
isidor 已提交
10
import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
I
isidor 已提交
11
import { CancellationToken } from 'vs/base/common/cancellation';
I
isidor 已提交
12
import { mnemonicButtonLabel } from 'vs/base/common/labels';
I
isidor 已提交
13
import { CommandsRegistry } from 'vs/platform/commands/common/commands';
M
Martin Aeschlimann 已提交
14
import { FileKind } from 'vs/platform/files/common/files';
I
isidor 已提交
15
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
I
isidor 已提交
16
import { ILabelService } from 'vs/platform/label/common/label';
C
Christof Marti 已提交
17
import { IQuickInputService, IPickOptions, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput';
18
import { getIconClasses } from 'vs/workbench/browser/getIconClasses';
C
Christof Marti 已提交
19 20
import { IModelService } from 'vs/editor/common/services/modelService';
import { IModeService } from 'vs/editor/common/services/modeService';
21
import { Schemas } from 'vs/base/common/network';
M
Martin Aeschlimann 已提交
22
import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs';
I
isidor 已提交
23

I
isidor 已提交
24
export const ADD_ROOT_FOLDER_COMMAND_ID = 'addRootFolder';
I
isidor 已提交
25 26
export const ADD_ROOT_FOLDER_LABEL = nls.localize('addFolderToWorkspace', "Add Folder to Workspace...");

I
isidor 已提交
27 28
export const PICK_WORKSPACE_FOLDER_COMMAND_ID = '_workbench.pickWorkspaceFolder';

I
isidor 已提交
29 30
// Command registration

I
isidor 已提交
31 32
CommandsRegistry.registerCommand({
	id: 'workbench.action.files.openFileFolderInNewWindow',
M
Martin Aeschlimann 已提交
33
	handler: (accessor: ServicesAccessor) => accessor.get(IFileDialogService).pickFileFolderAndOpen({ forceNewWindow: true })
I
isidor 已提交
34 35 36 37
});

CommandsRegistry.registerCommand({
	id: '_files.pickFolderAndOpen',
M
Martin Aeschlimann 已提交
38
	handler: (accessor: ServicesAccessor, forceNewWindow: boolean) => accessor.get(IFileDialogService).pickFolderAndOpen({ forceNewWindow })
I
isidor 已提交
39 40 41 42
});

CommandsRegistry.registerCommand({
	id: 'workbench.action.files.openFolderInNewWindow',
M
Martin Aeschlimann 已提交
43
	handler: (accessor: ServicesAccessor) => accessor.get(IFileDialogService).pickFolderAndOpen({ forceNewWindow: true })
I
isidor 已提交
44 45 46 47
});

CommandsRegistry.registerCommand({
	id: 'workbench.action.files.openFileInNewWindow',
M
Martin Aeschlimann 已提交
48
	handler: (accessor: ServicesAccessor) => accessor.get(IFileDialogService).pickFileAndOpen({ forceNewWindow: true })
I
isidor 已提交
49 50 51 52
});

CommandsRegistry.registerCommand({
	id: 'workbench.action.openWorkspaceInNewWindow',
M
Martin Aeschlimann 已提交
53
	handler: (accessor: ServicesAccessor) => accessor.get(IFileDialogService).pickWorkspaceAndOpen({ forceNewWindow: true })
I
isidor 已提交
54 55
});

I
isidor 已提交
56 57 58
CommandsRegistry.registerCommand({
	id: ADD_ROOT_FOLDER_COMMAND_ID,
	handler: (accessor) => {
I
isidor 已提交
59 60
		const viewletService = accessor.get(IViewletService);
		const workspaceEditingService = accessor.get(IWorkspaceEditingService);
M
Martin Aeschlimann 已提交
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
		const dialogsService = accessor.get(IFileDialogService);
		return dialogsService.showOpenDialog({
			openLabel: mnemonicButtonLabel(nls.localize({ key: 'add', comment: ['&& denotes a mnemonic'] }, "&&Add")),
			title: nls.localize('addFolderToWorkspaceTitle', "Add Folder to Workspace"),
			canSelectFolders: true,
			canSelectMany: true,
			defaultUri: dialogsService.defaultFolderPath(Schemas.file)
		}).then(folders => {
			if (!folders || !folders.length) {
				return null;
			}

			// Add and show Files Explorer viewlet
			return workspaceEditingService.addFolders(folders.map(folder => ({ uri: folder })))
				.then(() => viewletService.openViewlet(viewletService.getDefaultViewletId(), true))
				.then(() => void 0);
		});
I
isidor 已提交
78 79
	}
});
I
isidor 已提交
80

C
Christof Marti 已提交
81
CommandsRegistry.registerCommand(PICK_WORKSPACE_FOLDER_COMMAND_ID, function (accessor, args?: [IPickOptions<IQuickPickItem>, CancellationToken]) {
C
Christof Marti 已提交
82
	const quickInputService = accessor.get(IQuickInputService);
I
isidor 已提交
83
	const labelService = accessor.get(ILabelService);
I
isidor 已提交
84
	const contextService = accessor.get(IWorkspaceContextService);
C
Christof Marti 已提交
85 86
	const modelService = accessor.get(IModelService);
	const modeService = accessor.get(IModeService);
I
isidor 已提交
87 88 89 90 91 92 93 94 95

	const folders = contextService.getWorkspace().folders;
	if (!folders.length) {
		return void 0;
	}

	const folderPicks = folders.map(folder => {
		return {
			label: folder.name,
96
			description: labelService.getUriLabel(resources.dirname(folder.uri), { relative: true }),
I
isidor 已提交
97
			folder,
C
Christof Marti 已提交
98 99
			iconClasses: getIconClasses(modelService, modeService, folder.uri, FileKind.ROOT_FOLDER)
		} as IQuickPickItem;
I
isidor 已提交
100 101
	});

C
Christof Marti 已提交
102
	let options: IPickOptions<IQuickPickItem>;
I
isidor 已提交
103 104 105 106 107 108 109 110
	if (args) {
		options = args[0];
	}

	if (!options) {
		options = Object.create(null);
	}

C
Christof Marti 已提交
111 112
	if (!options.activeItem) {
		options.activeItem = folderPicks[0];
I
isidor 已提交
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
	}

	if (!options.placeHolder) {
		options.placeHolder = nls.localize('workspaceFolderPickerPlaceholder', "Select workspace folder");
	}

	if (typeof options.matchOnDescription !== 'boolean') {
		options.matchOnDescription = true;
	}

	let token: CancellationToken;
	if (args) {
		token = args[1];
	}

	if (!token) {
		token = CancellationToken.None;
	}

C
Christof Marti 已提交
132
	return quickInputService.pick(folderPicks, options, token).then(pick => {
I
isidor 已提交
133 134 135 136 137 138 139
		if (!pick) {
			return void 0;
		}

		return folders[folderPicks.indexOf(pick)];
	});
});