Provide additional workspace API to add/remove workspace folders (for #35407) (#36820)

* 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:
Benjamin Pasero
2017-10-30 13:49:48 +00:00
committed by GitHub
parent 7ebc20495c
commit 80ece09d7f
7 changed files with 118 additions and 10 deletions

View File

@@ -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[]> {