@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
package/src/browser/saveable.ts
CHANGED
|
@@ -1,395 +1,395 @@
|
|
|
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 { Widget } from '@phosphor/widgets';
|
|
18
|
-
import { Message } from '@phosphor/messaging';
|
|
19
|
-
import { Emitter, Event } from '../common/event';
|
|
20
|
-
import { MaybePromise } from '../common/types';
|
|
21
|
-
import { Key } from './keyboard/keys';
|
|
22
|
-
import { AbstractDialog } from './dialogs';
|
|
23
|
-
import { nls } from '../common/nls';
|
|
24
|
-
import { Disposable, DisposableCollection, isObject } from '../common';
|
|
25
|
-
import { BinaryBuffer } from '../common/buffer';
|
|
26
|
-
|
|
27
|
-
export type AutoSaveMode = 'off' | 'afterDelay' | 'onFocusChange' | 'onWindowChange';
|
|
28
|
-
|
|
29
|
-
export interface Saveable {
|
|
30
|
-
readonly dirty: boolean;
|
|
31
|
-
/**
|
|
32
|
-
* This event is fired when the content of the `dirty` variable changes.
|
|
33
|
-
*/
|
|
34
|
-
readonly onDirtyChanged: Event<void>;
|
|
35
|
-
/**
|
|
36
|
-
* This event is fired when the content of the saveable changes.
|
|
37
|
-
* While `onDirtyChanged` is fired to notify the UI that the widget is dirty,
|
|
38
|
-
* `onContentChanged` is used for the auto save throttling.
|
|
39
|
-
*/
|
|
40
|
-
readonly onContentChanged: Event<void>;
|
|
41
|
-
/**
|
|
42
|
-
* Saves dirty changes.
|
|
43
|
-
*/
|
|
44
|
-
save(options?: SaveOptions): MaybePromise<void>;
|
|
45
|
-
/**
|
|
46
|
-
* Reverts dirty changes.
|
|
47
|
-
*/
|
|
48
|
-
revert?(options?: Saveable.RevertOptions): Promise<void>;
|
|
49
|
-
/**
|
|
50
|
-
* Creates a snapshot of the dirty state. See also {@link Saveable.Snapshot}.
|
|
51
|
-
*/
|
|
52
|
-
createSnapshot?(): Saveable.Snapshot;
|
|
53
|
-
/**
|
|
54
|
-
* Applies the given snapshot to the dirty state.
|
|
55
|
-
*/
|
|
56
|
-
applySnapshot?(snapshot: object): void;
|
|
57
|
-
/**
|
|
58
|
-
* Serializes the full state of the saveable item to a binary buffer.
|
|
59
|
-
*/
|
|
60
|
-
serialize?(): Promise<BinaryBuffer>;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export interface SaveableSource {
|
|
64
|
-
readonly saveable: Saveable;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export class DelegatingSaveable implements Saveable {
|
|
68
|
-
dirty = false;
|
|
69
|
-
protected readonly onDirtyChangedEmitter = new Emitter<void>();
|
|
70
|
-
protected readonly onContentChangedEmitter = new Emitter<void>();
|
|
71
|
-
|
|
72
|
-
get onDirtyChanged(): Event<void> {
|
|
73
|
-
return this.onDirtyChangedEmitter.event;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
get onContentChanged(): Event<void> {
|
|
77
|
-
return this.onContentChangedEmitter.event;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
async save(options?: SaveOptions): Promise<void> {
|
|
81
|
-
await this._delegate?.save(options);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
revert?(options?: Saveable.RevertOptions): Promise<void>;
|
|
85
|
-
createSnapshot?(): Saveable.Snapshot;
|
|
86
|
-
applySnapshot?(snapshot: object): void;
|
|
87
|
-
serialize?(): Promise<BinaryBuffer>;
|
|
88
|
-
|
|
89
|
-
protected _delegate?: Saveable;
|
|
90
|
-
protected toDispose = new DisposableCollection();
|
|
91
|
-
|
|
92
|
-
set delegate(delegate: Saveable) {
|
|
93
|
-
this.toDispose.dispose();
|
|
94
|
-
this.toDispose = new DisposableCollection();
|
|
95
|
-
this._delegate = delegate;
|
|
96
|
-
this.toDispose.push(delegate.onDirtyChanged(() => {
|
|
97
|
-
this.dirty = delegate.dirty;
|
|
98
|
-
this.onDirtyChangedEmitter.fire();
|
|
99
|
-
}));
|
|
100
|
-
this.toDispose.push(delegate.onContentChanged(() => {
|
|
101
|
-
this.onContentChangedEmitter.fire();
|
|
102
|
-
}));
|
|
103
|
-
if (this.dirty !== delegate.dirty) {
|
|
104
|
-
this.dirty = delegate.dirty;
|
|
105
|
-
this.onDirtyChangedEmitter.fire();
|
|
106
|
-
}
|
|
107
|
-
this.revert = delegate.revert?.bind(delegate);
|
|
108
|
-
this.createSnapshot = delegate.createSnapshot?.bind(delegate);
|
|
109
|
-
this.applySnapshot = delegate.applySnapshot?.bind(delegate);
|
|
110
|
-
this.serialize = delegate.serialize?.bind(delegate);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
export class CompositeSaveable implements Saveable {
|
|
116
|
-
protected isDirty = false;
|
|
117
|
-
protected readonly onDirtyChangedEmitter = new Emitter<void>();
|
|
118
|
-
protected readonly onContentChangedEmitter = new Emitter<void>();
|
|
119
|
-
protected readonly toDispose = new DisposableCollection(this.onDirtyChangedEmitter, this.onContentChangedEmitter);
|
|
120
|
-
protected readonly saveablesMap = new Map<Saveable, Disposable>();
|
|
121
|
-
|
|
122
|
-
get dirty(): boolean {
|
|
123
|
-
return this.isDirty;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
get onDirtyChanged(): Event<void> {
|
|
127
|
-
return this.onDirtyChangedEmitter.event;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
get onContentChanged(): Event<void> {
|
|
131
|
-
return this.onContentChangedEmitter.event;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
async save(options?: SaveOptions): Promise<void> {
|
|
135
|
-
await Promise.all(this.saveables.map(saveable => saveable.save(options)));
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
async revert(options?: Saveable.RevertOptions): Promise<void> {
|
|
139
|
-
await Promise.all(this.saveables.map(saveable => saveable.revert?.(options)));
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
get saveables(): readonly Saveable[] {
|
|
143
|
-
return Array.from(this.saveablesMap.keys());
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
add(saveable: Saveable): void {
|
|
147
|
-
if (this.saveablesMap.has(saveable)) {
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
const toDispose = new DisposableCollection();
|
|
151
|
-
this.toDispose.push(toDispose);
|
|
152
|
-
this.saveablesMap.set(saveable, toDispose);
|
|
153
|
-
toDispose.push(Disposable.create(() => {
|
|
154
|
-
this.saveablesMap.delete(saveable);
|
|
155
|
-
}));
|
|
156
|
-
toDispose.push(saveable.onDirtyChanged(() => {
|
|
157
|
-
const wasDirty = this.isDirty;
|
|
158
|
-
this.isDirty = this.saveables.some(s => s.dirty);
|
|
159
|
-
if (this.isDirty !== wasDirty) {
|
|
160
|
-
this.onDirtyChangedEmitter.fire();
|
|
161
|
-
}
|
|
162
|
-
}));
|
|
163
|
-
toDispose.push(saveable.onContentChanged(() => {
|
|
164
|
-
this.onContentChangedEmitter.fire();
|
|
165
|
-
}));
|
|
166
|
-
if (saveable.dirty && !this.isDirty) {
|
|
167
|
-
this.isDirty = true;
|
|
168
|
-
this.onDirtyChangedEmitter.fire();
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
remove(saveable: Saveable): boolean {
|
|
173
|
-
const toDispose = this.saveablesMap.get(saveable);
|
|
174
|
-
toDispose?.dispose();
|
|
175
|
-
return !!toDispose;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
dispose(): void {
|
|
179
|
-
this.toDispose.dispose();
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
export namespace Saveable {
|
|
184
|
-
export interface RevertOptions {
|
|
185
|
-
/**
|
|
186
|
-
* If soft then only dirty flag should be updated, otherwise
|
|
187
|
-
* the underlying data should be reverted as well.
|
|
188
|
-
*/
|
|
189
|
-
soft?: boolean
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* A snapshot of a saveable item.
|
|
194
|
-
* Applying a snapshot of a saveable on another (of the same type) using the `applySnapshot` should yield the state of the original saveable.
|
|
195
|
-
*/
|
|
196
|
-
export type Snapshot = { value: string } | { read(): string | null };
|
|
197
|
-
export namespace Snapshot {
|
|
198
|
-
export function read(snapshot: Snapshot): string | undefined {
|
|
199
|
-
return 'value' in snapshot ? snapshot.value : (snapshot.read() ?? undefined);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
export function isSource(arg: unknown): arg is SaveableSource {
|
|
203
|
-
return isObject<SaveableSource>(arg) && is(arg.saveable);
|
|
204
|
-
}
|
|
205
|
-
export function is(arg: unknown): arg is Saveable {
|
|
206
|
-
return isObject(arg) && 'dirty' in arg && 'onDirtyChanged' in arg;
|
|
207
|
-
}
|
|
208
|
-
export function get(arg: unknown): Saveable | undefined {
|
|
209
|
-
if (is(arg)) {
|
|
210
|
-
return arg;
|
|
211
|
-
}
|
|
212
|
-
if (isSource(arg)) {
|
|
213
|
-
return arg.saveable;
|
|
214
|
-
}
|
|
215
|
-
return undefined;
|
|
216
|
-
}
|
|
217
|
-
export function getDirty(arg: unknown): Saveable | undefined {
|
|
218
|
-
const saveable = get(arg);
|
|
219
|
-
if (saveable && saveable.dirty) {
|
|
220
|
-
return saveable;
|
|
221
|
-
}
|
|
222
|
-
return undefined;
|
|
223
|
-
}
|
|
224
|
-
export function isDirty(arg: unknown): boolean {
|
|
225
|
-
return !!getDirty(arg);
|
|
226
|
-
}
|
|
227
|
-
export async function save(arg: unknown, options?: SaveOptions): Promise<void> {
|
|
228
|
-
const saveable = get(arg);
|
|
229
|
-
if (saveable) {
|
|
230
|
-
await saveable.save(options);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
export async function confirmSaveBeforeClose(toClose: Iterable<Widget>, others: Widget[]): Promise<boolean | undefined> {
|
|
235
|
-
for (const widget of toClose) {
|
|
236
|
-
const saveable = Saveable.get(widget);
|
|
237
|
-
if (saveable?.dirty) {
|
|
238
|
-
if (!closingWidgetWouldLoseSaveable(widget, others)) {
|
|
239
|
-
continue;
|
|
240
|
-
}
|
|
241
|
-
const userWantsToSave = await new ShouldSaveDialog(widget).open();
|
|
242
|
-
if (userWantsToSave === undefined) { // User clicked cancel.
|
|
243
|
-
return undefined;
|
|
244
|
-
} else if (userWantsToSave) {
|
|
245
|
-
await saveable.save();
|
|
246
|
-
} else {
|
|
247
|
-
await saveable.revert?.();
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
return true;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
export function closingWidgetWouldLoseSaveable(widget: Widget, others: Widget[]): boolean {
|
|
255
|
-
const saveable = Saveable.get(widget);
|
|
256
|
-
return !!saveable && !others.some(otherWidget => otherWidget !== widget && Saveable.get(otherWidget) === saveable);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
export interface SaveableWidget extends Widget {
|
|
261
|
-
/**
|
|
262
|
-
* @param doRevert whether the saveable should be reverted before being saved. Defaults to `true`.
|
|
263
|
-
*/
|
|
264
|
-
closeWithoutSaving(doRevert?: boolean): Promise<void>;
|
|
265
|
-
closeWithSaving(options?: SaveableWidget.CloseOptions): Promise<void>;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
export const close = Symbol('close');
|
|
269
|
-
/**
|
|
270
|
-
* An interface describing saveable widgets that are created by the `Saveable.apply` function.
|
|
271
|
-
* The original `close` function is reassigned to a locally-defined `Symbol`
|
|
272
|
-
*/
|
|
273
|
-
export interface PostCreationSaveableWidget extends SaveableWidget {
|
|
274
|
-
/**
|
|
275
|
-
* The original `close` function of the widget
|
|
276
|
-
*/
|
|
277
|
-
[close](): void;
|
|
278
|
-
}
|
|
279
|
-
export namespace SaveableWidget {
|
|
280
|
-
export function is(widget: Widget | undefined): widget is SaveableWidget {
|
|
281
|
-
return !!widget && 'closeWithoutSaving' in widget;
|
|
282
|
-
}
|
|
283
|
-
export function getDirty<T extends Widget>(widgets: Iterable<T>): IterableIterator<SaveableWidget & T> {
|
|
284
|
-
return get<T>(widgets, Saveable.isDirty);
|
|
285
|
-
}
|
|
286
|
-
export function* get<T extends Widget>(
|
|
287
|
-
widgets: Iterable<T>,
|
|
288
|
-
filter: (widget: T) => boolean = () => true
|
|
289
|
-
): IterableIterator<SaveableWidget & T> {
|
|
290
|
-
for (const widget of widgets) {
|
|
291
|
-
if (SaveableWidget.is(widget) && filter(widget)) {
|
|
292
|
-
yield widget;
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
export interface CloseOptions {
|
|
297
|
-
shouldSave?(): MaybePromise<boolean | undefined>
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
/**
|
|
302
|
-
* Possible formatting types when saving.
|
|
303
|
-
*/
|
|
304
|
-
export const enum FormatType {
|
|
305
|
-
/**
|
|
306
|
-
* Formatting should occur (default).
|
|
307
|
-
*/
|
|
308
|
-
ON = 1,
|
|
309
|
-
/**
|
|
310
|
-
* Formatting should not occur.
|
|
311
|
-
*/
|
|
312
|
-
OFF,
|
|
313
|
-
/**
|
|
314
|
-
* Formatting should only occur if the resource is dirty.
|
|
315
|
-
*/
|
|
316
|
-
DIRTY
|
|
317
|
-
};
|
|
318
|
-
|
|
319
|
-
export enum SaveReason {
|
|
320
|
-
Manual = 1,
|
|
321
|
-
AfterDelay = 2,
|
|
322
|
-
FocusChange = 3
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
export namespace SaveReason {
|
|
326
|
-
export function isManual(reason?: number): reason is typeof SaveReason.Manual {
|
|
327
|
-
return reason === SaveReason.Manual;
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
export interface SaveOptions {
|
|
332
|
-
/**
|
|
333
|
-
* Formatting type to apply when saving.
|
|
334
|
-
*/
|
|
335
|
-
readonly formatType?: FormatType;
|
|
336
|
-
/**
|
|
337
|
-
* The reason for saving the resource.
|
|
338
|
-
*/
|
|
339
|
-
readonly saveReason?: SaveReason;
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
/**
|
|
343
|
-
* The class name added to the dirty widget's title.
|
|
344
|
-
*/
|
|
345
|
-
const DIRTY_CLASS = 'theia-mod-dirty';
|
|
346
|
-
export function setDirty(widget: Widget, dirty: boolean): void {
|
|
347
|
-
const dirtyClass = ` ${DIRTY_CLASS}`;
|
|
348
|
-
widget.title.className = widget.title.className.replace(dirtyClass, '');
|
|
349
|
-
if (dirty) {
|
|
350
|
-
widget.title.className += dirtyClass;
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
export class ShouldSaveDialog extends AbstractDialog<boolean> {
|
|
355
|
-
|
|
356
|
-
protected shouldSave = true;
|
|
357
|
-
|
|
358
|
-
protected readonly dontSaveButton: HTMLButtonElement;
|
|
359
|
-
|
|
360
|
-
constructor(widget: Widget) {
|
|
361
|
-
super({
|
|
362
|
-
title: nls.localizeByDefault('Do you want to save the changes you made to {0}?', widget.title.label || widget.title.caption)
|
|
363
|
-
}, {
|
|
364
|
-
node: widget.node.ownerDocument.createElement('div')
|
|
365
|
-
});
|
|
366
|
-
|
|
367
|
-
const messageNode = this.node.ownerDocument.createElement('div');
|
|
368
|
-
messageNode.textContent = nls.localizeByDefault("Your changes will be lost if you don't save them.");
|
|
369
|
-
messageNode.setAttribute('style', 'flex: 1 100%; padding-bottom: calc(var(--theia-ui-padding)*3);');
|
|
370
|
-
this.contentNode.appendChild(messageNode);
|
|
371
|
-
this.appendCloseButton();
|
|
372
|
-
this.dontSaveButton = this.appendDontSaveButton();
|
|
373
|
-
this.appendAcceptButton(nls.localizeByDefault('Save'));
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
protected appendDontSaveButton(): HTMLButtonElement {
|
|
377
|
-
const button = this.createButton(nls.localizeByDefault("Don't Save"));
|
|
378
|
-
this.controlPanel.appendChild(button);
|
|
379
|
-
button.classList.add('secondary');
|
|
380
|
-
return button;
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
protected override onAfterAttach(msg: Message): void {
|
|
384
|
-
super.onAfterAttach(msg);
|
|
385
|
-
this.addKeyListener(this.dontSaveButton, Key.ENTER, () => {
|
|
386
|
-
this.shouldSave = false;
|
|
387
|
-
this.accept();
|
|
388
|
-
}, 'click');
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
get value(): boolean {
|
|
392
|
-
return this.shouldSave;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
}
|
|
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 { Widget } from '@phosphor/widgets';
|
|
18
|
+
import { Message } from '@phosphor/messaging';
|
|
19
|
+
import { Emitter, Event } from '../common/event';
|
|
20
|
+
import { MaybePromise } from '../common/types';
|
|
21
|
+
import { Key } from './keyboard/keys';
|
|
22
|
+
import { AbstractDialog } from './dialogs';
|
|
23
|
+
import { nls } from '../common/nls';
|
|
24
|
+
import { Disposable, DisposableCollection, isObject } from '../common';
|
|
25
|
+
import { BinaryBuffer } from '../common/buffer';
|
|
26
|
+
|
|
27
|
+
export type AutoSaveMode = 'off' | 'afterDelay' | 'onFocusChange' | 'onWindowChange';
|
|
28
|
+
|
|
29
|
+
export interface Saveable {
|
|
30
|
+
readonly dirty: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* This event is fired when the content of the `dirty` variable changes.
|
|
33
|
+
*/
|
|
34
|
+
readonly onDirtyChanged: Event<void>;
|
|
35
|
+
/**
|
|
36
|
+
* This event is fired when the content of the saveable changes.
|
|
37
|
+
* While `onDirtyChanged` is fired to notify the UI that the widget is dirty,
|
|
38
|
+
* `onContentChanged` is used for the auto save throttling.
|
|
39
|
+
*/
|
|
40
|
+
readonly onContentChanged: Event<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Saves dirty changes.
|
|
43
|
+
*/
|
|
44
|
+
save(options?: SaveOptions): MaybePromise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Reverts dirty changes.
|
|
47
|
+
*/
|
|
48
|
+
revert?(options?: Saveable.RevertOptions): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Creates a snapshot of the dirty state. See also {@link Saveable.Snapshot}.
|
|
51
|
+
*/
|
|
52
|
+
createSnapshot?(): Saveable.Snapshot;
|
|
53
|
+
/**
|
|
54
|
+
* Applies the given snapshot to the dirty state.
|
|
55
|
+
*/
|
|
56
|
+
applySnapshot?(snapshot: object): void;
|
|
57
|
+
/**
|
|
58
|
+
* Serializes the full state of the saveable item to a binary buffer.
|
|
59
|
+
*/
|
|
60
|
+
serialize?(): Promise<BinaryBuffer>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface SaveableSource {
|
|
64
|
+
readonly saveable: Saveable;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export class DelegatingSaveable implements Saveable {
|
|
68
|
+
dirty = false;
|
|
69
|
+
protected readonly onDirtyChangedEmitter = new Emitter<void>();
|
|
70
|
+
protected readonly onContentChangedEmitter = new Emitter<void>();
|
|
71
|
+
|
|
72
|
+
get onDirtyChanged(): Event<void> {
|
|
73
|
+
return this.onDirtyChangedEmitter.event;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
get onContentChanged(): Event<void> {
|
|
77
|
+
return this.onContentChangedEmitter.event;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async save(options?: SaveOptions): Promise<void> {
|
|
81
|
+
await this._delegate?.save(options);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
revert?(options?: Saveable.RevertOptions): Promise<void>;
|
|
85
|
+
createSnapshot?(): Saveable.Snapshot;
|
|
86
|
+
applySnapshot?(snapshot: object): void;
|
|
87
|
+
serialize?(): Promise<BinaryBuffer>;
|
|
88
|
+
|
|
89
|
+
protected _delegate?: Saveable;
|
|
90
|
+
protected toDispose = new DisposableCollection();
|
|
91
|
+
|
|
92
|
+
set delegate(delegate: Saveable) {
|
|
93
|
+
this.toDispose.dispose();
|
|
94
|
+
this.toDispose = new DisposableCollection();
|
|
95
|
+
this._delegate = delegate;
|
|
96
|
+
this.toDispose.push(delegate.onDirtyChanged(() => {
|
|
97
|
+
this.dirty = delegate.dirty;
|
|
98
|
+
this.onDirtyChangedEmitter.fire();
|
|
99
|
+
}));
|
|
100
|
+
this.toDispose.push(delegate.onContentChanged(() => {
|
|
101
|
+
this.onContentChangedEmitter.fire();
|
|
102
|
+
}));
|
|
103
|
+
if (this.dirty !== delegate.dirty) {
|
|
104
|
+
this.dirty = delegate.dirty;
|
|
105
|
+
this.onDirtyChangedEmitter.fire();
|
|
106
|
+
}
|
|
107
|
+
this.revert = delegate.revert?.bind(delegate);
|
|
108
|
+
this.createSnapshot = delegate.createSnapshot?.bind(delegate);
|
|
109
|
+
this.applySnapshot = delegate.applySnapshot?.bind(delegate);
|
|
110
|
+
this.serialize = delegate.serialize?.bind(delegate);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export class CompositeSaveable implements Saveable {
|
|
116
|
+
protected isDirty = false;
|
|
117
|
+
protected readonly onDirtyChangedEmitter = new Emitter<void>();
|
|
118
|
+
protected readonly onContentChangedEmitter = new Emitter<void>();
|
|
119
|
+
protected readonly toDispose = new DisposableCollection(this.onDirtyChangedEmitter, this.onContentChangedEmitter);
|
|
120
|
+
protected readonly saveablesMap = new Map<Saveable, Disposable>();
|
|
121
|
+
|
|
122
|
+
get dirty(): boolean {
|
|
123
|
+
return this.isDirty;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
get onDirtyChanged(): Event<void> {
|
|
127
|
+
return this.onDirtyChangedEmitter.event;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
get onContentChanged(): Event<void> {
|
|
131
|
+
return this.onContentChangedEmitter.event;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async save(options?: SaveOptions): Promise<void> {
|
|
135
|
+
await Promise.all(this.saveables.map(saveable => saveable.save(options)));
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async revert(options?: Saveable.RevertOptions): Promise<void> {
|
|
139
|
+
await Promise.all(this.saveables.map(saveable => saveable.revert?.(options)));
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
get saveables(): readonly Saveable[] {
|
|
143
|
+
return Array.from(this.saveablesMap.keys());
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
add(saveable: Saveable): void {
|
|
147
|
+
if (this.saveablesMap.has(saveable)) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const toDispose = new DisposableCollection();
|
|
151
|
+
this.toDispose.push(toDispose);
|
|
152
|
+
this.saveablesMap.set(saveable, toDispose);
|
|
153
|
+
toDispose.push(Disposable.create(() => {
|
|
154
|
+
this.saveablesMap.delete(saveable);
|
|
155
|
+
}));
|
|
156
|
+
toDispose.push(saveable.onDirtyChanged(() => {
|
|
157
|
+
const wasDirty = this.isDirty;
|
|
158
|
+
this.isDirty = this.saveables.some(s => s.dirty);
|
|
159
|
+
if (this.isDirty !== wasDirty) {
|
|
160
|
+
this.onDirtyChangedEmitter.fire();
|
|
161
|
+
}
|
|
162
|
+
}));
|
|
163
|
+
toDispose.push(saveable.onContentChanged(() => {
|
|
164
|
+
this.onContentChangedEmitter.fire();
|
|
165
|
+
}));
|
|
166
|
+
if (saveable.dirty && !this.isDirty) {
|
|
167
|
+
this.isDirty = true;
|
|
168
|
+
this.onDirtyChangedEmitter.fire();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
remove(saveable: Saveable): boolean {
|
|
173
|
+
const toDispose = this.saveablesMap.get(saveable);
|
|
174
|
+
toDispose?.dispose();
|
|
175
|
+
return !!toDispose;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
dispose(): void {
|
|
179
|
+
this.toDispose.dispose();
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export namespace Saveable {
|
|
184
|
+
export interface RevertOptions {
|
|
185
|
+
/**
|
|
186
|
+
* If soft then only dirty flag should be updated, otherwise
|
|
187
|
+
* the underlying data should be reverted as well.
|
|
188
|
+
*/
|
|
189
|
+
soft?: boolean
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* A snapshot of a saveable item.
|
|
194
|
+
* Applying a snapshot of a saveable on another (of the same type) using the `applySnapshot` should yield the state of the original saveable.
|
|
195
|
+
*/
|
|
196
|
+
export type Snapshot = { value: string } | { read(): string | null };
|
|
197
|
+
export namespace Snapshot {
|
|
198
|
+
export function read(snapshot: Snapshot): string | undefined {
|
|
199
|
+
return 'value' in snapshot ? snapshot.value : (snapshot.read() ?? undefined);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
export function isSource(arg: unknown): arg is SaveableSource {
|
|
203
|
+
return isObject<SaveableSource>(arg) && is(arg.saveable);
|
|
204
|
+
}
|
|
205
|
+
export function is(arg: unknown): arg is Saveable {
|
|
206
|
+
return isObject(arg) && 'dirty' in arg && 'onDirtyChanged' in arg;
|
|
207
|
+
}
|
|
208
|
+
export function get(arg: unknown): Saveable | undefined {
|
|
209
|
+
if (is(arg)) {
|
|
210
|
+
return arg;
|
|
211
|
+
}
|
|
212
|
+
if (isSource(arg)) {
|
|
213
|
+
return arg.saveable;
|
|
214
|
+
}
|
|
215
|
+
return undefined;
|
|
216
|
+
}
|
|
217
|
+
export function getDirty(arg: unknown): Saveable | undefined {
|
|
218
|
+
const saveable = get(arg);
|
|
219
|
+
if (saveable && saveable.dirty) {
|
|
220
|
+
return saveable;
|
|
221
|
+
}
|
|
222
|
+
return undefined;
|
|
223
|
+
}
|
|
224
|
+
export function isDirty(arg: unknown): boolean {
|
|
225
|
+
return !!getDirty(arg);
|
|
226
|
+
}
|
|
227
|
+
export async function save(arg: unknown, options?: SaveOptions): Promise<void> {
|
|
228
|
+
const saveable = get(arg);
|
|
229
|
+
if (saveable) {
|
|
230
|
+
await saveable.save(options);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export async function confirmSaveBeforeClose(toClose: Iterable<Widget>, others: Widget[]): Promise<boolean | undefined> {
|
|
235
|
+
for (const widget of toClose) {
|
|
236
|
+
const saveable = Saveable.get(widget);
|
|
237
|
+
if (saveable?.dirty) {
|
|
238
|
+
if (!closingWidgetWouldLoseSaveable(widget, others)) {
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
const userWantsToSave = await new ShouldSaveDialog(widget).open();
|
|
242
|
+
if (userWantsToSave === undefined) { // User clicked cancel.
|
|
243
|
+
return undefined;
|
|
244
|
+
} else if (userWantsToSave) {
|
|
245
|
+
await saveable.save();
|
|
246
|
+
} else {
|
|
247
|
+
await saveable.revert?.();
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
export function closingWidgetWouldLoseSaveable(widget: Widget, others: Widget[]): boolean {
|
|
255
|
+
const saveable = Saveable.get(widget);
|
|
256
|
+
return !!saveable && !others.some(otherWidget => otherWidget !== widget && Saveable.get(otherWidget) === saveable);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
export interface SaveableWidget extends Widget {
|
|
261
|
+
/**
|
|
262
|
+
* @param doRevert whether the saveable should be reverted before being saved. Defaults to `true`.
|
|
263
|
+
*/
|
|
264
|
+
closeWithoutSaving(doRevert?: boolean): Promise<void>;
|
|
265
|
+
closeWithSaving(options?: SaveableWidget.CloseOptions): Promise<void>;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
export const close = Symbol('close');
|
|
269
|
+
/**
|
|
270
|
+
* An interface describing saveable widgets that are created by the `Saveable.apply` function.
|
|
271
|
+
* The original `close` function is reassigned to a locally-defined `Symbol`
|
|
272
|
+
*/
|
|
273
|
+
export interface PostCreationSaveableWidget extends SaveableWidget {
|
|
274
|
+
/**
|
|
275
|
+
* The original `close` function of the widget
|
|
276
|
+
*/
|
|
277
|
+
[close](): void;
|
|
278
|
+
}
|
|
279
|
+
export namespace SaveableWidget {
|
|
280
|
+
export function is(widget: Widget | undefined): widget is SaveableWidget {
|
|
281
|
+
return !!widget && 'closeWithoutSaving' in widget;
|
|
282
|
+
}
|
|
283
|
+
export function getDirty<T extends Widget>(widgets: Iterable<T>): IterableIterator<SaveableWidget & T> {
|
|
284
|
+
return get<T>(widgets, Saveable.isDirty);
|
|
285
|
+
}
|
|
286
|
+
export function* get<T extends Widget>(
|
|
287
|
+
widgets: Iterable<T>,
|
|
288
|
+
filter: (widget: T) => boolean = () => true
|
|
289
|
+
): IterableIterator<SaveableWidget & T> {
|
|
290
|
+
for (const widget of widgets) {
|
|
291
|
+
if (SaveableWidget.is(widget) && filter(widget)) {
|
|
292
|
+
yield widget;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
export interface CloseOptions {
|
|
297
|
+
shouldSave?(): MaybePromise<boolean | undefined>
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Possible formatting types when saving.
|
|
303
|
+
*/
|
|
304
|
+
export const enum FormatType {
|
|
305
|
+
/**
|
|
306
|
+
* Formatting should occur (default).
|
|
307
|
+
*/
|
|
308
|
+
ON = 1,
|
|
309
|
+
/**
|
|
310
|
+
* Formatting should not occur.
|
|
311
|
+
*/
|
|
312
|
+
OFF,
|
|
313
|
+
/**
|
|
314
|
+
* Formatting should only occur if the resource is dirty.
|
|
315
|
+
*/
|
|
316
|
+
DIRTY
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
export enum SaveReason {
|
|
320
|
+
Manual = 1,
|
|
321
|
+
AfterDelay = 2,
|
|
322
|
+
FocusChange = 3
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
export namespace SaveReason {
|
|
326
|
+
export function isManual(reason?: number): reason is typeof SaveReason.Manual {
|
|
327
|
+
return reason === SaveReason.Manual;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export interface SaveOptions {
|
|
332
|
+
/**
|
|
333
|
+
* Formatting type to apply when saving.
|
|
334
|
+
*/
|
|
335
|
+
readonly formatType?: FormatType;
|
|
336
|
+
/**
|
|
337
|
+
* The reason for saving the resource.
|
|
338
|
+
*/
|
|
339
|
+
readonly saveReason?: SaveReason;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* The class name added to the dirty widget's title.
|
|
344
|
+
*/
|
|
345
|
+
const DIRTY_CLASS = 'theia-mod-dirty';
|
|
346
|
+
export function setDirty(widget: Widget, dirty: boolean): void {
|
|
347
|
+
const dirtyClass = ` ${DIRTY_CLASS}`;
|
|
348
|
+
widget.title.className = widget.title.className.replace(dirtyClass, '');
|
|
349
|
+
if (dirty) {
|
|
350
|
+
widget.title.className += dirtyClass;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
export class ShouldSaveDialog extends AbstractDialog<boolean> {
|
|
355
|
+
|
|
356
|
+
protected shouldSave = true;
|
|
357
|
+
|
|
358
|
+
protected readonly dontSaveButton: HTMLButtonElement;
|
|
359
|
+
|
|
360
|
+
constructor(widget: Widget) {
|
|
361
|
+
super({
|
|
362
|
+
title: nls.localizeByDefault('Do you want to save the changes you made to {0}?', widget.title.label || widget.title.caption)
|
|
363
|
+
}, {
|
|
364
|
+
node: widget.node.ownerDocument.createElement('div')
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
const messageNode = this.node.ownerDocument.createElement('div');
|
|
368
|
+
messageNode.textContent = nls.localizeByDefault("Your changes will be lost if you don't save them.");
|
|
369
|
+
messageNode.setAttribute('style', 'flex: 1 100%; padding-bottom: calc(var(--theia-ui-padding)*3);');
|
|
370
|
+
this.contentNode.appendChild(messageNode);
|
|
371
|
+
this.appendCloseButton();
|
|
372
|
+
this.dontSaveButton = this.appendDontSaveButton();
|
|
373
|
+
this.appendAcceptButton(nls.localizeByDefault('Save'));
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
protected appendDontSaveButton(): HTMLButtonElement {
|
|
377
|
+
const button = this.createButton(nls.localizeByDefault("Don't Save"));
|
|
378
|
+
this.controlPanel.appendChild(button);
|
|
379
|
+
button.classList.add('secondary');
|
|
380
|
+
return button;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
protected override onAfterAttach(msg: Message): void {
|
|
384
|
+
super.onAfterAttach(msg);
|
|
385
|
+
this.addKeyListener(this.dontSaveButton, Key.ENTER, () => {
|
|
386
|
+
this.shouldSave = false;
|
|
387
|
+
this.accept();
|
|
388
|
+
}, 'click');
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
get value(): boolean {
|
|
392
|
+
return this.shouldSave;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
}
|