Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/electron-browser/parts/dialogs/dialog.contribution.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { IClipboardService } from '../../../../platform/clipboard/common/clipboardService.js';
7
import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';
8
import { IDialogHandler, IDialogResult, IDialogService } from '../../../../platform/dialogs/common/dialogs.js';
9
import { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';
10
import { ILayoutService } from '../../../../platform/layout/browser/layoutService.js';
11
import { ILogService } from '../../../../platform/log/common/log.js';
12
import { INativeHostService } from '../../../../platform/native/common/native.js';
13
import { IProductService } from '../../../../platform/product/common/productService.js';
14
import { IWorkbenchContribution, WorkbenchPhase, registerWorkbenchContribution2 } from '../../../common/contributions.js';
15
import { IDialogsModel, IDialogViewItem } from '../../../common/dialogs.js';
16
import { BrowserDialogHandler } from '../../../browser/parts/dialogs/dialogHandler.js';
17
import { NativeDialogHandler } from './dialogHandler.js';
18
import { DialogService } from '../../../services/dialogs/common/dialogService.js';
19
import { Disposable } from '../../../../base/common/lifecycle.js';
20
import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';
21
import { Lazy } from '../../../../base/common/lazy.js';
22
import { IOpenerService } from '../../../../platform/opener/common/opener.js';
23
import { createNativeAboutDialogDetails } from '../../../../platform/dialogs/electron-browser/dialog.js';
24
import { IWorkbenchEnvironmentService } from '../../../services/environment/common/environmentService.js';
25
26
export class DialogHandlerContribution extends Disposable implements IWorkbenchContribution {
27
28
static readonly ID = 'workbench.contrib.dialogHandler';
29
30
private nativeImpl: Lazy<IDialogHandler>;
31
private browserImpl: Lazy<IDialogHandler>;
32
33
private model: IDialogsModel;
34
private currentDialog: IDialogViewItem | undefined;
35
36
constructor(
37
@IConfigurationService private configurationService: IConfigurationService,
38
@IDialogService private dialogService: IDialogService,
39
@ILogService logService: ILogService,
40
@ILayoutService layoutService: ILayoutService,
41
@IKeybindingService keybindingService: IKeybindingService,
42
@IInstantiationService instantiationService: IInstantiationService,
43
@IProductService private productService: IProductService,
44
@IClipboardService clipboardService: IClipboardService,
45
@INativeHostService private nativeHostService: INativeHostService,
46
@IWorkbenchEnvironmentService private environmentService: IWorkbenchEnvironmentService,
47
@IOpenerService openerService: IOpenerService
48
) {
49
super();
50
51
this.browserImpl = new Lazy(() => new BrowserDialogHandler(logService, layoutService, keybindingService, instantiationService, clipboardService, openerService));
52
this.nativeImpl = new Lazy(() => new NativeDialogHandler(logService, nativeHostService, clipboardService));
53
54
this.model = (this.dialogService as DialogService).model;
55
56
this._register(this.model.onWillShowDialog(() => {
57
if (!this.currentDialog) {
58
this.processDialogs();
59
}
60
}));
61
62
this.processDialogs();
63
}
64
65
private async processDialogs(): Promise<void> {
66
while (this.model.dialogs.length) {
67
this.currentDialog = this.model.dialogs[0];
68
69
let result: IDialogResult | Error | undefined = undefined;
70
try {
71
72
// Confirm
73
if (this.currentDialog.args.confirmArgs) {
74
const args = this.currentDialog.args.confirmArgs;
75
result = (this.useCustomDialog || args?.confirmation.custom) ?
76
await this.browserImpl.value.confirm(args.confirmation) :
77
await this.nativeImpl.value.confirm(args.confirmation);
78
}
79
80
// Input (custom only)
81
else if (this.currentDialog.args.inputArgs) {
82
const args = this.currentDialog.args.inputArgs;
83
result = await this.browserImpl.value.input(args.input);
84
}
85
86
// Prompt
87
else if (this.currentDialog.args.promptArgs) {
88
const args = this.currentDialog.args.promptArgs;
89
result = (this.useCustomDialog || args?.prompt.custom) ?
90
await this.browserImpl.value.prompt(args.prompt) :
91
await this.nativeImpl.value.prompt(args.prompt);
92
}
93
94
// About
95
else {
96
const aboutDialogDetails = createNativeAboutDialogDetails(this.productService, await this.nativeHostService.getOSProperties());
97
98
if (this.useCustomDialog) {
99
await this.browserImpl.value.about(aboutDialogDetails.title, aboutDialogDetails.details, aboutDialogDetails.detailsToCopy);
100
} else {
101
await this.nativeImpl.value.about(aboutDialogDetails.title, aboutDialogDetails.details, aboutDialogDetails.detailsToCopy);
102
}
103
}
104
} catch (error) {
105
result = error;
106
}
107
108
this.currentDialog.close(result);
109
this.currentDialog = undefined;
110
}
111
}
112
113
private get useCustomDialog(): boolean {
114
return this.configurationService.getValue('window.dialogStyle') === 'custom' ||
115
// Use the custom dialog while driven so that the driver can interact with it
116
!!this.environmentService.enableSmokeTestDriver;
117
}
118
}
119
120
registerWorkbenchContribution2(
121
DialogHandlerContribution.ID,
122
DialogHandlerContribution,
123
WorkbenchPhase.BlockStartup // Block to allow for dialogs to show before restore finished
124
);
125
126