@theia/core 1.53.0-next.5 → 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 -352
- 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/tree/tree.ts
CHANGED
|
@@ -1,425 +1,425 @@
|
|
|
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 } from 'inversify';
|
|
18
|
-
import { Event, Emitter, WaitUntilEvent } from '../../common/event';
|
|
19
|
-
import { Disposable, DisposableCollection } from '../../common/disposable';
|
|
20
|
-
import { CancellationToken, CancellationTokenSource } from '../../common/cancellation';
|
|
21
|
-
import { timeout } from '../../common/promise-util';
|
|
22
|
-
import { isObject, Mutable } from '../../common';
|
|
23
|
-
import { AccessibilityInformation } from '../../common/accessibility';
|
|
24
|
-
|
|
25
|
-
export const Tree = Symbol('Tree');
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* The tree - an abstract data type.
|
|
29
|
-
*/
|
|
30
|
-
export interface Tree extends Disposable {
|
|
31
|
-
/**
|
|
32
|
-
* A root node of this tree.
|
|
33
|
-
* Undefined if there is no root node.
|
|
34
|
-
* Setting a root node refreshes the tree.
|
|
35
|
-
*/
|
|
36
|
-
root: TreeNode | undefined;
|
|
37
|
-
/**
|
|
38
|
-
* Emit when the tree is changed.
|
|
39
|
-
*/
|
|
40
|
-
readonly onChanged: Event<void>;
|
|
41
|
-
/**
|
|
42
|
-
* Return a node for the given identifier or undefined if such does not exist.
|
|
43
|
-
*/
|
|
44
|
-
getNode(id: string | undefined): TreeNode | undefined;
|
|
45
|
-
/**
|
|
46
|
-
* Return a valid node in this tree matching to the given; otherwise undefined.
|
|
47
|
-
*/
|
|
48
|
-
validateNode(node: TreeNode | undefined): TreeNode | undefined;
|
|
49
|
-
/**
|
|
50
|
-
* Refresh children of the root node.
|
|
51
|
-
*
|
|
52
|
-
* Return a valid refreshed composite root or `undefined` if such does not exist.
|
|
53
|
-
*/
|
|
54
|
-
refresh(): Promise<Readonly<CompositeTreeNode> | undefined>;
|
|
55
|
-
/**
|
|
56
|
-
* Refresh children of a node for the give node id if it is valid.
|
|
57
|
-
*
|
|
58
|
-
* Return a valid refreshed composite node or `undefined` if such does not exist.
|
|
59
|
-
*/
|
|
60
|
-
refresh(parent: Readonly<CompositeTreeNode>): Promise<Readonly<CompositeTreeNode> | undefined>;
|
|
61
|
-
/**
|
|
62
|
-
* Emit when the children of the given node are refreshed.
|
|
63
|
-
*/
|
|
64
|
-
readonly onNodeRefreshed: Event<Readonly<CompositeTreeNode> & WaitUntilEvent>;
|
|
65
|
-
/**
|
|
66
|
-
* Emits when the busy state of the given node is changed.
|
|
67
|
-
*/
|
|
68
|
-
readonly onDidChangeBusy: Event<TreeNode>;
|
|
69
|
-
/**
|
|
70
|
-
* Marks the give node as busy after a specified number of milliseconds.
|
|
71
|
-
* A token source of the given token should be canceled to unmark.
|
|
72
|
-
*/
|
|
73
|
-
markAsBusy(node: Readonly<TreeNode>, ms: number, token: CancellationToken): Promise<void>;
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* An update to the tree node occurred, but the tree structure remains unchanged
|
|
77
|
-
*/
|
|
78
|
-
readonly onDidUpdate: Event<TreeNode[]>;
|
|
79
|
-
|
|
80
|
-
markAsChecked(node: TreeNode, checked: boolean): void;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export interface TreeViewItemCheckboxInfo {
|
|
84
|
-
checked: boolean;
|
|
85
|
-
tooltip?: string;
|
|
86
|
-
accessibilityInformation?: AccessibilityInformation
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* The tree node.
|
|
91
|
-
*/
|
|
92
|
-
export interface TreeNode {
|
|
93
|
-
/**
|
|
94
|
-
* An unique id of this node.
|
|
95
|
-
*/
|
|
96
|
-
readonly id: string;
|
|
97
|
-
/**
|
|
98
|
-
* A human-readable name of this tree node.
|
|
99
|
-
*
|
|
100
|
-
* @deprecated use `LabelProvider.getName` instead or move this property to your tree node type
|
|
101
|
-
*/
|
|
102
|
-
readonly name?: string;
|
|
103
|
-
/**
|
|
104
|
-
* A css string for this tree node icon.
|
|
105
|
-
*
|
|
106
|
-
* @deprecated use `LabelProvider.getIcon` instead or move this property to your tree node type
|
|
107
|
-
*/
|
|
108
|
-
readonly icon?: string;
|
|
109
|
-
/**
|
|
110
|
-
* A human-readable description of this tree node.
|
|
111
|
-
*
|
|
112
|
-
* @deprecated use `LabelProvider.getLongName` instead or move this property to your tree node type
|
|
113
|
-
*/
|
|
114
|
-
readonly description?: string;
|
|
115
|
-
/**
|
|
116
|
-
* Test whether this node should be rendered.
|
|
117
|
-
* If undefined then node will be rendered.
|
|
118
|
-
*/
|
|
119
|
-
readonly visible?: boolean;
|
|
120
|
-
/**
|
|
121
|
-
* A parent node of this tree node.
|
|
122
|
-
* Undefined if this node is root.
|
|
123
|
-
*/
|
|
124
|
-
readonly parent: Readonly<CompositeTreeNode> | undefined;
|
|
125
|
-
/**
|
|
126
|
-
* A previous sibling of this tree node.
|
|
127
|
-
*/
|
|
128
|
-
readonly previousSibling?: TreeNode;
|
|
129
|
-
/**
|
|
130
|
-
* A next sibling of this tree node.
|
|
131
|
-
*/
|
|
132
|
-
readonly nextSibling?: TreeNode;
|
|
133
|
-
/**
|
|
134
|
-
* Whether this node is busy. Greater than 0 then busy; otherwise not.
|
|
135
|
-
*/
|
|
136
|
-
readonly busy?: number;
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Whether this node is checked.
|
|
140
|
-
*/
|
|
141
|
-
readonly checkboxInfo?: TreeViewItemCheckboxInfo;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
export namespace TreeNode {
|
|
145
|
-
export function is(node: unknown): node is TreeNode {
|
|
146
|
-
return isObject(node) && 'id' in node && 'parent' in node;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
export function equals(left: TreeNode | undefined, right: TreeNode | undefined): boolean {
|
|
150
|
-
return left === right || (!!left && !!right && left.id === right.id);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
export function isVisible(node: TreeNode | undefined): boolean {
|
|
154
|
-
return !!node && (node.visible === undefined || node.visible);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* The composite tree node.
|
|
160
|
-
*/
|
|
161
|
-
export interface CompositeTreeNode extends TreeNode {
|
|
162
|
-
/**
|
|
163
|
-
* Child nodes of this tree node.
|
|
164
|
-
*/
|
|
165
|
-
children: ReadonlyArray<TreeNode>;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
export namespace CompositeTreeNode {
|
|
169
|
-
export function is(node: unknown): node is CompositeTreeNode {
|
|
170
|
-
return isObject(node) && 'children' in node;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
export function getFirstChild(parent: CompositeTreeNode): TreeNode | undefined {
|
|
174
|
-
return parent.children[0];
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
export function getLastChild(parent: CompositeTreeNode): TreeNode | undefined {
|
|
178
|
-
return parent.children[parent.children.length - 1];
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
export function isAncestor(parent: CompositeTreeNode, child: TreeNode | undefined): boolean {
|
|
182
|
-
if (!child) {
|
|
183
|
-
return false;
|
|
184
|
-
}
|
|
185
|
-
if (TreeNode.equals(parent, child.parent)) {
|
|
186
|
-
return true;
|
|
187
|
-
}
|
|
188
|
-
return isAncestor(parent, child.parent);
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
export function indexOf(parent: CompositeTreeNode, node: TreeNode | undefined): number {
|
|
192
|
-
if (!node) {
|
|
193
|
-
return -1;
|
|
194
|
-
}
|
|
195
|
-
return parent.children.findIndex(child => TreeNode.equals(node, child));
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
export function addChildren(parent: CompositeTreeNode, children: TreeNode[]): CompositeTreeNode {
|
|
199
|
-
for (const child of children) {
|
|
200
|
-
addChild(parent, child);
|
|
201
|
-
}
|
|
202
|
-
return parent;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
export function addChild(parent: CompositeTreeNode, child: TreeNode): CompositeTreeNode {
|
|
206
|
-
const children = parent.children as TreeNode[];
|
|
207
|
-
const index = children.findIndex(value => value.id === child.id);
|
|
208
|
-
if (index !== -1) {
|
|
209
|
-
children.splice(index, 1, child);
|
|
210
|
-
setParent(child, index, parent);
|
|
211
|
-
} else {
|
|
212
|
-
children.push(child);
|
|
213
|
-
setParent(child, parent.children.length - 1, parent);
|
|
214
|
-
}
|
|
215
|
-
return parent;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
export function removeChild(parent: CompositeTreeNode, child: TreeNode): void {
|
|
219
|
-
const children = parent.children as TreeNode[];
|
|
220
|
-
const index = children.findIndex(value => value.id === child.id);
|
|
221
|
-
if (index === -1) {
|
|
222
|
-
return;
|
|
223
|
-
}
|
|
224
|
-
children.splice(index, 1);
|
|
225
|
-
const { previousSibling, nextSibling } = child;
|
|
226
|
-
if (previousSibling) {
|
|
227
|
-
Object.assign(previousSibling, { nextSibling });
|
|
228
|
-
}
|
|
229
|
-
if (nextSibling) {
|
|
230
|
-
Object.assign(nextSibling, { previousSibling });
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
export function setParent(child: TreeNode, index: number, parent: CompositeTreeNode): void {
|
|
235
|
-
const previousSibling = parent.children[index - 1];
|
|
236
|
-
const nextSibling = parent.children[index + 1];
|
|
237
|
-
Object.assign(child, { parent, previousSibling, nextSibling });
|
|
238
|
-
if (previousSibling) {
|
|
239
|
-
Object.assign(previousSibling, { nextSibling: child });
|
|
240
|
-
}
|
|
241
|
-
if (nextSibling) {
|
|
242
|
-
Object.assign(nextSibling, { previousSibling: child });
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* A default implementation of the tree.
|
|
249
|
-
*/
|
|
250
|
-
@injectable()
|
|
251
|
-
export class TreeImpl implements Tree {
|
|
252
|
-
|
|
253
|
-
protected _root: TreeNode | undefined;
|
|
254
|
-
protected readonly onChangedEmitter = new Emitter<void>();
|
|
255
|
-
protected readonly onNodeRefreshedEmitter = new Emitter<CompositeTreeNode & WaitUntilEvent>();
|
|
256
|
-
protected readonly toDispose = new DisposableCollection();
|
|
257
|
-
|
|
258
|
-
protected readonly onDidChangeBusyEmitter = new Emitter<TreeNode>();
|
|
259
|
-
readonly onDidChangeBusy = this.onDidChangeBusyEmitter.event;
|
|
260
|
-
protected readonly onDidUpdateEmitter = new Emitter<TreeNode[]>();
|
|
261
|
-
readonly onDidUpdate = this.onDidUpdateEmitter.event;
|
|
262
|
-
|
|
263
|
-
protected nodes: {
|
|
264
|
-
[id: string]: Mutable<TreeNode> | undefined
|
|
265
|
-
} = {};
|
|
266
|
-
|
|
267
|
-
constructor() {
|
|
268
|
-
this.toDispose.push(this.onChangedEmitter);
|
|
269
|
-
this.toDispose.push(this.onNodeRefreshedEmitter);
|
|
270
|
-
this.toDispose.push(this.onDidChangeBusyEmitter);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
dispose(): void {
|
|
274
|
-
this.nodes = {};
|
|
275
|
-
this.toDispose.dispose();
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
get root(): TreeNode | undefined {
|
|
279
|
-
return this._root;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
protected toDisposeOnSetRoot = new DisposableCollection();
|
|
283
|
-
set root(root: TreeNode | undefined) {
|
|
284
|
-
this.toDisposeOnSetRoot.dispose();
|
|
285
|
-
const cancelRefresh = new CancellationTokenSource();
|
|
286
|
-
this.toDisposeOnSetRoot.push(cancelRefresh);
|
|
287
|
-
this.nodes = {};
|
|
288
|
-
this._root = root;
|
|
289
|
-
this.addNode(root);
|
|
290
|
-
this.refresh(undefined, cancelRefresh.token);
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
get onChanged(): Event<void> {
|
|
294
|
-
return this.onChangedEmitter.event;
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
protected fireChanged(): void {
|
|
298
|
-
this.onChangedEmitter.fire(undefined);
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
get onNodeRefreshed(): Event<CompositeTreeNode & WaitUntilEvent> {
|
|
302
|
-
return this.onNodeRefreshedEmitter.event;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
protected async fireNodeRefreshed(parent: CompositeTreeNode): Promise<void> {
|
|
306
|
-
await WaitUntilEvent.fire(this.onNodeRefreshedEmitter, parent);
|
|
307
|
-
this.fireChanged();
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
getNode(id: string | undefined): TreeNode | undefined {
|
|
311
|
-
return id !== undefined ? this.nodes[id] : undefined;
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
validateNode(node: TreeNode | undefined): TreeNode | undefined {
|
|
315
|
-
const id = !!node ? node.id : undefined;
|
|
316
|
-
return this.getNode(id);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
async refresh(raw?: CompositeTreeNode, cancellationToken?: CancellationToken): Promise<CompositeTreeNode | undefined> {
|
|
320
|
-
const parent = !raw ? this._root : this.validateNode(raw);
|
|
321
|
-
let result: CompositeTreeNode | undefined;
|
|
322
|
-
if (CompositeTreeNode.is(parent)) {
|
|
323
|
-
const busySource = new CancellationTokenSource();
|
|
324
|
-
this.doMarkAsBusy(parent, 800, busySource.token);
|
|
325
|
-
try {
|
|
326
|
-
result = parent;
|
|
327
|
-
const children = await this.resolveChildren(parent);
|
|
328
|
-
if (cancellationToken?.isCancellationRequested) { return; }
|
|
329
|
-
result = await this.setChildren(parent, children);
|
|
330
|
-
if (cancellationToken?.isCancellationRequested) { return; }
|
|
331
|
-
} finally {
|
|
332
|
-
busySource.cancel();
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
this.fireChanged();
|
|
336
|
-
return result;
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
protected resolveChildren(parent: CompositeTreeNode): Promise<TreeNode[]> {
|
|
340
|
-
return Promise.resolve(Array.from(parent.children));
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
protected async setChildren(parent: CompositeTreeNode, children: TreeNode[]): Promise<CompositeTreeNode | undefined> {
|
|
344
|
-
const root = this.getRootNode(parent);
|
|
345
|
-
if (this.nodes[root.id] && this.nodes[root.id] !== root) {
|
|
346
|
-
console.error(`Child node '${parent.id}' does not belong to this '${root.id}' tree.`);
|
|
347
|
-
return undefined;
|
|
348
|
-
}
|
|
349
|
-
this.removeNode(parent);
|
|
350
|
-
parent.children = children;
|
|
351
|
-
this.addNode(parent);
|
|
352
|
-
await this.fireNodeRefreshed(parent);
|
|
353
|
-
return parent;
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
protected removeNode(node: TreeNode | undefined): void {
|
|
357
|
-
if (CompositeTreeNode.is(node)) {
|
|
358
|
-
node.children.forEach(child => this.removeNode(child));
|
|
359
|
-
}
|
|
360
|
-
if (node) {
|
|
361
|
-
delete this.nodes[node.id];
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
protected getRootNode(node: TreeNode): TreeNode {
|
|
366
|
-
if (node.parent === undefined) {
|
|
367
|
-
return node;
|
|
368
|
-
} else {
|
|
369
|
-
return this.getRootNode(node.parent);
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
protected addNode(node: TreeNode | undefined): void {
|
|
374
|
-
if (node) {
|
|
375
|
-
this.nodes[node.id] = node;
|
|
376
|
-
}
|
|
377
|
-
if (CompositeTreeNode.is(node)) {
|
|
378
|
-
const { children } = node;
|
|
379
|
-
children.forEach((child, index) => {
|
|
380
|
-
CompositeTreeNode.setParent(child, index, node);
|
|
381
|
-
this.addNode(child);
|
|
382
|
-
});
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
async markAsBusy(raw: TreeNode, ms: number, token: CancellationToken): Promise<void> {
|
|
387
|
-
const node = this.validateNode(raw);
|
|
388
|
-
if (node) {
|
|
389
|
-
await this.doMarkAsBusy(node, ms, token);
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
markAsChecked(node: Mutable<TreeNode>, checked: boolean): void {
|
|
394
|
-
node.checkboxInfo!.checked = checked;
|
|
395
|
-
this.onDidUpdateEmitter.fire([node]);
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
protected async doMarkAsBusy(node: Mutable<TreeNode>, ms: number, token: CancellationToken): Promise<void> {
|
|
399
|
-
try {
|
|
400
|
-
token.onCancellationRequested(() => this.doResetBusy(node));
|
|
401
|
-
await timeout(ms, token);
|
|
402
|
-
if (token.isCancellationRequested) { return; }
|
|
403
|
-
this.doSetBusy(node);
|
|
404
|
-
} catch {
|
|
405
|
-
/* no-op */
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
protected doSetBusy(node: Mutable<TreeNode>): void {
|
|
409
|
-
const oldBusy = node.busy || 0;
|
|
410
|
-
node.busy = oldBusy + 1;
|
|
411
|
-
if (oldBusy === 0) {
|
|
412
|
-
this.onDidChangeBusyEmitter.fire(node);
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
protected doResetBusy(node: Mutable<TreeNode>): void {
|
|
416
|
-
const oldBusy = node.busy || 0;
|
|
417
|
-
if (oldBusy > 0) {
|
|
418
|
-
node.busy = oldBusy - 1;
|
|
419
|
-
if (node.busy === 0) {
|
|
420
|
-
this.onDidChangeBusyEmitter.fire(node);
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
}
|
|
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 } from 'inversify';
|
|
18
|
+
import { Event, Emitter, WaitUntilEvent } from '../../common/event';
|
|
19
|
+
import { Disposable, DisposableCollection } from '../../common/disposable';
|
|
20
|
+
import { CancellationToken, CancellationTokenSource } from '../../common/cancellation';
|
|
21
|
+
import { timeout } from '../../common/promise-util';
|
|
22
|
+
import { isObject, Mutable } from '../../common';
|
|
23
|
+
import { AccessibilityInformation } from '../../common/accessibility';
|
|
24
|
+
|
|
25
|
+
export const Tree = Symbol('Tree');
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The tree - an abstract data type.
|
|
29
|
+
*/
|
|
30
|
+
export interface Tree extends Disposable {
|
|
31
|
+
/**
|
|
32
|
+
* A root node of this tree.
|
|
33
|
+
* Undefined if there is no root node.
|
|
34
|
+
* Setting a root node refreshes the tree.
|
|
35
|
+
*/
|
|
36
|
+
root: TreeNode | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Emit when the tree is changed.
|
|
39
|
+
*/
|
|
40
|
+
readonly onChanged: Event<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Return a node for the given identifier or undefined if such does not exist.
|
|
43
|
+
*/
|
|
44
|
+
getNode(id: string | undefined): TreeNode | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Return a valid node in this tree matching to the given; otherwise undefined.
|
|
47
|
+
*/
|
|
48
|
+
validateNode(node: TreeNode | undefined): TreeNode | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* Refresh children of the root node.
|
|
51
|
+
*
|
|
52
|
+
* Return a valid refreshed composite root or `undefined` if such does not exist.
|
|
53
|
+
*/
|
|
54
|
+
refresh(): Promise<Readonly<CompositeTreeNode> | undefined>;
|
|
55
|
+
/**
|
|
56
|
+
* Refresh children of a node for the give node id if it is valid.
|
|
57
|
+
*
|
|
58
|
+
* Return a valid refreshed composite node or `undefined` if such does not exist.
|
|
59
|
+
*/
|
|
60
|
+
refresh(parent: Readonly<CompositeTreeNode>): Promise<Readonly<CompositeTreeNode> | undefined>;
|
|
61
|
+
/**
|
|
62
|
+
* Emit when the children of the given node are refreshed.
|
|
63
|
+
*/
|
|
64
|
+
readonly onNodeRefreshed: Event<Readonly<CompositeTreeNode> & WaitUntilEvent>;
|
|
65
|
+
/**
|
|
66
|
+
* Emits when the busy state of the given node is changed.
|
|
67
|
+
*/
|
|
68
|
+
readonly onDidChangeBusy: Event<TreeNode>;
|
|
69
|
+
/**
|
|
70
|
+
* Marks the give node as busy after a specified number of milliseconds.
|
|
71
|
+
* A token source of the given token should be canceled to unmark.
|
|
72
|
+
*/
|
|
73
|
+
markAsBusy(node: Readonly<TreeNode>, ms: number, token: CancellationToken): Promise<void>;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* An update to the tree node occurred, but the tree structure remains unchanged
|
|
77
|
+
*/
|
|
78
|
+
readonly onDidUpdate: Event<TreeNode[]>;
|
|
79
|
+
|
|
80
|
+
markAsChecked(node: TreeNode, checked: boolean): void;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export interface TreeViewItemCheckboxInfo {
|
|
84
|
+
checked: boolean;
|
|
85
|
+
tooltip?: string;
|
|
86
|
+
accessibilityInformation?: AccessibilityInformation
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* The tree node.
|
|
91
|
+
*/
|
|
92
|
+
export interface TreeNode {
|
|
93
|
+
/**
|
|
94
|
+
* An unique id of this node.
|
|
95
|
+
*/
|
|
96
|
+
readonly id: string;
|
|
97
|
+
/**
|
|
98
|
+
* A human-readable name of this tree node.
|
|
99
|
+
*
|
|
100
|
+
* @deprecated use `LabelProvider.getName` instead or move this property to your tree node type
|
|
101
|
+
*/
|
|
102
|
+
readonly name?: string;
|
|
103
|
+
/**
|
|
104
|
+
* A css string for this tree node icon.
|
|
105
|
+
*
|
|
106
|
+
* @deprecated use `LabelProvider.getIcon` instead or move this property to your tree node type
|
|
107
|
+
*/
|
|
108
|
+
readonly icon?: string;
|
|
109
|
+
/**
|
|
110
|
+
* A human-readable description of this tree node.
|
|
111
|
+
*
|
|
112
|
+
* @deprecated use `LabelProvider.getLongName` instead or move this property to your tree node type
|
|
113
|
+
*/
|
|
114
|
+
readonly description?: string;
|
|
115
|
+
/**
|
|
116
|
+
* Test whether this node should be rendered.
|
|
117
|
+
* If undefined then node will be rendered.
|
|
118
|
+
*/
|
|
119
|
+
readonly visible?: boolean;
|
|
120
|
+
/**
|
|
121
|
+
* A parent node of this tree node.
|
|
122
|
+
* Undefined if this node is root.
|
|
123
|
+
*/
|
|
124
|
+
readonly parent: Readonly<CompositeTreeNode> | undefined;
|
|
125
|
+
/**
|
|
126
|
+
* A previous sibling of this tree node.
|
|
127
|
+
*/
|
|
128
|
+
readonly previousSibling?: TreeNode;
|
|
129
|
+
/**
|
|
130
|
+
* A next sibling of this tree node.
|
|
131
|
+
*/
|
|
132
|
+
readonly nextSibling?: TreeNode;
|
|
133
|
+
/**
|
|
134
|
+
* Whether this node is busy. Greater than 0 then busy; otherwise not.
|
|
135
|
+
*/
|
|
136
|
+
readonly busy?: number;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Whether this node is checked.
|
|
140
|
+
*/
|
|
141
|
+
readonly checkboxInfo?: TreeViewItemCheckboxInfo;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export namespace TreeNode {
|
|
145
|
+
export function is(node: unknown): node is TreeNode {
|
|
146
|
+
return isObject(node) && 'id' in node && 'parent' in node;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function equals(left: TreeNode | undefined, right: TreeNode | undefined): boolean {
|
|
150
|
+
return left === right || (!!left && !!right && left.id === right.id);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function isVisible(node: TreeNode | undefined): boolean {
|
|
154
|
+
return !!node && (node.visible === undefined || node.visible);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* The composite tree node.
|
|
160
|
+
*/
|
|
161
|
+
export interface CompositeTreeNode extends TreeNode {
|
|
162
|
+
/**
|
|
163
|
+
* Child nodes of this tree node.
|
|
164
|
+
*/
|
|
165
|
+
children: ReadonlyArray<TreeNode>;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export namespace CompositeTreeNode {
|
|
169
|
+
export function is(node: unknown): node is CompositeTreeNode {
|
|
170
|
+
return isObject(node) && 'children' in node;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export function getFirstChild(parent: CompositeTreeNode): TreeNode | undefined {
|
|
174
|
+
return parent.children[0];
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export function getLastChild(parent: CompositeTreeNode): TreeNode | undefined {
|
|
178
|
+
return parent.children[parent.children.length - 1];
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export function isAncestor(parent: CompositeTreeNode, child: TreeNode | undefined): boolean {
|
|
182
|
+
if (!child) {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
if (TreeNode.equals(parent, child.parent)) {
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
return isAncestor(parent, child.parent);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export function indexOf(parent: CompositeTreeNode, node: TreeNode | undefined): number {
|
|
192
|
+
if (!node) {
|
|
193
|
+
return -1;
|
|
194
|
+
}
|
|
195
|
+
return parent.children.findIndex(child => TreeNode.equals(node, child));
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export function addChildren(parent: CompositeTreeNode, children: TreeNode[]): CompositeTreeNode {
|
|
199
|
+
for (const child of children) {
|
|
200
|
+
addChild(parent, child);
|
|
201
|
+
}
|
|
202
|
+
return parent;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export function addChild(parent: CompositeTreeNode, child: TreeNode): CompositeTreeNode {
|
|
206
|
+
const children = parent.children as TreeNode[];
|
|
207
|
+
const index = children.findIndex(value => value.id === child.id);
|
|
208
|
+
if (index !== -1) {
|
|
209
|
+
children.splice(index, 1, child);
|
|
210
|
+
setParent(child, index, parent);
|
|
211
|
+
} else {
|
|
212
|
+
children.push(child);
|
|
213
|
+
setParent(child, parent.children.length - 1, parent);
|
|
214
|
+
}
|
|
215
|
+
return parent;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export function removeChild(parent: CompositeTreeNode, child: TreeNode): void {
|
|
219
|
+
const children = parent.children as TreeNode[];
|
|
220
|
+
const index = children.findIndex(value => value.id === child.id);
|
|
221
|
+
if (index === -1) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
children.splice(index, 1);
|
|
225
|
+
const { previousSibling, nextSibling } = child;
|
|
226
|
+
if (previousSibling) {
|
|
227
|
+
Object.assign(previousSibling, { nextSibling });
|
|
228
|
+
}
|
|
229
|
+
if (nextSibling) {
|
|
230
|
+
Object.assign(nextSibling, { previousSibling });
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export function setParent(child: TreeNode, index: number, parent: CompositeTreeNode): void {
|
|
235
|
+
const previousSibling = parent.children[index - 1];
|
|
236
|
+
const nextSibling = parent.children[index + 1];
|
|
237
|
+
Object.assign(child, { parent, previousSibling, nextSibling });
|
|
238
|
+
if (previousSibling) {
|
|
239
|
+
Object.assign(previousSibling, { nextSibling: child });
|
|
240
|
+
}
|
|
241
|
+
if (nextSibling) {
|
|
242
|
+
Object.assign(nextSibling, { previousSibling: child });
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* A default implementation of the tree.
|
|
249
|
+
*/
|
|
250
|
+
@injectable()
|
|
251
|
+
export class TreeImpl implements Tree {
|
|
252
|
+
|
|
253
|
+
protected _root: TreeNode | undefined;
|
|
254
|
+
protected readonly onChangedEmitter = new Emitter<void>();
|
|
255
|
+
protected readonly onNodeRefreshedEmitter = new Emitter<CompositeTreeNode & WaitUntilEvent>();
|
|
256
|
+
protected readonly toDispose = new DisposableCollection();
|
|
257
|
+
|
|
258
|
+
protected readonly onDidChangeBusyEmitter = new Emitter<TreeNode>();
|
|
259
|
+
readonly onDidChangeBusy = this.onDidChangeBusyEmitter.event;
|
|
260
|
+
protected readonly onDidUpdateEmitter = new Emitter<TreeNode[]>();
|
|
261
|
+
readonly onDidUpdate = this.onDidUpdateEmitter.event;
|
|
262
|
+
|
|
263
|
+
protected nodes: {
|
|
264
|
+
[id: string]: Mutable<TreeNode> | undefined
|
|
265
|
+
} = {};
|
|
266
|
+
|
|
267
|
+
constructor() {
|
|
268
|
+
this.toDispose.push(this.onChangedEmitter);
|
|
269
|
+
this.toDispose.push(this.onNodeRefreshedEmitter);
|
|
270
|
+
this.toDispose.push(this.onDidChangeBusyEmitter);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
dispose(): void {
|
|
274
|
+
this.nodes = {};
|
|
275
|
+
this.toDispose.dispose();
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
get root(): TreeNode | undefined {
|
|
279
|
+
return this._root;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
protected toDisposeOnSetRoot = new DisposableCollection();
|
|
283
|
+
set root(root: TreeNode | undefined) {
|
|
284
|
+
this.toDisposeOnSetRoot.dispose();
|
|
285
|
+
const cancelRefresh = new CancellationTokenSource();
|
|
286
|
+
this.toDisposeOnSetRoot.push(cancelRefresh);
|
|
287
|
+
this.nodes = {};
|
|
288
|
+
this._root = root;
|
|
289
|
+
this.addNode(root);
|
|
290
|
+
this.refresh(undefined, cancelRefresh.token);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
get onChanged(): Event<void> {
|
|
294
|
+
return this.onChangedEmitter.event;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
protected fireChanged(): void {
|
|
298
|
+
this.onChangedEmitter.fire(undefined);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
get onNodeRefreshed(): Event<CompositeTreeNode & WaitUntilEvent> {
|
|
302
|
+
return this.onNodeRefreshedEmitter.event;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
protected async fireNodeRefreshed(parent: CompositeTreeNode): Promise<void> {
|
|
306
|
+
await WaitUntilEvent.fire(this.onNodeRefreshedEmitter, parent);
|
|
307
|
+
this.fireChanged();
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
getNode(id: string | undefined): TreeNode | undefined {
|
|
311
|
+
return id !== undefined ? this.nodes[id] : undefined;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
validateNode(node: TreeNode | undefined): TreeNode | undefined {
|
|
315
|
+
const id = !!node ? node.id : undefined;
|
|
316
|
+
return this.getNode(id);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
async refresh(raw?: CompositeTreeNode, cancellationToken?: CancellationToken): Promise<CompositeTreeNode | undefined> {
|
|
320
|
+
const parent = !raw ? this._root : this.validateNode(raw);
|
|
321
|
+
let result: CompositeTreeNode | undefined;
|
|
322
|
+
if (CompositeTreeNode.is(parent)) {
|
|
323
|
+
const busySource = new CancellationTokenSource();
|
|
324
|
+
this.doMarkAsBusy(parent, 800, busySource.token);
|
|
325
|
+
try {
|
|
326
|
+
result = parent;
|
|
327
|
+
const children = await this.resolveChildren(parent);
|
|
328
|
+
if (cancellationToken?.isCancellationRequested) { return; }
|
|
329
|
+
result = await this.setChildren(parent, children);
|
|
330
|
+
if (cancellationToken?.isCancellationRequested) { return; }
|
|
331
|
+
} finally {
|
|
332
|
+
busySource.cancel();
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
this.fireChanged();
|
|
336
|
+
return result;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
protected resolveChildren(parent: CompositeTreeNode): Promise<TreeNode[]> {
|
|
340
|
+
return Promise.resolve(Array.from(parent.children));
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
protected async setChildren(parent: CompositeTreeNode, children: TreeNode[]): Promise<CompositeTreeNode | undefined> {
|
|
344
|
+
const root = this.getRootNode(parent);
|
|
345
|
+
if (this.nodes[root.id] && this.nodes[root.id] !== root) {
|
|
346
|
+
console.error(`Child node '${parent.id}' does not belong to this '${root.id}' tree.`);
|
|
347
|
+
return undefined;
|
|
348
|
+
}
|
|
349
|
+
this.removeNode(parent);
|
|
350
|
+
parent.children = children;
|
|
351
|
+
this.addNode(parent);
|
|
352
|
+
await this.fireNodeRefreshed(parent);
|
|
353
|
+
return parent;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
protected removeNode(node: TreeNode | undefined): void {
|
|
357
|
+
if (CompositeTreeNode.is(node)) {
|
|
358
|
+
node.children.forEach(child => this.removeNode(child));
|
|
359
|
+
}
|
|
360
|
+
if (node) {
|
|
361
|
+
delete this.nodes[node.id];
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
protected getRootNode(node: TreeNode): TreeNode {
|
|
366
|
+
if (node.parent === undefined) {
|
|
367
|
+
return node;
|
|
368
|
+
} else {
|
|
369
|
+
return this.getRootNode(node.parent);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
protected addNode(node: TreeNode | undefined): void {
|
|
374
|
+
if (node) {
|
|
375
|
+
this.nodes[node.id] = node;
|
|
376
|
+
}
|
|
377
|
+
if (CompositeTreeNode.is(node)) {
|
|
378
|
+
const { children } = node;
|
|
379
|
+
children.forEach((child, index) => {
|
|
380
|
+
CompositeTreeNode.setParent(child, index, node);
|
|
381
|
+
this.addNode(child);
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
async markAsBusy(raw: TreeNode, ms: number, token: CancellationToken): Promise<void> {
|
|
387
|
+
const node = this.validateNode(raw);
|
|
388
|
+
if (node) {
|
|
389
|
+
await this.doMarkAsBusy(node, ms, token);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
markAsChecked(node: Mutable<TreeNode>, checked: boolean): void {
|
|
394
|
+
node.checkboxInfo!.checked = checked;
|
|
395
|
+
this.onDidUpdateEmitter.fire([node]);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
protected async doMarkAsBusy(node: Mutable<TreeNode>, ms: number, token: CancellationToken): Promise<void> {
|
|
399
|
+
try {
|
|
400
|
+
token.onCancellationRequested(() => this.doResetBusy(node));
|
|
401
|
+
await timeout(ms, token);
|
|
402
|
+
if (token.isCancellationRequested) { return; }
|
|
403
|
+
this.doSetBusy(node);
|
|
404
|
+
} catch {
|
|
405
|
+
/* no-op */
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
protected doSetBusy(node: Mutable<TreeNode>): void {
|
|
409
|
+
const oldBusy = node.busy || 0;
|
|
410
|
+
node.busy = oldBusy + 1;
|
|
411
|
+
if (oldBusy === 0) {
|
|
412
|
+
this.onDidChangeBusyEmitter.fire(node);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
protected doResetBusy(node: Mutable<TreeNode>): void {
|
|
416
|
+
const oldBusy = node.busy || 0;
|
|
417
|
+
if (oldBusy > 0) {
|
|
418
|
+
node.busy = oldBusy - 1;
|
|
419
|
+
if (node.busy === 0) {
|
|
420
|
+
this.onDidChangeBusyEmitter.fire(node);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
}
|