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
5303 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
import { IMarkdownRendererService } from '../../../../platform/markdown/browser/markdownRenderer.js';
26
27
export class DialogHandlerContribution extends Disposable implements IWorkbenchContribution {
28
29
static readonly ID = 'workbench.contrib.dialogHandler';
30
31
private nativeImpl: Lazy<IDialogHandler>;
32
private browserImpl: Lazy<IDialogHandler>;
33
34
private model: IDialogsModel;
35
private currentDialog: IDialogViewItem | undefined;
36
37
constructor(
38
@IConfigurationService private configurationService: IConfigurationService,
39
@IDialogService private dialogService: IDialogService,
40
@ILogService logService: ILogService,
41
@ILayoutService layoutService: ILayoutService,
42
@IKeybindingService keybindingService: IKeybindingService,
43
@IInstantiationService instantiationService: IInstantiationService,
44
@IProductService private productService: IProductService,
45
@IClipboardService clipboardService: IClipboardService,
46
@INativeHostService private nativeHostService: INativeHostService,
47
@IWorkbenchEnvironmentService private environmentService: IWorkbenchEnvironmentService,
48
@IOpenerService openerService: IOpenerService,
49
@IMarkdownRendererService markdownRendererService: IMarkdownRendererService,
50
) {
51
super();
52
53
this.browserImpl = new Lazy(() => new BrowserDialogHandler(logService, layoutService, keybindingService, instantiationService, clipboardService, openerService, markdownRendererService));
54
this.nativeImpl = new Lazy(() => new NativeDialogHandler(logService, nativeHostService, clipboardService));
55
56
this.model = (this.dialogService as DialogService).model;
57
58
this._register(this.model.onWillShowDialog(() => {
59
if (!this.currentDialog) {
60
this.processDialogs();
61
}
62
}));
63
64
this.processDialogs();
65
}
66
67
private async processDialogs(): Promise<void> {
68
while (this.model.dialogs.length) {
69
this.currentDialog = this.model.dialogs[0];
70
71
let result: IDialogResult | Error | undefined = undefined;
72
try {
73
74
// Confirm
75
if (this.currentDialog.args.confirmArgs) {
76
const args = this.currentDialog.args.confirmArgs;
77
result = (this.useCustomDialog || args?.confirmation.custom) ?
78
await this.browserImpl.value.confirm(args.confirmation) :
79
await this.nativeImpl.value.confirm(args.confirmation);
80
}
81
82
// Input (custom only)
83
else if (this.currentDialog.args.inputArgs) {
84
const args = this.currentDialog.args.inputArgs;
85
result = await this.browserImpl.value.input(args.input);
86
}
87
88
// Prompt
89
else if (this.currentDialog.args.promptArgs) {
90
const args = this.currentDialog.args.promptArgs;
91
result = (this.useCustomDialog || args?.prompt.custom) ?
92
await this.browserImpl.value.prompt(args.prompt) :
93
await this.nativeImpl.value.prompt(args.prompt);
94
}
95
96
// About
97
else {
98
const aboutDialogDetails = createNativeAboutDialogDetails(this.productService, await this.nativeHostService.getOSProperties());
99
100
if (this.useCustomDialog) {
101
await this.browserImpl.value.about(aboutDialogDetails.title, aboutDialogDetails.details, aboutDialogDetails.detailsToCopy);
102
} else {
103
await this.nativeImpl.value.about(aboutDialogDetails.title, aboutDialogDetails.details, aboutDialogDetails.detailsToCopy);
104
}
105
}
106
} catch (error) {
107
result = error;
108
}
109
110
this.currentDialog.close(result);
111
this.currentDialog = undefined;
112
}
113
}
114
115
private get useCustomDialog(): boolean {
116
return this.configurationService.getValue('window.dialogStyle') === 'custom' ||
117
// Use the custom dialog while driven so that the driver can interact with it
118
!!this.environmentService.enableSmokeTestDriver;
119
}
120
}
121
122
registerWorkbenchContribution2(
123
DialogHandlerContribution.ID,
124
DialogHandlerContribution,
125
WorkbenchPhase.BlockStartup // Block to allow for dialogs to show before restore finished
126
);
127
128