@theia/core 1.53.0-next.4 → 1.53.0-next.55
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/README.md +7 -7
- package/i18n/nls.cs.json +582 -552
- package/i18n/nls.de.json +582 -552
- package/i18n/nls.es.json +582 -552
- package/i18n/nls.fr.json +582 -552
- package/i18n/nls.hu.json +582 -552
- package/i18n/nls.it.json +582 -552
- package/i18n/nls.ja.json +582 -552
- package/i18n/nls.json +582 -552
- package/i18n/nls.ko.json +582 -0
- package/i18n/nls.pl.json +582 -552
- package/i18n/nls.pt-br.json +582 -552
- package/i18n/nls.ru.json +582 -552
- package/i18n/nls.tr.json +582 -0
- package/i18n/nls.zh-cn.json +582 -552
- package/i18n/nls.zh-tw.json +582 -0
- package/lib/browser/authentication-service.d.ts +15 -14
- package/lib/browser/authentication-service.d.ts.map +1 -1
- package/lib/browser/authentication-service.js +5 -5
- package/lib/browser/authentication-service.js.map +1 -1
- package/lib/browser/catalog.json +6889 -0
- package/lib/browser/common-frontend-contribution.js +3 -3
- package/lib/browser/common-styling-participants.js +166 -166
- package/lib/browser/context-key-service.d.ts +3 -2
- package/lib/browser/context-key-service.d.ts.map +1 -1
- package/lib/browser/context-key-service.js.map +1 -1
- package/lib/browser/core-preferences.d.ts.map +1 -1
- package/lib/browser/core-preferences.js +9 -0
- package/lib/browser/core-preferences.js.map +1 -1
- package/lib/browser/frontend-application-module.d.ts.map +1 -1
- package/lib/browser/frontend-application-module.js.map +1 -1
- package/lib/browser/json-schema-store.d.ts +0 -3
- package/lib/browser/json-schema-store.d.ts.map +1 -1
- package/lib/browser/json-schema-store.js +2 -12
- package/lib/browser/json-schema-store.js.map +1 -1
- package/lib/browser/open-with-service.d.ts +13 -1
- package/lib/browser/open-with-service.d.ts.map +1 -1
- package/lib/browser/open-with-service.js +48 -9
- package/lib/browser/open-with-service.js.map +1 -1
- package/lib/browser/opener-service.d.ts +8 -0
- package/lib/browser/opener-service.d.ts.map +1 -1
- package/lib/browser/opener-service.js +18 -3
- package/lib/browser/opener-service.js.map +1 -1
- package/lib/browser/progress-location-service.spec.js +7 -7
- package/lib/browser/saveable-service.d.ts.map +1 -1
- package/lib/browser/saveable-service.js +6 -2
- package/lib/browser/saveable-service.js.map +1 -1
- package/lib/browser/saveable.d.ts +17 -1
- package/lib/browser/saveable.d.ts.map +1 -1
- package/lib/browser/saveable.js +62 -1
- package/lib/browser/saveable.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.d.ts +5 -4
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js +2 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.d.ts +6 -16
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.js +12 -29
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.d.ts +43 -78
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.js +8 -39
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.d.ts +10 -10
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js +43 -32
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js.map +1 -1
- package/lib/browser/storage-service.js +3 -3
- package/lib/browser/tree/tree.spec.js +75 -75
- package/lib/browser/view-container.d.ts +2 -2
- package/lib/browser/view-container.d.ts.map +1 -1
- package/lib/browser/view-container.js.map +1 -1
- package/lib/browser/widget-open-handler.d.ts +4 -1
- package/lib/browser/widget-open-handler.d.ts.map +1 -1
- package/lib/browser/widget-open-handler.js.map +1 -1
- package/lib/browser/widgets/extractable-widget.js +1 -1
- package/lib/browser/widgets/extractable-widget.js.map +1 -1
- package/lib/browser/widgets/index.d.ts +1 -0
- package/lib/browser/widgets/index.d.ts.map +1 -1
- package/lib/browser/widgets/index.js +1 -0
- package/lib/browser/widgets/index.js.map +1 -1
- package/lib/browser/widgets/split-widget.d.ts +45 -0
- package/lib/browser/widgets/split-widget.d.ts.map +1 -0
- package/lib/browser/widgets/split-widget.js +126 -0
- package/lib/browser/widgets/split-widget.js.map +1 -0
- package/lib/common/event.d.ts +2 -0
- package/lib/common/event.d.ts.map +1 -1
- package/lib/common/event.js +4 -0
- package/lib/common/event.js.map +1 -1
- package/lib/common/glob.d.ts +4 -4
- package/lib/common/json-schema.d.ts +2 -0
- package/lib/common/json-schema.d.ts.map +1 -1
- package/lib/common/menu/menu-types.d.ts.map +1 -1
- package/lib/common/menu/menu-types.js.map +1 -1
- package/lib/electron-browser/electron-uri-handler.d.ts +6 -0
- package/lib/electron-browser/electron-uri-handler.d.ts.map +1 -0
- package/lib/electron-browser/electron-uri-handler.js +49 -0
- package/lib/electron-browser/electron-uri-handler.js.map +1 -0
- package/lib/electron-browser/menu/electron-main-menu-factory.d.ts +1 -1
- package/lib/electron-browser/menu/electron-main-menu-factory.d.ts.map +1 -1
- package/lib/electron-browser/menu/electron-main-menu-factory.js +6 -6
- package/lib/electron-browser/menu/electron-main-menu-factory.js.map +1 -1
- package/lib/electron-browser/preload.d.ts.map +1 -1
- package/lib/electron-browser/preload.js +12 -0
- package/lib/electron-browser/preload.js.map +1 -1
- package/lib/electron-browser/window/electron-window-module.d.ts.map +1 -1
- package/lib/electron-browser/window/electron-window-module.js +3 -0
- package/lib/electron-browser/window/electron-window-module.js.map +1 -1
- package/lib/electron-browser/window/external-app-open-handler.js +1 -1
- package/lib/electron-browser/window/external-app-open-handler.js.map +1 -1
- package/lib/electron-common/electron-api.d.ts +2 -0
- package/lib/electron-common/electron-api.d.ts.map +1 -1
- package/lib/electron-common/electron-api.js +2 -1
- package/lib/electron-common/electron-api.js.map +1 -1
- package/lib/electron-main/electron-api-main.d.ts +2 -0
- package/lib/electron-main/electron-api-main.d.ts.map +1 -1
- package/lib/electron-main/electron-api-main.js +27 -3
- package/lib/electron-main/electron-api-main.js.map +1 -1
- package/lib/electron-main/electron-main-application.d.ts +5 -3
- package/lib/electron-main/electron-main-application.d.ts.map +1 -1
- package/lib/electron-main/electron-main-application.js +57 -14
- package/lib/electron-main/electron-main-application.js.map +1 -1
- package/lib/electron-main/theia-electron-window.d.ts +1 -0
- package/lib/electron-main/theia-electron-window.d.ts.map +1 -1
- package/lib/electron-main/theia-electron-window.js +3 -0
- package/lib/electron-main/theia-electron-window.js.map +1 -1
- package/lib/node/i18n/theia-localization-contribution.d.ts.map +1 -1
- package/lib/node/i18n/theia-localization-contribution.js +12 -8
- package/lib/node/i18n/theia-localization-contribution.js.map +1 -1
- package/lib/node/process-utils.spec.js +8 -8
- package/package.json +10 -8
- package/shared/ajv/index.d.ts +2 -2
- package/shared/markdown-it.d.ts +2 -2
- package/shared/markdown-it.js +1 -1
- package/shared/reflect-metadata/index.d.ts +1 -1
- package/shared/reflect-metadata/index.js +1 -1
- package/shared/vscode-languageserver-types/index.d.ts +1 -1
- package/src/browser/about-dialog.tsx +137 -137
- package/src/browser/authentication-service.ts +467 -468
- package/src/browser/breadcrumbs/breadcrumb-popup-container.ts +101 -101
- package/src/browser/breadcrumbs/breadcrumb-renderer.tsx +41 -41
- package/src/browser/breadcrumbs/breadcrumbs-constants.ts +79 -79
- package/src/browser/breadcrumbs/breadcrumbs-renderer.tsx +185 -185
- package/src/browser/breadcrumbs/breadcrumbs-service.ts +108 -108
- package/src/browser/breadcrumbs/index.ts +21 -21
- package/src/browser/browser-clipboard-service.ts +122 -122
- package/src/browser/browser.ts +239 -239
- package/src/browser/clipboard-service.ts +23 -23
- package/src/browser/color-application-contribution.ts +110 -110
- package/src/browser/color-registry.ts +60 -60
- package/src/browser/command-open-handler.ts +54 -54
- package/src/browser/common-frontend-contribution.ts +2680 -2680
- package/src/browser/common-styling-participants.ts +361 -361
- package/src/browser/connection-status-service.spec.ts +200 -200
- package/src/browser/connection-status-service.ts +216 -216
- package/src/browser/context-key-service.ts +142 -142
- package/src/browser/context-menu-renderer.ts +124 -124
- package/src/browser/core-preferences.ts +343 -334
- package/src/browser/credentials-service.ts +106 -106
- package/src/browser/decoration-style.ts +65 -65
- package/src/browser/decorations-service.ts +209 -209
- package/src/browser/dialogs/react-dialog.tsx +56 -56
- package/src/browser/dialogs.ts +534 -534
- package/src/browser/diff-uris.ts +117 -117
- package/src/browser/encoding-registry.ts +97 -97
- package/src/browser/endpoint.spec.ts +148 -148
- package/src/browser/endpoint.ts +136 -136
- package/src/browser/external-uri-service.ts +79 -79
- package/src/browser/file-icons-js.d.ts +20 -20
- package/src/browser/frontend-application-bindings.ts +62 -62
- package/src/browser/frontend-application-config-provider.spec.ts +45 -45
- package/src/browser/frontend-application-config-provider.ts +50 -50
- package/src/browser/frontend-application-contribution.ts +110 -110
- package/src/browser/frontend-application-module.ts +474 -475
- package/src/browser/frontend-application-state.ts +74 -74
- package/src/browser/frontend-application.ts +326 -326
- package/src/browser/hover-service.ts +218 -218
- package/src/browser/http-open-handler.ts +49 -49
- package/src/browser/i18n/i18n-frontend-module.ts +27 -27
- package/src/browser/i18n/language-quick-pick-service.ts +130 -130
- package/src/browser/icon-registry.ts +87 -87
- package/src/browser/icon-theme-contribution.ts +64 -64
- package/src/browser/icon-theme-service.ts +217 -217
- package/src/browser/icons/CollapseAll.svg +7 -7
- package/src/browser/icons/CollapseAll_inverse.svg +7 -7
- package/src/browser/icons/Refresh.svg +7 -7
- package/src/browser/icons/Refresh_inverse.svg +7 -7
- package/src/browser/icons/add-inverse.svg +4 -4
- package/src/browser/icons/add.svg +4 -4
- package/src/browser/icons/arrow-down-bright.svg +6 -6
- package/src/browser/icons/arrow-down-dark.svg +6 -6
- package/src/browser/icons/arrow-up-bright.svg +6 -6
- package/src/browser/icons/arrow-up-dark.svg +6 -6
- package/src/browser/icons/case-sensitive-dark.svg +16 -16
- package/src/browser/icons/case-sensitive.svg +16 -16
- package/src/browser/icons/chevron-right-dark.svg +5 -5
- package/src/browser/icons/chevron-right-light.svg +6 -6
- package/src/browser/icons/circle-bright.svg +7 -7
- package/src/browser/icons/circle-dark.svg +7 -7
- package/src/browser/icons/clear-search-results-dark.svg +7 -7
- package/src/browser/icons/clear-search-results.svg +7 -7
- package/src/browser/icons/close-all-bright.svg +7 -7
- package/src/browser/icons/close-all-dark.svg +7 -7
- package/src/browser/icons/close-bright.svg +7 -7
- package/src/browser/icons/close-dark.svg +7 -7
- package/src/browser/icons/collapse.svg +4 -4
- package/src/browser/icons/edit-json-dark.svg +6 -6
- package/src/browser/icons/edit-json.svg +6 -6
- package/src/browser/icons/expand.svg +4 -4
- package/src/browser/icons/loading-dark.svg +6 -6
- package/src/browser/icons/loading-light.svg +6 -6
- package/src/browser/icons/open-change-bright.svg +3 -3
- package/src/browser/icons/open-change-dark.svg +4 -4
- package/src/browser/icons/open-file-bright.svg +4 -4
- package/src/browser/icons/open-file-dark.svg +4 -4
- package/src/browser/icons/preview-bright.svg +3 -3
- package/src/browser/icons/preview-dark.svg +3 -3
- package/src/browser/icons/regex-dark.svg +10 -10
- package/src/browser/icons/regex.svg +10 -10
- package/src/browser/icons/remove-all-inverse.svg +4 -4
- package/src/browser/icons/remove-all.svg +4 -4
- package/src/browser/icons/replace-all-inverse.svg +13 -13
- package/src/browser/icons/replace-all.svg +13 -13
- package/src/browser/icons/replace-inverse.svg +15 -15
- package/src/browser/icons/replace.svg +15 -15
- package/src/browser/icons/whole-word-dark.svg +19 -19
- package/src/browser/icons/whole-word.svg +19 -19
- package/src/browser/index.ts +50 -50
- package/src/browser/json-schema-store.ts +118 -127
- package/src/browser/keybinding.spec.ts +554 -554
- package/src/browser/keybinding.ts +759 -759
- package/src/browser/keyboard/browser-keyboard-frontend-contribution.ts +108 -108
- package/src/browser/keyboard/browser-keyboard-layout-provider.spec.ts +171 -171
- package/src/browser/keyboard/browser-keyboard-layout-provider.ts +469 -469
- package/src/browser/keyboard/browser-keyboard-module.ts +30 -30
- package/src/browser/keyboard/index.ts +20 -20
- package/src/browser/keyboard/keyboard-layout-service.spec.ts +121 -121
- package/src/browser/keyboard/keyboard-layout-service.ts +455 -455
- package/src/browser/keyboard/keys.spec.ts +258 -258
- package/src/browser/keyboard/keys.ts +20 -20
- package/src/browser/keys.ts +21 -21
- package/src/browser/label-parser.spec.ts +165 -165
- package/src/browser/label-parser.ts +108 -108
- package/src/browser/label-provider.spec.ts +62 -62
- package/src/browser/label-provider.ts +385 -385
- package/src/browser/language-icon-provider.ts +55 -55
- package/src/browser/language-service.ts +77 -77
- package/src/browser/logger-frontend-module.ts +65 -65
- package/src/browser/markdown-rendering/markdown-renderer.ts +98 -98
- package/src/browser/menu/browser-context-menu-renderer.ts +48 -48
- package/src/browser/menu/browser-menu-module.ts +28 -28
- package/src/browser/menu/browser-menu-plugin.ts +491 -491
- package/src/browser/menu/context-menu-context.ts +41 -41
- package/src/browser/messaging/connection-source.ts +26 -26
- package/src/browser/messaging/frontend-id-provider.ts +37 -37
- package/src/browser/messaging/index.ts +18 -18
- package/src/browser/messaging/messaging-frontend-module.ts +41 -41
- package/src/browser/messaging/service-connection-provider.ts +140 -140
- package/src/browser/messaging/ws-connection-provider.ts +49 -49
- package/src/browser/messaging/ws-connection-source.ts +230 -230
- package/src/browser/mime-service.ts +30 -30
- package/src/browser/navigatable-types.ts +81 -81
- package/src/browser/navigatable.ts +39 -39
- package/src/browser/open-with-service.ts +140 -93
- package/src/browser/opener-service.spec.ts +49 -49
- package/src/browser/opener-service.ts +169 -146
- package/src/browser/performance/frontend-stopwatch.ts +65 -65
- package/src/browser/performance/index.ts +18 -18
- package/src/browser/performance/measurement-frontend-bindings.ts +31 -31
- package/src/browser/preferences/index.ts +23 -23
- package/src/browser/preferences/injectable-preference-proxy.ts +283 -283
- package/src/browser/preferences/preference-configurations.ts +82 -82
- package/src/browser/preferences/preference-contribution.ts +436 -436
- package/src/browser/preferences/preference-language-override-service.ts +111 -111
- package/src/browser/preferences/preference-provider.spec.ts +36 -36
- package/src/browser/preferences/preference-provider.ts +277 -277
- package/src/browser/preferences/preference-proxy.spec.ts +367 -367
- package/src/browser/preferences/preference-proxy.ts +367 -367
- package/src/browser/preferences/preference-schema-provider.spec.ts +130 -130
- package/src/browser/preferences/preference-scope.ts +18 -18
- package/src/browser/preferences/preference-service.spec.ts +613 -613
- package/src/browser/preferences/preference-service.ts +594 -594
- package/src/browser/preferences/preference-validation-service.spec.ts +334 -334
- package/src/browser/preferences/preference-validation-service.ts +358 -358
- package/src/browser/preferences/test/index.ts +19 -19
- package/src/browser/preferences/test/mock-preference-provider.ts +50 -50
- package/src/browser/preferences/test/mock-preference-proxy.ts +48 -48
- package/src/browser/preferences/test/mock-preference-service.ts +63 -63
- package/src/browser/preload/i18n-preload-contribution.ts +50 -50
- package/src/browser/preload/os-preload-contribution.ts +37 -37
- package/src/browser/preload/preload-module.ts +45 -45
- package/src/browser/preload/preloader.ts +37 -37
- package/src/browser/preload/theme-preload-contribution.ts +31 -31
- package/src/browser/progress-bar-factory.ts +29 -29
- package/src/browser/progress-bar.ts +76 -76
- package/src/browser/progress-client.ts +53 -53
- package/src/browser/progress-location-service.spec.ts +50 -50
- package/src/browser/progress-location-service.ts +96 -96
- package/src/browser/progress-status-bar-item.ts +83 -83
- package/src/browser/quick-input/index.ts +23 -23
- package/src/browser/quick-input/quick-access.ts +75 -75
- package/src/browser/quick-input/quick-command-frontend-contribution.ts +89 -89
- package/src/browser/quick-input/quick-command-service.ts +246 -246
- package/src/browser/quick-input/quick-help-service.ts +87 -87
- package/src/browser/quick-input/quick-input-frontend-contribution.ts +33 -33
- package/src/browser/quick-input/quick-input-service.spec.ts +176 -176
- package/src/browser/quick-input/quick-input-service.ts +17 -17
- package/src/browser/quick-input/quick-pick-service-impl.ts +69 -69
- package/src/browser/quick-input/quick-view-service.ts +83 -83
- package/src/browser/request/browser-request-module.ts +23 -23
- package/src/browser/request/browser-request-service.ts +172 -172
- package/src/browser/resource-context-key.ts +77 -77
- package/src/browser/saveable-service.ts +332 -328
- package/src/browser/saveable.ts +395 -327
- package/src/browser/secondary-window-handler.ts +211 -211
- package/src/browser/shell/additional-views-menu-widget.tsx +71 -71
- package/src/browser/shell/application-shell-mouse-tracker.ts +103 -103
- package/src/browser/shell/application-shell.ts +2271 -2271
- package/src/browser/shell/current-widget-command-adapter.ts +57 -57
- package/src/browser/shell/index.ts +23 -23
- package/src/browser/shell/shell-layout-restorer.ts +399 -399
- package/src/browser/shell/side-panel-handler.ts +794 -794
- package/src/browser/shell/side-panel-toolbar.ts +111 -111
- package/src/browser/shell/sidebar-bottom-menu-widget.tsx +39 -39
- package/src/browser/shell/sidebar-menu-widget.tsx +183 -183
- package/src/browser/shell/sidebar-top-menu-widget.tsx +26 -26
- package/src/browser/shell/split-panels.ts +191 -191
- package/src/browser/shell/tab-bar-decorator.ts +106 -106
- package/src/browser/shell/tab-bar-toolbar/index.ts +19 -19
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.ts +31 -31
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.ts +242 -256
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.ts +149 -207
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.spec.ts +62 -62
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx +443 -428
- package/src/browser/shell/tab-bars.spec.ts +63 -63
- package/src/browser/shell/tab-bars.ts +1468 -1468
- package/src/browser/shell/theia-dock-panel.ts +265 -265
- package/src/browser/shell/view-column-service.ts +125 -125
- package/src/browser/shell/view-contribution.ts +178 -178
- package/src/browser/source-tree/index.ts +19 -19
- package/src/browser/source-tree/source-tree-widget.tsx +107 -107
- package/src/browser/source-tree/source-tree.ts +146 -146
- package/src/browser/source-tree/tree-source.ts +73 -73
- package/src/browser/status-bar/index.ts +29 -29
- package/src/browser/status-bar/status-bar-types.ts +97 -97
- package/src/browser/status-bar/status-bar-view-model.ts +209 -209
- package/src/browser/status-bar/status-bar.tsx +189 -189
- package/src/browser/storage-service.spec.ts +76 -76
- package/src/browser/storage-service.ts +129 -129
- package/src/browser/style/about.css +36 -36
- package/src/browser/style/alert-messages.css +62 -62
- package/src/browser/style/ansi.css +88 -88
- package/src/browser/style/breadcrumbs.css +130 -130
- package/src/browser/style/dialog.css +126 -126
- package/src/browser/style/dockpanel.css +76 -76
- package/src/browser/style/hover-service.css +101 -101
- package/src/browser/style/icons.css +61 -61
- package/src/browser/style/index.css +353 -351
- package/src/browser/style/materialcolors.css +278 -278
- package/src/browser/style/menus.css +230 -230
- package/src/browser/style/notification.css +39 -39
- package/src/browser/style/os.css +87 -87
- package/src/browser/style/progress-bar.css +43 -43
- package/src/browser/style/quick-title-bar.css +45 -45
- package/src/browser/style/scrollbars.css +172 -172
- package/src/browser/style/search-box.css +123 -123
- package/src/browser/style/select-component.css +107 -107
- package/src/browser/style/sidepanel.css +367 -367
- package/src/browser/style/split-widget.css +38 -0
- package/src/browser/style/status-bar.css +127 -127
- package/src/browser/style/tabs.css +647 -658
- package/src/browser/style/tooltip.css +28 -28
- package/src/browser/style/tree-decorators.css +81 -81
- package/src/browser/style/tree.css +232 -232
- package/src/browser/style/view-container.css +187 -194
- package/src/browser/style/widget.css +19 -19
- package/src/browser/styling-service.ts +96 -96
- package/src/browser/supported-encodings.ts +262 -262
- package/src/browser/test/jsdom.ts +69 -69
- package/src/browser/test/mock-connection-status-service.ts +33 -33
- package/src/browser/test/mock-env-variables-server.ts +47 -47
- package/src/browser/test/mock-opener-service.ts +34 -34
- package/src/browser/test/mock-storage-service.ts +49 -49
- package/src/browser/theming.ts +206 -206
- package/src/browser/tooltip-service.tsx +96 -96
- package/src/browser/tree/fuzzy-search.spec.ts +99 -99
- package/src/browser/tree/fuzzy-search.ts +136 -136
- package/src/browser/tree/index.ts +29 -29
- package/src/browser/tree/search-box-debounce.ts +96 -96
- package/src/browser/tree/search-box.ts +355 -355
- package/src/browser/tree/test/mock-selectable-tree-model.ts +109 -109
- package/src/browser/tree/test/mock-tree-model.ts +136 -136
- package/src/browser/tree/test/tree-test-container.ts +50 -50
- package/src/browser/tree/tree-compression/compressed-tree-expansion-service.ts +46 -46
- package/src/browser/tree/tree-compression/compressed-tree-model.ts +88 -88
- package/src/browser/tree/tree-compression/compressed-tree-widget.tsx +203 -203
- package/src/browser/tree/tree-compression/index.ts +20 -20
- package/src/browser/tree/tree-compression/tree-compression-service.ts +125 -125
- package/src/browser/tree/tree-compression/tree-compression.css +28 -28
- package/src/browser/tree/tree-consistency.spec.ts +105 -105
- package/src/browser/tree/tree-container.spec.ts +45 -45
- package/src/browser/tree/tree-container.ts +155 -155
- package/src/browser/tree/tree-decorator.spec.ts +162 -162
- package/src/browser/tree/tree-decorator.ts +238 -238
- package/src/browser/tree/tree-expansion.spec.ts +173 -173
- package/src/browser/tree/tree-expansion.ts +165 -165
- package/src/browser/tree/tree-focus-service.ts +55 -55
- package/src/browser/tree/tree-iterator.spec.ts +170 -170
- package/src/browser/tree/tree-iterator.ts +256 -256
- package/src/browser/tree/tree-label-provider.ts +40 -40
- package/src/browser/tree/tree-model.ts +562 -562
- package/src/browser/tree/tree-navigation.ts +58 -58
- package/src/browser/tree/tree-preference.ts +50 -50
- package/src/browser/tree/tree-search.ts +128 -128
- package/src/browser/tree/tree-selectable.spec.ts +152 -152
- package/src/browser/tree/tree-selection-impl.ts +176 -176
- package/src/browser/tree/tree-selection-state.spec.ts +462 -462
- package/src/browser/tree/tree-selection-state.ts +245 -245
- package/src/browser/tree/tree-selection.ts +159 -159
- package/src/browser/tree/tree-view-welcome-widget.tsx +263 -263
- package/src/browser/tree/tree-widget-selection.ts +45 -45
- package/src/browser/tree/tree-widget.tsx +1591 -1591
- package/src/browser/tree/tree.spec.ts +241 -241
- package/src/browser/tree/tree.ts +425 -425
- package/src/browser/undo-redo-handler.ts +85 -85
- package/src/browser/user-working-directory-provider.ts +77 -77
- package/src/browser/view-container.ts +1640 -1640
- package/src/browser/widget-decoration.ts +358 -358
- package/src/browser/widget-manager.spec.ts +102 -102
- package/src/browser/widget-manager.ts +318 -318
- package/src/browser/widget-open-handler.ts +168 -165
- package/src/browser/widgets/alert-message.tsx +56 -56
- package/src/browser/widgets/enhanced-preview-widget.ts +27 -27
- package/src/browser/widgets/extractable-widget.ts +33 -33
- package/src/browser/widgets/index.ts +21 -20
- package/src/browser/widgets/previewable-widget.ts +31 -31
- package/src/browser/widgets/react-renderer.tsx +53 -53
- package/src/browser/widgets/react-widget.tsx +51 -51
- package/src/browser/widgets/select-component.tsx +367 -367
- package/src/browser/widgets/split-widget.ts +163 -0
- package/src/browser/widgets/widget.ts +406 -406
- package/src/browser/window/browser-window-module.ts +32 -32
- package/src/browser/window/default-secondary-window-service.ts +189 -189
- package/src/browser/window/default-window-service.spec.ts +78 -78
- package/src/browser/window/default-window-service.ts +171 -171
- package/src/browser/window/secondary-window-service.ts +39 -39
- package/src/browser/window/test/mock-window-service.ts +29 -29
- package/src/browser/window/window-service.ts +78 -78
- package/src/browser/window/window-title-service.ts +107 -107
- package/src/browser/window/window-title-updater.ts +95 -95
- package/src/browser/window-contribution.ts +64 -64
- package/src/browser-only/frontend-only-application-module.ts +116 -116
- package/src/browser-only/i18n/i18n-frontend-only-module.ts +37 -37
- package/src/browser-only/logger-frontend-only-module.ts +63 -63
- package/src/browser-only/messaging/frontend-only-service-connection-provider.ts +39 -39
- package/src/browser-only/messaging/messaging-frontend-only-module.ts +42 -42
- package/src/browser-only/preload/frontend-only-preload-module.ts +49 -49
- package/src/common/accessibility.ts +33 -33
- package/src/common/application-error.spec.ts +27 -27
- package/src/common/application-error.ts +76 -76
- package/src/common/application-protocol.ts +42 -42
- package/src/common/array-utils.ts +129 -129
- package/src/common/buffer.ts +228 -228
- package/src/common/cancellation.ts +163 -163
- package/src/common/char-code.ts +438 -438
- package/src/common/collections.ts +125 -125
- package/src/common/color.ts +103 -103
- package/src/common/command.spec.ts +208 -208
- package/src/common/command.ts +489 -489
- package/src/common/contribution-filter/contribution-filter-registry.ts +79 -79
- package/src/common/contribution-filter/contribution-filter.ts +64 -64
- package/src/common/contribution-filter/filter.ts +23 -23
- package/src/common/contribution-filter/index.ts +19 -19
- package/src/common/contribution-provider.ts +96 -96
- package/src/common/disposable.spec.ts +94 -94
- package/src/common/disposable.ts +188 -188
- package/src/common/encoding-service.ts +380 -380
- package/src/common/encodings.ts +24 -24
- package/src/common/env-variables/env-variables-protocol.ts +38 -38
- package/src/common/env-variables/index.ts +17 -17
- package/src/common/event.spec.ts +32 -32
- package/src/common/event.ts +493 -487
- package/src/common/file-uri.ts +61 -61
- package/src/common/frontend-application-state.ts +38 -38
- package/src/common/glob.ts +741 -741
- package/src/common/hash.ts +85 -85
- package/src/common/i18n/localization-server.ts +25 -25
- package/src/common/i18n/localization.ts +80 -80
- package/src/common/i18n/nls.metadata.json +34112 -34112
- package/src/common/index.ts +51 -51
- package/src/common/json-schema.ts +108 -106
- package/src/common/key-store.ts +26 -26
- package/src/common/keybinding.ts +152 -152
- package/src/common/keyboard/keyboard-layout-provider.ts +51 -51
- package/src/common/keys.ts +694 -694
- package/src/common/label-protocol.ts +35 -35
- package/src/common/logger-protocol.ts +119 -119
- package/src/common/logger-watcher.ts +48 -48
- package/src/common/logger.spec.ts +46 -46
- package/src/common/logger.ts +389 -389
- package/src/common/lsp-types.ts +34 -34
- package/src/common/markdown-rendering/icon-utilities.ts +30 -30
- package/src/common/markdown-rendering/index.ts +18 -18
- package/src/common/markdown-rendering/markdown-string.ts +152 -152
- package/src/common/menu/action-menu-node.ts +65 -65
- package/src/common/menu/composite-menu-node.spec.ts +67 -67
- package/src/common/menu/composite-menu-node.ts +114 -114
- package/src/common/menu/index.ts +21 -21
- package/src/common/menu/menu-adapter.ts +103 -103
- package/src/common/menu/menu-model-registry.ts +374 -374
- package/src/common/menu/menu-types.ts +220 -219
- package/src/common/menu/menu.spec.ts +101 -101
- package/src/common/message-rpc/channel.spec.ts +88 -88
- package/src/common/message-rpc/channel.ts +300 -300
- package/src/common/message-rpc/index.ts +22 -22
- package/src/common/message-rpc/message-buffer.ts +105 -105
- package/src/common/message-rpc/msg-pack-extension-manager.ts +70 -70
- package/src/common/message-rpc/rpc-message-encoder.spec.ts +65 -65
- package/src/common/message-rpc/rpc-message-encoder.ts +190 -190
- package/src/common/message-rpc/rpc-protocol.ts +255 -255
- package/src/common/message-rpc/uint8-array-message-buffer.spec.ts +41 -41
- package/src/common/message-rpc/uint8-array-message-buffer.ts +213 -213
- package/src/common/message-service-protocol.ts +148 -148
- package/src/common/message-service.ts +226 -226
- package/src/common/messaging/connection-error-handler.ts +73 -73
- package/src/common/messaging/connection-management.ts +43 -43
- package/src/common/messaging/handler.ts +26 -26
- package/src/common/messaging/index.ts +19 -19
- package/src/common/messaging/proxy-factory.spec.ts +108 -108
- package/src/common/messaging/proxy-factory.ts +336 -336
- package/src/common/messaging/socket-write-buffer.ts +52 -52
- package/src/common/messaging/web-socket-channel.ts +76 -76
- package/src/common/nls.ts +151 -151
- package/src/common/numbers.ts +21 -21
- package/src/common/objects.spec.ts +112 -112
- package/src/common/objects.ts +123 -123
- package/src/common/os.ts +82 -82
- package/src/common/path.spec.ts +415 -415
- package/src/common/path.ts +334 -334
- package/src/common/paths.ts +250 -250
- package/src/common/performance/index.ts +19 -19
- package/src/common/performance/measurement-protocol.ts +104 -104
- package/src/common/performance/measurement.ts +130 -130
- package/src/common/performance/stopwatch.ts +183 -183
- package/src/common/preferences/preference-schema.ts +101 -101
- package/src/common/preferences/preference-scope.spec.ts +48 -48
- package/src/common/preferences/preference-scope.ts +68 -68
- package/src/common/prioritizeable.ts +58 -58
- package/src/common/progress-service-protocol.ts +35 -35
- package/src/common/progress-service.ts +82 -82
- package/src/common/promise-util.spec.ts +102 -102
- package/src/common/promise-util.ts +143 -143
- package/src/common/quick-pick-service.ts +353 -353
- package/src/common/reference.spec.ts +145 -145
- package/src/common/reference.ts +230 -230
- package/src/common/resource.ts +430 -430
- package/src/common/selection-command-handler.ts +101 -101
- package/src/common/selection-service.spec.ts +43 -43
- package/src/common/selection-service.ts +49 -49
- package/src/common/selection.ts +50 -50
- package/src/common/severity.ts +111 -111
- package/src/common/stream.ts +718 -718
- package/src/common/strings.ts +231 -231
- package/src/common/telemetry.ts +45 -45
- package/src/common/ternary-search-tree.ts +417 -417
- package/src/common/test/expect.ts +34 -34
- package/src/common/test/mock-logger.ts +118 -118
- package/src/common/test/mock-menu.ts +35 -35
- package/src/common/test/mock-resource-provider.ts +33 -33
- package/src/common/theme.ts +68 -68
- package/src/common/types.spec.ts +86 -86
- package/src/common/types.ts +140 -140
- package/src/common/uri-command-handler.spec.ts +90 -90
- package/src/common/uri-command-handler.ts +148 -148
- package/src/common/uri.spec.ts +278 -278
- package/src/common/uri.ts +279 -279
- package/src/common/uuid.ts +45 -45
- package/src/common/version.ts +17 -17
- package/src/common/view-column.ts +33 -33
- package/src/common/window.ts +34 -34
- package/src/electron-browser/electron-clipboard-service.ts +32 -32
- package/src/electron-browser/electron-uri-handler.ts +42 -0
- package/src/electron-browser/keyboard/electron-keyboard-layout-change-notifier.ts +39 -39
- package/src/electron-browser/keyboard/electron-keyboard-module.ts +28 -28
- package/src/electron-browser/menu/electron-context-menu-renderer.ts +122 -122
- package/src/electron-browser/menu/electron-main-menu-factory.ts +339 -338
- package/src/electron-browser/menu/electron-menu-contribution.ts +506 -506
- package/src/electron-browser/menu/electron-menu-module.ts +40 -40
- package/src/electron-browser/menu/electron-menu-style.css +110 -110
- package/src/electron-browser/messaging/electron-frontend-id-provider.ts +25 -25
- package/src/electron-browser/messaging/electron-ipc-connection-source.ts +65 -65
- package/src/electron-browser/messaging/electron-local-ws-connection-source.ts +45 -45
- package/src/electron-browser/messaging/electron-messaging-frontend-module.ts +78 -78
- package/src/electron-browser/messaging/electron-ws-connection-source.ts +38 -38
- package/src/electron-browser/preload.ts +264 -249
- package/src/electron-browser/request/electron-browser-request-module.ts +26 -26
- package/src/electron-browser/token/electron-token-frontend-module.ts +22 -22
- package/src/electron-browser/window/electron-frontend-application-state.ts +26 -26
- package/src/electron-browser/window/electron-secondary-window-service.ts +35 -35
- package/src/electron-browser/window/electron-window-module.ts +48 -45
- package/src/electron-browser/window/electron-window-preferences.ts +76 -76
- package/src/electron-browser/window/electron-window-service.ts +109 -109
- package/src/electron-browser/window/external-app-open-handler.ts +42 -42
- package/src/electron-common/electron-api.ts +157 -154
- package/src/electron-common/electron-main-window-service.ts +24 -24
- package/src/electron-common/electron-token.ts +27 -27
- package/src/electron-main/electron-api-main.ts +373 -347
- package/src/electron-main/electron-main-application-module.ts +65 -65
- package/src/electron-main/electron-main-application.ts +860 -818
- package/src/electron-main/electron-main-constants.ts +23 -23
- package/src/electron-main/electron-main-window-service-impl.ts +44 -44
- package/src/electron-main/electron-security-token-service.ts +36 -36
- package/src/electron-main/event-utils.ts +36 -36
- package/src/electron-main/messaging/electron-connection-handler.ts +21 -21
- package/src/electron-main/messaging/electron-messaging-contribution.ts +143 -143
- package/src/electron-main/messaging/electron-messaging-service.ts +35 -35
- package/src/electron-main/theia-electron-window.ts +219 -214
- package/src/electron-node/cli/electron-backend-cli-module.ts +24 -24
- package/src/electron-node/cli/electron-cli-contribution.ts +35 -35
- package/src/electron-node/hosting/electron-backend-hosting-module.ts +24 -24
- package/src/electron-node/hosting/electron-ws-origin-validator.ts +37 -37
- package/src/electron-node/keyboard/electron-backend-keyboard-module.ts +30 -30
- package/src/electron-node/keyboard/electron-keyboard-layout-provider.ts +35 -35
- package/src/electron-node/request/electron-backend-request-module.ts +23 -23
- package/src/electron-node/request/electron-backend-request-service.ts +78 -78
- package/src/electron-node/token/electron-token-backend-contribution.ts +48 -48
- package/src/electron-node/token/electron-token-backend-module.ts +28 -28
- package/src/electron-node/token/electron-token-validator.ts +93 -93
- package/src/node/application-server.ts +59 -59
- package/src/node/backend-application-config-provider.spec.ts +29 -29
- package/src/node/backend-application-config-provider.ts +48 -48
- package/src/node/backend-application-module.ts +139 -139
- package/src/node/backend-application.ts +374 -374
- package/src/node/cli.spec.ts +94 -94
- package/src/node/cli.ts +63 -63
- package/src/node/console-logger-server.spec.ts +59 -59
- package/src/node/console-logger-server.ts +76 -76
- package/src/node/debug.ts +30 -30
- package/src/node/dynamic-require.ts +56 -56
- package/src/node/env-variables/env-variables-server.ts +123 -123
- package/src/node/env-variables/index.ts +17 -17
- package/src/node/environment-utils.spec.ts +92 -92
- package/src/node/environment-utils.ts +66 -66
- package/src/node/file-uri.spec.ts +76 -76
- package/src/node/filesystem-locking.ts +77 -77
- package/src/node/hosting/backend-application-hosts.ts +60 -60
- package/src/node/hosting/backend-hosting-module.ts +26 -26
- package/src/node/hosting/ws-origin-validator.ts +36 -36
- package/src/node/i18n/i18n-backend-module.ts +42 -42
- package/src/node/i18n/localization-contribution.ts +112 -112
- package/src/node/i18n/localization-provider.ts +125 -125
- package/src/node/i18n/localization-server.ts +52 -52
- package/src/node/i18n/theia-localization-contribution.ts +40 -36
- package/src/node/index.ts +22 -22
- package/src/node/key-store-server.ts +162 -162
- package/src/node/logger-backend-module.ts +88 -88
- package/src/node/logger-cli-contribution.spec.ts +245 -245
- package/src/node/logger-cli-contribution.ts +168 -168
- package/src/node/main.ts +33 -33
- package/src/node/messaging/binary-message-pipe.ts +168 -168
- package/src/node/messaging/connection-container-module.ts +96 -96
- package/src/node/messaging/default-messaging-service.ts +129 -129
- package/src/node/messaging/frontend-connection-service.ts +24 -24
- package/src/node/messaging/index.ts +19 -19
- package/src/node/messaging/ipc-bootstrap.ts +27 -27
- package/src/node/messaging/ipc-channel.ts +77 -77
- package/src/node/messaging/ipc-connection-provider.ts +107 -107
- package/src/node/messaging/ipc-protocol.ts +76 -76
- package/src/node/messaging/messaging-backend-module.ts +52 -52
- package/src/node/messaging/messaging-listeners.ts +52 -52
- package/src/node/messaging/messaging-service.ts +46 -46
- package/src/node/messaging/test/test-web-socket-channel.ts +61 -61
- package/src/node/messaging/websocket-endpoint.ts +79 -79
- package/src/node/messaging/websocket-frontend-connection-service.ts +186 -186
- package/src/node/os-backend-provider.ts +25 -25
- package/src/node/performance/index.ts +18 -18
- package/src/node/performance/measurement-backend-bindings.ts +35 -35
- package/src/node/performance/node-stopwatch.ts +40 -40
- package/src/node/process-utils.spec.ts +48 -48
- package/src/node/process-utils.ts +102 -102
- package/src/node/remote/backend-remote-service.ts +25 -25
- package/src/node/remote/remote-cli-contribution.ts +34 -34
- package/src/node/remote/remote-copy-contribution.ts +45 -45
- package/src/node/request/backend-request-facade.ts +39 -39
- package/src/node/request/backend-request-module.ts +25 -25
- package/src/node/request/proxy-cli-contribution.ts +65 -65
- package/src/node/ws-request-validators.ts +56 -56
- package/src/typings/native-keymap.d.ts +108 -108
- package/i18n/nls.pt-pt.json +0 -552
package/src/browser/dialogs.ts
CHANGED
|
@@ -1,534 +1,534 @@
|
|
|
1
|
-
// *****************************************************************************
|
|
2
|
-
// Copyright (C) 2017 TypeFox and others.
|
|
3
|
-
//
|
|
4
|
-
// This program and the accompanying materials are made available under the
|
|
5
|
-
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
-
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
-
//
|
|
8
|
-
// This Source Code may also be made available under the following Secondary
|
|
9
|
-
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
-
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
-
// with the GNU Classpath Exception which is available at
|
|
12
|
-
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
-
//
|
|
14
|
-
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
-
// *****************************************************************************
|
|
16
|
-
|
|
17
|
-
import { injectable, inject } from 'inversify';
|
|
18
|
-
import { Disposable, MaybePromise, CancellationTokenSource, nls } from '../common';
|
|
19
|
-
import { Key } from './keyboard/keys';
|
|
20
|
-
import { Widget, BaseWidget, Message, addKeyListener, codiconArray } from './widgets';
|
|
21
|
-
import { FrontendApplicationContribution } from './frontend-application-contribution';
|
|
22
|
-
|
|
23
|
-
@injectable()
|
|
24
|
-
export class DialogProps {
|
|
25
|
-
readonly title: string;
|
|
26
|
-
/**
|
|
27
|
-
* Determines the maximum width of the dialog in pixels.
|
|
28
|
-
* Default value is undefined, which would result in the css property 'max-width: none' being applied to the dialog.
|
|
29
|
-
*/
|
|
30
|
-
maxWidth?: number;
|
|
31
|
-
/**
|
|
32
|
-
* Determine the word wrapping behavior for content in the dialog.
|
|
33
|
-
* - `normal`: breaks words at allowed break points.
|
|
34
|
-
* - `break-word`: breaks otherwise unbreakable words.
|
|
35
|
-
* - `initial`: sets the property to it's default value.
|
|
36
|
-
* - `inherit`: inherit this property from it's parent element.
|
|
37
|
-
* Default value is undefined, which would result in the css property 'word-wrap' not being applied to the dialog.
|
|
38
|
-
*/
|
|
39
|
-
wordWrap?: 'normal' | 'break-word' | 'initial' | 'inherit';
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export type DialogMode = 'open' | 'preview';
|
|
43
|
-
|
|
44
|
-
export type DialogError = string | boolean | {
|
|
45
|
-
message: string
|
|
46
|
-
result: boolean
|
|
47
|
-
};
|
|
48
|
-
export namespace DialogError {
|
|
49
|
-
export function getResult(error: DialogError): boolean {
|
|
50
|
-
if (typeof error === 'string') {
|
|
51
|
-
return !error.length;
|
|
52
|
-
}
|
|
53
|
-
if (typeof error === 'boolean') {
|
|
54
|
-
return error;
|
|
55
|
-
}
|
|
56
|
-
return error.result;
|
|
57
|
-
}
|
|
58
|
-
export function getMessage(error: DialogError): string {
|
|
59
|
-
if (typeof error === 'string') {
|
|
60
|
-
return error;
|
|
61
|
-
}
|
|
62
|
-
if (typeof error === 'boolean') {
|
|
63
|
-
return '';
|
|
64
|
-
}
|
|
65
|
-
return error.message;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export namespace Dialog {
|
|
70
|
-
export const YES = nls.localizeByDefault('Yes');
|
|
71
|
-
export const NO = nls.localizeByDefault('No');
|
|
72
|
-
export const OK = nls.localizeByDefault('OK');
|
|
73
|
-
export const CANCEL = nls.localizeByDefault('Cancel');
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
@injectable()
|
|
77
|
-
export class DialogOverlayService implements FrontendApplicationContribution {
|
|
78
|
-
|
|
79
|
-
protected static INSTANCE: DialogOverlayService;
|
|
80
|
-
|
|
81
|
-
static get(): DialogOverlayService {
|
|
82
|
-
return DialogOverlayService.INSTANCE;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
86
|
-
protected readonly dialogs: AbstractDialog<any>[] = [];
|
|
87
|
-
protected readonly documents: Document[] = [];
|
|
88
|
-
|
|
89
|
-
constructor() {
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
initialize(): void {
|
|
93
|
-
DialogOverlayService.INSTANCE = this;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
97
|
-
protected get currentDialog(): AbstractDialog<any> | undefined {
|
|
98
|
-
return this.dialogs[0];
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
102
|
-
push(dialog: AbstractDialog<any>): Disposable {
|
|
103
|
-
if (this.documents.findIndex(document => document === dialog.node.ownerDocument) < 0) {
|
|
104
|
-
addKeyListener(dialog.node.ownerDocument.body, Key.ENTER, e => this.handleEnter(e));
|
|
105
|
-
addKeyListener(dialog.node.ownerDocument.body, Key.ESCAPE, e => this.handleEscape(e));
|
|
106
|
-
this.documents.push(dialog.node.ownerDocument);
|
|
107
|
-
}
|
|
108
|
-
this.dialogs.unshift(dialog);
|
|
109
|
-
return Disposable.create(() => {
|
|
110
|
-
const index = this.dialogs.indexOf(dialog);
|
|
111
|
-
if (index > -1) {
|
|
112
|
-
this.dialogs.splice(index, 1);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
protected handleEscape(event: KeyboardEvent): boolean | void {
|
|
118
|
-
const dialog = this.currentDialog;
|
|
119
|
-
if (dialog) {
|
|
120
|
-
return dialog['handleEscape'](event);
|
|
121
|
-
}
|
|
122
|
-
return false;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
protected handleEnter(event: KeyboardEvent): boolean | void {
|
|
126
|
-
const dialog = this.currentDialog;
|
|
127
|
-
if (dialog) {
|
|
128
|
-
return dialog['handleEnter'](event);
|
|
129
|
-
}
|
|
130
|
-
return false;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
@injectable()
|
|
136
|
-
export abstract class AbstractDialog<T> extends BaseWidget {
|
|
137
|
-
|
|
138
|
-
protected readonly titleNode: HTMLDivElement;
|
|
139
|
-
protected readonly contentNode: HTMLDivElement;
|
|
140
|
-
protected readonly closeCrossNode: HTMLElement;
|
|
141
|
-
protected readonly controlPanel: HTMLDivElement;
|
|
142
|
-
protected readonly errorMessageNode: HTMLDivElement;
|
|
143
|
-
|
|
144
|
-
protected resolve: undefined | ((value: T | undefined) => void);
|
|
145
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
146
|
-
protected reject: undefined | ((reason: any) => void);
|
|
147
|
-
|
|
148
|
-
protected closeButton: HTMLButtonElement | undefined;
|
|
149
|
-
protected acceptButton: HTMLButtonElement | undefined;
|
|
150
|
-
|
|
151
|
-
protected activeElement: HTMLElement | undefined;
|
|
152
|
-
|
|
153
|
-
constructor(
|
|
154
|
-
protected readonly props: DialogProps,
|
|
155
|
-
options?: Widget.IOptions
|
|
156
|
-
) {
|
|
157
|
-
super(options);
|
|
158
|
-
this.id = 'theia-dialog-shell';
|
|
159
|
-
this.addClass('dialogOverlay');
|
|
160
|
-
this.toDispose.push(Disposable.create(() => {
|
|
161
|
-
if (this.reject) {
|
|
162
|
-
Widget.detach(this);
|
|
163
|
-
}
|
|
164
|
-
}));
|
|
165
|
-
const container = this.node.ownerDocument.createElement('div');
|
|
166
|
-
container.classList.add('dialogBlock');
|
|
167
|
-
if (props.maxWidth === undefined) {
|
|
168
|
-
container.setAttribute('style', 'max-width: none');
|
|
169
|
-
} else if (props.maxWidth < 400) {
|
|
170
|
-
container.setAttribute('style', `max-width: ${props.maxWidth}px; min-width: 0px`);
|
|
171
|
-
} else {
|
|
172
|
-
container.setAttribute('style', `max-width: ${props.maxWidth}px`);
|
|
173
|
-
}
|
|
174
|
-
this.node.appendChild(container);
|
|
175
|
-
|
|
176
|
-
const titleContentNode = this.node.ownerDocument.createElement('div');
|
|
177
|
-
titleContentNode.classList.add('dialogTitle');
|
|
178
|
-
container.appendChild(titleContentNode);
|
|
179
|
-
|
|
180
|
-
this.titleNode = this.node.ownerDocument.createElement('div');
|
|
181
|
-
this.titleNode.textContent = props.title;
|
|
182
|
-
titleContentNode.appendChild(this.titleNode);
|
|
183
|
-
|
|
184
|
-
this.closeCrossNode = this.node.ownerDocument.createElement('i');
|
|
185
|
-
this.closeCrossNode.classList.add(...codiconArray('close', true));
|
|
186
|
-
this.closeCrossNode.classList.add('closeButton');
|
|
187
|
-
titleContentNode.appendChild(this.closeCrossNode);
|
|
188
|
-
|
|
189
|
-
this.contentNode = this.node.ownerDocument.createElement('div');
|
|
190
|
-
this.contentNode.classList.add('dialogContent');
|
|
191
|
-
if (props.wordWrap !== undefined) {
|
|
192
|
-
this.contentNode.setAttribute('style', `word-wrap: ${props.wordWrap}`);
|
|
193
|
-
}
|
|
194
|
-
container.appendChild(this.contentNode);
|
|
195
|
-
|
|
196
|
-
this.controlPanel = this.node.ownerDocument.createElement('div');
|
|
197
|
-
this.controlPanel.classList.add('dialogControl');
|
|
198
|
-
container.appendChild(this.controlPanel);
|
|
199
|
-
|
|
200
|
-
this.errorMessageNode = this.node.ownerDocument.createElement('div');
|
|
201
|
-
this.errorMessageNode.classList.add('error');
|
|
202
|
-
this.errorMessageNode.setAttribute('style', 'flex: 2');
|
|
203
|
-
this.controlPanel.appendChild(this.errorMessageNode);
|
|
204
|
-
|
|
205
|
-
this.update();
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
protected appendCloseButton(text: string = Dialog.CANCEL): HTMLButtonElement {
|
|
209
|
-
return this.closeButton = this.appendButton(text, false);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
protected appendAcceptButton(text: string = Dialog.OK): HTMLButtonElement {
|
|
213
|
-
return this.acceptButton = this.appendButton(text, true);
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
protected appendButton(text: string, primary: boolean): HTMLButtonElement {
|
|
217
|
-
const button = this.createButton(text);
|
|
218
|
-
this.controlPanel.appendChild(button);
|
|
219
|
-
button.classList.add(primary ? 'main' : 'secondary');
|
|
220
|
-
return button;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
protected createButton(text: string): HTMLButtonElement {
|
|
224
|
-
const button = document.createElement('button');
|
|
225
|
-
button.classList.add('theia-button');
|
|
226
|
-
button.textContent = text;
|
|
227
|
-
return button;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
protected override onAfterAttach(msg: Message): void {
|
|
231
|
-
super.onAfterAttach(msg);
|
|
232
|
-
if (this.closeButton) {
|
|
233
|
-
this.addCloseAction(this.closeButton, 'click');
|
|
234
|
-
}
|
|
235
|
-
if (this.acceptButton) {
|
|
236
|
-
this.addAcceptAction(this.acceptButton, 'click');
|
|
237
|
-
}
|
|
238
|
-
this.addCloseAction(this.closeCrossNode, 'click');
|
|
239
|
-
// TODO: use DI always to create dialog instances
|
|
240
|
-
this.toDisposeOnDetach.push(DialogOverlayService.get().push(this));
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
protected handleEscape(event: KeyboardEvent): boolean | void {
|
|
244
|
-
this.close();
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
protected handleEnter(event: KeyboardEvent): boolean | void {
|
|
248
|
-
if (event.target instanceof HTMLTextAreaElement) {
|
|
249
|
-
return false;
|
|
250
|
-
}
|
|
251
|
-
this.accept();
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
protected override onActivateRequest(msg: Message): void {
|
|
255
|
-
super.onActivateRequest(msg);
|
|
256
|
-
if (this.acceptButton) {
|
|
257
|
-
this.acceptButton.focus();
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
open(): Promise<T | undefined> {
|
|
262
|
-
if (this.resolve) {
|
|
263
|
-
return Promise.reject(new Error('The dialog is already opened.'));
|
|
264
|
-
}
|
|
265
|
-
this.activeElement = this.node.ownerDocument.activeElement as HTMLElement;
|
|
266
|
-
return new Promise<T | undefined>((resolve, reject) => {
|
|
267
|
-
this.resolve = resolve;
|
|
268
|
-
this.reject = reject;
|
|
269
|
-
this.toDisposeOnDetach.push(Disposable.create(() => {
|
|
270
|
-
this.resolve = undefined;
|
|
271
|
-
this.reject = undefined;
|
|
272
|
-
}));
|
|
273
|
-
|
|
274
|
-
Widget.attach(this, this.node.ownerDocument.body);
|
|
275
|
-
this.activate();
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
override close(): void {
|
|
280
|
-
if (this.resolve) {
|
|
281
|
-
if (this.activeElement) {
|
|
282
|
-
this.activeElement.focus({ preventScroll: true });
|
|
283
|
-
}
|
|
284
|
-
this.resolve(undefined);
|
|
285
|
-
}
|
|
286
|
-
this.activeElement = undefined;
|
|
287
|
-
super.close();
|
|
288
|
-
}
|
|
289
|
-
protected override onUpdateRequest(msg: Message): void {
|
|
290
|
-
super.onUpdateRequest(msg);
|
|
291
|
-
this.validate();
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
protected validateCancellationSource = new CancellationTokenSource();
|
|
295
|
-
protected async validate(): Promise<void> {
|
|
296
|
-
if (!this.resolve) {
|
|
297
|
-
return;
|
|
298
|
-
}
|
|
299
|
-
this.validateCancellationSource.cancel();
|
|
300
|
-
this.validateCancellationSource = new CancellationTokenSource();
|
|
301
|
-
const token = this.validateCancellationSource.token;
|
|
302
|
-
const value = this.value;
|
|
303
|
-
const error = await this.isValid(value, 'preview');
|
|
304
|
-
if (token.isCancellationRequested) {
|
|
305
|
-
return;
|
|
306
|
-
}
|
|
307
|
-
this.setErrorMessage(error);
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
protected acceptCancellationSource = new CancellationTokenSource();
|
|
311
|
-
protected async accept(): Promise<void> {
|
|
312
|
-
if (!this.resolve) {
|
|
313
|
-
return;
|
|
314
|
-
}
|
|
315
|
-
this.acceptCancellationSource.cancel();
|
|
316
|
-
this.acceptCancellationSource = new CancellationTokenSource();
|
|
317
|
-
const token = this.acceptCancellationSource.token;
|
|
318
|
-
const value = this.value;
|
|
319
|
-
const error = await this.isValid(value, 'open');
|
|
320
|
-
if (token.isCancellationRequested) {
|
|
321
|
-
return;
|
|
322
|
-
}
|
|
323
|
-
if (!DialogError.getResult(error)) {
|
|
324
|
-
this.setErrorMessage(error);
|
|
325
|
-
} else {
|
|
326
|
-
this.resolve(value);
|
|
327
|
-
Widget.detach(this);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
abstract get value(): T;
|
|
332
|
-
|
|
333
|
-
/**
|
|
334
|
-
* Return a string of zero-length or true if valid.
|
|
335
|
-
*/
|
|
336
|
-
protected isValid(value: T, mode: DialogMode): MaybePromise<DialogError> {
|
|
337
|
-
return '';
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
protected setErrorMessage(error: DialogError): void {
|
|
341
|
-
if (this.acceptButton) {
|
|
342
|
-
this.acceptButton.disabled = !DialogError.getResult(error);
|
|
343
|
-
}
|
|
344
|
-
this.errorMessageNode.innerText = DialogError.getMessage(error);
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
protected addAction<K extends keyof HTMLElementEventMap>(element: HTMLElement, callback: () => void, ...additionalEventTypes: K[]): void {
|
|
348
|
-
this.addKeyListener(element, Key.ENTER, callback, ...additionalEventTypes);
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
protected addCloseAction<K extends keyof HTMLElementEventMap>(element: HTMLElement, ...additionalEventTypes: K[]): void {
|
|
352
|
-
this.addAction(element, () => this.close(), ...additionalEventTypes);
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
protected addAcceptAction<K extends keyof HTMLElementEventMap>(element: HTMLElement, ...additionalEventTypes: K[]): void {
|
|
356
|
-
this.addAction(element, () => this.accept(), ...additionalEventTypes);
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
@injectable()
|
|
362
|
-
export class MessageDialogProps extends DialogProps {
|
|
363
|
-
readonly msg: string | HTMLElement;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
@injectable()
|
|
367
|
-
export class ConfirmDialogProps extends MessageDialogProps {
|
|
368
|
-
readonly cancel?: string;
|
|
369
|
-
readonly ok?: string;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
export class ConfirmDialog extends AbstractDialog<boolean> {
|
|
373
|
-
|
|
374
|
-
protected confirmed = true;
|
|
375
|
-
|
|
376
|
-
constructor(
|
|
377
|
-
@inject(ConfirmDialogProps) protected override readonly props: ConfirmDialogProps
|
|
378
|
-
) {
|
|
379
|
-
super(props);
|
|
380
|
-
|
|
381
|
-
this.contentNode.appendChild(this.createMessageNode(this.props.msg));
|
|
382
|
-
this.appendCloseButton(props.cancel);
|
|
383
|
-
this.appendAcceptButton(props.ok);
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
protected override onCloseRequest(msg: Message): void {
|
|
387
|
-
super.onCloseRequest(msg);
|
|
388
|
-
this.confirmed = false;
|
|
389
|
-
this.accept();
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
get value(): boolean {
|
|
393
|
-
return this.confirmed;
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
protected createMessageNode(msg: string | HTMLElement): HTMLElement {
|
|
397
|
-
if (typeof msg === 'string') {
|
|
398
|
-
const messageNode = this.node.ownerDocument.createElement('div');
|
|
399
|
-
messageNode.textContent = msg;
|
|
400
|
-
return messageNode;
|
|
401
|
-
}
|
|
402
|
-
return msg;
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
export async function confirmExit(): Promise<boolean> {
|
|
407
|
-
const safeToExit = await new ConfirmDialog({
|
|
408
|
-
title: nls.localizeByDefault('Are you sure you want to quit?'),
|
|
409
|
-
msg: nls.localize('theia/core/quitMessage', 'Any unsaved changes will not be saved.'),
|
|
410
|
-
ok: Dialog.YES,
|
|
411
|
-
cancel: Dialog.NO,
|
|
412
|
-
}).open();
|
|
413
|
-
return safeToExit === true;
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
export class ConfirmSaveDialogProps extends MessageDialogProps {
|
|
417
|
-
readonly cancel: string;
|
|
418
|
-
readonly dontSave: string;
|
|
419
|
-
readonly save: string;
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
// Dialog prompting the user to confirm whether they wish to save changes or not
|
|
423
|
-
export class ConfirmSaveDialog extends AbstractDialog<boolean | undefined> {
|
|
424
|
-
protected result?: boolean = false;
|
|
425
|
-
|
|
426
|
-
constructor(
|
|
427
|
-
@inject(ConfirmSaveDialogProps) protected override readonly props: ConfirmSaveDialogProps
|
|
428
|
-
) {
|
|
429
|
-
super(props);
|
|
430
|
-
// Append message and buttons to the dialog
|
|
431
|
-
this.contentNode.appendChild(this.createMessageNode(this.props.msg));
|
|
432
|
-
this.closeButton = this.appendButtonAndSetResult(props.cancel, false);
|
|
433
|
-
this.appendButtonAndSetResult(props.dontSave, false, false);
|
|
434
|
-
this.acceptButton = this.appendButtonAndSetResult(props.save, true, true);
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
get value(): boolean | undefined {
|
|
438
|
-
return this.result;
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
protected createMessageNode(msg: string | HTMLElement): HTMLElement {
|
|
442
|
-
if (typeof msg === 'string') {
|
|
443
|
-
const messageNode = document.createElement('div');
|
|
444
|
-
messageNode.textContent = msg;
|
|
445
|
-
return messageNode;
|
|
446
|
-
}
|
|
447
|
-
return msg;
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
protected appendButtonAndSetResult(text: string, primary: boolean, result?: boolean): HTMLButtonElement {
|
|
451
|
-
const button = this.appendButton(text, primary);
|
|
452
|
-
button.addEventListener('click', () => {
|
|
453
|
-
this.result = result;
|
|
454
|
-
this.accept();
|
|
455
|
-
});
|
|
456
|
-
return button;
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
@injectable()
|
|
462
|
-
export class SingleTextInputDialogProps extends DialogProps {
|
|
463
|
-
readonly confirmButtonLabel?: string;
|
|
464
|
-
readonly initialValue?: string;
|
|
465
|
-
readonly placeholder?: string;
|
|
466
|
-
readonly initialSelectionRange?: {
|
|
467
|
-
start: number
|
|
468
|
-
end: number
|
|
469
|
-
direction?: 'forward' | 'backward' | 'none'
|
|
470
|
-
};
|
|
471
|
-
readonly validate?: (input: string, mode: DialogMode) => MaybePromise<DialogError>;
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
export class SingleTextInputDialog extends AbstractDialog<string> {
|
|
475
|
-
|
|
476
|
-
protected readonly inputField: HTMLInputElement;
|
|
477
|
-
|
|
478
|
-
constructor(
|
|
479
|
-
@inject(SingleTextInputDialogProps) protected override props: SingleTextInputDialogProps
|
|
480
|
-
) {
|
|
481
|
-
super(props);
|
|
482
|
-
|
|
483
|
-
this.inputField = document.createElement('input');
|
|
484
|
-
this.inputField.type = 'text';
|
|
485
|
-
this.inputField.className = 'theia-input';
|
|
486
|
-
this.inputField.spellcheck = false;
|
|
487
|
-
this.inputField.setAttribute('style', 'flex: 0;');
|
|
488
|
-
this.inputField.placeholder = props.placeholder || '';
|
|
489
|
-
this.inputField.value = props.initialValue || '';
|
|
490
|
-
if (props.initialSelectionRange) {
|
|
491
|
-
this.inputField.setSelectionRange(
|
|
492
|
-
props.initialSelectionRange.start,
|
|
493
|
-
props.initialSelectionRange.end,
|
|
494
|
-
props.initialSelectionRange.direction
|
|
495
|
-
);
|
|
496
|
-
} else {
|
|
497
|
-
this.inputField.select();
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
this.contentNode.appendChild(this.inputField);
|
|
501
|
-
this.controlPanel.removeChild(this.errorMessageNode);
|
|
502
|
-
this.contentNode.appendChild(this.errorMessageNode);
|
|
503
|
-
|
|
504
|
-
this.appendAcceptButton(props.confirmButtonLabel);
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
get value(): string {
|
|
508
|
-
return this.inputField.value;
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
protected override isValid(value: string, mode: DialogMode): MaybePromise<DialogError> {
|
|
512
|
-
if (this.props.validate) {
|
|
513
|
-
return this.props.validate(value, mode);
|
|
514
|
-
}
|
|
515
|
-
return super.isValid(value, mode);
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
protected override onAfterAttach(msg: Message): void {
|
|
519
|
-
super.onAfterAttach(msg);
|
|
520
|
-
this.addUpdateListener(this.inputField, 'input');
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
protected override onActivateRequest(msg: Message): void {
|
|
524
|
-
this.inputField.focus();
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
protected override handleEnter(event: KeyboardEvent): boolean | void {
|
|
528
|
-
if (event.target instanceof HTMLInputElement) {
|
|
529
|
-
return super.handleEnter(event);
|
|
530
|
-
}
|
|
531
|
-
return false;
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
}
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2017 TypeFox and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import { injectable, inject } from 'inversify';
|
|
18
|
+
import { Disposable, MaybePromise, CancellationTokenSource, nls } from '../common';
|
|
19
|
+
import { Key } from './keyboard/keys';
|
|
20
|
+
import { Widget, BaseWidget, Message, addKeyListener, codiconArray } from './widgets';
|
|
21
|
+
import { FrontendApplicationContribution } from './frontend-application-contribution';
|
|
22
|
+
|
|
23
|
+
@injectable()
|
|
24
|
+
export class DialogProps {
|
|
25
|
+
readonly title: string;
|
|
26
|
+
/**
|
|
27
|
+
* Determines the maximum width of the dialog in pixels.
|
|
28
|
+
* Default value is undefined, which would result in the css property 'max-width: none' being applied to the dialog.
|
|
29
|
+
*/
|
|
30
|
+
maxWidth?: number;
|
|
31
|
+
/**
|
|
32
|
+
* Determine the word wrapping behavior for content in the dialog.
|
|
33
|
+
* - `normal`: breaks words at allowed break points.
|
|
34
|
+
* - `break-word`: breaks otherwise unbreakable words.
|
|
35
|
+
* - `initial`: sets the property to it's default value.
|
|
36
|
+
* - `inherit`: inherit this property from it's parent element.
|
|
37
|
+
* Default value is undefined, which would result in the css property 'word-wrap' not being applied to the dialog.
|
|
38
|
+
*/
|
|
39
|
+
wordWrap?: 'normal' | 'break-word' | 'initial' | 'inherit';
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export type DialogMode = 'open' | 'preview';
|
|
43
|
+
|
|
44
|
+
export type DialogError = string | boolean | {
|
|
45
|
+
message: string
|
|
46
|
+
result: boolean
|
|
47
|
+
};
|
|
48
|
+
export namespace DialogError {
|
|
49
|
+
export function getResult(error: DialogError): boolean {
|
|
50
|
+
if (typeof error === 'string') {
|
|
51
|
+
return !error.length;
|
|
52
|
+
}
|
|
53
|
+
if (typeof error === 'boolean') {
|
|
54
|
+
return error;
|
|
55
|
+
}
|
|
56
|
+
return error.result;
|
|
57
|
+
}
|
|
58
|
+
export function getMessage(error: DialogError): string {
|
|
59
|
+
if (typeof error === 'string') {
|
|
60
|
+
return error;
|
|
61
|
+
}
|
|
62
|
+
if (typeof error === 'boolean') {
|
|
63
|
+
return '';
|
|
64
|
+
}
|
|
65
|
+
return error.message;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export namespace Dialog {
|
|
70
|
+
export const YES = nls.localizeByDefault('Yes');
|
|
71
|
+
export const NO = nls.localizeByDefault('No');
|
|
72
|
+
export const OK = nls.localizeByDefault('OK');
|
|
73
|
+
export const CANCEL = nls.localizeByDefault('Cancel');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@injectable()
|
|
77
|
+
export class DialogOverlayService implements FrontendApplicationContribution {
|
|
78
|
+
|
|
79
|
+
protected static INSTANCE: DialogOverlayService;
|
|
80
|
+
|
|
81
|
+
static get(): DialogOverlayService {
|
|
82
|
+
return DialogOverlayService.INSTANCE;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
86
|
+
protected readonly dialogs: AbstractDialog<any>[] = [];
|
|
87
|
+
protected readonly documents: Document[] = [];
|
|
88
|
+
|
|
89
|
+
constructor() {
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
initialize(): void {
|
|
93
|
+
DialogOverlayService.INSTANCE = this;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
97
|
+
protected get currentDialog(): AbstractDialog<any> | undefined {
|
|
98
|
+
return this.dialogs[0];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
102
|
+
push(dialog: AbstractDialog<any>): Disposable {
|
|
103
|
+
if (this.documents.findIndex(document => document === dialog.node.ownerDocument) < 0) {
|
|
104
|
+
addKeyListener(dialog.node.ownerDocument.body, Key.ENTER, e => this.handleEnter(e));
|
|
105
|
+
addKeyListener(dialog.node.ownerDocument.body, Key.ESCAPE, e => this.handleEscape(e));
|
|
106
|
+
this.documents.push(dialog.node.ownerDocument);
|
|
107
|
+
}
|
|
108
|
+
this.dialogs.unshift(dialog);
|
|
109
|
+
return Disposable.create(() => {
|
|
110
|
+
const index = this.dialogs.indexOf(dialog);
|
|
111
|
+
if (index > -1) {
|
|
112
|
+
this.dialogs.splice(index, 1);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
protected handleEscape(event: KeyboardEvent): boolean | void {
|
|
118
|
+
const dialog = this.currentDialog;
|
|
119
|
+
if (dialog) {
|
|
120
|
+
return dialog['handleEscape'](event);
|
|
121
|
+
}
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
protected handleEnter(event: KeyboardEvent): boolean | void {
|
|
126
|
+
const dialog = this.currentDialog;
|
|
127
|
+
if (dialog) {
|
|
128
|
+
return dialog['handleEnter'](event);
|
|
129
|
+
}
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
@injectable()
|
|
136
|
+
export abstract class AbstractDialog<T> extends BaseWidget {
|
|
137
|
+
|
|
138
|
+
protected readonly titleNode: HTMLDivElement;
|
|
139
|
+
protected readonly contentNode: HTMLDivElement;
|
|
140
|
+
protected readonly closeCrossNode: HTMLElement;
|
|
141
|
+
protected readonly controlPanel: HTMLDivElement;
|
|
142
|
+
protected readonly errorMessageNode: HTMLDivElement;
|
|
143
|
+
|
|
144
|
+
protected resolve: undefined | ((value: T | undefined) => void);
|
|
145
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
146
|
+
protected reject: undefined | ((reason: any) => void);
|
|
147
|
+
|
|
148
|
+
protected closeButton: HTMLButtonElement | undefined;
|
|
149
|
+
protected acceptButton: HTMLButtonElement | undefined;
|
|
150
|
+
|
|
151
|
+
protected activeElement: HTMLElement | undefined;
|
|
152
|
+
|
|
153
|
+
constructor(
|
|
154
|
+
protected readonly props: DialogProps,
|
|
155
|
+
options?: Widget.IOptions
|
|
156
|
+
) {
|
|
157
|
+
super(options);
|
|
158
|
+
this.id = 'theia-dialog-shell';
|
|
159
|
+
this.addClass('dialogOverlay');
|
|
160
|
+
this.toDispose.push(Disposable.create(() => {
|
|
161
|
+
if (this.reject) {
|
|
162
|
+
Widget.detach(this);
|
|
163
|
+
}
|
|
164
|
+
}));
|
|
165
|
+
const container = this.node.ownerDocument.createElement('div');
|
|
166
|
+
container.classList.add('dialogBlock');
|
|
167
|
+
if (props.maxWidth === undefined) {
|
|
168
|
+
container.setAttribute('style', 'max-width: none');
|
|
169
|
+
} else if (props.maxWidth < 400) {
|
|
170
|
+
container.setAttribute('style', `max-width: ${props.maxWidth}px; min-width: 0px`);
|
|
171
|
+
} else {
|
|
172
|
+
container.setAttribute('style', `max-width: ${props.maxWidth}px`);
|
|
173
|
+
}
|
|
174
|
+
this.node.appendChild(container);
|
|
175
|
+
|
|
176
|
+
const titleContentNode = this.node.ownerDocument.createElement('div');
|
|
177
|
+
titleContentNode.classList.add('dialogTitle');
|
|
178
|
+
container.appendChild(titleContentNode);
|
|
179
|
+
|
|
180
|
+
this.titleNode = this.node.ownerDocument.createElement('div');
|
|
181
|
+
this.titleNode.textContent = props.title;
|
|
182
|
+
titleContentNode.appendChild(this.titleNode);
|
|
183
|
+
|
|
184
|
+
this.closeCrossNode = this.node.ownerDocument.createElement('i');
|
|
185
|
+
this.closeCrossNode.classList.add(...codiconArray('close', true));
|
|
186
|
+
this.closeCrossNode.classList.add('closeButton');
|
|
187
|
+
titleContentNode.appendChild(this.closeCrossNode);
|
|
188
|
+
|
|
189
|
+
this.contentNode = this.node.ownerDocument.createElement('div');
|
|
190
|
+
this.contentNode.classList.add('dialogContent');
|
|
191
|
+
if (props.wordWrap !== undefined) {
|
|
192
|
+
this.contentNode.setAttribute('style', `word-wrap: ${props.wordWrap}`);
|
|
193
|
+
}
|
|
194
|
+
container.appendChild(this.contentNode);
|
|
195
|
+
|
|
196
|
+
this.controlPanel = this.node.ownerDocument.createElement('div');
|
|
197
|
+
this.controlPanel.classList.add('dialogControl');
|
|
198
|
+
container.appendChild(this.controlPanel);
|
|
199
|
+
|
|
200
|
+
this.errorMessageNode = this.node.ownerDocument.createElement('div');
|
|
201
|
+
this.errorMessageNode.classList.add('error');
|
|
202
|
+
this.errorMessageNode.setAttribute('style', 'flex: 2');
|
|
203
|
+
this.controlPanel.appendChild(this.errorMessageNode);
|
|
204
|
+
|
|
205
|
+
this.update();
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
protected appendCloseButton(text: string = Dialog.CANCEL): HTMLButtonElement {
|
|
209
|
+
return this.closeButton = this.appendButton(text, false);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
protected appendAcceptButton(text: string = Dialog.OK): HTMLButtonElement {
|
|
213
|
+
return this.acceptButton = this.appendButton(text, true);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
protected appendButton(text: string, primary: boolean): HTMLButtonElement {
|
|
217
|
+
const button = this.createButton(text);
|
|
218
|
+
this.controlPanel.appendChild(button);
|
|
219
|
+
button.classList.add(primary ? 'main' : 'secondary');
|
|
220
|
+
return button;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
protected createButton(text: string): HTMLButtonElement {
|
|
224
|
+
const button = document.createElement('button');
|
|
225
|
+
button.classList.add('theia-button');
|
|
226
|
+
button.textContent = text;
|
|
227
|
+
return button;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
protected override onAfterAttach(msg: Message): void {
|
|
231
|
+
super.onAfterAttach(msg);
|
|
232
|
+
if (this.closeButton) {
|
|
233
|
+
this.addCloseAction(this.closeButton, 'click');
|
|
234
|
+
}
|
|
235
|
+
if (this.acceptButton) {
|
|
236
|
+
this.addAcceptAction(this.acceptButton, 'click');
|
|
237
|
+
}
|
|
238
|
+
this.addCloseAction(this.closeCrossNode, 'click');
|
|
239
|
+
// TODO: use DI always to create dialog instances
|
|
240
|
+
this.toDisposeOnDetach.push(DialogOverlayService.get().push(this));
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
protected handleEscape(event: KeyboardEvent): boolean | void {
|
|
244
|
+
this.close();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
protected handleEnter(event: KeyboardEvent): boolean | void {
|
|
248
|
+
if (event.target instanceof HTMLTextAreaElement) {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
this.accept();
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
protected override onActivateRequest(msg: Message): void {
|
|
255
|
+
super.onActivateRequest(msg);
|
|
256
|
+
if (this.acceptButton) {
|
|
257
|
+
this.acceptButton.focus();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
open(): Promise<T | undefined> {
|
|
262
|
+
if (this.resolve) {
|
|
263
|
+
return Promise.reject(new Error('The dialog is already opened.'));
|
|
264
|
+
}
|
|
265
|
+
this.activeElement = this.node.ownerDocument.activeElement as HTMLElement;
|
|
266
|
+
return new Promise<T | undefined>((resolve, reject) => {
|
|
267
|
+
this.resolve = resolve;
|
|
268
|
+
this.reject = reject;
|
|
269
|
+
this.toDisposeOnDetach.push(Disposable.create(() => {
|
|
270
|
+
this.resolve = undefined;
|
|
271
|
+
this.reject = undefined;
|
|
272
|
+
}));
|
|
273
|
+
|
|
274
|
+
Widget.attach(this, this.node.ownerDocument.body);
|
|
275
|
+
this.activate();
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
override close(): void {
|
|
280
|
+
if (this.resolve) {
|
|
281
|
+
if (this.activeElement) {
|
|
282
|
+
this.activeElement.focus({ preventScroll: true });
|
|
283
|
+
}
|
|
284
|
+
this.resolve(undefined);
|
|
285
|
+
}
|
|
286
|
+
this.activeElement = undefined;
|
|
287
|
+
super.close();
|
|
288
|
+
}
|
|
289
|
+
protected override onUpdateRequest(msg: Message): void {
|
|
290
|
+
super.onUpdateRequest(msg);
|
|
291
|
+
this.validate();
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
protected validateCancellationSource = new CancellationTokenSource();
|
|
295
|
+
protected async validate(): Promise<void> {
|
|
296
|
+
if (!this.resolve) {
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
this.validateCancellationSource.cancel();
|
|
300
|
+
this.validateCancellationSource = new CancellationTokenSource();
|
|
301
|
+
const token = this.validateCancellationSource.token;
|
|
302
|
+
const value = this.value;
|
|
303
|
+
const error = await this.isValid(value, 'preview');
|
|
304
|
+
if (token.isCancellationRequested) {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
this.setErrorMessage(error);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
protected acceptCancellationSource = new CancellationTokenSource();
|
|
311
|
+
protected async accept(): Promise<void> {
|
|
312
|
+
if (!this.resolve) {
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
this.acceptCancellationSource.cancel();
|
|
316
|
+
this.acceptCancellationSource = new CancellationTokenSource();
|
|
317
|
+
const token = this.acceptCancellationSource.token;
|
|
318
|
+
const value = this.value;
|
|
319
|
+
const error = await this.isValid(value, 'open');
|
|
320
|
+
if (token.isCancellationRequested) {
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
if (!DialogError.getResult(error)) {
|
|
324
|
+
this.setErrorMessage(error);
|
|
325
|
+
} else {
|
|
326
|
+
this.resolve(value);
|
|
327
|
+
Widget.detach(this);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
abstract get value(): T;
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Return a string of zero-length or true if valid.
|
|
335
|
+
*/
|
|
336
|
+
protected isValid(value: T, mode: DialogMode): MaybePromise<DialogError> {
|
|
337
|
+
return '';
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
protected setErrorMessage(error: DialogError): void {
|
|
341
|
+
if (this.acceptButton) {
|
|
342
|
+
this.acceptButton.disabled = !DialogError.getResult(error);
|
|
343
|
+
}
|
|
344
|
+
this.errorMessageNode.innerText = DialogError.getMessage(error);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
protected addAction<K extends keyof HTMLElementEventMap>(element: HTMLElement, callback: () => void, ...additionalEventTypes: K[]): void {
|
|
348
|
+
this.addKeyListener(element, Key.ENTER, callback, ...additionalEventTypes);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
protected addCloseAction<K extends keyof HTMLElementEventMap>(element: HTMLElement, ...additionalEventTypes: K[]): void {
|
|
352
|
+
this.addAction(element, () => this.close(), ...additionalEventTypes);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
protected addAcceptAction<K extends keyof HTMLElementEventMap>(element: HTMLElement, ...additionalEventTypes: K[]): void {
|
|
356
|
+
this.addAction(element, () => this.accept(), ...additionalEventTypes);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
@injectable()
|
|
362
|
+
export class MessageDialogProps extends DialogProps {
|
|
363
|
+
readonly msg: string | HTMLElement;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
@injectable()
|
|
367
|
+
export class ConfirmDialogProps extends MessageDialogProps {
|
|
368
|
+
readonly cancel?: string;
|
|
369
|
+
readonly ok?: string;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
export class ConfirmDialog extends AbstractDialog<boolean> {
|
|
373
|
+
|
|
374
|
+
protected confirmed = true;
|
|
375
|
+
|
|
376
|
+
constructor(
|
|
377
|
+
@inject(ConfirmDialogProps) protected override readonly props: ConfirmDialogProps
|
|
378
|
+
) {
|
|
379
|
+
super(props);
|
|
380
|
+
|
|
381
|
+
this.contentNode.appendChild(this.createMessageNode(this.props.msg));
|
|
382
|
+
this.appendCloseButton(props.cancel);
|
|
383
|
+
this.appendAcceptButton(props.ok);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
protected override onCloseRequest(msg: Message): void {
|
|
387
|
+
super.onCloseRequest(msg);
|
|
388
|
+
this.confirmed = false;
|
|
389
|
+
this.accept();
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
get value(): boolean {
|
|
393
|
+
return this.confirmed;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
protected createMessageNode(msg: string | HTMLElement): HTMLElement {
|
|
397
|
+
if (typeof msg === 'string') {
|
|
398
|
+
const messageNode = this.node.ownerDocument.createElement('div');
|
|
399
|
+
messageNode.textContent = msg;
|
|
400
|
+
return messageNode;
|
|
401
|
+
}
|
|
402
|
+
return msg;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
export async function confirmExit(): Promise<boolean> {
|
|
407
|
+
const safeToExit = await new ConfirmDialog({
|
|
408
|
+
title: nls.localizeByDefault('Are you sure you want to quit?'),
|
|
409
|
+
msg: nls.localize('theia/core/quitMessage', 'Any unsaved changes will not be saved.'),
|
|
410
|
+
ok: Dialog.YES,
|
|
411
|
+
cancel: Dialog.NO,
|
|
412
|
+
}).open();
|
|
413
|
+
return safeToExit === true;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
export class ConfirmSaveDialogProps extends MessageDialogProps {
|
|
417
|
+
readonly cancel: string;
|
|
418
|
+
readonly dontSave: string;
|
|
419
|
+
readonly save: string;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// Dialog prompting the user to confirm whether they wish to save changes or not
|
|
423
|
+
export class ConfirmSaveDialog extends AbstractDialog<boolean | undefined> {
|
|
424
|
+
protected result?: boolean = false;
|
|
425
|
+
|
|
426
|
+
constructor(
|
|
427
|
+
@inject(ConfirmSaveDialogProps) protected override readonly props: ConfirmSaveDialogProps
|
|
428
|
+
) {
|
|
429
|
+
super(props);
|
|
430
|
+
// Append message and buttons to the dialog
|
|
431
|
+
this.contentNode.appendChild(this.createMessageNode(this.props.msg));
|
|
432
|
+
this.closeButton = this.appendButtonAndSetResult(props.cancel, false);
|
|
433
|
+
this.appendButtonAndSetResult(props.dontSave, false, false);
|
|
434
|
+
this.acceptButton = this.appendButtonAndSetResult(props.save, true, true);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
get value(): boolean | undefined {
|
|
438
|
+
return this.result;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
protected createMessageNode(msg: string | HTMLElement): HTMLElement {
|
|
442
|
+
if (typeof msg === 'string') {
|
|
443
|
+
const messageNode = document.createElement('div');
|
|
444
|
+
messageNode.textContent = msg;
|
|
445
|
+
return messageNode;
|
|
446
|
+
}
|
|
447
|
+
return msg;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
protected appendButtonAndSetResult(text: string, primary: boolean, result?: boolean): HTMLButtonElement {
|
|
451
|
+
const button = this.appendButton(text, primary);
|
|
452
|
+
button.addEventListener('click', () => {
|
|
453
|
+
this.result = result;
|
|
454
|
+
this.accept();
|
|
455
|
+
});
|
|
456
|
+
return button;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
@injectable()
|
|
462
|
+
export class SingleTextInputDialogProps extends DialogProps {
|
|
463
|
+
readonly confirmButtonLabel?: string;
|
|
464
|
+
readonly initialValue?: string;
|
|
465
|
+
readonly placeholder?: string;
|
|
466
|
+
readonly initialSelectionRange?: {
|
|
467
|
+
start: number
|
|
468
|
+
end: number
|
|
469
|
+
direction?: 'forward' | 'backward' | 'none'
|
|
470
|
+
};
|
|
471
|
+
readonly validate?: (input: string, mode: DialogMode) => MaybePromise<DialogError>;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
export class SingleTextInputDialog extends AbstractDialog<string> {
|
|
475
|
+
|
|
476
|
+
protected readonly inputField: HTMLInputElement;
|
|
477
|
+
|
|
478
|
+
constructor(
|
|
479
|
+
@inject(SingleTextInputDialogProps) protected override props: SingleTextInputDialogProps
|
|
480
|
+
) {
|
|
481
|
+
super(props);
|
|
482
|
+
|
|
483
|
+
this.inputField = document.createElement('input');
|
|
484
|
+
this.inputField.type = 'text';
|
|
485
|
+
this.inputField.className = 'theia-input';
|
|
486
|
+
this.inputField.spellcheck = false;
|
|
487
|
+
this.inputField.setAttribute('style', 'flex: 0;');
|
|
488
|
+
this.inputField.placeholder = props.placeholder || '';
|
|
489
|
+
this.inputField.value = props.initialValue || '';
|
|
490
|
+
if (props.initialSelectionRange) {
|
|
491
|
+
this.inputField.setSelectionRange(
|
|
492
|
+
props.initialSelectionRange.start,
|
|
493
|
+
props.initialSelectionRange.end,
|
|
494
|
+
props.initialSelectionRange.direction
|
|
495
|
+
);
|
|
496
|
+
} else {
|
|
497
|
+
this.inputField.select();
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
this.contentNode.appendChild(this.inputField);
|
|
501
|
+
this.controlPanel.removeChild(this.errorMessageNode);
|
|
502
|
+
this.contentNode.appendChild(this.errorMessageNode);
|
|
503
|
+
|
|
504
|
+
this.appendAcceptButton(props.confirmButtonLabel);
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
get value(): string {
|
|
508
|
+
return this.inputField.value;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
protected override isValid(value: string, mode: DialogMode): MaybePromise<DialogError> {
|
|
512
|
+
if (this.props.validate) {
|
|
513
|
+
return this.props.validate(value, mode);
|
|
514
|
+
}
|
|
515
|
+
return super.isValid(value, mode);
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
protected override onAfterAttach(msg: Message): void {
|
|
519
|
+
super.onAfterAttach(msg);
|
|
520
|
+
this.addUpdateListener(this.inputField, 'input');
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
protected override onActivateRequest(msg: Message): void {
|
|
524
|
+
this.inputField.focus();
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
protected override handleEnter(event: KeyboardEvent): boolean | void {
|
|
528
|
+
if (event.target instanceof HTMLInputElement) {
|
|
529
|
+
return super.handleEnter(event);
|
|
530
|
+
}
|
|
531
|
+
return false;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
}
|