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/editor/common/services/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',
33
	handler: (accessor: ServicesAccessor) => accessor.get(IFileDialogService).pickFileFolderAndOpen({ forceNewWindow: true, allowLocalPaths: 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',
43
	handler: (accessor: ServicesAccessor) => accessor.get(IFileDialogService).pickFolderAndOpen({ forceNewWindow: true, allowLocalPaths: true })
I
isidor 已提交
44 45 46 47
});

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

CommandsRegistry.registerCommand({
	id: 'workbench.action.openWorkspaceInNewWindow',
53
	handler: (accessor: ServicesAccessor) => accessor.get(IFileDialogService).pickWorkspaceAndOpen({ forceNewWindow: true, allowLocalPaths: 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
		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)
68
		}).then((folders): Promise<any> | null => {
M
Martin Aeschlimann 已提交
69 70 71 72 73 74 75
			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))
R
Rob Lourens 已提交
76
				.then(() => undefined);
M
Martin Aeschlimann 已提交
77
		});
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

	const folders = contextService.getWorkspace().folders;
	if (!folders.length) {
R
Rob Lourens 已提交
90
		return undefined;
I
isidor 已提交
91 92 93 94 95
	}

	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
	});

102
	const options: IPickOptions<IQuickPickItem> = (args ? args[0] : undefined) || Object.create(null);
I
isidor 已提交
103

C
Christof Marti 已提交
104 105
	if (!options.activeItem) {
		options.activeItem = folderPicks[0];
I
isidor 已提交
106 107 108 109 110 111 112 113 114 115
	}

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

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

116
	const token: CancellationToken = (args ? args[1] : undefined) || CancellationToken.None;
I
isidor 已提交
117

C
Christof Marti 已提交
118
	return quickInputService.pick(folderPicks, options, token).then(pick => {
I
isidor 已提交
119
		if (!pick) {
R
Rob Lourens 已提交
120
			return undefined;
I
isidor 已提交
121 122 123 124 125
		}

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