mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-26 11:38:51 +01:00
* Provide additional workspace API to add/remove workspace folders (for #35407) * add/removeFolders => add/removeFolder * make add/remove folder return a boolean * use proper service for workspace editing * workspac => workspace * do not log promise canceled messages * show confirm dialog
This commit is contained in:
@@ -14,8 +14,11 @@ import { MainThreadWorkspaceShape, ExtHostWorkspaceShape, ExtHostContext, MainCo
|
||||
import { IFileService } from 'vs/platform/files/common/files';
|
||||
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||
import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration';
|
||||
import { IRelativePattern } from 'vs/base/common/glob';
|
||||
import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing';
|
||||
import { IMessageService } from 'vs/platform/message/common/message';
|
||||
import { localize } from 'vs/nls';
|
||||
|
||||
@extHostNamedCustomer(MainContext.MainThreadWorkspace)
|
||||
export class MainThreadWorkspace implements MainThreadWorkspaceShape {
|
||||
@@ -30,7 +33,9 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape {
|
||||
@IWorkspaceContextService private readonly _contextService: IWorkspaceContextService,
|
||||
@ITextFileService private readonly _textFileService: ITextFileService,
|
||||
@IConfigurationService private _configurationService: IConfigurationService,
|
||||
@IFileService private readonly _fileService: IFileService
|
||||
@IFileService private readonly _fileService: IFileService,
|
||||
@IWorkspaceEditingService private _workspaceEditingService: IWorkspaceEditingService,
|
||||
@IMessageService private _messageService: IMessageService
|
||||
) {
|
||||
this._proxy = extHostContext.get(ExtHostContext.ExtHostWorkspace);
|
||||
this._contextService.onDidChangeWorkspaceFolders(this._onDidChangeWorkspace, this, this._toDispose);
|
||||
@@ -52,6 +57,51 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape {
|
||||
this._proxy.$acceptWorkspaceData(this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? null : this._contextService.getWorkspace());
|
||||
}
|
||||
|
||||
$addFolder(extensionName: string, uri: URI, name?: string): Thenable<boolean> {
|
||||
return this.confirmAddRemoveFolder(extensionName, uri, false).then(confirmed => {
|
||||
if (!confirmed) {
|
||||
return TPromise.as(false);
|
||||
}
|
||||
|
||||
return this._workspaceEditingService.addFolders([{ uri, name }]).then(() => true);
|
||||
});
|
||||
}
|
||||
|
||||
$removeFolder(extensionName: string, uri: URI): Thenable<boolean> {
|
||||
return this.confirmAddRemoveFolder(extensionName, uri, true).then(confirmed => {
|
||||
if (!confirmed) {
|
||||
return TPromise.as(false);
|
||||
}
|
||||
|
||||
return this._workspaceEditingService.removeFolders([uri]).then(() => true);
|
||||
});
|
||||
}
|
||||
|
||||
private confirmAddRemoveFolder(extensionName, uri: URI, isRemove: boolean): Thenable<boolean> {
|
||||
if (!this._configurationService.getValue<boolean>('workbench.confirmChangesToWorkspaceFromExtensions')) {
|
||||
return TPromise.as(true); // return confirmed if the setting indicates this
|
||||
}
|
||||
|
||||
return this._messageService.confirm({
|
||||
message: isRemove ?
|
||||
localize('folderMessageRemove', "Extension {0} wants to remove a folder from the workspace. Please confirm.", extensionName) :
|
||||
localize('folderMessageAdd', "Extension {0} wants to add a folder to the workspace. Please confirm.", extensionName),
|
||||
detail: localize('folderPath', "Folder path: '{0}'", uri.scheme === 'file' ? uri.fsPath : uri.toString()),
|
||||
type: 'question',
|
||||
primaryButton: isRemove ? localize('removeFolder', "&&Remove Folder") : localize('addFolder', "&&Add Folder"),
|
||||
checkbox: {
|
||||
label: localize('doNotAskAgain', "Do not ask me again")
|
||||
}
|
||||
}).then(confirmation => {
|
||||
let updateConfirmSettingsPromise: TPromise<void> = TPromise.as(void 0);
|
||||
if (confirmation.confirmed && confirmation.checkboxChecked === true) {
|
||||
updateConfirmSettingsPromise = this._configurationService.updateValue('workbench.confirmChangesToWorkspaceFromExtensions', false, ConfigurationTarget.USER);
|
||||
}
|
||||
|
||||
return updateConfirmSettingsPromise.then(() => confirmation.confirmed);
|
||||
});
|
||||
}
|
||||
|
||||
// --- search ---
|
||||
|
||||
$startSearch(include: string | IRelativePattern, exclude: string | IRelativePattern, maxResults: number, requestId: number): Thenable<URI[]> {
|
||||
|
||||
Reference in New Issue
Block a user