@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
|
@@ -1,399 +1,399 @@
|
|
|
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, named } from 'inversify';
|
|
18
|
-
import { Widget } from '@phosphor/widgets';
|
|
19
|
-
import { FrontendApplication } from '../frontend-application';
|
|
20
|
-
import { WidgetManager, WidgetConstructionOptions } from '../widget-manager';
|
|
21
|
-
import { StorageService } from '../storage-service';
|
|
22
|
-
import { ILogger } from '../../common/logger';
|
|
23
|
-
import { CommandContribution, CommandRegistry, Command } from '../../common/command';
|
|
24
|
-
import { ThemeService } from '../theming';
|
|
25
|
-
import { ContributionProvider } from '../../common/contribution-provider';
|
|
26
|
-
import { ApplicationShell, applicationShellLayoutVersion, ApplicationShellLayoutVersion } from './application-shell';
|
|
27
|
-
import { CommonCommands } from '../common-frontend-contribution';
|
|
28
|
-
import { WindowService } from '../window/window-service';
|
|
29
|
-
import { StopReason } from '../../common/frontend-application-state';
|
|
30
|
-
import { isFunction, isObject, MaybePromise } from '../../common';
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* A contract for widgets that want to store and restore their inner state, between sessions.
|
|
34
|
-
*/
|
|
35
|
-
export interface StatefulWidget {
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Called on unload to store the inner state. Returns 'undefined' if the widget cannot be stored.
|
|
39
|
-
*/
|
|
40
|
-
storeState(): object | undefined;
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Called when the widget got created by the storage service
|
|
44
|
-
*/
|
|
45
|
-
restoreState(oldState: object): void;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export namespace StatefulWidget {
|
|
49
|
-
export function is(arg: unknown): arg is StatefulWidget {
|
|
50
|
-
return isObject<StatefulWidget>(arg) && isFunction(arg.storeState) && isFunction(arg.restoreState);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export interface WidgetDescription {
|
|
55
|
-
constructionOptions: WidgetConstructionOptions,
|
|
56
|
-
innerWidgetState?: string | object
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export interface ApplicationShellLayoutMigrationContext {
|
|
60
|
-
/**
|
|
61
|
-
* A resolved version of a current layout.
|
|
62
|
-
*/
|
|
63
|
-
layoutVersion: number
|
|
64
|
-
/**
|
|
65
|
-
* A layout to be inflated.
|
|
66
|
-
*/
|
|
67
|
-
layout: ApplicationShell.LayoutData
|
|
68
|
-
/**
|
|
69
|
-
* A parent widget is to be inflated. `undefined` if the application shell
|
|
70
|
-
*/
|
|
71
|
-
parent?: Widget
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export interface ApplicationShellLayoutMigrationError extends Error {
|
|
75
|
-
code: 'ApplicationShellLayoutMigrationError'
|
|
76
|
-
}
|
|
77
|
-
export namespace ApplicationShellLayoutMigrationError {
|
|
78
|
-
const code: ApplicationShellLayoutMigrationError['code'] = 'ApplicationShellLayoutMigrationError';
|
|
79
|
-
export function create(message?: string): ApplicationShellLayoutMigrationError {
|
|
80
|
-
return Object.assign(new Error(
|
|
81
|
-
`Could not migrate layout to version ${applicationShellLayoutVersion}.` + (message ? '\n' + message : '')
|
|
82
|
-
), { code });
|
|
83
|
-
}
|
|
84
|
-
export function is(error: Error | undefined): error is ApplicationShellLayoutMigrationError {
|
|
85
|
-
return !!error && 'code' in error && error['code'] === code;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export const ApplicationShellLayoutMigration = Symbol('ApplicationShellLayoutMigration');
|
|
90
|
-
export interface ApplicationShellLayoutMigration {
|
|
91
|
-
/**
|
|
92
|
-
* A target migration version.
|
|
93
|
-
*/
|
|
94
|
-
readonly layoutVersion: ApplicationShellLayoutVersion;
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* A migration can transform layout before it will be inflated.
|
|
98
|
-
*
|
|
99
|
-
* @throws `ApplicationShellLayoutMigrationError` if a layout cannot be migrated,
|
|
100
|
-
* in this case the default layout will be initialized.
|
|
101
|
-
*/
|
|
102
|
-
onWillInflateLayout?(context: ApplicationShellLayoutMigrationContext): MaybePromise<void>;
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* A migration can transform the given description before it will be inflated.
|
|
106
|
-
*
|
|
107
|
-
* @returns a migrated widget description, or `undefined`
|
|
108
|
-
* @throws `ApplicationShellLayoutMigrationError` if a widget description cannot be migrated,
|
|
109
|
-
* in this case the default layout will be initialized.
|
|
110
|
-
*/
|
|
111
|
-
onWillInflateWidget?(desc: WidgetDescription, context: ApplicationShellLayoutMigrationContext): MaybePromise<WidgetDescription | undefined>;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export const RESET_LAYOUT = Command.toLocalizedCommand({
|
|
115
|
-
id: 'reset.layout',
|
|
116
|
-
category: CommonCommands.VIEW_CATEGORY,
|
|
117
|
-
label: 'Reset Workbench Layout'
|
|
118
|
-
}, 'theia/core/resetWorkbenchLayout', CommonCommands.VIEW_CATEGORY_KEY);
|
|
119
|
-
|
|
120
|
-
@injectable()
|
|
121
|
-
export class ShellLayoutRestorer implements CommandContribution {
|
|
122
|
-
|
|
123
|
-
protected storageKey = 'layout';
|
|
124
|
-
protected shouldStoreLayout: boolean = true;
|
|
125
|
-
|
|
126
|
-
@inject(ContributionProvider) @named(ApplicationShellLayoutMigration) protected readonly migrations: ContributionProvider<ApplicationShellLayoutMigration>;
|
|
127
|
-
@inject(WindowService) protected readonly windowService: WindowService;
|
|
128
|
-
@inject(ThemeService) protected readonly themeService: ThemeService;
|
|
129
|
-
|
|
130
|
-
constructor(
|
|
131
|
-
@inject(WidgetManager) protected widgetManager: WidgetManager,
|
|
132
|
-
@inject(ILogger) protected logger: ILogger,
|
|
133
|
-
@inject(StorageService) protected storageService: StorageService) { }
|
|
134
|
-
|
|
135
|
-
registerCommands(commands: CommandRegistry): void {
|
|
136
|
-
commands.registerCommand(RESET_LAYOUT, {
|
|
137
|
-
execute: async () => this.resetLayout()
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
protected async resetLayout(): Promise<void> {
|
|
142
|
-
if (await this.windowService.isSafeToShutDown(StopReason.Reload)) {
|
|
143
|
-
this.logger.info('>>> Resetting layout...');
|
|
144
|
-
this.shouldStoreLayout = false;
|
|
145
|
-
this.storageService.setData(this.storageKey, undefined);
|
|
146
|
-
this.themeService.reset();
|
|
147
|
-
this.logger.info('<<< The layout has been successfully reset.');
|
|
148
|
-
this.windowService.reload();
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
storeLayout(app: FrontendApplication): void {
|
|
153
|
-
if (this.shouldStoreLayout) {
|
|
154
|
-
try {
|
|
155
|
-
this.logger.info('>>> Storing the layout...');
|
|
156
|
-
const layoutData = app.shell.getLayoutData();
|
|
157
|
-
const serializedLayoutData = this.deflate(layoutData);
|
|
158
|
-
this.storageService.setData(this.storageKey, serializedLayoutData);
|
|
159
|
-
this.logger.info('<<< The layout has been successfully stored.');
|
|
160
|
-
} catch (error) {
|
|
161
|
-
this.storageService.setData(this.storageKey, undefined);
|
|
162
|
-
this.logger.error('Error during serialization of layout data', error);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
async restoreLayout(app: FrontendApplication): Promise<boolean> {
|
|
168
|
-
this.logger.info('>>> Restoring the layout state...');
|
|
169
|
-
const serializedLayoutData = await this.storageService.getData<string>(this.storageKey);
|
|
170
|
-
if (serializedLayoutData === undefined) {
|
|
171
|
-
this.logger.info('<<< Nothing to restore.');
|
|
172
|
-
return false;
|
|
173
|
-
}
|
|
174
|
-
const layoutData = await this.inflate(serializedLayoutData);
|
|
175
|
-
await app.shell.setLayoutData(layoutData);
|
|
176
|
-
this.logger.info('<<< The layout has been successfully restored.');
|
|
177
|
-
return true;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
protected isWidgetProperty(propertyName: string): boolean {
|
|
181
|
-
return propertyName === 'widget';
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
protected isWidgetsProperty(propertyName: string): boolean {
|
|
185
|
-
return propertyName === 'widgets';
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* Turns the layout data to a string representation.
|
|
190
|
-
*/
|
|
191
|
-
protected deflate(data: object): string {
|
|
192
|
-
return JSON.stringify(data, (property: string, value) => {
|
|
193
|
-
if (this.isWidgetProperty(property)) {
|
|
194
|
-
const description = this.convertToDescription(value as Widget);
|
|
195
|
-
return description;
|
|
196
|
-
} else if (this.isWidgetsProperty(property)) {
|
|
197
|
-
const descriptions: WidgetDescription[] = [];
|
|
198
|
-
for (const widget of (value as Widget[])) {
|
|
199
|
-
const description = this.convertToDescription(widget);
|
|
200
|
-
if (description) {
|
|
201
|
-
descriptions.push(description);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
return descriptions;
|
|
205
|
-
}
|
|
206
|
-
return value;
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
private convertToDescription(widget: Widget): WidgetDescription | undefined {
|
|
211
|
-
const desc = this.widgetManager.getDescription(widget);
|
|
212
|
-
if (desc) {
|
|
213
|
-
if (StatefulWidget.is(widget)) {
|
|
214
|
-
const innerState = widget.storeState();
|
|
215
|
-
return innerState ? {
|
|
216
|
-
constructionOptions: desc,
|
|
217
|
-
innerWidgetState: this.deflate(innerState)
|
|
218
|
-
} : undefined;
|
|
219
|
-
} else {
|
|
220
|
-
return {
|
|
221
|
-
constructionOptions: desc,
|
|
222
|
-
innerWidgetState: undefined
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Creates the layout data from its string representation.
|
|
230
|
-
*/
|
|
231
|
-
protected async inflate(layoutData: string): Promise<ApplicationShell.LayoutData> {
|
|
232
|
-
const parseContext = new ShellLayoutRestorer.ParseContext();
|
|
233
|
-
const layout = this.parse<ApplicationShell.LayoutData>(layoutData, parseContext);
|
|
234
|
-
|
|
235
|
-
const layoutVersion = Number(layout.version);
|
|
236
|
-
if (typeof layoutVersion !== 'number' || Number.isNaN(layoutVersion)) {
|
|
237
|
-
throw new Error('could not resolve a layout version');
|
|
238
|
-
}
|
|
239
|
-
if (layoutVersion !== applicationShellLayoutVersion) {
|
|
240
|
-
if (layoutVersion < applicationShellLayoutVersion) {
|
|
241
|
-
console.warn(`Layout version ${layoutVersion} is behind current layout version ${applicationShellLayoutVersion}, trying to migrate...`);
|
|
242
|
-
} else {
|
|
243
|
-
console.warn(`Layout version ${layoutVersion} is ahead current layout version ${applicationShellLayoutVersion}, trying to load anyway...`);
|
|
244
|
-
}
|
|
245
|
-
console.info(`Please use '${RESET_LAYOUT.label}' command if the layout looks bogus.`);
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
const migrations = this.migrations.getContributions()
|
|
249
|
-
.filter(m => m.layoutVersion > layoutVersion && m.layoutVersion <= applicationShellLayoutVersion)
|
|
250
|
-
.sort((m, m2) => m.layoutVersion - m2.layoutVersion);
|
|
251
|
-
if (migrations.length) {
|
|
252
|
-
console.info(`Found ${migrations.length} migrations from layout version ${layoutVersion} to version ${applicationShellLayoutVersion}, migrating...`);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
const context = { layout, layoutVersion, migrations };
|
|
256
|
-
await this.fireWillInflateLayout(context);
|
|
257
|
-
await parseContext.inflate(context);
|
|
258
|
-
return layout;
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
protected async fireWillInflateLayout(context: ShellLayoutRestorer.InflateContext): Promise<void> {
|
|
262
|
-
for (const migration of context.migrations) {
|
|
263
|
-
if (migration.onWillInflateLayout) {
|
|
264
|
-
// don't catch exceptions, if one migration fails all should fail.
|
|
265
|
-
await migration.onWillInflateLayout(context);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
protected parse<T>(layoutData: string, parseContext: ShellLayoutRestorer.ParseContext): T {
|
|
271
|
-
return JSON.parse(layoutData, (property: string, value) => {
|
|
272
|
-
if (this.isWidgetsProperty(property)) {
|
|
273
|
-
const widgets = parseContext.filteredArray();
|
|
274
|
-
const descs = (value as WidgetDescription[]);
|
|
275
|
-
for (let i = 0; i < descs.length; i++) {
|
|
276
|
-
parseContext.push(async context => {
|
|
277
|
-
widgets[i] = await this.convertToWidget(descs[i], context);
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
return widgets;
|
|
281
|
-
} else if (isObject(value) && !Array.isArray(value)) {
|
|
282
|
-
const copy: Record<string, unknown> = {};
|
|
283
|
-
for (const p in value) {
|
|
284
|
-
if (this.isWidgetProperty(p)) {
|
|
285
|
-
parseContext.push(async context => {
|
|
286
|
-
copy[p] = await this.convertToWidget(value[p] as WidgetDescription, context);
|
|
287
|
-
});
|
|
288
|
-
} else {
|
|
289
|
-
copy[p] = value[p];
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
return copy;
|
|
293
|
-
}
|
|
294
|
-
return value;
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
protected async fireWillInflateWidget(desc: WidgetDescription, context: ShellLayoutRestorer.InflateContext): Promise<WidgetDescription> {
|
|
299
|
-
for (const migration of context.migrations) {
|
|
300
|
-
if (migration.onWillInflateWidget) {
|
|
301
|
-
// don't catch exceptions, if one migration fails all should fail.
|
|
302
|
-
const migrated = await migration.onWillInflateWidget(desc, context);
|
|
303
|
-
if (migrated) {
|
|
304
|
-
if (isObject(migrated.innerWidgetState)) {
|
|
305
|
-
// in order to inflate nested widgets
|
|
306
|
-
migrated.innerWidgetState = JSON.stringify(migrated.innerWidgetState);
|
|
307
|
-
}
|
|
308
|
-
desc = migrated;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
return desc;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
protected async convertToWidget(desc: WidgetDescription, context: ShellLayoutRestorer.InflateContext): Promise<Widget | undefined> {
|
|
316
|
-
if (!desc.constructionOptions) {
|
|
317
|
-
return undefined;
|
|
318
|
-
}
|
|
319
|
-
try {
|
|
320
|
-
desc = await this.fireWillInflateWidget(desc, context);
|
|
321
|
-
const widget = await this.widgetManager.getOrCreateWidget(desc.constructionOptions.factoryId, desc.constructionOptions.options);
|
|
322
|
-
if (StatefulWidget.is(widget) && desc.innerWidgetState !== undefined) {
|
|
323
|
-
try {
|
|
324
|
-
let oldState: object;
|
|
325
|
-
if (typeof desc.innerWidgetState === 'string') {
|
|
326
|
-
const parseContext = new ShellLayoutRestorer.ParseContext();
|
|
327
|
-
oldState = this.parse(desc.innerWidgetState, parseContext);
|
|
328
|
-
await parseContext.inflate({ ...context, parent: widget });
|
|
329
|
-
} else {
|
|
330
|
-
oldState = desc.innerWidgetState;
|
|
331
|
-
}
|
|
332
|
-
widget.restoreState(oldState);
|
|
333
|
-
} catch (e) {
|
|
334
|
-
if (ApplicationShellLayoutMigrationError.is(e)) {
|
|
335
|
-
throw e;
|
|
336
|
-
}
|
|
337
|
-
this.logger.warn(`Couldn't restore widget state for ${widget.id}. Error: ${e} `);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
if (widget.isDisposed) {
|
|
341
|
-
return undefined;
|
|
342
|
-
}
|
|
343
|
-
return widget;
|
|
344
|
-
} catch (e) {
|
|
345
|
-
if (ApplicationShellLayoutMigrationError.is(e)) {
|
|
346
|
-
throw e;
|
|
347
|
-
}
|
|
348
|
-
this.logger.warn(`Couldn't restore widget for ${desc.constructionOptions.factoryId}. Error: ${e} `);
|
|
349
|
-
return undefined;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
export namespace ShellLayoutRestorer {
|
|
356
|
-
|
|
357
|
-
export class ParseContext {
|
|
358
|
-
protected readonly toInflate: Inflate[] = [];
|
|
359
|
-
protected readonly toFilter: Widgets[] = [];
|
|
360
|
-
|
|
361
|
-
/**
|
|
362
|
-
* Returns an array, which will be filtered from undefined elements
|
|
363
|
-
* after resolving promises, that create widgets.
|
|
364
|
-
*/
|
|
365
|
-
filteredArray(): Widgets {
|
|
366
|
-
const array: Widgets = [];
|
|
367
|
-
this.toFilter.push(array);
|
|
368
|
-
return array;
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
push(toInflate: Inflate): void {
|
|
372
|
-
this.toInflate.push(toInflate);
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
async inflate(context: InflateContext): Promise<void> {
|
|
376
|
-
const pending: Promise<void>[] = [];
|
|
377
|
-
while (this.toInflate.length) {
|
|
378
|
-
pending.push(this.toInflate.pop()!(context));
|
|
379
|
-
}
|
|
380
|
-
await Promise.all(pending);
|
|
381
|
-
|
|
382
|
-
if (this.toFilter.length) {
|
|
383
|
-
this.toFilter.forEach(array => {
|
|
384
|
-
for (let i = 0; i < array.length; i++) {
|
|
385
|
-
if (array[i] === undefined) {
|
|
386
|
-
array.splice(i--, 1);
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
});
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
export type Widgets = (Widget | undefined)[];
|
|
395
|
-
export type Inflate = (context: InflateContext) => Promise<void>;
|
|
396
|
-
export interface InflateContext extends ApplicationShellLayoutMigrationContext {
|
|
397
|
-
readonly migrations: ApplicationShellLayoutMigration[];
|
|
398
|
-
}
|
|
399
|
-
}
|
|
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, named } from 'inversify';
|
|
18
|
+
import { Widget } from '@phosphor/widgets';
|
|
19
|
+
import { FrontendApplication } from '../frontend-application';
|
|
20
|
+
import { WidgetManager, WidgetConstructionOptions } from '../widget-manager';
|
|
21
|
+
import { StorageService } from '../storage-service';
|
|
22
|
+
import { ILogger } from '../../common/logger';
|
|
23
|
+
import { CommandContribution, CommandRegistry, Command } from '../../common/command';
|
|
24
|
+
import { ThemeService } from '../theming';
|
|
25
|
+
import { ContributionProvider } from '../../common/contribution-provider';
|
|
26
|
+
import { ApplicationShell, applicationShellLayoutVersion, ApplicationShellLayoutVersion } from './application-shell';
|
|
27
|
+
import { CommonCommands } from '../common-frontend-contribution';
|
|
28
|
+
import { WindowService } from '../window/window-service';
|
|
29
|
+
import { StopReason } from '../../common/frontend-application-state';
|
|
30
|
+
import { isFunction, isObject, MaybePromise } from '../../common';
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* A contract for widgets that want to store and restore their inner state, between sessions.
|
|
34
|
+
*/
|
|
35
|
+
export interface StatefulWidget {
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Called on unload to store the inner state. Returns 'undefined' if the widget cannot be stored.
|
|
39
|
+
*/
|
|
40
|
+
storeState(): object | undefined;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Called when the widget got created by the storage service
|
|
44
|
+
*/
|
|
45
|
+
restoreState(oldState: object): void;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export namespace StatefulWidget {
|
|
49
|
+
export function is(arg: unknown): arg is StatefulWidget {
|
|
50
|
+
return isObject<StatefulWidget>(arg) && isFunction(arg.storeState) && isFunction(arg.restoreState);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface WidgetDescription {
|
|
55
|
+
constructionOptions: WidgetConstructionOptions,
|
|
56
|
+
innerWidgetState?: string | object
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface ApplicationShellLayoutMigrationContext {
|
|
60
|
+
/**
|
|
61
|
+
* A resolved version of a current layout.
|
|
62
|
+
*/
|
|
63
|
+
layoutVersion: number
|
|
64
|
+
/**
|
|
65
|
+
* A layout to be inflated.
|
|
66
|
+
*/
|
|
67
|
+
layout: ApplicationShell.LayoutData
|
|
68
|
+
/**
|
|
69
|
+
* A parent widget is to be inflated. `undefined` if the application shell
|
|
70
|
+
*/
|
|
71
|
+
parent?: Widget
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface ApplicationShellLayoutMigrationError extends Error {
|
|
75
|
+
code: 'ApplicationShellLayoutMigrationError'
|
|
76
|
+
}
|
|
77
|
+
export namespace ApplicationShellLayoutMigrationError {
|
|
78
|
+
const code: ApplicationShellLayoutMigrationError['code'] = 'ApplicationShellLayoutMigrationError';
|
|
79
|
+
export function create(message?: string): ApplicationShellLayoutMigrationError {
|
|
80
|
+
return Object.assign(new Error(
|
|
81
|
+
`Could not migrate layout to version ${applicationShellLayoutVersion}.` + (message ? '\n' + message : '')
|
|
82
|
+
), { code });
|
|
83
|
+
}
|
|
84
|
+
export function is(error: Error | undefined): error is ApplicationShellLayoutMigrationError {
|
|
85
|
+
return !!error && 'code' in error && error['code'] === code;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export const ApplicationShellLayoutMigration = Symbol('ApplicationShellLayoutMigration');
|
|
90
|
+
export interface ApplicationShellLayoutMigration {
|
|
91
|
+
/**
|
|
92
|
+
* A target migration version.
|
|
93
|
+
*/
|
|
94
|
+
readonly layoutVersion: ApplicationShellLayoutVersion;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* A migration can transform layout before it will be inflated.
|
|
98
|
+
*
|
|
99
|
+
* @throws `ApplicationShellLayoutMigrationError` if a layout cannot be migrated,
|
|
100
|
+
* in this case the default layout will be initialized.
|
|
101
|
+
*/
|
|
102
|
+
onWillInflateLayout?(context: ApplicationShellLayoutMigrationContext): MaybePromise<void>;
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* A migration can transform the given description before it will be inflated.
|
|
106
|
+
*
|
|
107
|
+
* @returns a migrated widget description, or `undefined`
|
|
108
|
+
* @throws `ApplicationShellLayoutMigrationError` if a widget description cannot be migrated,
|
|
109
|
+
* in this case the default layout will be initialized.
|
|
110
|
+
*/
|
|
111
|
+
onWillInflateWidget?(desc: WidgetDescription, context: ApplicationShellLayoutMigrationContext): MaybePromise<WidgetDescription | undefined>;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export const RESET_LAYOUT = Command.toLocalizedCommand({
|
|
115
|
+
id: 'reset.layout',
|
|
116
|
+
category: CommonCommands.VIEW_CATEGORY,
|
|
117
|
+
label: 'Reset Workbench Layout'
|
|
118
|
+
}, 'theia/core/resetWorkbenchLayout', CommonCommands.VIEW_CATEGORY_KEY);
|
|
119
|
+
|
|
120
|
+
@injectable()
|
|
121
|
+
export class ShellLayoutRestorer implements CommandContribution {
|
|
122
|
+
|
|
123
|
+
protected storageKey = 'layout';
|
|
124
|
+
protected shouldStoreLayout: boolean = true;
|
|
125
|
+
|
|
126
|
+
@inject(ContributionProvider) @named(ApplicationShellLayoutMigration) protected readonly migrations: ContributionProvider<ApplicationShellLayoutMigration>;
|
|
127
|
+
@inject(WindowService) protected readonly windowService: WindowService;
|
|
128
|
+
@inject(ThemeService) protected readonly themeService: ThemeService;
|
|
129
|
+
|
|
130
|
+
constructor(
|
|
131
|
+
@inject(WidgetManager) protected widgetManager: WidgetManager,
|
|
132
|
+
@inject(ILogger) protected logger: ILogger,
|
|
133
|
+
@inject(StorageService) protected storageService: StorageService) { }
|
|
134
|
+
|
|
135
|
+
registerCommands(commands: CommandRegistry): void {
|
|
136
|
+
commands.registerCommand(RESET_LAYOUT, {
|
|
137
|
+
execute: async () => this.resetLayout()
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
protected async resetLayout(): Promise<void> {
|
|
142
|
+
if (await this.windowService.isSafeToShutDown(StopReason.Reload)) {
|
|
143
|
+
this.logger.info('>>> Resetting layout...');
|
|
144
|
+
this.shouldStoreLayout = false;
|
|
145
|
+
this.storageService.setData(this.storageKey, undefined);
|
|
146
|
+
this.themeService.reset();
|
|
147
|
+
this.logger.info('<<< The layout has been successfully reset.');
|
|
148
|
+
this.windowService.reload();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
storeLayout(app: FrontendApplication): void {
|
|
153
|
+
if (this.shouldStoreLayout) {
|
|
154
|
+
try {
|
|
155
|
+
this.logger.info('>>> Storing the layout...');
|
|
156
|
+
const layoutData = app.shell.getLayoutData();
|
|
157
|
+
const serializedLayoutData = this.deflate(layoutData);
|
|
158
|
+
this.storageService.setData(this.storageKey, serializedLayoutData);
|
|
159
|
+
this.logger.info('<<< The layout has been successfully stored.');
|
|
160
|
+
} catch (error) {
|
|
161
|
+
this.storageService.setData(this.storageKey, undefined);
|
|
162
|
+
this.logger.error('Error during serialization of layout data', error);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
async restoreLayout(app: FrontendApplication): Promise<boolean> {
|
|
168
|
+
this.logger.info('>>> Restoring the layout state...');
|
|
169
|
+
const serializedLayoutData = await this.storageService.getData<string>(this.storageKey);
|
|
170
|
+
if (serializedLayoutData === undefined) {
|
|
171
|
+
this.logger.info('<<< Nothing to restore.');
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
const layoutData = await this.inflate(serializedLayoutData);
|
|
175
|
+
await app.shell.setLayoutData(layoutData);
|
|
176
|
+
this.logger.info('<<< The layout has been successfully restored.');
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
protected isWidgetProperty(propertyName: string): boolean {
|
|
181
|
+
return propertyName === 'widget';
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
protected isWidgetsProperty(propertyName: string): boolean {
|
|
185
|
+
return propertyName === 'widgets';
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Turns the layout data to a string representation.
|
|
190
|
+
*/
|
|
191
|
+
protected deflate(data: object): string {
|
|
192
|
+
return JSON.stringify(data, (property: string, value) => {
|
|
193
|
+
if (this.isWidgetProperty(property)) {
|
|
194
|
+
const description = this.convertToDescription(value as Widget);
|
|
195
|
+
return description;
|
|
196
|
+
} else if (this.isWidgetsProperty(property)) {
|
|
197
|
+
const descriptions: WidgetDescription[] = [];
|
|
198
|
+
for (const widget of (value as Widget[])) {
|
|
199
|
+
const description = this.convertToDescription(widget);
|
|
200
|
+
if (description) {
|
|
201
|
+
descriptions.push(description);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return descriptions;
|
|
205
|
+
}
|
|
206
|
+
return value;
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
private convertToDescription(widget: Widget): WidgetDescription | undefined {
|
|
211
|
+
const desc = this.widgetManager.getDescription(widget);
|
|
212
|
+
if (desc) {
|
|
213
|
+
if (StatefulWidget.is(widget)) {
|
|
214
|
+
const innerState = widget.storeState();
|
|
215
|
+
return innerState ? {
|
|
216
|
+
constructionOptions: desc,
|
|
217
|
+
innerWidgetState: this.deflate(innerState)
|
|
218
|
+
} : undefined;
|
|
219
|
+
} else {
|
|
220
|
+
return {
|
|
221
|
+
constructionOptions: desc,
|
|
222
|
+
innerWidgetState: undefined
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Creates the layout data from its string representation.
|
|
230
|
+
*/
|
|
231
|
+
protected async inflate(layoutData: string): Promise<ApplicationShell.LayoutData> {
|
|
232
|
+
const parseContext = new ShellLayoutRestorer.ParseContext();
|
|
233
|
+
const layout = this.parse<ApplicationShell.LayoutData>(layoutData, parseContext);
|
|
234
|
+
|
|
235
|
+
const layoutVersion = Number(layout.version);
|
|
236
|
+
if (typeof layoutVersion !== 'number' || Number.isNaN(layoutVersion)) {
|
|
237
|
+
throw new Error('could not resolve a layout version');
|
|
238
|
+
}
|
|
239
|
+
if (layoutVersion !== applicationShellLayoutVersion) {
|
|
240
|
+
if (layoutVersion < applicationShellLayoutVersion) {
|
|
241
|
+
console.warn(`Layout version ${layoutVersion} is behind current layout version ${applicationShellLayoutVersion}, trying to migrate...`);
|
|
242
|
+
} else {
|
|
243
|
+
console.warn(`Layout version ${layoutVersion} is ahead current layout version ${applicationShellLayoutVersion}, trying to load anyway...`);
|
|
244
|
+
}
|
|
245
|
+
console.info(`Please use '${RESET_LAYOUT.label}' command if the layout looks bogus.`);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const migrations = this.migrations.getContributions()
|
|
249
|
+
.filter(m => m.layoutVersion > layoutVersion && m.layoutVersion <= applicationShellLayoutVersion)
|
|
250
|
+
.sort((m, m2) => m.layoutVersion - m2.layoutVersion);
|
|
251
|
+
if (migrations.length) {
|
|
252
|
+
console.info(`Found ${migrations.length} migrations from layout version ${layoutVersion} to version ${applicationShellLayoutVersion}, migrating...`);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const context = { layout, layoutVersion, migrations };
|
|
256
|
+
await this.fireWillInflateLayout(context);
|
|
257
|
+
await parseContext.inflate(context);
|
|
258
|
+
return layout;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
protected async fireWillInflateLayout(context: ShellLayoutRestorer.InflateContext): Promise<void> {
|
|
262
|
+
for (const migration of context.migrations) {
|
|
263
|
+
if (migration.onWillInflateLayout) {
|
|
264
|
+
// don't catch exceptions, if one migration fails all should fail.
|
|
265
|
+
await migration.onWillInflateLayout(context);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
protected parse<T>(layoutData: string, parseContext: ShellLayoutRestorer.ParseContext): T {
|
|
271
|
+
return JSON.parse(layoutData, (property: string, value) => {
|
|
272
|
+
if (this.isWidgetsProperty(property)) {
|
|
273
|
+
const widgets = parseContext.filteredArray();
|
|
274
|
+
const descs = (value as WidgetDescription[]);
|
|
275
|
+
for (let i = 0; i < descs.length; i++) {
|
|
276
|
+
parseContext.push(async context => {
|
|
277
|
+
widgets[i] = await this.convertToWidget(descs[i], context);
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
return widgets;
|
|
281
|
+
} else if (isObject(value) && !Array.isArray(value)) {
|
|
282
|
+
const copy: Record<string, unknown> = {};
|
|
283
|
+
for (const p in value) {
|
|
284
|
+
if (this.isWidgetProperty(p)) {
|
|
285
|
+
parseContext.push(async context => {
|
|
286
|
+
copy[p] = await this.convertToWidget(value[p] as WidgetDescription, context);
|
|
287
|
+
});
|
|
288
|
+
} else {
|
|
289
|
+
copy[p] = value[p];
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return copy;
|
|
293
|
+
}
|
|
294
|
+
return value;
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
protected async fireWillInflateWidget(desc: WidgetDescription, context: ShellLayoutRestorer.InflateContext): Promise<WidgetDescription> {
|
|
299
|
+
for (const migration of context.migrations) {
|
|
300
|
+
if (migration.onWillInflateWidget) {
|
|
301
|
+
// don't catch exceptions, if one migration fails all should fail.
|
|
302
|
+
const migrated = await migration.onWillInflateWidget(desc, context);
|
|
303
|
+
if (migrated) {
|
|
304
|
+
if (isObject(migrated.innerWidgetState)) {
|
|
305
|
+
// in order to inflate nested widgets
|
|
306
|
+
migrated.innerWidgetState = JSON.stringify(migrated.innerWidgetState);
|
|
307
|
+
}
|
|
308
|
+
desc = migrated;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return desc;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
protected async convertToWidget(desc: WidgetDescription, context: ShellLayoutRestorer.InflateContext): Promise<Widget | undefined> {
|
|
316
|
+
if (!desc.constructionOptions) {
|
|
317
|
+
return undefined;
|
|
318
|
+
}
|
|
319
|
+
try {
|
|
320
|
+
desc = await this.fireWillInflateWidget(desc, context);
|
|
321
|
+
const widget = await this.widgetManager.getOrCreateWidget(desc.constructionOptions.factoryId, desc.constructionOptions.options);
|
|
322
|
+
if (StatefulWidget.is(widget) && desc.innerWidgetState !== undefined) {
|
|
323
|
+
try {
|
|
324
|
+
let oldState: object;
|
|
325
|
+
if (typeof desc.innerWidgetState === 'string') {
|
|
326
|
+
const parseContext = new ShellLayoutRestorer.ParseContext();
|
|
327
|
+
oldState = this.parse(desc.innerWidgetState, parseContext);
|
|
328
|
+
await parseContext.inflate({ ...context, parent: widget });
|
|
329
|
+
} else {
|
|
330
|
+
oldState = desc.innerWidgetState;
|
|
331
|
+
}
|
|
332
|
+
widget.restoreState(oldState);
|
|
333
|
+
} catch (e) {
|
|
334
|
+
if (ApplicationShellLayoutMigrationError.is(e)) {
|
|
335
|
+
throw e;
|
|
336
|
+
}
|
|
337
|
+
this.logger.warn(`Couldn't restore widget state for ${widget.id}. Error: ${e} `);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if (widget.isDisposed) {
|
|
341
|
+
return undefined;
|
|
342
|
+
}
|
|
343
|
+
return widget;
|
|
344
|
+
} catch (e) {
|
|
345
|
+
if (ApplicationShellLayoutMigrationError.is(e)) {
|
|
346
|
+
throw e;
|
|
347
|
+
}
|
|
348
|
+
this.logger.warn(`Couldn't restore widget for ${desc.constructionOptions.factoryId}. Error: ${e} `);
|
|
349
|
+
return undefined;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
export namespace ShellLayoutRestorer {
|
|
356
|
+
|
|
357
|
+
export class ParseContext {
|
|
358
|
+
protected readonly toInflate: Inflate[] = [];
|
|
359
|
+
protected readonly toFilter: Widgets[] = [];
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Returns an array, which will be filtered from undefined elements
|
|
363
|
+
* after resolving promises, that create widgets.
|
|
364
|
+
*/
|
|
365
|
+
filteredArray(): Widgets {
|
|
366
|
+
const array: Widgets = [];
|
|
367
|
+
this.toFilter.push(array);
|
|
368
|
+
return array;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
push(toInflate: Inflate): void {
|
|
372
|
+
this.toInflate.push(toInflate);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
async inflate(context: InflateContext): Promise<void> {
|
|
376
|
+
const pending: Promise<void>[] = [];
|
|
377
|
+
while (this.toInflate.length) {
|
|
378
|
+
pending.push(this.toInflate.pop()!(context));
|
|
379
|
+
}
|
|
380
|
+
await Promise.all(pending);
|
|
381
|
+
|
|
382
|
+
if (this.toFilter.length) {
|
|
383
|
+
this.toFilter.forEach(array => {
|
|
384
|
+
for (let i = 0; i < array.length; i++) {
|
|
385
|
+
if (array[i] === undefined) {
|
|
386
|
+
array.splice(i--, 1);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
export type Widgets = (Widget | undefined)[];
|
|
395
|
+
export type Inflate = (context: InflateContext) => Promise<void>;
|
|
396
|
+
export interface InflateContext extends ApplicationShellLayoutMigrationContext {
|
|
397
|
+
readonly migrations: ApplicationShellLayoutMigration[];
|
|
398
|
+
}
|
|
399
|
+
}
|