@codingame/monaco-vscode-dialogs-service-override 4.1.0 → 4.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dialogs.js +4 -4
- package/external/rollup-plugin-styles/dist/runtime/inject-css.js +3 -0
- package/external/tslib/tslib.es6.js +11 -0
- package/package.json +2 -2
- package/vscode/src/vs/workbench/browser/parts/dialogs/dialog.web.contribution.js +76 -0
- package/vscode/src/vs/workbench/browser/parts/dialogs/dialogHandler.js +134 -0
- package/vscode/src/vs/workbench/common/dialogs.js +38 -0
- package/vscode/src/vs/workbench/contrib/welcomeDialog/browser/media/welcomeWidget.css.js +6 -0
- package/vscode/src/vs/workbench/contrib/welcomeDialog/browser/welcomeDialog.contribution.js +103 -0
- package/vscode/src/vs/workbench/contrib/welcomeDialog/browser/welcomeWidget.js +189 -0
- package/vscode/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.js +379 -0
- package/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog.js +1039 -0
- package/vscode/src/vs/workbench/services/dialogs/common/dialogService.js +72 -0
package/dialogs.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { DialogService } from 'vscode/
|
|
1
|
+
import { DialogService } from './vscode/src/vs/workbench/services/dialogs/common/dialogService.js';
|
|
2
2
|
import './override/vs/platform/dialogs/common/dialogs.js';
|
|
3
3
|
import { SyncDescriptor } from 'vscode/vscode/vs/platform/instantiation/common/descriptors';
|
|
4
|
-
import { AbstractFileDialogService } from 'vscode/
|
|
4
|
+
import { AbstractFileDialogService } from './vscode/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.js';
|
|
5
5
|
import { unsupported } from './tools.js';
|
|
6
|
-
import 'vscode/
|
|
7
|
-
import 'vscode/
|
|
6
|
+
import './vscode/src/vs/workbench/browser/parts/dialogs/dialog.web.contribution.js';
|
|
7
|
+
import './vscode/src/vs/workbench/contrib/welcomeDialog/browser/welcomeDialog.contribution.js';
|
|
8
8
|
import { IDialogService, IFileDialogService } from 'vscode/vscode/vs/platform/dialogs/common/dialogs';
|
|
9
9
|
|
|
10
10
|
class FileDialogService extends AbstractFileDialogService {
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var e=[],t=[];function n(n,r){if(n&&"undefined"!=typeof document){var a,s=!0===r.prepend?"prepend":"append",d=!0===r.singleTag,i="string"==typeof r.container?document.querySelector(r.container):document.getElementsByTagName("head")[0];if(d){var u=e.indexOf(i);-1===u&&(u=e.push(i)-1,t[u]={}),a=t[u]&&t[u][s]?t[u][s]:t[u][s]=c();}else a=c();65279===n.charCodeAt(0)&&(n=n.substring(1)),a.styleSheet?a.styleSheet.cssText+=n:a.appendChild(document.createTextNode(n));}function c(){var e=document.createElement("style");if(e.setAttribute("type","text/css"),r.attributes)for(var t=( Object.keys(r.attributes)),n=0;n<t.length;n++)e.setAttribute(t[n],r.attributes[t[n]]);var a="prepend"===s?"afterbegin":"beforeend";return i.insertAdjacentElement(a,e),e}}
|
|
2
|
+
|
|
3
|
+
export { n as default };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
function __decorate(decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
}
|
|
7
|
+
function __param(paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export { __decorate, __param };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codingame/monaco-vscode-dialogs-service-override",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.2",
|
|
4
4
|
"keywords": [],
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "CodinGame",
|
|
@@ -18,6 +18,6 @@
|
|
|
18
18
|
"module": "index.js",
|
|
19
19
|
"types": "index.d.ts",
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"vscode": "npm:@codingame/monaco-vscode-api@4.1.
|
|
21
|
+
"vscode": "npm:@codingame/monaco-vscode-api@4.1.2"
|
|
22
22
|
}
|
|
23
23
|
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { __decorate, __param } from '../../../../../../../external/tslib/tslib.es6.js';
|
|
2
|
+
import { IClipboardService } from 'vscode/vscode/vs/platform/clipboard/common/clipboardService';
|
|
3
|
+
import '../../../../../../../override/vs/platform/dialogs/common/dialogs.js';
|
|
4
|
+
import { IKeybindingService } from 'vscode/vscode/vs/platform/keybinding/common/keybinding';
|
|
5
|
+
import { ILayoutService } from 'vscode/vscode/vs/platform/layout/browser/layoutService';
|
|
6
|
+
import { ILogService } from 'vscode/vscode/vs/platform/log/common/log';
|
|
7
|
+
import { IProductService } from 'vscode/vscode/vs/platform/product/common/productService';
|
|
8
|
+
import { registerWorkbenchContribution2 } from 'vscode/vscode/vs/workbench/common/contributions';
|
|
9
|
+
import { BrowserDialogHandler } from './dialogHandler.js';
|
|
10
|
+
import { Disposable } from 'vscode/vscode/vs/base/common/lifecycle';
|
|
11
|
+
import { IInstantiationService } from 'vscode/vscode/vs/platform/instantiation/common/instantiation';
|
|
12
|
+
import { Lazy } from 'vscode/vscode/vs/base/common/lazy';
|
|
13
|
+
import { IDialogService } from 'vscode/vscode/vs/platform/dialogs/common/dialogs';
|
|
14
|
+
|
|
15
|
+
let DialogHandlerContribution = class DialogHandlerContribution extends Disposable {
|
|
16
|
+
static { this.ID = 'workbench.contrib.dialogHandler'; }
|
|
17
|
+
constructor(dialogService, logService, layoutService, keybindingService, instantiationService, productService, clipboardService) {
|
|
18
|
+
super();
|
|
19
|
+
this.dialogService = dialogService;
|
|
20
|
+
this.impl = ( new Lazy(() => ( new BrowserDialogHandler(
|
|
21
|
+
logService,
|
|
22
|
+
layoutService,
|
|
23
|
+
keybindingService,
|
|
24
|
+
instantiationService,
|
|
25
|
+
productService,
|
|
26
|
+
clipboardService
|
|
27
|
+
))));
|
|
28
|
+
this.model = this.dialogService.model;
|
|
29
|
+
this._register(this.model.onWillShowDialog(() => {
|
|
30
|
+
if (!this.currentDialog) {
|
|
31
|
+
this.processDialogs();
|
|
32
|
+
}
|
|
33
|
+
}));
|
|
34
|
+
this.processDialogs();
|
|
35
|
+
}
|
|
36
|
+
async processDialogs() {
|
|
37
|
+
while (this.model.dialogs.length) {
|
|
38
|
+
this.currentDialog = this.model.dialogs[0];
|
|
39
|
+
let result = undefined;
|
|
40
|
+
try {
|
|
41
|
+
if (this.currentDialog.args.confirmArgs) {
|
|
42
|
+
const args = this.currentDialog.args.confirmArgs;
|
|
43
|
+
result = await this.impl.value.confirm(args.confirmation);
|
|
44
|
+
}
|
|
45
|
+
else if (this.currentDialog.args.inputArgs) {
|
|
46
|
+
const args = this.currentDialog.args.inputArgs;
|
|
47
|
+
result = await this.impl.value.input(args.input);
|
|
48
|
+
}
|
|
49
|
+
else if (this.currentDialog.args.promptArgs) {
|
|
50
|
+
const args = this.currentDialog.args.promptArgs;
|
|
51
|
+
result = await this.impl.value.prompt(args.prompt);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
await this.impl.value.about();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
result = error;
|
|
59
|
+
}
|
|
60
|
+
this.currentDialog.close(result);
|
|
61
|
+
this.currentDialog = undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
DialogHandlerContribution = ( __decorate([
|
|
66
|
+
( __param(0, IDialogService)),
|
|
67
|
+
( __param(1, ILogService)),
|
|
68
|
+
( __param(2, ILayoutService)),
|
|
69
|
+
( __param(3, IKeybindingService)),
|
|
70
|
+
( __param(4, IInstantiationService)),
|
|
71
|
+
( __param(5, IProductService)),
|
|
72
|
+
( __param(6, IClipboardService))
|
|
73
|
+
], DialogHandlerContribution));
|
|
74
|
+
registerWorkbenchContribution2(DialogHandlerContribution.ID, DialogHandlerContribution, 1 );
|
|
75
|
+
|
|
76
|
+
export { DialogHandlerContribution };
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { __decorate, __param } from '../../../../../../../external/tslib/tslib.es6.js';
|
|
2
|
+
import { localizeWithPath } from 'vscode/vscode/vs/nls';
|
|
3
|
+
import '../../../../../../../override/vs/platform/dialogs/common/dialogs.js';
|
|
4
|
+
import { ILayoutService } from 'vscode/vscode/vs/platform/layout/browser/layoutService';
|
|
5
|
+
import { ILogService } from 'vscode/vscode/vs/platform/log/common/log';
|
|
6
|
+
import Severity$1 from 'vscode/vscode/vs/base/common/severity';
|
|
7
|
+
import { Dialog } from 'vscode/vscode/vs/base/browser/ui/dialog/dialog';
|
|
8
|
+
import { DisposableStore } from 'vscode/vscode/vs/base/common/lifecycle';
|
|
9
|
+
import { EventHelper } from 'vscode/vscode/vs/base/browser/dom';
|
|
10
|
+
import { IKeybindingService } from 'vscode/vscode/vs/platform/keybinding/common/keybinding';
|
|
11
|
+
import { IProductService } from 'vscode/vscode/vs/platform/product/common/productService';
|
|
12
|
+
import { IClipboardService } from 'vscode/vscode/vs/platform/clipboard/common/clipboardService';
|
|
13
|
+
import { fromNow } from 'vscode/vscode/vs/base/common/date';
|
|
14
|
+
import { IInstantiationService } from 'vscode/vscode/vs/platform/instantiation/common/instantiation';
|
|
15
|
+
import { MarkdownRenderer } from 'vscode/vscode/vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer';
|
|
16
|
+
import { defaultButtonStyles, defaultCheckboxStyles, defaultInputBoxStyles, defaultDialogStyles } from 'vscode/vscode/vs/platform/theme/browser/defaultStyles';
|
|
17
|
+
import { AbstractDialogHandler } from 'vscode/vscode/vs/platform/dialogs/common/dialogs';
|
|
18
|
+
|
|
19
|
+
var BrowserDialogHandler_1;
|
|
20
|
+
let BrowserDialogHandler = class BrowserDialogHandler extends AbstractDialogHandler {
|
|
21
|
+
static { BrowserDialogHandler_1 = this; }
|
|
22
|
+
static { this.ALLOWABLE_COMMANDS = [
|
|
23
|
+
'copy',
|
|
24
|
+
'cut',
|
|
25
|
+
'editor.action.selectAll',
|
|
26
|
+
'editor.action.clipboardCopyAction',
|
|
27
|
+
'editor.action.clipboardCutAction',
|
|
28
|
+
'editor.action.clipboardPasteAction'
|
|
29
|
+
]; }
|
|
30
|
+
constructor(logService, layoutService, keybindingService, instantiationService, productService, clipboardService) {
|
|
31
|
+
super();
|
|
32
|
+
this.logService = logService;
|
|
33
|
+
this.layoutService = layoutService;
|
|
34
|
+
this.keybindingService = keybindingService;
|
|
35
|
+
this.instantiationService = instantiationService;
|
|
36
|
+
this.productService = productService;
|
|
37
|
+
this.clipboardService = clipboardService;
|
|
38
|
+
this.markdownRenderer = this.instantiationService.createInstance(MarkdownRenderer, {});
|
|
39
|
+
}
|
|
40
|
+
async prompt(prompt) {
|
|
41
|
+
this.logService.trace('DialogService#prompt', prompt.message);
|
|
42
|
+
const buttons = this.getPromptButtons(prompt);
|
|
43
|
+
const { button, checkboxChecked } = await this.doShow(prompt.type, prompt.message, buttons, prompt.detail, prompt.cancelButton ? buttons.length - 1 : -1 , prompt.checkbox, undefined, typeof prompt?.custom === 'object' ? prompt.custom : undefined);
|
|
44
|
+
return this.getPromptResult(prompt, button, checkboxChecked);
|
|
45
|
+
}
|
|
46
|
+
async confirm(confirmation) {
|
|
47
|
+
this.logService.trace('DialogService#confirm', confirmation.message);
|
|
48
|
+
const buttons = this.getConfirmationButtons(confirmation);
|
|
49
|
+
const { button, checkboxChecked } = await this.doShow(confirmation.type ?? 'question', confirmation.message, buttons, confirmation.detail, buttons.length - 1, confirmation.checkbox, undefined, typeof confirmation?.custom === 'object' ? confirmation.custom : undefined);
|
|
50
|
+
return { confirmed: button === 0, checkboxChecked };
|
|
51
|
+
}
|
|
52
|
+
async input(input) {
|
|
53
|
+
this.logService.trace('DialogService#input', input.message);
|
|
54
|
+
const buttons = this.getInputButtons(input);
|
|
55
|
+
const { button, checkboxChecked, values } = await this.doShow(input.type ?? 'question', input.message, buttons, input.detail, buttons.length - 1, input?.checkbox, input.inputs, typeof input.custom === 'object' ? input.custom : undefined);
|
|
56
|
+
return { confirmed: button === 0, checkboxChecked, values };
|
|
57
|
+
}
|
|
58
|
+
async about() {
|
|
59
|
+
const detailString = (useAgo) => {
|
|
60
|
+
return ( localizeWithPath(
|
|
61
|
+
'vs/workbench/browser/parts/dialogs/dialogHandler',
|
|
62
|
+
'aboutDetail',
|
|
63
|
+
"Version: {0}\nCommit: {1}\nDate: {2}\nBrowser: {3}",
|
|
64
|
+
this.productService.version || 'Unknown',
|
|
65
|
+
this.productService.commit || 'Unknown',
|
|
66
|
+
this.productService.date ? `${this.productService.date}${useAgo ? ' (' + fromNow(( new Date(this.productService.date)), true) + ')' : ''}` : 'Unknown',
|
|
67
|
+
navigator.userAgent
|
|
68
|
+
));
|
|
69
|
+
};
|
|
70
|
+
const detail = detailString(true);
|
|
71
|
+
const detailToCopy = detailString(false);
|
|
72
|
+
const { button } = await this.doShow(Severity$1.Info, this.productService.nameLong, [
|
|
73
|
+
( localizeWithPath(
|
|
74
|
+
'vs/workbench/browser/parts/dialogs/dialogHandler',
|
|
75
|
+
{ key: 'copy', comment: ['&& denotes a mnemonic'] },
|
|
76
|
+
"&&Copy"
|
|
77
|
+
)),
|
|
78
|
+
( localizeWithPath('vs/workbench/browser/parts/dialogs/dialogHandler', 'ok', "OK"))
|
|
79
|
+
], detail, 1);
|
|
80
|
+
if (button === 0) {
|
|
81
|
+
this.clipboardService.writeText(detailToCopy);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async doShow(type, message, buttons, detail, cancelId, checkbox, inputs, customOptions) {
|
|
85
|
+
const dialogDisposables = ( new DisposableStore());
|
|
86
|
+
const renderBody = customOptions ? (parent) => {
|
|
87
|
+
parent.classList.add(...(customOptions.classes || []));
|
|
88
|
+
customOptions.markdownDetails?.forEach(markdownDetail => {
|
|
89
|
+
const result = this.markdownRenderer.render(markdownDetail.markdown);
|
|
90
|
+
parent.appendChild(result.element);
|
|
91
|
+
result.element.classList.add(...(markdownDetail.classes || []));
|
|
92
|
+
dialogDisposables.add(result);
|
|
93
|
+
});
|
|
94
|
+
} : undefined;
|
|
95
|
+
const dialog = ( new Dialog(this.layoutService.activeContainer, message, buttons, {
|
|
96
|
+
detail,
|
|
97
|
+
cancelId,
|
|
98
|
+
type: this.getDialogType(type),
|
|
99
|
+
keyEventProcessor: (event) => {
|
|
100
|
+
const resolved = this.keybindingService.softDispatch(event, this.layoutService.activeContainer);
|
|
101
|
+
if (resolved.kind === 2 && resolved.commandId) {
|
|
102
|
+
if (BrowserDialogHandler_1.ALLOWABLE_COMMANDS.indexOf(resolved.commandId) === -1) {
|
|
103
|
+
EventHelper.stop(event, true);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
renderBody,
|
|
108
|
+
icon: customOptions?.icon,
|
|
109
|
+
disableCloseAction: customOptions?.disableCloseAction,
|
|
110
|
+
buttonDetails: customOptions?.buttonDetails,
|
|
111
|
+
checkboxLabel: checkbox?.label,
|
|
112
|
+
checkboxChecked: checkbox?.checked,
|
|
113
|
+
inputs,
|
|
114
|
+
buttonStyles: defaultButtonStyles,
|
|
115
|
+
checkboxStyles: defaultCheckboxStyles,
|
|
116
|
+
inputBoxStyles: defaultInputBoxStyles,
|
|
117
|
+
dialogStyles: defaultDialogStyles
|
|
118
|
+
}));
|
|
119
|
+
dialogDisposables.add(dialog);
|
|
120
|
+
const result = await dialog.show();
|
|
121
|
+
dialogDisposables.dispose();
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
BrowserDialogHandler = BrowserDialogHandler_1 = ( __decorate([
|
|
126
|
+
( __param(0, ILogService)),
|
|
127
|
+
( __param(1, ILayoutService)),
|
|
128
|
+
( __param(2, IKeybindingService)),
|
|
129
|
+
( __param(3, IInstantiationService)),
|
|
130
|
+
( __param(4, IProductService)),
|
|
131
|
+
( __param(5, IClipboardService))
|
|
132
|
+
], BrowserDialogHandler));
|
|
133
|
+
|
|
134
|
+
export { BrowserDialogHandler };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { DeferredPromise } from 'vscode/vscode/vs/base/common/async';
|
|
2
|
+
import { Emitter } from 'vscode/vscode/vs/base/common/event';
|
|
3
|
+
import { Disposable } from 'vscode/vscode/vs/base/common/lifecycle';
|
|
4
|
+
|
|
5
|
+
class DialogsModel extends Disposable {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(...arguments);
|
|
8
|
+
this.dialogs = [];
|
|
9
|
+
this._onWillShowDialog = this._register(( new Emitter()));
|
|
10
|
+
this.onWillShowDialog = this._onWillShowDialog.event;
|
|
11
|
+
this._onDidShowDialog = this._register(( new Emitter()));
|
|
12
|
+
this.onDidShowDialog = this._onDidShowDialog.event;
|
|
13
|
+
}
|
|
14
|
+
show(dialog) {
|
|
15
|
+
const promise = ( new DeferredPromise());
|
|
16
|
+
const item = {
|
|
17
|
+
args: dialog,
|
|
18
|
+
close: result => {
|
|
19
|
+
this.dialogs.splice(0, 1);
|
|
20
|
+
if (result instanceof Error) {
|
|
21
|
+
promise.error(result);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
promise.complete(result);
|
|
25
|
+
}
|
|
26
|
+
this._onDidShowDialog.fire();
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
this.dialogs.push(item);
|
|
30
|
+
this._onWillShowDialog.fire();
|
|
31
|
+
return {
|
|
32
|
+
item,
|
|
33
|
+
result: promise.p
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export { DialogsModel };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import n from '../../../../../../../../external/rollup-plugin-styles/dist/runtime/inject-css.js';
|
|
2
|
+
|
|
3
|
+
var css = ".monaco-dialog-box{border-radius:6px}.dialog-message-detail-title>div>p>.codicon[class*=codicon-]:before{color:var(--vscode-textLink-foreground);font-size:larger;padding-right:10px;position:relative}.dialog-message-detail-title{font-size:large;height:22px}.monaco-dialog-box .monaco-action-bar .actions-container{justify-content:flex-end}";
|
|
4
|
+
n(css,{});
|
|
5
|
+
|
|
6
|
+
export { css, css as default };
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { __decorate, __param } from '../../../../../../../external/tslib/tslib.es6.js';
|
|
2
|
+
import { Registry } from 'vscode/vscode/vs/platform/registry/common/platform';
|
|
3
|
+
import { Extensions } from 'vscode/vscode/vs/workbench/common/contributions';
|
|
4
|
+
import { IStorageService } from 'vscode/vscode/vs/platform/storage/common/storage';
|
|
5
|
+
import { IBrowserWorkbenchEnvironmentService } from 'vscode/vscode/vs/workbench/services/environment/browser/environmentService';
|
|
6
|
+
import { IConfigurationService } from 'vscode/vscode/vs/platform/configuration/common/configuration';
|
|
7
|
+
import { Disposable } from 'vscode/vscode/vs/base/common/lifecycle';
|
|
8
|
+
import { ContextKeyExpr, IContextKeyService } from 'vscode/vscode/vs/platform/contextkey/common/contextkey';
|
|
9
|
+
import { ICodeEditorService } from 'vscode/vscode/vs/editor/browser/services/codeEditorService';
|
|
10
|
+
import { IInstantiationService } from 'vscode/vscode/vs/platform/instantiation/common/instantiation';
|
|
11
|
+
import { ICommandService } from 'vscode/vscode/vs/platform/commands/common/commands';
|
|
12
|
+
import { WelcomeWidget } from './welcomeWidget.js';
|
|
13
|
+
import { ITelemetryService } from 'vscode/vscode/vs/platform/telemetry/common/telemetry';
|
|
14
|
+
import { IOpenerService } from 'vscode/vscode/vs/platform/opener/common/opener';
|
|
15
|
+
import { Extensions as Extensions$1 } from 'vscode/vscode/vs/platform/configuration/common/configurationRegistry';
|
|
16
|
+
import { localizeWithPath } from 'vscode/vscode/vs/nls';
|
|
17
|
+
import { applicationConfigurationNodeBase } from 'vscode/vscode/vs/workbench/common/configuration';
|
|
18
|
+
import { RunOnceScheduler } from 'vscode/vscode/vs/base/common/async';
|
|
19
|
+
import { IEditorService } from 'vscode/vscode/vs/workbench/services/editor/common/editorService';
|
|
20
|
+
|
|
21
|
+
const configurationKey = 'workbench.welcome.experimental.dialog';
|
|
22
|
+
let WelcomeDialogContribution = class WelcomeDialogContribution extends Disposable {
|
|
23
|
+
constructor(storageService, environmentService, configurationService, contextService, codeEditorService, instantiationService, commandService, telemetryService, openerService, editorService) {
|
|
24
|
+
super();
|
|
25
|
+
this.contextService = contextService;
|
|
26
|
+
this.codeEditorService = codeEditorService;
|
|
27
|
+
this.instantiationService = instantiationService;
|
|
28
|
+
this.commandService = commandService;
|
|
29
|
+
this.telemetryService = telemetryService;
|
|
30
|
+
this.openerService = openerService;
|
|
31
|
+
this.editorService = editorService;
|
|
32
|
+
this.isRendered = false;
|
|
33
|
+
if (!storageService.isNew(-1 )) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const setting = configurationService.inspect(configurationKey);
|
|
37
|
+
if (!setting.value) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const welcomeDialog = environmentService.options?.welcomeDialog;
|
|
41
|
+
if (!welcomeDialog) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
this._register(editorService.onDidActiveEditorChange(() => {
|
|
45
|
+
if (!this.isRendered) {
|
|
46
|
+
const codeEditor = codeEditorService.getActiveCodeEditor();
|
|
47
|
+
if (codeEditor?.hasModel()) {
|
|
48
|
+
const scheduler = ( new RunOnceScheduler(() => {
|
|
49
|
+
const notificationsVisible = contextService.contextMatchesRules(ContextKeyExpr.deserialize('notificationCenterVisible')) ||
|
|
50
|
+
contextService.contextMatchesRules(ContextKeyExpr.deserialize('notificationToastsVisible'));
|
|
51
|
+
if (codeEditor === codeEditorService.getActiveCodeEditor() && !notificationsVisible) {
|
|
52
|
+
this.isRendered = true;
|
|
53
|
+
const welcomeWidget = ( new WelcomeWidget(
|
|
54
|
+
codeEditor,
|
|
55
|
+
instantiationService,
|
|
56
|
+
commandService,
|
|
57
|
+
telemetryService,
|
|
58
|
+
openerService
|
|
59
|
+
));
|
|
60
|
+
welcomeWidget.render(welcomeDialog.title, welcomeDialog.message, welcomeDialog.buttonText, welcomeDialog.buttonCommand);
|
|
61
|
+
}
|
|
62
|
+
}, 3000));
|
|
63
|
+
this._register(codeEditor.onDidChangeModelContent((e) => {
|
|
64
|
+
if (!this.isRendered) {
|
|
65
|
+
scheduler.schedule();
|
|
66
|
+
}
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
WelcomeDialogContribution = ( __decorate([
|
|
74
|
+
( __param(0, IStorageService)),
|
|
75
|
+
( __param(1, IBrowserWorkbenchEnvironmentService)),
|
|
76
|
+
( __param(2, IConfigurationService)),
|
|
77
|
+
( __param(3, IContextKeyService)),
|
|
78
|
+
( __param(4, ICodeEditorService)),
|
|
79
|
+
( __param(5, IInstantiationService)),
|
|
80
|
+
( __param(6, ICommandService)),
|
|
81
|
+
( __param(7, ITelemetryService)),
|
|
82
|
+
( __param(8, IOpenerService)),
|
|
83
|
+
( __param(9, IEditorService))
|
|
84
|
+
], WelcomeDialogContribution));
|
|
85
|
+
( Registry.as(Extensions.Workbench))
|
|
86
|
+
.registerWorkbenchContribution(WelcomeDialogContribution, 4 );
|
|
87
|
+
const configurationRegistry = ( Registry.as(Extensions$1.Configuration));
|
|
88
|
+
configurationRegistry.registerConfiguration({
|
|
89
|
+
...applicationConfigurationNodeBase,
|
|
90
|
+
properties: {
|
|
91
|
+
'workbench.welcome.experimental.dialog': {
|
|
92
|
+
scope: 1 ,
|
|
93
|
+
type: 'boolean',
|
|
94
|
+
default: false,
|
|
95
|
+
tags: ['experimental'],
|
|
96
|
+
description: ( localizeWithPath(
|
|
97
|
+
'vs/workbench/contrib/welcomeDialog/browser/welcomeDialog.contribution',
|
|
98
|
+
'workbench.welcome.dialog',
|
|
99
|
+
"When enabled, a welcome widget is shown in the editor"
|
|
100
|
+
))
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
});
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import './media/welcomeWidget.css.js';
|
|
2
|
+
import { Disposable } from 'vscode/vscode/vs/base/common/lifecycle';
|
|
3
|
+
import { $, hide, append } from 'vscode/vscode/vs/base/browser/dom';
|
|
4
|
+
import { MarkdownString } from 'vscode/vscode/vs/base/common/htmlContent';
|
|
5
|
+
import { MarkdownRenderer } from 'vscode/vscode/vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer';
|
|
6
|
+
import { ButtonBar } from 'vscode/vscode/vs/base/browser/ui/button/button';
|
|
7
|
+
import { mnemonicButtonLabel } from 'vscode/vscode/vs/base/common/labels';
|
|
8
|
+
import { defaultButtonStyles } from 'vscode/vscode/vs/platform/theme/browser/defaultStyles';
|
|
9
|
+
import { Action } from 'vscode/vscode/vs/base/common/actions';
|
|
10
|
+
import { ActionBar } from 'vscode/vscode/vs/base/browser/ui/actionbar/actionbar';
|
|
11
|
+
import { localizeWithPath } from 'vscode/vscode/vs/nls';
|
|
12
|
+
import { ThemeIcon } from 'vscode/vscode/vs/base/common/themables';
|
|
13
|
+
import { Codicon } from 'vscode/vscode/vs/base/common/codicons';
|
|
14
|
+
import { parseLinkedText } from 'vscode/vscode/vs/base/common/linkedText';
|
|
15
|
+
import { Link } from 'vscode/vscode/vs/platform/opener/browser/link';
|
|
16
|
+
import { renderLabelWithIcons } from 'vscode/vscode/vs/base/browser/ui/iconLabel/iconLabels';
|
|
17
|
+
import { renderFormattedText } from 'vscode/vscode/vs/base/browser/formattedTextRenderer';
|
|
18
|
+
import { registerThemingParticipant } from 'vscode/vscode/vs/platform/theme/common/themeService';
|
|
19
|
+
import 'vscode/vscode/vs/platform/theme/common/colorUtils';
|
|
20
|
+
import { contrastBorder } from 'vscode/vscode/vs/platform/theme/common/colors/baseColors';
|
|
21
|
+
import 'vscode/vscode/vs/platform/theme/common/colors/chartsColors';
|
|
22
|
+
import { editorWidgetBackground, widgetShadow, widgetBorder, editorWidgetForeground } from 'vscode/vscode/vs/platform/theme/common/colors/editorColors';
|
|
23
|
+
import 'vscode/vscode/vs/platform/theme/common/colors/inputColors';
|
|
24
|
+
import 'vscode/vscode/vs/platform/theme/common/colors/listColors';
|
|
25
|
+
import 'vscode/vscode/vs/platform/theme/common/colors/menuColors';
|
|
26
|
+
import 'vscode/vscode/vs/platform/theme/common/colors/minimapColors';
|
|
27
|
+
import 'vscode/vscode/vs/platform/theme/common/colors/miscColors';
|
|
28
|
+
import 'vscode/vscode/vs/platform/theme/common/colors/quickpickColors';
|
|
29
|
+
import 'vscode/vscode/vs/platform/theme/common/colors/searchColors';
|
|
30
|
+
|
|
31
|
+
class WelcomeWidget extends Disposable {
|
|
32
|
+
constructor(_editor, instantiationService, commandService, telemetryService, openerService) {
|
|
33
|
+
super();
|
|
34
|
+
this._editor = _editor;
|
|
35
|
+
this.instantiationService = instantiationService;
|
|
36
|
+
this.commandService = commandService;
|
|
37
|
+
this.telemetryService = telemetryService;
|
|
38
|
+
this.openerService = openerService;
|
|
39
|
+
this.markdownRenderer = this.instantiationService.createInstance(MarkdownRenderer, {});
|
|
40
|
+
this._isVisible = false;
|
|
41
|
+
this._rootDomNode = document.createElement('div');
|
|
42
|
+
this._rootDomNode.className = 'welcome-widget';
|
|
43
|
+
this.element = this._rootDomNode.appendChild($('.monaco-dialog-box'));
|
|
44
|
+
this.element.setAttribute('role', 'dialog');
|
|
45
|
+
hide(this._rootDomNode);
|
|
46
|
+
this.messageContainer = this.element.appendChild($('.dialog-message-container'));
|
|
47
|
+
}
|
|
48
|
+
async executeCommand(commandId, ...args) {
|
|
49
|
+
try {
|
|
50
|
+
await this.commandService.executeCommand(commandId, ...args);
|
|
51
|
+
this.telemetryService.publicLog2('workbenchActionExecuted', {
|
|
52
|
+
id: commandId,
|
|
53
|
+
from: 'welcomeWidget'
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (ex) {
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async render(title, message, buttonText, buttonAction) {
|
|
60
|
+
if (!this._editor._getViewModel()) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
await this.buildWidgetContent(title, message, buttonText, buttonAction);
|
|
64
|
+
this._editor.addOverlayWidget(this);
|
|
65
|
+
this._show();
|
|
66
|
+
this.telemetryService.publicLog2('workbenchActionExecuted', {
|
|
67
|
+
id: 'welcomeWidgetRendered',
|
|
68
|
+
from: 'welcomeWidget'
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
async buildWidgetContent(title, message, buttonText, buttonAction) {
|
|
72
|
+
const actionBar = this._register(( new ActionBar(this.element, {})));
|
|
73
|
+
const action = this._register(( new Action('dialog.close', ( localizeWithPath(
|
|
74
|
+
'vs/workbench/contrib/welcomeDialog/browser/welcomeWidget',
|
|
75
|
+
'dialogClose',
|
|
76
|
+
"Close Dialog"
|
|
77
|
+
)), ThemeIcon.asClassName(Codicon.dialogClose), true, async () => {
|
|
78
|
+
this._hide();
|
|
79
|
+
})));
|
|
80
|
+
actionBar.push(action, { icon: true, label: false });
|
|
81
|
+
const renderBody = (message, icon) => {
|
|
82
|
+
const mds = ( new MarkdownString(undefined, { supportThemeIcons: true, supportHtml: true }));
|
|
83
|
+
mds.appendMarkdown(`<a class="copilot">$(${icon})</a>`);
|
|
84
|
+
mds.appendMarkdown(message);
|
|
85
|
+
return mds;
|
|
86
|
+
};
|
|
87
|
+
const titleElement = this.messageContainer.appendChild($('#monaco-dialog-message-detail.dialog-message-detail-title'));
|
|
88
|
+
const titleElementMdt = this.markdownRenderer.render(renderBody(title, 'zap'));
|
|
89
|
+
titleElement.appendChild(titleElementMdt.element);
|
|
90
|
+
this.buildStepMarkdownDescription(this.messageContainer, ( message.split('\n').filter(x => x).map(text => parseLinkedText(text))));
|
|
91
|
+
const buttonsRowElement = this.messageContainer.appendChild($('.dialog-buttons-row'));
|
|
92
|
+
const buttonContainer = buttonsRowElement.appendChild($('.dialog-buttons'));
|
|
93
|
+
const buttonBar = this._register(( new ButtonBar(buttonContainer)));
|
|
94
|
+
const primaryButton = this._register(buttonBar.addButtonWithDescription({ title: true, secondary: false, ...defaultButtonStyles }));
|
|
95
|
+
primaryButton.label = mnemonicButtonLabel(buttonText, true);
|
|
96
|
+
this._register(primaryButton.onDidClick(async () => {
|
|
97
|
+
await this.executeCommand(buttonAction);
|
|
98
|
+
}));
|
|
99
|
+
buttonBar.buttons[0].focus();
|
|
100
|
+
}
|
|
101
|
+
buildStepMarkdownDescription(container, text) {
|
|
102
|
+
for (const linkedText of text) {
|
|
103
|
+
const p = append(container, $('p'));
|
|
104
|
+
for (const node of linkedText.nodes) {
|
|
105
|
+
if (typeof node === 'string') {
|
|
106
|
+
const labelWithIcon = renderLabelWithIcons(node);
|
|
107
|
+
for (const element of labelWithIcon) {
|
|
108
|
+
if (typeof element === 'string') {
|
|
109
|
+
p.appendChild(renderFormattedText(element, { inline: true, renderCodeSegments: true }));
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
p.appendChild(element);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
const link = this.instantiationService.createInstance(Link, p, node, {
|
|
118
|
+
opener: (href) => {
|
|
119
|
+
this.telemetryService.publicLog2('workbenchActionExecuted', {
|
|
120
|
+
id: 'welcomeWidetLinkAction',
|
|
121
|
+
from: 'welcomeWidget'
|
|
122
|
+
});
|
|
123
|
+
this.openerService.open(href, { allowCommands: true });
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
this._register(link);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return container;
|
|
131
|
+
}
|
|
132
|
+
getId() {
|
|
133
|
+
return 'editor.contrib.welcomeWidget';
|
|
134
|
+
}
|
|
135
|
+
getDomNode() {
|
|
136
|
+
return this._rootDomNode;
|
|
137
|
+
}
|
|
138
|
+
getPosition() {
|
|
139
|
+
return {
|
|
140
|
+
preference: 0
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
_show() {
|
|
144
|
+
if (this._isVisible) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
this._isVisible = true;
|
|
148
|
+
this._rootDomNode.style.display = 'block';
|
|
149
|
+
}
|
|
150
|
+
_hide() {
|
|
151
|
+
if (!this._isVisible) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
this._isVisible = true;
|
|
155
|
+
this._rootDomNode.style.display = 'none';
|
|
156
|
+
this._editor.removeOverlayWidget(this);
|
|
157
|
+
this.telemetryService.publicLog2('workbenchActionExecuted', {
|
|
158
|
+
id: 'welcomeWidgetDismissed',
|
|
159
|
+
from: 'welcomeWidget'
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
registerThemingParticipant((theme, collector) => {
|
|
164
|
+
const addBackgroundColorRule = (selector, color) => {
|
|
165
|
+
if (color) {
|
|
166
|
+
collector.addRule(`.monaco-editor ${selector} { background-color: ${color}; }`);
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
const widgetBackground = theme.getColor(editorWidgetBackground);
|
|
170
|
+
addBackgroundColorRule('.welcome-widget', widgetBackground);
|
|
171
|
+
const widgetShadowColor = theme.getColor(widgetShadow);
|
|
172
|
+
if (widgetShadowColor) {
|
|
173
|
+
collector.addRule(`.welcome-widget { box-shadow: 0 0 8px 2px ${widgetShadowColor}; }`);
|
|
174
|
+
}
|
|
175
|
+
const widgetBorderColor = theme.getColor(widgetBorder);
|
|
176
|
+
if (widgetBorderColor) {
|
|
177
|
+
collector.addRule(`.welcome-widget { border-left: 1px solid ${widgetBorderColor}; border-right: 1px solid ${widgetBorderColor}; border-bottom: 1px solid ${widgetBorderColor}; }`);
|
|
178
|
+
}
|
|
179
|
+
const hcBorder = theme.getColor(contrastBorder);
|
|
180
|
+
if (hcBorder) {
|
|
181
|
+
collector.addRule(`.welcome-widget { border: 1px solid ${hcBorder}; }`);
|
|
182
|
+
}
|
|
183
|
+
const foreground = theme.getColor(editorWidgetForeground);
|
|
184
|
+
if (foreground) {
|
|
185
|
+
collector.addRule(`.welcome-widget { color: ${foreground}; }`);
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
export { WelcomeWidget };
|