@theia/core 1.53.0-next.55 → 1.53.0-next.64
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 +6 -6
- package/i18n/nls.cs.json +582 -582
- package/i18n/nls.de.json +582 -582
- package/i18n/nls.es.json +582 -582
- package/i18n/nls.fr.json +582 -582
- package/i18n/nls.hu.json +582 -582
- package/i18n/nls.it.json +582 -582
- package/i18n/nls.ja.json +582 -582
- package/i18n/nls.json +582 -582
- package/i18n/nls.ko.json +582 -582
- package/i18n/nls.pl.json +582 -582
- package/i18n/nls.pt-br.json +582 -582
- package/i18n/nls.ru.json +582 -582
- package/i18n/nls.tr.json +582 -582
- package/i18n/nls.zh-cn.json +582 -582
- package/i18n/nls.zh-tw.json +582 -582
- package/lib/browser/catalog.json +54 -6
- package/lib/browser/common-frontend-contribution.js +3 -3
- package/lib/browser/common-styling-participants.js +166 -166
- package/lib/browser/progress-location-service.spec.js +7 -7
- package/lib/browser/storage-service.js +3 -3
- package/lib/browser/tree/tree.spec.js +75 -75
- package/lib/node/process-utils.spec.js +8 -8
- package/package.json +4 -4
- 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 -467
- 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 -343
- 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 -474
- 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 -118
- 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 -140
- package/src/browser/opener-service.spec.ts +49 -49
- package/src/browser/opener-service.ts +169 -169
- 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 -332
- package/src/browser/saveable.ts +395 -395
- 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 -242
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.ts +149 -149
- 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 -443
- 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 -353
- 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 -38
- package/src/browser/style/status-bar.css +127 -127
- package/src/browser/style/tabs.css +647 -647
- 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 -187
- 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 -168
- 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 -21
- 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 -163
- 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 -493
- 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 -108
- 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 -220
- 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 -42
- 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 -339
- 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 -264
- 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 -48
- 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 -157
- 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 -373
- package/src/electron-main/electron-main-application-module.ts +65 -65
- package/src/electron-main/electron-main-application.ts +860 -860
- 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 -219
- 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 -40
- 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
|
@@ -1,443 +1,443 @@
|
|
|
1
|
-
// *****************************************************************************
|
|
2
|
-
// Copyright (C) 2018 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 { inject, injectable, postConstruct } from 'inversify';
|
|
18
|
-
import * as React from 'react';
|
|
19
|
-
import { ContextKeyService, ContextMatcher } from '../../context-key-service';
|
|
20
|
-
import { CommandRegistry, Disposable, DisposableCollection, MenuCommandExecutor, MenuModelRegistry, MenuPath, nls } from '../../../common';
|
|
21
|
-
import { Anchor, ContextMenuAccess, ContextMenuRenderer } from '../../context-menu-renderer';
|
|
22
|
-
import { LabelIcon, LabelParser } from '../../label-parser';
|
|
23
|
-
import { ACTION_ITEM, codicon, ReactWidget, Widget } from '../../widgets';
|
|
24
|
-
import { TabBarToolbarRegistry } from './tab-bar-toolbar-registry';
|
|
25
|
-
import { ReactTabBarToolbarItem, TabBarDelegator, TabBarToolbarItem, TAB_BAR_TOOLBAR_CONTEXT_MENU, RenderedToolbarItem } from './tab-bar-toolbar-types';
|
|
26
|
-
import { KeybindingRegistry } from '../..//keybinding';
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Factory for instantiating tab-bar toolbars.
|
|
30
|
-
*/
|
|
31
|
-
export const TabBarToolbarFactory = Symbol('TabBarToolbarFactory');
|
|
32
|
-
export interface TabBarToolbarFactory {
|
|
33
|
-
(): TabBarToolbar;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Class name indicating rendering of a toolbar item without an icon but instead with a text label.
|
|
38
|
-
*/
|
|
39
|
-
const NO_ICON_CLASS = 'no-icon';
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Tab-bar toolbar widget representing the active [tab-bar toolbar items](TabBarToolbarItem).
|
|
43
|
-
*/
|
|
44
|
-
@injectable()
|
|
45
|
-
export class TabBarToolbar extends ReactWidget {
|
|
46
|
-
|
|
47
|
-
protected current: Widget | undefined;
|
|
48
|
-
protected inline = new Map<string, TabBarToolbarItem | ReactTabBarToolbarItem>();
|
|
49
|
-
protected more = new Map<string, TabBarToolbarItem>();
|
|
50
|
-
|
|
51
|
-
protected contextKeyListener: Disposable | undefined;
|
|
52
|
-
protected toDisposeOnUpdateItems: DisposableCollection = new DisposableCollection();
|
|
53
|
-
|
|
54
|
-
protected keybindingContextKeys = new Set<string>();
|
|
55
|
-
|
|
56
|
-
@inject(CommandRegistry) protected readonly commands: CommandRegistry;
|
|
57
|
-
@inject(LabelParser) protected readonly labelParser: LabelParser;
|
|
58
|
-
@inject(MenuModelRegistry) protected readonly menus: MenuModelRegistry;
|
|
59
|
-
@inject(MenuCommandExecutor) protected readonly menuCommandExecutor: MenuCommandExecutor;
|
|
60
|
-
@inject(ContextMenuRenderer) protected readonly contextMenuRenderer: ContextMenuRenderer;
|
|
61
|
-
@inject(TabBarToolbarRegistry) protected readonly toolbarRegistry: TabBarToolbarRegistry;
|
|
62
|
-
@inject(ContextKeyService) protected readonly contextKeyService: ContextKeyService;
|
|
63
|
-
@inject(KeybindingRegistry) protected readonly keybindings: KeybindingRegistry;
|
|
64
|
-
|
|
65
|
-
constructor() {
|
|
66
|
-
super();
|
|
67
|
-
this.addClass(TabBarToolbar.Styles.TAB_BAR_TOOLBAR);
|
|
68
|
-
this.hide();
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
@postConstruct()
|
|
72
|
-
protected init(): void {
|
|
73
|
-
this.toDispose.push(this.keybindings.onKeybindingsChanged(() => this.maybeUpdate()));
|
|
74
|
-
|
|
75
|
-
this.toDispose.push(this.contextKeyService.onDidChange(e => {
|
|
76
|
-
if (e.affects(this.keybindingContextKeys)) {
|
|
77
|
-
this.maybeUpdate();
|
|
78
|
-
}
|
|
79
|
-
}));
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
updateItems(items: Array<TabBarToolbarItem | ReactTabBarToolbarItem>, current: Widget | undefined): void {
|
|
83
|
-
this.toDisposeOnUpdateItems.dispose();
|
|
84
|
-
this.toDisposeOnUpdateItems = new DisposableCollection();
|
|
85
|
-
this.inline.clear();
|
|
86
|
-
this.more.clear();
|
|
87
|
-
|
|
88
|
-
const contextKeys = new Set<string>();
|
|
89
|
-
for (const item of items.sort(TabBarToolbarItem.PRIORITY_COMPARATOR).reverse()) {
|
|
90
|
-
if (item.command) {
|
|
91
|
-
this.commands.getAllHandlers(item.command).forEach(handler => {
|
|
92
|
-
if (handler.onDidChangeEnabled) {
|
|
93
|
-
this.toDisposeOnUpdateItems.push(handler.onDidChangeEnabled(() => this.maybeUpdate()));
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
if ('render' in item || item.group === undefined || item.group === 'navigation') {
|
|
98
|
-
this.inline.set(item.id, item);
|
|
99
|
-
} else {
|
|
100
|
-
this.more.set(item.id, item);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
if (item.when) {
|
|
104
|
-
this.contextKeyService.parseKeys(item.when)?.forEach(key => contextKeys.add(key));
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
this.updateContextKeyListener(contextKeys);
|
|
109
|
-
|
|
110
|
-
this.setCurrent(current);
|
|
111
|
-
if (items.length) {
|
|
112
|
-
this.show();
|
|
113
|
-
} else {
|
|
114
|
-
this.hide();
|
|
115
|
-
}
|
|
116
|
-
this.maybeUpdate();
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
updateTarget(current?: Widget): void {
|
|
120
|
-
const operativeWidget = TabBarDelegator.is(current) ? current.getTabBarDelegate() : current;
|
|
121
|
-
const items = operativeWidget ? this.toolbarRegistry.visibleItems(operativeWidget) : [];
|
|
122
|
-
this.updateItems(items, operativeWidget);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
protected readonly toDisposeOnSetCurrent = new DisposableCollection();
|
|
126
|
-
protected setCurrent(current: Widget | undefined): void {
|
|
127
|
-
this.toDisposeOnSetCurrent.dispose();
|
|
128
|
-
this.toDispose.push(this.toDisposeOnSetCurrent);
|
|
129
|
-
this.current = current;
|
|
130
|
-
if (current) {
|
|
131
|
-
const resetCurrent = () => {
|
|
132
|
-
this.setCurrent(undefined);
|
|
133
|
-
this.maybeUpdate();
|
|
134
|
-
};
|
|
135
|
-
current.disposed.connect(resetCurrent);
|
|
136
|
-
this.toDisposeOnSetCurrent.push(Disposable.create(() =>
|
|
137
|
-
current.disposed.disconnect(resetCurrent)
|
|
138
|
-
));
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
protected updateContextKeyListener(contextKeys: Set<string>): void {
|
|
143
|
-
this.contextKeyListener?.dispose();
|
|
144
|
-
if (contextKeys.size > 0) {
|
|
145
|
-
this.contextKeyListener = this.contextKeyService.onDidChange(event => {
|
|
146
|
-
if (event.affects(contextKeys)) {
|
|
147
|
-
this.maybeUpdate();
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
protected render(): React.ReactNode {
|
|
154
|
-
this.keybindingContextKeys.clear();
|
|
155
|
-
return <React.Fragment>
|
|
156
|
-
{this.renderMore()}
|
|
157
|
-
{[...this.inline.values()].map(item => {
|
|
158
|
-
if (ReactTabBarToolbarItem.is(item)) {
|
|
159
|
-
return item.render(this.current);
|
|
160
|
-
} else {
|
|
161
|
-
return (item.menuPath && this.toolbarRegistry.isNonEmptyMenu(item, this.current) ? this.renderMenuItem(item) : this.renderItem(item));
|
|
162
|
-
}
|
|
163
|
-
})}
|
|
164
|
-
</React.Fragment>;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
protected resolveKeybindingForCommand(command: string | undefined): string {
|
|
168
|
-
let result = '';
|
|
169
|
-
if (command) {
|
|
170
|
-
const bindings = this.keybindings.getKeybindingsForCommand(command);
|
|
171
|
-
let found = false;
|
|
172
|
-
if (bindings && bindings.length > 0) {
|
|
173
|
-
bindings.forEach(binding => {
|
|
174
|
-
if (binding.when) {
|
|
175
|
-
this.contextKeyService.parseKeys(binding.when)?.forEach(key => this.keybindingContextKeys.add(key));
|
|
176
|
-
}
|
|
177
|
-
if (!found && this.keybindings.isEnabledInScope(binding, this.current?.node)) {
|
|
178
|
-
found = true;
|
|
179
|
-
result = ` (${this.keybindings.acceleratorFor(binding, '+')})`;
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
return result;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
protected renderItem(item: RenderedToolbarItem): React.ReactNode {
|
|
188
|
-
let innerText = '';
|
|
189
|
-
const classNames = [];
|
|
190
|
-
const command = item.command ? this.commands.getCommand(item.command) : undefined;
|
|
191
|
-
// Fall back to the item ID in extremis so there is _something_ to render in the
|
|
192
|
-
// case that there is neither an icon nor a title
|
|
193
|
-
const itemText = item.text || command?.label || command?.id || item.id;
|
|
194
|
-
if (itemText) {
|
|
195
|
-
for (const labelPart of this.labelParser.parse(itemText)) {
|
|
196
|
-
if (LabelIcon.is(labelPart)) {
|
|
197
|
-
const className = `fa fa-${labelPart.name}${labelPart.animation ? ' fa-' + labelPart.animation : ''}`;
|
|
198
|
-
classNames.push(...className.split(' '));
|
|
199
|
-
} else {
|
|
200
|
-
innerText = labelPart;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
const iconClass = (typeof item.icon === 'function' && item.icon()) || item.icon as string || (command && command.iconClass);
|
|
205
|
-
if (iconClass) {
|
|
206
|
-
classNames.push(iconClass);
|
|
207
|
-
}
|
|
208
|
-
const tooltipText = item.tooltip || (command && command.label) || '';
|
|
209
|
-
const tooltip = `${this.labelParser.stripIcons(tooltipText)}${this.resolveKeybindingForCommand(command?.id)}`;
|
|
210
|
-
|
|
211
|
-
// Only present text if there is no icon
|
|
212
|
-
if (classNames.length) {
|
|
213
|
-
innerText = '';
|
|
214
|
-
} else if (innerText) {
|
|
215
|
-
// Make room for the label text
|
|
216
|
-
classNames.push(NO_ICON_CLASS);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
// In any case, this is an action item, with or without icon.
|
|
220
|
-
classNames.push(ACTION_ITEM);
|
|
221
|
-
|
|
222
|
-
const toolbarItemClassNames = this.getToolbarItemClassNames(item);
|
|
223
|
-
return <div key={item.id}
|
|
224
|
-
className={toolbarItemClassNames.join(' ')}
|
|
225
|
-
onMouseDown={this.onMouseDownEvent}
|
|
226
|
-
onMouseUp={this.onMouseUpEvent}
|
|
227
|
-
onMouseOut={this.onMouseUpEvent} >
|
|
228
|
-
<div id={item.id} className={classNames.join(' ')}
|
|
229
|
-
onClick={e => this.executeCommand(e, item)}
|
|
230
|
-
title={tooltip}>{innerText}
|
|
231
|
-
</div>
|
|
232
|
-
</div>;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
protected isEnabled(item: TabBarToolbarItem): boolean {
|
|
236
|
-
if (!!item.command) {
|
|
237
|
-
return this.commandIsEnabled(item.command) && this.evaluateWhenClause(item.when);
|
|
238
|
-
} else {
|
|
239
|
-
return !!item.menuPath;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
protected getToolbarItemClassNames(item: TabBarToolbarItem): string[] {
|
|
244
|
-
const classNames = [TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM];
|
|
245
|
-
if (item.command) {
|
|
246
|
-
if (this.isEnabled(item)) {
|
|
247
|
-
classNames.push('enabled');
|
|
248
|
-
}
|
|
249
|
-
if (this.commandIsToggled(item.command)) {
|
|
250
|
-
classNames.push('toggled');
|
|
251
|
-
}
|
|
252
|
-
} else {
|
|
253
|
-
if (this.isEnabled(item)) {
|
|
254
|
-
classNames.push('enabled');
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
return classNames;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
protected renderMore(): React.ReactNode {
|
|
261
|
-
return !!this.more.size && <div key='__more__' className={TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM + ' enabled'}>
|
|
262
|
-
<div id='__more__' className={codicon('ellipsis', true)} onClick={this.showMoreContextMenu}
|
|
263
|
-
title={nls.localizeByDefault('More Actions...')} />
|
|
264
|
-
</div>;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
protected showMoreContextMenu = (event: React.MouseEvent) => {
|
|
268
|
-
event.stopPropagation();
|
|
269
|
-
event.preventDefault();
|
|
270
|
-
const anchor = this.toAnchor(event);
|
|
271
|
-
this.renderMoreContextMenu(anchor);
|
|
272
|
-
};
|
|
273
|
-
|
|
274
|
-
protected toAnchor(event: React.MouseEvent): Anchor {
|
|
275
|
-
const itemBox = event.currentTarget.closest('.' + TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM)?.getBoundingClientRect();
|
|
276
|
-
return itemBox ? { y: itemBox.bottom, x: itemBox.left } : event.nativeEvent;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
renderMoreContextMenu(anchor: Anchor, subpath?: MenuPath): ContextMenuAccess {
|
|
280
|
-
const toDisposeOnHide = new DisposableCollection();
|
|
281
|
-
this.addClass('menu-open');
|
|
282
|
-
toDisposeOnHide.push(Disposable.create(() => this.removeClass('menu-open')));
|
|
283
|
-
if (subpath) {
|
|
284
|
-
toDisposeOnHide.push(this.menus.linkSubmenu(TAB_BAR_TOOLBAR_CONTEXT_MENU, subpath));
|
|
285
|
-
} else {
|
|
286
|
-
for (const item of this.more.values()) {
|
|
287
|
-
if (item.menuPath && !item.command) {
|
|
288
|
-
toDisposeOnHide.push(this.menus.linkSubmenu(TAB_BAR_TOOLBAR_CONTEXT_MENU, item.menuPath, undefined, item.group));
|
|
289
|
-
} else if (item.command) {
|
|
290
|
-
// Register a submenu for the item, if the group is in format `<submenu group>/<submenu name>/.../<item group>`
|
|
291
|
-
if (item.group?.includes('/')) {
|
|
292
|
-
const split = item.group.split('/');
|
|
293
|
-
const paths: string[] = [];
|
|
294
|
-
for (let i = 0; i < split.length - 1; i += 2) {
|
|
295
|
-
paths.push(split[i], split[i + 1]);
|
|
296
|
-
toDisposeOnHide.push(this.menus.registerSubmenu([...TAB_BAR_TOOLBAR_CONTEXT_MENU, ...paths], split[i + 1], { order: item.order }));
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
toDisposeOnHide.push(this.menus.registerMenuAction([...TAB_BAR_TOOLBAR_CONTEXT_MENU, ...item.group!.split('/')], {
|
|
300
|
-
label: (item as RenderedToolbarItem).tooltip,
|
|
301
|
-
commandId: item.command,
|
|
302
|
-
when: item.when,
|
|
303
|
-
order: item.order
|
|
304
|
-
}));
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
return this.contextMenuRenderer.render({
|
|
309
|
-
menuPath: TAB_BAR_TOOLBAR_CONTEXT_MENU,
|
|
310
|
-
args: [this.current],
|
|
311
|
-
anchor,
|
|
312
|
-
context: this.current?.node,
|
|
313
|
-
onHide: () => toDisposeOnHide.dispose(),
|
|
314
|
-
skipSingleRootNode: true,
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
/**
|
|
319
|
-
* Renders a toolbar item that is a menu, presenting it as a button with a little
|
|
320
|
-
* chevron decoration that pops up a floating menu when clicked.
|
|
321
|
-
*
|
|
322
|
-
* @param item a toolbar item that is a menu item
|
|
323
|
-
* @returns the rendered toolbar item
|
|
324
|
-
*/
|
|
325
|
-
protected renderMenuItem(item: RenderedToolbarItem): React.ReactNode {
|
|
326
|
-
const command = item.command ? this.commands.getCommand(item.command) : undefined;
|
|
327
|
-
const icon = (typeof item.icon === 'function' && item.icon()) || item.icon as string || (command && command.iconClass) || 'ellipsis';
|
|
328
|
-
|
|
329
|
-
let contextMatcher: ContextMatcher = this.contextKeyService;
|
|
330
|
-
if (item.contextKeyOverlays) {
|
|
331
|
-
contextMatcher = this.contextKeyService.createOverlay(Object.keys(item.contextKeyOverlays).map(key => [key, item.contextKeyOverlays![key]]));
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
return <div key={item.id}
|
|
335
|
-
className={TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM + ' enabled menu'}
|
|
336
|
-
>
|
|
337
|
-
<div className={codicon(icon, true)}
|
|
338
|
-
title={item.text}
|
|
339
|
-
onClick={e => this.executeCommand(e, item)}
|
|
340
|
-
/>
|
|
341
|
-
<div className={ACTION_ITEM} onClick={event => this.showPopupMenu(item.menuPath!, event, contextMatcher)}>
|
|
342
|
-
<div className={codicon('chevron-down') + ' chevron'} />
|
|
343
|
-
</div>
|
|
344
|
-
|
|
345
|
-
</div >;
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
/**
|
|
349
|
-
* Presents the menu to popup on the `event` that is the clicking of
|
|
350
|
-
* a menu toolbar item.
|
|
351
|
-
*
|
|
352
|
-
* @param menuPath the path of the registered menu to show
|
|
353
|
-
* @param event the mouse event triggering the menu
|
|
354
|
-
*/
|
|
355
|
-
protected showPopupMenu = (menuPath: MenuPath, event: React.MouseEvent, contextMatcher: ContextMatcher) => {
|
|
356
|
-
event.stopPropagation();
|
|
357
|
-
event.preventDefault();
|
|
358
|
-
const anchor = this.toAnchor(event);
|
|
359
|
-
this.renderPopupMenu(menuPath, anchor, contextMatcher);
|
|
360
|
-
};
|
|
361
|
-
|
|
362
|
-
/**
|
|
363
|
-
* Renders the menu popped up on a menu toolbar item.
|
|
364
|
-
*
|
|
365
|
-
* @param menuPath the path of the registered menu to render
|
|
366
|
-
* @param anchor a description of where to render the menu
|
|
367
|
-
* @returns platform-specific access to the rendered context menu
|
|
368
|
-
*/
|
|
369
|
-
protected renderPopupMenu(menuPath: MenuPath, anchor: Anchor, contextMatcher: ContextMatcher): ContextMenuAccess {
|
|
370
|
-
const toDisposeOnHide = new DisposableCollection();
|
|
371
|
-
this.addClass('menu-open');
|
|
372
|
-
toDisposeOnHide.push(Disposable.create(() => this.removeClass('menu-open')));
|
|
373
|
-
|
|
374
|
-
return this.contextMenuRenderer.render({
|
|
375
|
-
menuPath,
|
|
376
|
-
args: [this.current],
|
|
377
|
-
anchor,
|
|
378
|
-
context: this.current?.node,
|
|
379
|
-
contextKeyService: contextMatcher,
|
|
380
|
-
onHide: () => toDisposeOnHide.dispose()
|
|
381
|
-
});
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
shouldHandleMouseEvent(event: MouseEvent): boolean {
|
|
385
|
-
return event.target instanceof Element && this.node.contains(event.target);
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
protected commandIsEnabled(command: string): boolean {
|
|
389
|
-
return this.commands.isEnabled(command, this.current);
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
protected commandIsToggled(command: string): boolean {
|
|
393
|
-
return this.commands.isToggled(command, this.current);
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
protected evaluateWhenClause(whenClause: string | undefined): boolean {
|
|
397
|
-
return whenClause ? this.contextKeyService.match(whenClause, this.current?.node) : true;
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
protected executeCommand(e: React.MouseEvent<HTMLElement>, item: TabBarToolbarItem): void {
|
|
401
|
-
e.preventDefault();
|
|
402
|
-
e.stopPropagation();
|
|
403
|
-
|
|
404
|
-
if (!item || !this.isEnabled(item)) {
|
|
405
|
-
return;
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
if (item.command && item.delegateMenuPath) {
|
|
409
|
-
this.menuCommandExecutor.executeCommand(item.delegateMenuPath, item.command, this.current);
|
|
410
|
-
} else if (item.command) {
|
|
411
|
-
this.commands.executeCommand(item.command, this.current);
|
|
412
|
-
} else if (item.menuPath) {
|
|
413
|
-
this.renderMoreContextMenu(this.toAnchor(e), item.menuPath);
|
|
414
|
-
}
|
|
415
|
-
this.maybeUpdate();
|
|
416
|
-
};
|
|
417
|
-
|
|
418
|
-
protected maybeUpdate(): void {
|
|
419
|
-
if (!this.isDisposed) {
|
|
420
|
-
this.update();
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
protected onMouseDownEvent = (e: React.MouseEvent<HTMLElement>) => {
|
|
425
|
-
if (e.button === 0) {
|
|
426
|
-
e.currentTarget.classList.add('active');
|
|
427
|
-
}
|
|
428
|
-
};
|
|
429
|
-
|
|
430
|
-
protected onMouseUpEvent = (e: React.MouseEvent<HTMLElement>) => {
|
|
431
|
-
e.currentTarget.classList.remove('active');
|
|
432
|
-
};
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
export namespace TabBarToolbar {
|
|
436
|
-
|
|
437
|
-
export namespace Styles {
|
|
438
|
-
|
|
439
|
-
export const TAB_BAR_TOOLBAR = 'p-TabBar-toolbar';
|
|
440
|
-
export const TAB_BAR_TOOLBAR_ITEM = 'item';
|
|
441
|
-
|
|
442
|
-
}
|
|
443
|
-
}
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2018 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 { inject, injectable, postConstruct } from 'inversify';
|
|
18
|
+
import * as React from 'react';
|
|
19
|
+
import { ContextKeyService, ContextMatcher } from '../../context-key-service';
|
|
20
|
+
import { CommandRegistry, Disposable, DisposableCollection, MenuCommandExecutor, MenuModelRegistry, MenuPath, nls } from '../../../common';
|
|
21
|
+
import { Anchor, ContextMenuAccess, ContextMenuRenderer } from '../../context-menu-renderer';
|
|
22
|
+
import { LabelIcon, LabelParser } from '../../label-parser';
|
|
23
|
+
import { ACTION_ITEM, codicon, ReactWidget, Widget } from '../../widgets';
|
|
24
|
+
import { TabBarToolbarRegistry } from './tab-bar-toolbar-registry';
|
|
25
|
+
import { ReactTabBarToolbarItem, TabBarDelegator, TabBarToolbarItem, TAB_BAR_TOOLBAR_CONTEXT_MENU, RenderedToolbarItem } from './tab-bar-toolbar-types';
|
|
26
|
+
import { KeybindingRegistry } from '../..//keybinding';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Factory for instantiating tab-bar toolbars.
|
|
30
|
+
*/
|
|
31
|
+
export const TabBarToolbarFactory = Symbol('TabBarToolbarFactory');
|
|
32
|
+
export interface TabBarToolbarFactory {
|
|
33
|
+
(): TabBarToolbar;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Class name indicating rendering of a toolbar item without an icon but instead with a text label.
|
|
38
|
+
*/
|
|
39
|
+
const NO_ICON_CLASS = 'no-icon';
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Tab-bar toolbar widget representing the active [tab-bar toolbar items](TabBarToolbarItem).
|
|
43
|
+
*/
|
|
44
|
+
@injectable()
|
|
45
|
+
export class TabBarToolbar extends ReactWidget {
|
|
46
|
+
|
|
47
|
+
protected current: Widget | undefined;
|
|
48
|
+
protected inline = new Map<string, TabBarToolbarItem | ReactTabBarToolbarItem>();
|
|
49
|
+
protected more = new Map<string, TabBarToolbarItem>();
|
|
50
|
+
|
|
51
|
+
protected contextKeyListener: Disposable | undefined;
|
|
52
|
+
protected toDisposeOnUpdateItems: DisposableCollection = new DisposableCollection();
|
|
53
|
+
|
|
54
|
+
protected keybindingContextKeys = new Set<string>();
|
|
55
|
+
|
|
56
|
+
@inject(CommandRegistry) protected readonly commands: CommandRegistry;
|
|
57
|
+
@inject(LabelParser) protected readonly labelParser: LabelParser;
|
|
58
|
+
@inject(MenuModelRegistry) protected readonly menus: MenuModelRegistry;
|
|
59
|
+
@inject(MenuCommandExecutor) protected readonly menuCommandExecutor: MenuCommandExecutor;
|
|
60
|
+
@inject(ContextMenuRenderer) protected readonly contextMenuRenderer: ContextMenuRenderer;
|
|
61
|
+
@inject(TabBarToolbarRegistry) protected readonly toolbarRegistry: TabBarToolbarRegistry;
|
|
62
|
+
@inject(ContextKeyService) protected readonly contextKeyService: ContextKeyService;
|
|
63
|
+
@inject(KeybindingRegistry) protected readonly keybindings: KeybindingRegistry;
|
|
64
|
+
|
|
65
|
+
constructor() {
|
|
66
|
+
super();
|
|
67
|
+
this.addClass(TabBarToolbar.Styles.TAB_BAR_TOOLBAR);
|
|
68
|
+
this.hide();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@postConstruct()
|
|
72
|
+
protected init(): void {
|
|
73
|
+
this.toDispose.push(this.keybindings.onKeybindingsChanged(() => this.maybeUpdate()));
|
|
74
|
+
|
|
75
|
+
this.toDispose.push(this.contextKeyService.onDidChange(e => {
|
|
76
|
+
if (e.affects(this.keybindingContextKeys)) {
|
|
77
|
+
this.maybeUpdate();
|
|
78
|
+
}
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
updateItems(items: Array<TabBarToolbarItem | ReactTabBarToolbarItem>, current: Widget | undefined): void {
|
|
83
|
+
this.toDisposeOnUpdateItems.dispose();
|
|
84
|
+
this.toDisposeOnUpdateItems = new DisposableCollection();
|
|
85
|
+
this.inline.clear();
|
|
86
|
+
this.more.clear();
|
|
87
|
+
|
|
88
|
+
const contextKeys = new Set<string>();
|
|
89
|
+
for (const item of items.sort(TabBarToolbarItem.PRIORITY_COMPARATOR).reverse()) {
|
|
90
|
+
if (item.command) {
|
|
91
|
+
this.commands.getAllHandlers(item.command).forEach(handler => {
|
|
92
|
+
if (handler.onDidChangeEnabled) {
|
|
93
|
+
this.toDisposeOnUpdateItems.push(handler.onDidChangeEnabled(() => this.maybeUpdate()));
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
if ('render' in item || item.group === undefined || item.group === 'navigation') {
|
|
98
|
+
this.inline.set(item.id, item);
|
|
99
|
+
} else {
|
|
100
|
+
this.more.set(item.id, item);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (item.when) {
|
|
104
|
+
this.contextKeyService.parseKeys(item.when)?.forEach(key => contextKeys.add(key));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
this.updateContextKeyListener(contextKeys);
|
|
109
|
+
|
|
110
|
+
this.setCurrent(current);
|
|
111
|
+
if (items.length) {
|
|
112
|
+
this.show();
|
|
113
|
+
} else {
|
|
114
|
+
this.hide();
|
|
115
|
+
}
|
|
116
|
+
this.maybeUpdate();
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
updateTarget(current?: Widget): void {
|
|
120
|
+
const operativeWidget = TabBarDelegator.is(current) ? current.getTabBarDelegate() : current;
|
|
121
|
+
const items = operativeWidget ? this.toolbarRegistry.visibleItems(operativeWidget) : [];
|
|
122
|
+
this.updateItems(items, operativeWidget);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
protected readonly toDisposeOnSetCurrent = new DisposableCollection();
|
|
126
|
+
protected setCurrent(current: Widget | undefined): void {
|
|
127
|
+
this.toDisposeOnSetCurrent.dispose();
|
|
128
|
+
this.toDispose.push(this.toDisposeOnSetCurrent);
|
|
129
|
+
this.current = current;
|
|
130
|
+
if (current) {
|
|
131
|
+
const resetCurrent = () => {
|
|
132
|
+
this.setCurrent(undefined);
|
|
133
|
+
this.maybeUpdate();
|
|
134
|
+
};
|
|
135
|
+
current.disposed.connect(resetCurrent);
|
|
136
|
+
this.toDisposeOnSetCurrent.push(Disposable.create(() =>
|
|
137
|
+
current.disposed.disconnect(resetCurrent)
|
|
138
|
+
));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
protected updateContextKeyListener(contextKeys: Set<string>): void {
|
|
143
|
+
this.contextKeyListener?.dispose();
|
|
144
|
+
if (contextKeys.size > 0) {
|
|
145
|
+
this.contextKeyListener = this.contextKeyService.onDidChange(event => {
|
|
146
|
+
if (event.affects(contextKeys)) {
|
|
147
|
+
this.maybeUpdate();
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
protected render(): React.ReactNode {
|
|
154
|
+
this.keybindingContextKeys.clear();
|
|
155
|
+
return <React.Fragment>
|
|
156
|
+
{this.renderMore()}
|
|
157
|
+
{[...this.inline.values()].map(item => {
|
|
158
|
+
if (ReactTabBarToolbarItem.is(item)) {
|
|
159
|
+
return item.render(this.current);
|
|
160
|
+
} else {
|
|
161
|
+
return (item.menuPath && this.toolbarRegistry.isNonEmptyMenu(item, this.current) ? this.renderMenuItem(item) : this.renderItem(item));
|
|
162
|
+
}
|
|
163
|
+
})}
|
|
164
|
+
</React.Fragment>;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
protected resolveKeybindingForCommand(command: string | undefined): string {
|
|
168
|
+
let result = '';
|
|
169
|
+
if (command) {
|
|
170
|
+
const bindings = this.keybindings.getKeybindingsForCommand(command);
|
|
171
|
+
let found = false;
|
|
172
|
+
if (bindings && bindings.length > 0) {
|
|
173
|
+
bindings.forEach(binding => {
|
|
174
|
+
if (binding.when) {
|
|
175
|
+
this.contextKeyService.parseKeys(binding.when)?.forEach(key => this.keybindingContextKeys.add(key));
|
|
176
|
+
}
|
|
177
|
+
if (!found && this.keybindings.isEnabledInScope(binding, this.current?.node)) {
|
|
178
|
+
found = true;
|
|
179
|
+
result = ` (${this.keybindings.acceleratorFor(binding, '+')})`;
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
protected renderItem(item: RenderedToolbarItem): React.ReactNode {
|
|
188
|
+
let innerText = '';
|
|
189
|
+
const classNames = [];
|
|
190
|
+
const command = item.command ? this.commands.getCommand(item.command) : undefined;
|
|
191
|
+
// Fall back to the item ID in extremis so there is _something_ to render in the
|
|
192
|
+
// case that there is neither an icon nor a title
|
|
193
|
+
const itemText = item.text || command?.label || command?.id || item.id;
|
|
194
|
+
if (itemText) {
|
|
195
|
+
for (const labelPart of this.labelParser.parse(itemText)) {
|
|
196
|
+
if (LabelIcon.is(labelPart)) {
|
|
197
|
+
const className = `fa fa-${labelPart.name}${labelPart.animation ? ' fa-' + labelPart.animation : ''}`;
|
|
198
|
+
classNames.push(...className.split(' '));
|
|
199
|
+
} else {
|
|
200
|
+
innerText = labelPart;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const iconClass = (typeof item.icon === 'function' && item.icon()) || item.icon as string || (command && command.iconClass);
|
|
205
|
+
if (iconClass) {
|
|
206
|
+
classNames.push(iconClass);
|
|
207
|
+
}
|
|
208
|
+
const tooltipText = item.tooltip || (command && command.label) || '';
|
|
209
|
+
const tooltip = `${this.labelParser.stripIcons(tooltipText)}${this.resolveKeybindingForCommand(command?.id)}`;
|
|
210
|
+
|
|
211
|
+
// Only present text if there is no icon
|
|
212
|
+
if (classNames.length) {
|
|
213
|
+
innerText = '';
|
|
214
|
+
} else if (innerText) {
|
|
215
|
+
// Make room for the label text
|
|
216
|
+
classNames.push(NO_ICON_CLASS);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// In any case, this is an action item, with or without icon.
|
|
220
|
+
classNames.push(ACTION_ITEM);
|
|
221
|
+
|
|
222
|
+
const toolbarItemClassNames = this.getToolbarItemClassNames(item);
|
|
223
|
+
return <div key={item.id}
|
|
224
|
+
className={toolbarItemClassNames.join(' ')}
|
|
225
|
+
onMouseDown={this.onMouseDownEvent}
|
|
226
|
+
onMouseUp={this.onMouseUpEvent}
|
|
227
|
+
onMouseOut={this.onMouseUpEvent} >
|
|
228
|
+
<div id={item.id} className={classNames.join(' ')}
|
|
229
|
+
onClick={e => this.executeCommand(e, item)}
|
|
230
|
+
title={tooltip}>{innerText}
|
|
231
|
+
</div>
|
|
232
|
+
</div>;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
protected isEnabled(item: TabBarToolbarItem): boolean {
|
|
236
|
+
if (!!item.command) {
|
|
237
|
+
return this.commandIsEnabled(item.command) && this.evaluateWhenClause(item.when);
|
|
238
|
+
} else {
|
|
239
|
+
return !!item.menuPath;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
protected getToolbarItemClassNames(item: TabBarToolbarItem): string[] {
|
|
244
|
+
const classNames = [TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM];
|
|
245
|
+
if (item.command) {
|
|
246
|
+
if (this.isEnabled(item)) {
|
|
247
|
+
classNames.push('enabled');
|
|
248
|
+
}
|
|
249
|
+
if (this.commandIsToggled(item.command)) {
|
|
250
|
+
classNames.push('toggled');
|
|
251
|
+
}
|
|
252
|
+
} else {
|
|
253
|
+
if (this.isEnabled(item)) {
|
|
254
|
+
classNames.push('enabled');
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return classNames;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
protected renderMore(): React.ReactNode {
|
|
261
|
+
return !!this.more.size && <div key='__more__' className={TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM + ' enabled'}>
|
|
262
|
+
<div id='__more__' className={codicon('ellipsis', true)} onClick={this.showMoreContextMenu}
|
|
263
|
+
title={nls.localizeByDefault('More Actions...')} />
|
|
264
|
+
</div>;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
protected showMoreContextMenu = (event: React.MouseEvent) => {
|
|
268
|
+
event.stopPropagation();
|
|
269
|
+
event.preventDefault();
|
|
270
|
+
const anchor = this.toAnchor(event);
|
|
271
|
+
this.renderMoreContextMenu(anchor);
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
protected toAnchor(event: React.MouseEvent): Anchor {
|
|
275
|
+
const itemBox = event.currentTarget.closest('.' + TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM)?.getBoundingClientRect();
|
|
276
|
+
return itemBox ? { y: itemBox.bottom, x: itemBox.left } : event.nativeEvent;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
renderMoreContextMenu(anchor: Anchor, subpath?: MenuPath): ContextMenuAccess {
|
|
280
|
+
const toDisposeOnHide = new DisposableCollection();
|
|
281
|
+
this.addClass('menu-open');
|
|
282
|
+
toDisposeOnHide.push(Disposable.create(() => this.removeClass('menu-open')));
|
|
283
|
+
if (subpath) {
|
|
284
|
+
toDisposeOnHide.push(this.menus.linkSubmenu(TAB_BAR_TOOLBAR_CONTEXT_MENU, subpath));
|
|
285
|
+
} else {
|
|
286
|
+
for (const item of this.more.values()) {
|
|
287
|
+
if (item.menuPath && !item.command) {
|
|
288
|
+
toDisposeOnHide.push(this.menus.linkSubmenu(TAB_BAR_TOOLBAR_CONTEXT_MENU, item.menuPath, undefined, item.group));
|
|
289
|
+
} else if (item.command) {
|
|
290
|
+
// Register a submenu for the item, if the group is in format `<submenu group>/<submenu name>/.../<item group>`
|
|
291
|
+
if (item.group?.includes('/')) {
|
|
292
|
+
const split = item.group.split('/');
|
|
293
|
+
const paths: string[] = [];
|
|
294
|
+
for (let i = 0; i < split.length - 1; i += 2) {
|
|
295
|
+
paths.push(split[i], split[i + 1]);
|
|
296
|
+
toDisposeOnHide.push(this.menus.registerSubmenu([...TAB_BAR_TOOLBAR_CONTEXT_MENU, ...paths], split[i + 1], { order: item.order }));
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
toDisposeOnHide.push(this.menus.registerMenuAction([...TAB_BAR_TOOLBAR_CONTEXT_MENU, ...item.group!.split('/')], {
|
|
300
|
+
label: (item as RenderedToolbarItem).tooltip,
|
|
301
|
+
commandId: item.command,
|
|
302
|
+
when: item.when,
|
|
303
|
+
order: item.order
|
|
304
|
+
}));
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return this.contextMenuRenderer.render({
|
|
309
|
+
menuPath: TAB_BAR_TOOLBAR_CONTEXT_MENU,
|
|
310
|
+
args: [this.current],
|
|
311
|
+
anchor,
|
|
312
|
+
context: this.current?.node,
|
|
313
|
+
onHide: () => toDisposeOnHide.dispose(),
|
|
314
|
+
skipSingleRootNode: true,
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Renders a toolbar item that is a menu, presenting it as a button with a little
|
|
320
|
+
* chevron decoration that pops up a floating menu when clicked.
|
|
321
|
+
*
|
|
322
|
+
* @param item a toolbar item that is a menu item
|
|
323
|
+
* @returns the rendered toolbar item
|
|
324
|
+
*/
|
|
325
|
+
protected renderMenuItem(item: RenderedToolbarItem): React.ReactNode {
|
|
326
|
+
const command = item.command ? this.commands.getCommand(item.command) : undefined;
|
|
327
|
+
const icon = (typeof item.icon === 'function' && item.icon()) || item.icon as string || (command && command.iconClass) || 'ellipsis';
|
|
328
|
+
|
|
329
|
+
let contextMatcher: ContextMatcher = this.contextKeyService;
|
|
330
|
+
if (item.contextKeyOverlays) {
|
|
331
|
+
contextMatcher = this.contextKeyService.createOverlay(Object.keys(item.contextKeyOverlays).map(key => [key, item.contextKeyOverlays![key]]));
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
return <div key={item.id}
|
|
335
|
+
className={TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM + ' enabled menu'}
|
|
336
|
+
>
|
|
337
|
+
<div className={codicon(icon, true)}
|
|
338
|
+
title={item.text}
|
|
339
|
+
onClick={e => this.executeCommand(e, item)}
|
|
340
|
+
/>
|
|
341
|
+
<div className={ACTION_ITEM} onClick={event => this.showPopupMenu(item.menuPath!, event, contextMatcher)}>
|
|
342
|
+
<div className={codicon('chevron-down') + ' chevron'} />
|
|
343
|
+
</div>
|
|
344
|
+
|
|
345
|
+
</div >;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Presents the menu to popup on the `event` that is the clicking of
|
|
350
|
+
* a menu toolbar item.
|
|
351
|
+
*
|
|
352
|
+
* @param menuPath the path of the registered menu to show
|
|
353
|
+
* @param event the mouse event triggering the menu
|
|
354
|
+
*/
|
|
355
|
+
protected showPopupMenu = (menuPath: MenuPath, event: React.MouseEvent, contextMatcher: ContextMatcher) => {
|
|
356
|
+
event.stopPropagation();
|
|
357
|
+
event.preventDefault();
|
|
358
|
+
const anchor = this.toAnchor(event);
|
|
359
|
+
this.renderPopupMenu(menuPath, anchor, contextMatcher);
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* Renders the menu popped up on a menu toolbar item.
|
|
364
|
+
*
|
|
365
|
+
* @param menuPath the path of the registered menu to render
|
|
366
|
+
* @param anchor a description of where to render the menu
|
|
367
|
+
* @returns platform-specific access to the rendered context menu
|
|
368
|
+
*/
|
|
369
|
+
protected renderPopupMenu(menuPath: MenuPath, anchor: Anchor, contextMatcher: ContextMatcher): ContextMenuAccess {
|
|
370
|
+
const toDisposeOnHide = new DisposableCollection();
|
|
371
|
+
this.addClass('menu-open');
|
|
372
|
+
toDisposeOnHide.push(Disposable.create(() => this.removeClass('menu-open')));
|
|
373
|
+
|
|
374
|
+
return this.contextMenuRenderer.render({
|
|
375
|
+
menuPath,
|
|
376
|
+
args: [this.current],
|
|
377
|
+
anchor,
|
|
378
|
+
context: this.current?.node,
|
|
379
|
+
contextKeyService: contextMatcher,
|
|
380
|
+
onHide: () => toDisposeOnHide.dispose()
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
shouldHandleMouseEvent(event: MouseEvent): boolean {
|
|
385
|
+
return event.target instanceof Element && this.node.contains(event.target);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
protected commandIsEnabled(command: string): boolean {
|
|
389
|
+
return this.commands.isEnabled(command, this.current);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
protected commandIsToggled(command: string): boolean {
|
|
393
|
+
return this.commands.isToggled(command, this.current);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
protected evaluateWhenClause(whenClause: string | undefined): boolean {
|
|
397
|
+
return whenClause ? this.contextKeyService.match(whenClause, this.current?.node) : true;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
protected executeCommand(e: React.MouseEvent<HTMLElement>, item: TabBarToolbarItem): void {
|
|
401
|
+
e.preventDefault();
|
|
402
|
+
e.stopPropagation();
|
|
403
|
+
|
|
404
|
+
if (!item || !this.isEnabled(item)) {
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
if (item.command && item.delegateMenuPath) {
|
|
409
|
+
this.menuCommandExecutor.executeCommand(item.delegateMenuPath, item.command, this.current);
|
|
410
|
+
} else if (item.command) {
|
|
411
|
+
this.commands.executeCommand(item.command, this.current);
|
|
412
|
+
} else if (item.menuPath) {
|
|
413
|
+
this.renderMoreContextMenu(this.toAnchor(e), item.menuPath);
|
|
414
|
+
}
|
|
415
|
+
this.maybeUpdate();
|
|
416
|
+
};
|
|
417
|
+
|
|
418
|
+
protected maybeUpdate(): void {
|
|
419
|
+
if (!this.isDisposed) {
|
|
420
|
+
this.update();
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
protected onMouseDownEvent = (e: React.MouseEvent<HTMLElement>) => {
|
|
425
|
+
if (e.button === 0) {
|
|
426
|
+
e.currentTarget.classList.add('active');
|
|
427
|
+
}
|
|
428
|
+
};
|
|
429
|
+
|
|
430
|
+
protected onMouseUpEvent = (e: React.MouseEvent<HTMLElement>) => {
|
|
431
|
+
e.currentTarget.classList.remove('active');
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
export namespace TabBarToolbar {
|
|
436
|
+
|
|
437
|
+
export namespace Styles {
|
|
438
|
+
|
|
439
|
+
export const TAB_BAR_TOOLBAR = 'p-TabBar-toolbar';
|
|
440
|
+
export const TAB_BAR_TOOLBAR_ITEM = 'item';
|
|
441
|
+
|
|
442
|
+
}
|
|
443
|
+
}
|