workspaceActions.ts 7.9 KB
Newer Older
1 2 3 4 5 6
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

import { Action } from 'vs/base/common/actions';
7
import * as nls from 'vs/nls';
B
Benjamin Pasero 已提交
8
import { IWindowService } from 'vs/platform/windows/common/windows';
9
import { ITelemetryData } from 'vs/platform/telemetry/common/telemetry';
10
import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
B
Benjamin Pasero 已提交
11
import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing';
12
import { WORKSPACE_FILTER, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces';
I
isidor 已提交
13
import { mnemonicButtonLabel } from 'vs/base/common/labels';
14
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
I
isidor 已提交
15
import { ICommandService } from 'vs/platform/commands/common/commands';
M
Martin Aeschlimann 已提交
16
import { ADD_ROOT_FOLDER_COMMAND_ID, ADD_ROOT_FOLDER_LABEL, PICK_WORKSPACE_FOLDER_COMMAND_ID } from 'vs/workbench/browser/actions/workspaceCommands';
17
import { URI } from 'vs/base/common/uri';
18
import { Schemas } from 'vs/base/common/network';
M
Martin Aeschlimann 已提交
19
import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs';
20 21 22

export class OpenFileAction extends Action {

23
	static readonly ID = 'workbench.action.files.openFile';
24 25 26 27 28
	static LABEL = nls.localize('openFile', "Open File...");

	constructor(
		id: string,
		label: string,
29
		@IFileDialogService private readonly dialogService: IFileDialogService
30 31 32 33
	) {
		super(id, label);
	}

J
Johannes Rieken 已提交
34
	run(event?: any, data?: ITelemetryData): Promise<any> {
M
Martin Aeschlimann 已提交
35
		return this.dialogService.pickFileAndOpen({ forceNewWindow: false, telemetryExtraData: data });
36 37
	}
}
38 39 40

export class OpenFolderAction extends Action {

41
	static readonly ID = 'workbench.action.files.openFolder';
42 43 44 45 46
	static LABEL = nls.localize('openFolder', "Open Folder...");

	constructor(
		id: string,
		label: string,
47
		@IFileDialogService private readonly dialogService: IFileDialogService
48 49 50 51
	) {
		super(id, label);
	}

J
Johannes Rieken 已提交
52
	run(event?: any, data?: ITelemetryData): Promise<any> {
M
Martin Aeschlimann 已提交
53
		return this.dialogService.pickFolderAndOpen({ forceNewWindow: false, telemetryExtraData: data });
54 55 56 57 58
	}
}

export class OpenFileFolderAction extends Action {

59
	static readonly ID = 'workbench.action.files.openFileFolder';
60 61 62 63 64
	static LABEL = nls.localize('openFileFolder', "Open...");

	constructor(
		id: string,
		label: string,
65
		@IFileDialogService private readonly dialogService: IFileDialogService
66 67 68 69
	) {
		super(id, label);
	}

J
Johannes Rieken 已提交
70
	run(event?: any, data?: ITelemetryData): Promise<any> {
M
Martin Aeschlimann 已提交
71
		return this.dialogService.pickFileFolderAndOpen({ forceNewWindow: false, telemetryExtraData: data });
72
	}
B
Benjamin Pasero 已提交
73 74
}

I
isidor 已提交
75
export class AddRootFolderAction extends Action {
B
Benjamin Pasero 已提交
76

77
	static readonly ID = 'workbench.action.addRootFolder';
I
isidor 已提交
78
	static LABEL = ADD_ROOT_FOLDER_LABEL;
B
Benjamin Pasero 已提交
79 80 81 82

	constructor(
		id: string,
		label: string,
83
		@ICommandService private readonly commandService: ICommandService
B
Benjamin Pasero 已提交
84
	) {
I
isidor 已提交
85
		super(id, label);
B
Benjamin Pasero 已提交
86 87
	}

J
Johannes Rieken 已提交
88
	run(): Promise<any> {
I
isidor 已提交
89
		return this.commandService.executeCommand(ADD_ROOT_FOLDER_COMMAND_ID);
S
Sandeep Somavarapu 已提交
90
	}
B
Benjamin Pasero 已提交
91
}
S
Sandeep Somavarapu 已提交
92

I
isidor 已提交
93
export class GlobalRemoveRootFolderAction extends Action {
94

95
	static readonly ID = 'workbench.action.removeRootFolder';
96 97 98 99 100
	static LABEL = nls.localize('globalRemoveFolderFromWorkspace', "Remove Folder from Workspace...");

	constructor(
		id: string,
		label: string,
101 102 103
		@IWorkspaceEditingService private readonly workspaceEditingService: IWorkspaceEditingService,
		@IWorkspaceContextService private readonly contextService: IWorkspaceContextService,
		@ICommandService private readonly commandService: ICommandService
104
	) {
I
isidor 已提交
105
		super(id, label);
106 107
	}

J
Johannes Rieken 已提交
108
	run(): Promise<any> {
109 110 111 112
		const state = this.contextService.getWorkbenchState();

		// Workspace / Folder
		if (state === WorkbenchState.WORKSPACE || state === WorkbenchState.FOLDER) {
I
isidor 已提交
113
			return this.commandService.executeCommand<IWorkspaceFolder>(PICK_WORKSPACE_FOLDER_COMMAND_ID).then(folder => {
114
				if (folder) {
S
Sandeep Somavarapu 已提交
115
					return this.workspaceEditingService.removeFolders([folder.uri]).then(() => true);
116 117 118 119 120 121
				}

				return true;
			});
		}

122
		return Promise.resolve(true);
123 124 125
	}
}

I
isidor 已提交
126
export class SaveWorkspaceAsAction extends Action {
127

128
	static readonly ID = 'workbench.action.saveWorkspaceAs';
129
	static LABEL = nls.localize('saveWorkspaceAsAction', "Save Workspace As...");
130 131 132 133

	constructor(
		id: string,
		label: string,
134 135 136
		@IWorkspaceContextService private readonly contextService: IWorkspaceContextService,
		@IWorkspaceEditingService private readonly workspaceEditingService: IWorkspaceEditingService,
		@IFileDialogService private readonly dialogService: IFileDialogService
M
Martin Aeschlimann 已提交
137

138
	) {
I
isidor 已提交
139
		super(id, label);
140 141
	}

J
Johannes Rieken 已提交
142
	run(): Promise<any> {
143
		return this.getNewWorkspaceConfigPath().then((configPathUri): Promise<void> | void => {
M
Martin Aeschlimann 已提交
144 145
			if (configPathUri) {
				const configPath = configPathUri.fsPath;
146 147 148 149 150 151 152 153 154
				switch (this.contextService.getWorkbenchState()) {
					case WorkbenchState.EMPTY:
					case WorkbenchState.FOLDER:
						const folders = this.contextService.getWorkspace().folders.map(folder => ({ uri: folder.uri }));
						return this.workspaceEditingService.createAndEnterWorkspace(folders, configPath);

					case WorkbenchState.WORKSPACE:
						return this.workspaceEditingService.saveAndEnterWorkspace(configPath);
				}
S
Sandeep Somavarapu 已提交
155
			}
156
		});
S
Sandeep Somavarapu 已提交
157 158
	}

159
	private getNewWorkspaceConfigPath(): Promise<URI | undefined> {
M
Martin Aeschlimann 已提交
160
		return this.dialogService.showSaveDialog({
161
			saveLabel: mnemonicButtonLabel(nls.localize({ key: 'save', comment: ['&& denotes a mnemonic'] }, "&&Save")),
S
Sandeep Somavarapu 已提交
162 163
			title: nls.localize('saveWorkspace', "Save Workspace"),
			filters: WORKSPACE_FILTER,
M
Martin Aeschlimann 已提交
164
			defaultUri: this.dialogService.defaultWorkspacePath(Schemas.file)
S
Sandeep Somavarapu 已提交
165
		});
166 167 168 169 170
	}
}

export class OpenWorkspaceAction extends Action {

171
	static readonly ID = 'workbench.action.openWorkspace';
172 173 174 175 176
	static LABEL = nls.localize('openWorkspaceAction', "Open Workspace...");

	constructor(
		id: string,
		label: string,
177
		@IFileDialogService private readonly dialogService: IFileDialogService
178 179 180 181
	) {
		super(id, label);
	}

J
Johannes Rieken 已提交
182
	run(event?: any, data?: ITelemetryData): Promise<any> {
M
Martin Aeschlimann 已提交
183
		return this.dialogService.pickWorkspaceAndOpen({ telemetryExtraData: data });
184
	}
185 186
}

187 188
export class OpenWorkspaceConfigFileAction extends Action {

B
Benjamin Pasero 已提交
189 190
	static readonly ID = 'workbench.action.openWorkspaceConfigFile';
	static readonly LABEL = nls.localize('openWorkspaceConfigFile', "Open Workspace Configuration File");
191 192 193 194

	constructor(
		id: string,
		label: string,
195 196
		@IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService,
		@IEditorService private readonly editorService: IEditorService
197 198
	) {
		super(id, label);
B
Benjamin Pasero 已提交
199

200
		this.enabled = !!this.workspaceContextService.getWorkspace().configuration;
201 202
	}

J
Johannes Rieken 已提交
203
	run(): Promise<any> {
204 205 206 207 208
		const configuration = this.workspaceContextService.getWorkspace().configuration;
		if (configuration) {
			return this.editorService.openEditor({ resource: configuration });
		}
		return Promise.resolve();
209
	}
210 211
}

I
isidor 已提交
212
export class DuplicateWorkspaceInNewWindowAction extends Action {
213

B
Benjamin Pasero 已提交
214 215
	static readonly ID = 'workbench.action.duplicateWorkspaceInNewWindow';
	static readonly LABEL = nls.localize('duplicateWorkspaceInNewWindow', "Duplicate Workspace in New Window");
216 217 218 219

	constructor(
		id: string,
		label: string,
220 221 222 223
		@IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService,
		@IWorkspaceEditingService private readonly workspaceEditingService: IWorkspaceEditingService,
		@IWindowService private readonly windowService: IWindowService,
		@IWorkspacesService private readonly workspacesService: IWorkspacesService
224 225 226 227
	) {
		super(id, label);
	}

J
Johannes Rieken 已提交
228
	run(): Promise<any> {
229 230
		const folders = this.workspaceContextService.getWorkspace().folders;

I
isidor 已提交
231 232
		return this.workspacesService.createWorkspace(folders).then(newWorkspace => {
			return this.workspaceEditingService.copyWorkspaceSettings(newWorkspace).then(() => {
233
				return this.windowService.openWindow([URI.file(newWorkspace.configPath)], { forceNewWindow: true });
234 235 236
			});
		});
	}
I
isidor 已提交
237
}