Path: blob/main/src/vs/workbench/electron-browser/parts/dialogs/dialog.contribution.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { IClipboardService } from '../../../../platform/clipboard/common/clipboardService.js';6import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';7import { IDialogHandler, IDialogResult, IDialogService } from '../../../../platform/dialogs/common/dialogs.js';8import { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';9import { ILayoutService } from '../../../../platform/layout/browser/layoutService.js';10import { ILogService } from '../../../../platform/log/common/log.js';11import { INativeHostService } from '../../../../platform/native/common/native.js';12import { IProductService } from '../../../../platform/product/common/productService.js';13import { IWorkbenchContribution, WorkbenchPhase, registerWorkbenchContribution2 } from '../../../common/contributions.js';14import { IDialogsModel, IDialogViewItem } from '../../../common/dialogs.js';15import { BrowserDialogHandler } from '../../../browser/parts/dialogs/dialogHandler.js';16import { NativeDialogHandler } from './dialogHandler.js';17import { DialogService } from '../../../services/dialogs/common/dialogService.js';18import { Disposable } from '../../../../base/common/lifecycle.js';19import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';20import { Lazy } from '../../../../base/common/lazy.js';21import { IOpenerService } from '../../../../platform/opener/common/opener.js';22import { createNativeAboutDialogDetails } from '../../../../platform/dialogs/electron-browser/dialog.js';23import { IWorkbenchEnvironmentService } from '../../../services/environment/common/environmentService.js';2425export class DialogHandlerContribution extends Disposable implements IWorkbenchContribution {2627static readonly ID = 'workbench.contrib.dialogHandler';2829private nativeImpl: Lazy<IDialogHandler>;30private browserImpl: Lazy<IDialogHandler>;3132private model: IDialogsModel;33private currentDialog: IDialogViewItem | undefined;3435constructor(36@IConfigurationService private configurationService: IConfigurationService,37@IDialogService private dialogService: IDialogService,38@ILogService logService: ILogService,39@ILayoutService layoutService: ILayoutService,40@IKeybindingService keybindingService: IKeybindingService,41@IInstantiationService instantiationService: IInstantiationService,42@IProductService private productService: IProductService,43@IClipboardService clipboardService: IClipboardService,44@INativeHostService private nativeHostService: INativeHostService,45@IWorkbenchEnvironmentService private environmentService: IWorkbenchEnvironmentService,46@IOpenerService openerService: IOpenerService47) {48super();4950this.browserImpl = new Lazy(() => new BrowserDialogHandler(logService, layoutService, keybindingService, instantiationService, clipboardService, openerService));51this.nativeImpl = new Lazy(() => new NativeDialogHandler(logService, nativeHostService, clipboardService));5253this.model = (this.dialogService as DialogService).model;5455this._register(this.model.onWillShowDialog(() => {56if (!this.currentDialog) {57this.processDialogs();58}59}));6061this.processDialogs();62}6364private async processDialogs(): Promise<void> {65while (this.model.dialogs.length) {66this.currentDialog = this.model.dialogs[0];6768let result: IDialogResult | Error | undefined = undefined;69try {7071// Confirm72if (this.currentDialog.args.confirmArgs) {73const args = this.currentDialog.args.confirmArgs;74result = (this.useCustomDialog || args?.confirmation.custom) ?75await this.browserImpl.value.confirm(args.confirmation) :76await this.nativeImpl.value.confirm(args.confirmation);77}7879// Input (custom only)80else if (this.currentDialog.args.inputArgs) {81const args = this.currentDialog.args.inputArgs;82result = await this.browserImpl.value.input(args.input);83}8485// Prompt86else if (this.currentDialog.args.promptArgs) {87const args = this.currentDialog.args.promptArgs;88result = (this.useCustomDialog || args?.prompt.custom) ?89await this.browserImpl.value.prompt(args.prompt) :90await this.nativeImpl.value.prompt(args.prompt);91}9293// About94else {95const aboutDialogDetails = createNativeAboutDialogDetails(this.productService, await this.nativeHostService.getOSProperties());9697if (this.useCustomDialog) {98await this.browserImpl.value.about(aboutDialogDetails.title, aboutDialogDetails.details, aboutDialogDetails.detailsToCopy);99} else {100await this.nativeImpl.value.about(aboutDialogDetails.title, aboutDialogDetails.details, aboutDialogDetails.detailsToCopy);101}102}103} catch (error) {104result = error;105}106107this.currentDialog.close(result);108this.currentDialog = undefined;109}110}111112private get useCustomDialog(): boolean {113return this.configurationService.getValue('window.dialogStyle') === 'custom' ||114// Use the custom dialog while driven so that the driver can interact with it115!!this.environmentService.enableSmokeTestDriver;116}117}118119registerWorkbenchContribution2(120DialogHandlerContribution.ID,121DialogHandlerContribution,122WorkbenchPhase.BlockStartup // Block to allow for dialogs to show before restore finished123);124125126