workspaceCommands.ts 5.1 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';
M
Martin Aeschlimann 已提交
21
import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs';
I
isidor 已提交
22

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

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

I
isidor 已提交
28 29
// Command registration

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

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

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

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

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

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

		if (!folders || !folders.length) {
			return;
		}

		await workspaceEditingService.addFolders(folders.map(folder => ({ uri: resources.removeTrailingPathSeparator(folder) })));
		await viewletService.openViewlet(viewletService.getDefaultViewletId(), true);
I
isidor 已提交
75 76
	}
});
I
isidor 已提交
77

78
CommandsRegistry.registerCommand(PICK_WORKSPACE_FOLDER_COMMAND_ID, async function (accessor, args?: [IPickOptions<IQuickPickItem>, CancellationToken]) {
C
Christof Marti 已提交
79
	const quickInputService = accessor.get(IQuickInputService);
I
isidor 已提交
80
	const labelService = accessor.get(ILabelService);
I
isidor 已提交
81
	const contextService = accessor.get(IWorkspaceContextService);
C
Christof Marti 已提交
82 83
	const modelService = accessor.get(IModelService);
	const modeService = accessor.get(IModeService);
I
isidor 已提交
84 85 86

	const folders = contextService.getWorkspace().folders;
	if (!folders.length) {
87
		return;
I
isidor 已提交
88 89
	}

90
	const folderPicks: IQuickPickItem[] = folders.map(folder => {
I
isidor 已提交
91 92
		return {
			label: folder.name,
M
Martin Aeschlimann 已提交
93
			description: labelService.getUriLabel(resources.dirname(folder.uri), { relative: true }),
I
isidor 已提交
94
			folder,
C
Christof Marti 已提交
95
			iconClasses: getIconClasses(modelService, modeService, folder.uri, FileKind.ROOT_FOLDER)
96
		};
I
isidor 已提交
97 98
	});

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

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

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

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

113
	const token: CancellationToken = (args ? args[1] : undefined) || CancellationToken.None;
114
	const pick = await quickInputService.pick(folderPicks, options, token);
I
isidor 已提交
115

116
	if (pick) {
I
isidor 已提交
117
		return folders[folderPicks.indexOf(pick)];
118 119 120
	}

	return;
I
isidor 已提交
121
});