diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 1ec9c67719a..9f6240ab3b6 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -152,7 +152,7 @@ export class ExtensionManagementService implements IExtensionManagementService { nls.localize('install', "Yes"), nls.localize('doNotInstall', "No") ]; - return this.choiceService.choose(Severity.Info, message, options, true) + return this.choiceService.choose(Severity.Info, message, options, 1, true) .then(value => { if (value === 0) { return this.installWithDependencies(compatibleVersion); @@ -330,7 +330,7 @@ export class ExtensionManagementService implements IExtensionManagementService { nls.localize('uninstallAll', "All"), nls.localize('cancel', "Cancel") ]; - return this.choiceService.choose(Severity.Info, message, options, true) + return this.choiceService.choose(Severity.Info, message, options, 2, true) .then(value => { if (value === 0) { return this.uninstallWithDependencies(extension, [], installed); @@ -353,7 +353,7 @@ export class ExtensionManagementService implements IExtensionManagementService { nls.localize('ok', "OK"), nls.localize('cancel', "Cancel") ]; - return this.choiceService.choose(Severity.Info, message, options, true) + return this.choiceService.choose(Severity.Info, message, options, 1, true) .then(value => { if (value === 0) { return this.uninstallWithDependencies(extension, [], installed); diff --git a/src/vs/platform/message/common/message.ts b/src/vs/platform/message/common/message.ts index ed5da01eb0f..8a04042fff4 100644 --- a/src/vs/platform/message/common/message.ts +++ b/src/vs/platform/message/common/message.ts @@ -74,7 +74,7 @@ export interface IChoiceService { * `Cancel` option is returned. If there is no such option then promise with * `0` index is returned. */ - choose(severity: Severity, message: string, options: string[], modal?: boolean): TPromise; + choose(severity: Severity, message: string, options: string[], cancelId: number, modal?: boolean): TPromise; } export import Severity = Severity; \ No newline at end of file diff --git a/src/vs/platform/message/common/messageIpc.ts b/src/vs/platform/message/common/messageIpc.ts index a8533f9d441..a6c009e32ec 100644 --- a/src/vs/platform/message/common/messageIpc.ts +++ b/src/vs/platform/message/common/messageIpc.ts @@ -19,9 +19,9 @@ export class ChoiceChannel implements IChoiceChannel { constructor( @IChoiceService private choiceService: IChoiceService) { } - call(command: string, args?: any): TPromise { + call(command: string, args?: [Severity, string, string[], number, boolean]): TPromise { switch (command) { - case 'choose': return this.choiceService.choose(args[0], args[1], args[2], args[3]); + case 'choose': return this.choiceService.choose(args[0], args[1], args[2], args[3], args[4]); } return TPromise.wrapError('invalid command'); } @@ -33,7 +33,7 @@ export class ChoiceChannelClient implements IChoiceService { constructor(private channel: IChoiceChannel) { } - choose(severity: Severity, message: string, options: string[], modal?: boolean): TPromise { - return this.channel.call('choose', [severity, message, options, modal]); + choose(severity: Severity, message: string, options: string[], cancelId: number, modal?: boolean): TPromise { + return this.channel.call('choose', [severity, message, options, cancelId, modal]); } } \ No newline at end of file diff --git a/src/vs/platform/message/node/messageCli.ts b/src/vs/platform/message/node/messageCli.ts index b50bbefd006..846261e9574 100644 --- a/src/vs/platform/message/node/messageCli.ts +++ b/src/vs/platform/message/node/messageCli.ts @@ -11,7 +11,7 @@ export class ChoiceCliService implements IChoiceService { _serviceBrand: any; - choose(severity: Severity, message: string, options: string[]): TPromise { + choose(severity: Severity, message: string, options: string[], cancelId: number): TPromise { const promise = new TPromise((c, e) => { const rl = readline.createInterface({ input: process.stdin, diff --git a/src/vs/workbench/api/node/mainThreadMessageService.ts b/src/vs/workbench/api/node/mainThreadMessageService.ts index c8d9c07996e..840111c180e 100644 --- a/src/vs/workbench/api/node/mainThreadMessageService.ts +++ b/src/vs/workbench/api/node/mainThreadMessageService.ts @@ -69,25 +69,27 @@ export class MainThreadMessageService extends MainThreadMessageServiceShape { } private showModalMessage(severity: Severity, message: string, commands: { title: string; isCloseAffordance: boolean; handle: number; }[]): Thenable { - let hasCloseAffordance = false; + let cancelId: number | undefined = void 0; const options = commands.map((command, index) => { if (command.isCloseAffordance === true) { - hasCloseAffordance = true; + cancelId = index; } return command.title; }); - if (!hasCloseAffordance) { + if (cancelId === void 0) { if (options.length > 0) { options.push(nls.localize('cancel', "Cancel")); } else { options.push(nls.localize('ok', "OK")); } + + cancelId = options.length - 1; } - return this._choiceService.choose(severity, message, options, true) + return this._choiceService.choose(severity, message, options, cancelId, true) .then(result => result === commands.length ? undefined : commands[result].handle); } } diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts index 7b88f2d43cf..930fd9d6769 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts @@ -171,7 +171,7 @@ export class ExtensionTipsService implements IExtensionTipsService { localize('close', "Close") ]; - this.choiceService.choose(Severity.Info, message, options).done(choice => { + this.choiceService.choose(Severity.Info, message, options, 2).done(choice => { switch (choice) { case 0: return recommendationsAction.run(); case 1: @@ -218,7 +218,7 @@ export class ExtensionTipsService implements IExtensionTipsService { localize('close', "Close") ]; - this.choiceService.choose(Severity.Info, message, options).done(choice => { + this.choiceService.choose(Severity.Info, message, options, 2).done(choice => { switch (choice) { case 0: return action.run(); case 1: return this.storageService.store(storageKey, true, StorageScope.WORKSPACE); diff --git a/src/vs/workbench/parts/extensions/electron-browser/keymapExtensions.ts b/src/vs/workbench/parts/extensions/electron-browser/keymapExtensions.ts index 58467357b2c..5c30ad7c0be 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/keymapExtensions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/keymapExtensions.ts @@ -73,7 +73,7 @@ export class KeymapExtensions implements IWorkbenchContribution { nls.localize('yes', "Yes"), nls.localize('no', "No") ]; - return this.choiceService.choose(Severity.Info, message, options, false) + return this.choiceService.choose(Severity.Info, message, options, 1, false) .then(value => { const confirmed = value === 0; telemetryData['confirmed'] = confirmed; diff --git a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts index 5eb64ac1790..bcaad136e04 100644 --- a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts @@ -533,7 +533,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { nls.localize('enable', "Yes"), nls.localize('doNotEnable', "No") ]; - return this.choiceService.choose(Severity.Info, message, options, true) + return this.choiceService.choose(Severity.Info, message, options, 1, true) .then(value => { if (value === 0) { return this.checkAndSetEnablement(extension, dependencies, true, workspace); @@ -549,7 +549,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { nls.localize('disableAll', "All"), nls.localize('cancel', "Cancel") ]; - return this.choiceService.choose(Severity.Info, message, options, true) + return this.choiceService.choose(Severity.Info, message, options, 2, true) .then(value => { if (value === 0) { return this.checkAndSetEnablement(extension, [], false, workspace); diff --git a/src/vs/workbench/parts/git/browser/gitActions.ts b/src/vs/workbench/parts/git/browser/gitActions.ts index 7b7a0825ebf..0b80d5e1663 100644 --- a/src/vs/workbench/parts/git/browser/gitActions.ts +++ b/src/vs/workbench/parts/git/browser/gitActions.ts @@ -1205,7 +1205,7 @@ export class SyncAction extends GitAction { const message = nls.localize('sync is unpredictable', "This action will push and pull commits to and from '{0}'.", HEAD.upstream); const options = [nls.localize('ok', "OK"), nls.localize('cancel', "Cancel"), nls.localize('never again', "OK, Never Show Again")]; - return this.choiceService.choose(Severity.Warning, message, options).then(choice => { + return this.choiceService.choose(Severity.Warning, message, options, 1).then(choice => { switch (choice) { case 0: return this.sync(); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts index 54650531ec0..b356edb05eb 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts @@ -132,7 +132,7 @@ export class TerminalConfigHelper implements ITerminalConfigHelper { } const message = nls.localize('terminal.integrated.allowWorkspaceShell', "Do you allow {0} (defined as a workspace setting) to be launched in the terminal?", changeString); const options = [nls.localize('allow', "Allow"), nls.localize('disallow', "Disallow")]; - this._choiceService.choose(Severity.Info, message, options).then(choice => { + this._choiceService.choose(Severity.Info, message, options, 1).then(choice => { switch (choice) { case 0: this._storageService.store(IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, true, StorageScope.WORKSPACE); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index 691273627f5..5c3a969a73a 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -95,7 +95,7 @@ export class TerminalService extends AbstractTerminalService implements ITermina const message = nls.localize('terminal.integrated.chooseWindowsShellInfo', "You can change the default terminal shell by selecting the customize button."); const options = [nls.localize('customize', "Customize"), nls.localize('cancel', "Cancel"), nls.localize('never again', "OK, Never Show Again")]; - this._choiceService.choose(Severity.Info, message, options).then(choice => { + this._choiceService.choose(Severity.Info, message, options, 1).then(choice => { switch (choice) { case 0: return this.selectDefaultWindowsShell().then(shell => { diff --git a/src/vs/workbench/services/message/electron-browser/messageService.ts b/src/vs/workbench/services/message/electron-browser/messageService.ts index bb7e044d8a3..607db7a5253 100644 --- a/src/vs/workbench/services/message/electron-browser/messageService.ts +++ b/src/vs/workbench/services/message/electron-browser/messageService.ts @@ -54,10 +54,10 @@ export class MessageService extends WorkbenchMessageService implements IChoiceSe return result === 0 ? true : false; } - public choose(severity: Severity, message: string, options: string[], modal: boolean = false): TPromise { + public choose(severity: Severity, message: string, options: string[], cancelId: number, modal: boolean = false): TPromise { if (modal) { const type: 'none' | 'info' | 'error' | 'question' | 'warning' = severity === Severity.Info ? 'question' : severity === Severity.Error ? 'error' : severity === Severity.Warning ? 'warning' : 'none'; - return TPromise.wrap(this.showMessageBox({ message, buttons: options, type })); + return TPromise.wrap(this.showMessageBox({ message, buttons: options, type, cancelId })); } let onCancel: () => void = null;