mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-17 09:35:37 -05:00
124 lines
4.6 KiB
TypeScript
124 lines
4.6 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import * as nls from 'vs/nls';
|
|
import Severity from 'vs/base/common/severity';
|
|
import { Action, IAction } from 'vs/base/common/actions';
|
|
import { MainThreadMessageServiceShape, MainContext, IExtHostContext, MainThreadMessageOptions } from '../common/extHost.protocol';
|
|
import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers';
|
|
import { IDialogService } from 'vs/platform/dialogs/common/dialogs';
|
|
import { INotificationService } from 'vs/platform/notification/common/notification';
|
|
import { Event } from 'vs/base/common/event';
|
|
import { ICommandService } from 'vs/platform/commands/common/commands';
|
|
import { dispose } from 'vs/base/common/lifecycle';
|
|
import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions';
|
|
|
|
@extHostNamedCustomer(MainContext.MainThreadMessageService)
|
|
export class MainThreadMessageService implements MainThreadMessageServiceShape {
|
|
|
|
constructor(
|
|
extHostContext: IExtHostContext,
|
|
@INotificationService private readonly _notificationService: INotificationService,
|
|
@ICommandService private readonly _commandService: ICommandService,
|
|
@IDialogService private readonly _dialogService: IDialogService
|
|
) {
|
|
//
|
|
}
|
|
|
|
dispose(): void {
|
|
//
|
|
}
|
|
|
|
$showMessage(severity: Severity, message: string, options: MainThreadMessageOptions, commands: { title: string; isCloseAffordance: boolean; handle: number; }[]): Promise<number | undefined> {
|
|
if (options.modal) {
|
|
return this._showModalMessage(severity, message, commands);
|
|
} else {
|
|
return this._showMessage(severity, message, commands, options.extension);
|
|
}
|
|
}
|
|
|
|
private _showMessage(severity: Severity, message: string, commands: { title: string; isCloseAffordance: boolean; handle: number; }[], extension: IExtensionDescription | undefined): Promise<number> {
|
|
|
|
return new Promise<number>(resolve => {
|
|
|
|
const primaryActions: MessageItemAction[] = [];
|
|
|
|
class MessageItemAction extends Action {
|
|
constructor(id: string, label: string, handle: number) {
|
|
super(id, label, undefined, true, () => {
|
|
resolve(handle);
|
|
return Promise.resolve();
|
|
});
|
|
}
|
|
}
|
|
|
|
class ManageExtensionAction extends Action {
|
|
constructor(id: ExtensionIdentifier, label: string, commandService: ICommandService) {
|
|
super(id.value, label, undefined, true, () => {
|
|
return commandService.executeCommand('_extensions.manage', id.value);
|
|
});
|
|
}
|
|
}
|
|
|
|
commands.forEach(command => {
|
|
primaryActions.push(new MessageItemAction('_extension_message_handle_' + command.handle, command.title, command.handle));
|
|
});
|
|
|
|
let source: string | undefined;
|
|
if (extension) {
|
|
source = nls.localize('extensionSource', "{0} (Extension)", extension.displayName || extension.name);
|
|
}
|
|
|
|
if (!source) {
|
|
source = nls.localize('defaultSource', "Extension");
|
|
}
|
|
|
|
const secondaryActions: IAction[] = [];
|
|
if (extension && !extension.isUnderDevelopment) {
|
|
secondaryActions.push(new ManageExtensionAction(extension.identifier, nls.localize('manageExtension', "Manage Extension"), this._commandService));
|
|
}
|
|
|
|
const messageHandle = this._notificationService.notify({
|
|
severity,
|
|
message,
|
|
actions: { primary: primaryActions, secondary: secondaryActions },
|
|
source
|
|
});
|
|
|
|
// if promise has not been resolved yet, now is the time to ensure a return value
|
|
// otherwise if already resolved it means the user clicked one of the buttons
|
|
Event.once(messageHandle.onDidClose)(() => {
|
|
dispose(...primaryActions, ...secondaryActions);
|
|
resolve(undefined);
|
|
});
|
|
});
|
|
}
|
|
|
|
private _showModalMessage(severity: Severity, message: string, commands: { title: string; isCloseAffordance: boolean; handle: number; }[]): Promise<number | undefined> {
|
|
let cancelId: number | undefined = undefined;
|
|
|
|
const buttons = commands.map((command, index) => {
|
|
if (command.isCloseAffordance === true) {
|
|
cancelId = index;
|
|
}
|
|
|
|
return command.title;
|
|
});
|
|
|
|
if (cancelId === undefined) {
|
|
if (buttons.length > 0) {
|
|
buttons.push(nls.localize('cancel', "Cancel"));
|
|
} else {
|
|
buttons.push(nls.localize('ok', "OK"));
|
|
}
|
|
|
|
cancelId = buttons.length - 1;
|
|
}
|
|
|
|
return this._dialogService.show(severity, message, buttons, { cancelId })
|
|
.then(result => result === commands.length ? undefined : commands[result].handle);
|
|
}
|
|
}
|