@theia/plugin-ext 1.53.0-next.4 → 1.53.0-next.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -54
- package/lib/common/plugin-api-rpc.d.ts +19 -4
- package/lib/common/plugin-api-rpc.d.ts.map +1 -1
- package/lib/common/plugin-api-rpc.js +4 -2
- package/lib/common/plugin-api-rpc.js.map +1 -1
- package/lib/common/rpc-protocol.d.ts +14 -13
- package/lib/common/rpc-protocol.d.ts.map +1 -1
- package/lib/common/rpc-protocol.js +56 -53
- package/lib/common/rpc-protocol.js.map +1 -1
- package/lib/hosted/browser/hosted-plugin.d.ts +1 -0
- package/lib/hosted/browser/hosted-plugin.d.ts.map +1 -1
- package/lib/hosted/browser/hosted-plugin.js +22 -12
- package/lib/hosted/browser/hosted-plugin.js.map +1 -1
- package/lib/hosted/node/scanners/scanner-theia.d.ts.map +1 -1
- package/lib/hosted/node/scanners/scanner-theia.js +13 -1
- package/lib/hosted/node/scanners/scanner-theia.js.map +1 -1
- package/lib/main/browser/authentication-main.d.ts +6 -5
- package/lib/main/browser/authentication-main.d.ts.map +1 -1
- package/lib/main/browser/authentication-main.js +15 -9
- package/lib/main/browser/authentication-main.js.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-opener.d.ts +9 -3
- package/lib/main/browser/custom-editors/custom-editor-opener.d.ts.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-opener.js +120 -31
- package/lib/main/browser/custom-editors/custom-editor-opener.js.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-widget.d.ts +7 -4
- package/lib/main/browser/custom-editors/custom-editor-widget.d.ts.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-widget.js +21 -7
- package/lib/main/browser/custom-editors/custom-editor-widget.js.map +1 -1
- package/lib/main/browser/custom-editors/custom-editors-main.d.ts +3 -4
- package/lib/main/browser/custom-editors/custom-editors-main.d.ts.map +1 -1
- package/lib/main/browser/custom-editors/custom-editors-main.js +5 -55
- package/lib/main/browser/custom-editors/custom-editors-main.js.map +1 -1
- package/lib/main/browser/custom-editors/plugin-custom-editor-registry.d.ts +4 -3
- package/lib/main/browser/custom-editors/plugin-custom-editor-registry.d.ts.map +1 -1
- package/lib/main/browser/custom-editors/plugin-custom-editor-registry.js +24 -16
- package/lib/main/browser/custom-editors/plugin-custom-editor-registry.js.map +1 -1
- package/lib/main/browser/main-context.d.ts.map +1 -1
- package/lib/main/browser/main-context.js +3 -0
- package/lib/main/browser/main-context.js.map +1 -1
- package/lib/main/browser/menus/menus-contribution-handler.d.ts.map +1 -1
- package/lib/main/browser/menus/menus-contribution-handler.js +1 -1
- package/lib/main/browser/menus/menus-contribution-handler.js.map +1 -1
- package/lib/main/browser/menus/plugin-menu-command-adapter.d.ts +1 -0
- package/lib/main/browser/menus/plugin-menu-command-adapter.d.ts.map +1 -1
- package/lib/main/browser/menus/plugin-menu-command-adapter.js +22 -1
- package/lib/main/browser/menus/plugin-menu-command-adapter.js.map +1 -1
- package/lib/main/browser/menus/vscode-theia-menu-mappings.d.ts +2 -2
- package/lib/main/browser/menus/vscode-theia-menu-mappings.d.ts.map +1 -1
- package/lib/main/browser/menus/vscode-theia-menu-mappings.js +2 -0
- package/lib/main/browser/menus/vscode-theia-menu-mappings.js.map +1 -1
- package/lib/main/browser/notebooks/notebook-documents-and-editors-main.js +1 -1
- package/lib/main/browser/notebooks/notebook-documents-and-editors-main.js.map +1 -1
- package/lib/main/browser/notebooks/notebook-documents-main.d.ts.map +1 -1
- package/lib/main/browser/notebooks/notebook-documents-main.js +22 -3
- package/lib/main/browser/notebooks/notebook-documents-main.js.map +1 -1
- package/lib/main/browser/notebooks/notebook-editors-main.d.ts +1 -1
- package/lib/main/browser/notebooks/notebook-editors-main.d.ts.map +1 -1
- package/lib/main/browser/notebooks/notebook-editors-main.js +16 -2
- package/lib/main/browser/notebooks/notebook-editors-main.js.map +1 -1
- package/lib/main/browser/notebooks/renderers/cell-output-webview.d.ts +1 -1
- package/lib/main/browser/notebooks/renderers/cell-output-webview.d.ts.map +1 -1
- package/lib/main/browser/notebooks/renderers/cell-output-webview.js +152 -77
- package/lib/main/browser/notebooks/renderers/cell-output-webview.js.map +1 -1
- package/lib/main/browser/notebooks/renderers/output-webview-internal.d.ts.map +1 -1
- package/lib/main/browser/notebooks/renderers/output-webview-internal.js +38 -19
- package/lib/main/browser/notebooks/renderers/output-webview-internal.js.map +1 -1
- package/lib/main/browser/plugin-ext-frontend-module.d.ts.map +1 -1
- package/lib/main/browser/plugin-ext-frontend-module.js +18 -0
- package/lib/main/browser/plugin-ext-frontend-module.js.map +1 -1
- package/lib/main/browser/plugin-icon-theme-service.js +20 -20
- package/lib/main/browser/plugin-shared-style.js +14 -14
- package/lib/main/browser/uri-main.d.ts +16 -0
- package/lib/main/browser/uri-main.d.ts.map +1 -0
- package/lib/main/browser/uri-main.js +64 -0
- package/lib/main/browser/uri-main.js.map +1 -0
- package/lib/main/browser/view/plugin-view-registry.js +3 -3
- package/lib/main/browser/webview/webview-frontend-security-warnings.js +2 -2
- package/lib/main/browser/webview/webview-secondary-window-support.js +10 -10
- package/lib/main/browser/webview/webview.d.ts +1 -3
- package/lib/main/browser/webview/webview.d.ts.map +1 -1
- package/lib/main/browser/webview/webview.js +5 -4
- package/lib/main/browser/webview/webview.js.map +1 -1
- package/lib/main/browser/webviews-main.d.ts.map +1 -1
- package/lib/main/browser/webviews-main.js +6 -1
- package/lib/main/browser/webviews-main.js.map +1 -1
- package/lib/main/browser/workspace-main.d.ts +2 -0
- package/lib/main/browser/workspace-main.d.ts.map +1 -1
- package/lib/main/node/plugin-service.d.ts +1 -1
- package/lib/main/node/webview-backend-security-warnings.js +6 -6
- package/lib/plugin/authentication-ext.d.ts +3 -2
- package/lib/plugin/authentication-ext.d.ts.map +1 -1
- package/lib/plugin/authentication-ext.js +8 -5
- package/lib/plugin/authentication-ext.js.map +1 -1
- package/lib/plugin/custom-editors.d.ts +2 -4
- package/lib/plugin/custom-editors.d.ts.map +1 -1
- package/lib/plugin/custom-editors.js +5 -7
- package/lib/plugin/custom-editors.js.map +1 -1
- package/lib/plugin/env.d.ts +2 -0
- package/lib/plugin/env.d.ts.map +1 -1
- package/lib/plugin/env.js +4 -1
- package/lib/plugin/env.js.map +1 -1
- package/lib/plugin/known-commands.d.ts.map +1 -1
- package/lib/plugin/known-commands.js +1 -0
- package/lib/plugin/known-commands.js.map +1 -1
- package/lib/plugin/languages.d.ts +1 -0
- package/lib/plugin/languages.d.ts.map +1 -1
- package/lib/plugin/notebook/notebook-kernels.d.ts +2 -0
- package/lib/plugin/notebook/notebook-kernels.d.ts.map +1 -1
- package/lib/plugin/plugin-context.d.ts.map +1 -1
- package/lib/plugin/plugin-context.js +17 -6
- package/lib/plugin/plugin-context.js.map +1 -1
- package/lib/plugin/plugin-manager.d.ts.map +1 -1
- package/lib/plugin/plugin-manager.js +2 -1
- package/lib/plugin/plugin-manager.js.map +1 -1
- package/lib/plugin/scm.d.ts +1 -0
- package/lib/plugin/scm.d.ts.map +1 -1
- package/lib/plugin/terminal-ext.d.ts +3 -0
- package/lib/plugin/terminal-ext.d.ts.map +1 -1
- package/lib/plugin/terminal-ext.js +2 -0
- package/lib/plugin/terminal-ext.js.map +1 -1
- package/lib/plugin/type-converters.d.ts +6 -0
- package/lib/plugin/type-converters.d.ts.map +1 -1
- package/lib/plugin/type-converters.js +24 -3
- package/lib/plugin/type-converters.js.map +1 -1
- package/lib/plugin/types-impl.d.ts +8 -2
- package/lib/plugin/types-impl.d.ts.map +1 -1
- package/lib/plugin/types-impl.js +9 -1
- package/lib/plugin/types-impl.js.map +1 -1
- package/lib/plugin/uri-ext.d.ts +37 -0
- package/lib/plugin/uri-ext.d.ts.map +1 -0
- package/lib/plugin/uri-ext.js +50 -0
- package/lib/plugin/uri-ext.js.map +1 -0
- package/lib/plugin/webviews.js +1 -1
- package/lib/plugin/webviews.js.map +1 -1
- package/lib/plugin/workspace.d.ts +4 -0
- package/lib/plugin/workspace.d.ts.map +1 -1
- package/package.json +29 -29
- package/src/common/arrays.ts +70 -70
- package/src/common/assert.ts +23 -23
- package/src/common/cache.ts +51 -51
- package/src/common/character-classifier.ts +73 -73
- package/src/common/collections.ts +54 -54
- package/src/common/commands.ts +19 -19
- package/src/common/connection.ts +137 -137
- package/src/common/disposable-util.ts +39 -39
- package/src/common/editor-options.ts +74 -74
- package/src/common/env.ts +19 -19
- package/src/common/errors.ts +63 -63
- package/src/common/id-generator.ts +26 -26
- package/src/common/index.ts +24 -24
- package/src/common/language-pack-service.ts +34 -34
- package/src/common/link-computer.ts +354 -354
- package/src/common/object-identifier.ts +33 -33
- package/src/common/objects.ts +50 -50
- package/src/common/paths-util.ts +158 -158
- package/src/common/plugin-api-rpc-model.ts +907 -907
- package/src/common/plugin-api-rpc.ts +2752 -2738
- package/src/common/plugin-ext-api-contribution.ts +115 -115
- package/src/common/plugin-identifiers.ts +84 -84
- package/src/common/plugin-protocol.ts +1094 -1094
- package/src/common/reference-map.ts +38 -38
- package/src/common/rpc-protocol.ts +306 -310
- package/src/common/semantic-tokens-dto.ts +182 -182
- package/src/common/test-types.ts +154 -154
- package/src/common/types.ts +129 -129
- package/src/common/uint.ts +37 -37
- package/src/common/uri-components.ts +81 -81
- package/src/hosted/browser/hosted-plugin-watcher.ts +54 -54
- package/src/hosted/browser/hosted-plugin.ts +635 -624
- package/src/hosted/browser/plugin-worker.ts +52 -52
- package/src/hosted/browser/worker/debug-stub.ts +29 -29
- package/src/hosted/browser/worker/plugin-manifest-loader.ts +114 -114
- package/src/hosted/browser/worker/worker-env-ext.ts +40 -40
- package/src/hosted/browser/worker/worker-main.ts +212 -212
- package/src/hosted/browser/worker/worker-plugin-module.ts +80 -80
- package/src/hosted/common/hosted-plugin.ts +456 -456
- package/src/hosted/node/hosted-plugin-cli-contribution.ts +75 -75
- package/src/hosted/node/hosted-plugin-deployer-handler.ts +274 -274
- package/src/hosted/node/hosted-plugin-localization-service.ts +410 -410
- package/src/hosted/node/hosted-plugin-process.ts +248 -248
- package/src/hosted/node/hosted-plugin-protocol.ts +49 -49
- package/src/hosted/node/hosted-plugin.ts +116 -116
- package/src/hosted/node/metadata-scanner.ts +64 -64
- package/src/hosted/node/plugin-activation-events.ts +112 -112
- package/src/hosted/node/plugin-ext-hosted-backend-module.ts +94 -94
- package/src/hosted/node/plugin-host-module.ts +69 -69
- package/src/hosted/node/plugin-host-proxy.ts +82 -82
- package/src/hosted/node/plugin-host-rpc.ts +377 -377
- package/src/hosted/node/plugin-host.ts +110 -110
- package/src/hosted/node/plugin-language-pack-service.ts +43 -43
- package/src/hosted/node/plugin-manifest-loader.ts +32 -32
- package/src/hosted/node/plugin-reader.ts +136 -136
- package/src/hosted/node/plugin-service.ts +197 -197
- package/src/hosted/node/scanners/backend-init-theia.ts +71 -71
- package/src/hosted/node/scanners/file-plugin-uri-factory.ts +32 -32
- package/src/hosted/node/scanners/grammars-reader.ts +57 -57
- package/src/hosted/node/scanners/plugin-uri-factory.ts +33 -33
- package/src/hosted/node/scanners/scanner-theia.ts +963 -952
- package/src/hosted/node-electron/plugin-ext-hosted-electron-backend-module.ts +26 -26
- package/src/hosted/node-electron/scanner-theia-electron.ts +32 -32
- package/src/main/browser/authentication-main.ts +401 -388
- package/src/main/browser/clipboard-main.ts +38 -38
- package/src/main/browser/command-registry-main.ts +130 -130
- package/src/main/browser/commands.ts +104 -104
- package/src/main/browser/comments/comment-glyph-widget.ts +66 -66
- package/src/main/browser/comments/comment-thread-widget.tsx +696 -696
- package/src/main/browser/comments/comments-context-key-service.ts +68 -68
- package/src/main/browser/comments/comments-contribution.ts +268 -268
- package/src/main/browser/comments/comments-decorator.ts +110 -110
- package/src/main/browser/comments/comments-main.ts +482 -482
- package/src/main/browser/comments/comments-service.ts +205 -205
- package/src/main/browser/custom-editors/custom-editor-opener.tsx +205 -105
- package/src/main/browser/custom-editors/custom-editor-service.ts +108 -108
- package/src/main/browser/custom-editors/custom-editor-undo-redo-handler.ts +41 -41
- package/src/main/browser/custom-editors/custom-editor-widget-factory.ts +44 -44
- package/src/main/browser/custom-editors/custom-editor-widget.ts +127 -118
- package/src/main/browser/custom-editors/custom-editors-main.ts +526 -585
- package/src/main/browser/custom-editors/plugin-custom-editor-registry.ts +126 -120
- package/src/main/browser/data-transfer/data-transfer-type-converters.ts +68 -68
- package/src/main/browser/debug/debug-main.ts +397 -397
- package/src/main/browser/debug/plugin-debug-adapter-contribution.ts +48 -48
- package/src/main/browser/debug/plugin-debug-configuration-provider.ts +63 -63
- package/src/main/browser/debug/plugin-debug-service.ts +427 -427
- package/src/main/browser/debug/plugin-debug-session-contribution-registry.ts +76 -76
- package/src/main/browser/debug/plugin-debug-session-factory.ts +115 -115
- package/src/main/browser/decorations/decorations-main.ts +146 -146
- package/src/main/browser/dialogs/modal-notification.ts +112 -112
- package/src/main/browser/dialogs/style/modal-notification.css +123 -123
- package/src/main/browser/dialogs-main.ts +185 -185
- package/src/main/browser/documents-main.ts +275 -275
- package/src/main/browser/editors-and-documents-main.ts +425 -425
- package/src/main/browser/env-main.ts +60 -60
- package/src/main/browser/file-system-main-impl.ts +267 -267
- package/src/main/browser/hierarchy/hierarchy-types-converters.ts +189 -189
- package/src/main/browser/keybindings/keybindings-contribution-handler.ts +66 -66
- package/src/main/browser/label-service-main.ts +51 -51
- package/src/main/browser/languages-main.ts +1439 -1439
- package/src/main/browser/localization-main.ts +34 -34
- package/src/main/browser/main-context.ts +210 -206
- package/src/main/browser/main-file-system-event-service.ts +76 -76
- package/src/main/browser/menus/menus-contribution-handler.ts +172 -171
- package/src/main/browser/menus/plugin-menu-command-adapter.ts +358 -337
- package/src/main/browser/menus/vscode-theia-menu-mappings.ts +118 -116
- package/src/main/browser/message-registry-main.ts +43 -43
- package/src/main/browser/notebooks/notebook-documents-and-editors-main.ts +249 -249
- package/src/main/browser/notebooks/notebook-documents-main.ts +202 -182
- package/src/main/browser/notebooks/notebook-dto.ts +131 -131
- package/src/main/browser/notebooks/notebook-editors-main.ts +88 -75
- package/src/main/browser/notebooks/notebook-kernels-main.ts +339 -339
- package/src/main/browser/notebooks/notebook-renderers-main.ts +47 -47
- package/src/main/browser/notebooks/notebooks-main.ts +164 -164
- package/src/main/browser/notebooks/renderers/cell-output-webview.tsx +452 -375
- package/src/main/browser/notebooks/renderers/output-webview-internal.ts +636 -613
- package/src/main/browser/notebooks/renderers/webview-communication.ts +107 -107
- package/src/main/browser/notification-main.ts +26 -26
- package/src/main/browser/output-channel-registry-main.ts +53 -53
- package/src/main/browser/plugin-authentication-service.ts +71 -71
- package/src/main/browser/plugin-contribution-handler.ts +698 -698
- package/src/main/browser/plugin-ext-frontend-module.ts +291 -272
- package/src/main/browser/plugin-ext-widget.tsx +132 -132
- package/src/main/browser/plugin-frontend-contribution.ts +70 -70
- package/src/main/browser/plugin-frontend-view-contribution.ts +38 -38
- package/src/main/browser/plugin-icon-service.ts +92 -92
- package/src/main/browser/plugin-icon-theme-service.ts +625 -625
- package/src/main/browser/plugin-shared-style.ts +154 -154
- package/src/main/browser/plugin-storage.ts +55 -55
- package/src/main/browser/plugin-terminal-registry.ts +27 -27
- package/src/main/browser/preference-registry-main.ts +123 -123
- package/src/main/browser/quick-open-main.ts +367 -367
- package/src/main/browser/scm-main.ts +472 -472
- package/src/main/browser/secrets-main.ts +82 -82
- package/src/main/browser/selection-provider-command.ts +45 -45
- package/src/main/browser/status-bar-message-registry-main.ts +90 -90
- package/src/main/browser/style/comments.css +345 -345
- package/src/main/browser/style/index.css +84 -84
- package/src/main/browser/style/plugin-sidebar.css +73 -73
- package/src/main/browser/style/tree.css +54 -54
- package/src/main/browser/style/webview.css +55 -55
- package/src/main/browser/tabs/tabs-main.ts +384 -384
- package/src/main/browser/tasks-main.ts +268 -268
- package/src/main/browser/terminal-main.ts +370 -370
- package/src/main/browser/test-main.ts +632 -632
- package/src/main/browser/text-editor-main.ts +478 -478
- package/src/main/browser/text-editor-model-service.ts +111 -111
- package/src/main/browser/text-editors-main.ts +234 -234
- package/src/main/browser/theme-icon-override.ts +246 -246
- package/src/main/browser/theming-main.ts +42 -42
- package/src/main/browser/timeline-main.ts +80 -80
- package/src/main/browser/uri-main.ts +72 -0
- package/src/main/browser/view/dnd-file-content-store.ts +42 -42
- package/src/main/browser/view/plugin-tree-view-node-label-provider.ts +81 -81
- package/src/main/browser/view/plugin-view-registry.ts +967 -967
- package/src/main/browser/view/plugin-view-widget.ts +221 -221
- package/src/main/browser/view/tree-view-decorator-service.ts +51 -51
- package/src/main/browser/view/tree-view-widget.tsx +931 -931
- package/src/main/browser/view/tree-views-main.ts +205 -205
- package/src/main/browser/view/view-context-key-service.ts +64 -64
- package/src/main/browser/webview/pre/fake.html +14 -14
- package/src/main/browser/webview/pre/host.js +130 -130
- package/src/main/browser/webview/pre/index.html +17 -17
- package/src/main/browser/webview/pre/main.js +682 -682
- package/src/main/browser/webview/pre/service-worker.js +296 -295
- package/src/main/browser/webview/webview-context-keys.ts +62 -62
- package/src/main/browser/webview/webview-environment.ts +87 -87
- package/src/main/browser/webview/webview-frontend-security-warnings.ts +59 -59
- package/src/main/browser/webview/webview-preferences.ts +72 -72
- package/src/main/browser/webview/webview-resource-cache.ts +88 -88
- package/src/main/browser/webview/webview-secondary-window-support.ts +47 -47
- package/src/main/browser/webview/webview-theme-data-provider.ts +124 -124
- package/src/main/browser/webview/webview.ts +718 -719
- package/src/main/browser/webview-views/webview-views-main.ts +154 -154
- package/src/main/browser/webview-views/webview-views.ts +43 -43
- package/src/main/browser/webviews-main.ts +287 -282
- package/src/main/browser/window-activity-tracker.ts +96 -96
- package/src/main/browser/window-state-main.ts +85 -85
- package/src/main/browser/workspace-main.ts +424 -424
- package/src/main/common/basic-message-registry-main.ts +53 -53
- package/src/main/common/basic-notification-main.ts +86 -86
- package/src/main/common/env-main.ts +44 -44
- package/src/main/common/plugin-paths-protocol.ts +26 -26
- package/src/main/common/plugin-theia-environment.ts +36 -36
- package/src/main/common/webview-protocol.ts +28 -28
- package/src/main/electron-browser/plugin-ext-frontend-electron-module.ts +25 -25
- package/src/main/electron-browser/webview/electron-webview-widget-factory.ts +59 -59
- package/src/main/node/errors.spec.ts +37 -37
- package/src/main/node/handlers/plugin-theia-directory-handler.ts +137 -137
- package/src/main/node/handlers/plugin-theia-file-handler.ts +66 -66
- package/src/main/node/paths/const.ts +21 -21
- package/src/main/node/paths/plugin-paths-service.ts +163 -163
- package/src/main/node/plugin-cli-contribution.ts +85 -85
- package/src/main/node/plugin-deployer-contribution.ts +35 -35
- package/src/main/node/plugin-deployer-directory-handler-context-impl.ts +45 -45
- package/src/main/node/plugin-deployer-entry-impl.ts +132 -132
- package/src/main/node/plugin-deployer-file-handler-context-impl.ts +33 -33
- package/src/main/node/plugin-deployer-impl.ts +375 -375
- package/src/main/node/plugin-deployer-proxy-entry-impl.ts +96 -96
- package/src/main/node/plugin-deployer-resolver-context-impl.ts +55 -55
- package/src/main/node/plugin-ext-backend-module.ts +106 -106
- package/src/main/node/plugin-github-resolver.ts +139 -139
- package/src/main/node/plugin-http-resolver.ts +92 -92
- package/src/main/node/plugin-localization-server.ts +42 -42
- package/src/main/node/plugin-mgmt-cli-contribution.ts +64 -64
- package/src/main/node/plugin-remote-cli-contribution.ts +36 -36
- package/src/main/node/plugin-remote-copy-contribution.ts +36 -36
- package/src/main/node/plugin-server-handler.ts +69 -69
- package/src/main/node/plugin-service.ts +97 -97
- package/src/main/node/plugin-theia-deployer-participant.ts +32 -32
- package/src/main/node/plugin-uninstallation-manager.ts +74 -74
- package/src/main/node/plugins-key-value-storage.spec.ts +110 -110
- package/src/main/node/plugins-key-value-storage.ts +161 -161
- package/src/main/node/resolvers/local-directory-plugin-deployer-resolver.ts +37 -37
- package/src/main/node/resolvers/local-plugin-deployer-resolver.ts +56 -56
- package/src/main/node/temp-dir-util.ts +36 -36
- package/src/main/node/webview-backend-security-warnings.ts +45 -45
- package/src/main/style/status-bar.css +35 -35
- package/src/plugin/authentication-ext.ts +140 -136
- package/src/plugin/clipboard-ext.ts +43 -43
- package/src/plugin/command-registry.ts +219 -219
- package/src/plugin/comments.ts +549 -549
- package/src/plugin/custom-editors.ts +334 -336
- package/src/plugin/debug/debug-ext.ts +549 -549
- package/src/plugin/debug/plugin-debug-adapter-creator.ts +50 -50
- package/src/plugin/debug/plugin-debug-adapter-session.ts +106 -106
- package/src/plugin/debug/plugin-debug-adapter-tracker.ts +85 -85
- package/src/plugin/decorations.ts +140 -140
- package/src/plugin/dialogs.ts +96 -96
- package/src/plugin/document-data.ts +366 -366
- package/src/plugin/documents.ts +283 -283
- package/src/plugin/editors-and-documents.ts +176 -176
- package/src/plugin/env.ts +134 -129
- package/src/plugin/file-system-event-service-ext-impl.ts +256 -256
- package/src/plugin/file-system-ext-impl.ts +415 -415
- package/src/plugin/known-commands.spec.ts +50 -50
- package/src/plugin/known-commands.ts +429 -428
- package/src/plugin/label-service.ts +36 -36
- package/src/plugin/languages/call-hierarchy.ts +124 -124
- package/src/plugin/languages/code-action.ts +162 -162
- package/src/plugin/languages/color.ts +75 -75
- package/src/plugin/languages/completion.ts +183 -183
- package/src/plugin/languages/declaration.ts +72 -72
- package/src/plugin/languages/definition.ts +73 -73
- package/src/plugin/languages/diagnostics.ts +325 -325
- package/src/plugin/languages/document-drop-edit.ts +44 -44
- package/src/plugin/languages/document-formatting.ts +47 -47
- package/src/plugin/languages/document-highlight.ts +61 -61
- package/src/plugin/languages/evaluatable-expression.ts +47 -47
- package/src/plugin/languages/folding.ts +46 -46
- package/src/plugin/languages/hover.ts +58 -58
- package/src/plugin/languages/implementation.ts +73 -73
- package/src/plugin/languages/inlay-hints.ts +149 -149
- package/src/plugin/languages/inline-completion.ts +126 -126
- package/src/plugin/languages/inline-values.ts +50 -50
- package/src/plugin/languages/lens.ts +102 -102
- package/src/plugin/languages/link-provider.ts +81 -81
- package/src/plugin/languages/linked-editing-range.ts +48 -48
- package/src/plugin/languages/on-type-formatting.ts +50 -50
- package/src/plugin/languages/outline.ts +126 -126
- package/src/plugin/languages/range-formatting.ts +48 -48
- package/src/plugin/languages/reference.ts +58 -58
- package/src/plugin/languages/rename.ts +130 -130
- package/src/plugin/languages/selection-range.ts +80 -80
- package/src/plugin/languages/semantic-highlighting.ts +211 -211
- package/src/plugin/languages/signature.ts +82 -82
- package/src/plugin/languages/type-definition.ts +73 -73
- package/src/plugin/languages/type-hierarchy.ts +117 -117
- package/src/plugin/languages/util.ts +26 -26
- package/src/plugin/languages/workspace-symbol.ts +66 -66
- package/src/plugin/languages-utils.ts +68 -68
- package/src/plugin/languages.ts +1022 -1022
- package/src/plugin/localization-ext.ts +89 -89
- package/src/plugin/markdown-string.ts +115 -115
- package/src/plugin/message-registry.ts +70 -70
- package/src/plugin/node/debug/debug.spec.ts +98 -98
- package/src/plugin/node/debug/plugin-node-debug-adapter-creator.ts +167 -167
- package/src/plugin/node/env-node-ext.ts +64 -64
- package/src/plugin/node/plugin-container-module.ts +165 -165
- package/src/plugin/notebook/notebook-document.ts +446 -446
- package/src/plugin/notebook/notebook-documents.ts +58 -58
- package/src/plugin/notebook/notebook-editor.ts +116 -116
- package/src/plugin/notebook/notebook-editors.ts +71 -71
- package/src/plugin/notebook/notebook-kernels.ts +631 -631
- package/src/plugin/notebook/notebook-renderers.ts +71 -71
- package/src/plugin/notebook/notebooks.ts +449 -449
- package/src/plugin/notification.ts +80 -80
- package/src/plugin/output-channel/log-output-channel.ts +108 -108
- package/src/plugin/output-channel/output-channel-item.ts +73 -73
- package/src/plugin/output-channel-registry.ts +52 -52
- package/src/plugin/path.spec.ts +40 -40
- package/src/plugin/path.ts +68 -68
- package/src/plugin/plugin-context.ts +1606 -1595
- package/src/plugin/plugin-icon-path.ts +53 -53
- package/src/plugin/plugin-manager.ts +508 -507
- package/src/plugin/plugin-storage.ts +138 -138
- package/src/plugin/preference-registry.spec.ts +288 -288
- package/src/plugin/preference-registry.ts +335 -335
- package/src/plugin/prefix-sum-computer.ts +218 -218
- package/src/plugin/quick-open.ts +735 -735
- package/src/plugin/scm.ts +919 -919
- package/src/plugin/secrets-ext.ts +104 -104
- package/src/plugin/status-bar/status-bar-item.ts +193 -193
- package/src/plugin/status-bar-message-registry.ts +103 -103
- package/src/plugin/tabs.ts +431 -431
- package/src/plugin/tasks/task-provider.ts +57 -57
- package/src/plugin/tasks/tasks.ts +252 -252
- package/src/plugin/telemetry-ext.ts +298 -298
- package/src/plugin/terminal-ext.ts +569 -566
- package/src/plugin/test-item.ts +174 -174
- package/src/plugin/tests.ts +545 -545
- package/src/plugin/text-editor.ts +581 -581
- package/src/plugin/text-editors.ts +157 -157
- package/src/plugin/theming.ts +73 -73
- package/src/plugin/timeline.ts +186 -186
- package/src/plugin/tree/tree-views.ts +682 -682
- package/src/plugin/type-converters.spec.ts +476 -476
- package/src/plugin/type-converters.ts +1768 -1748
- package/src/plugin/types-impl.spec.ts +85 -85
- package/src/plugin/types-impl.ts +4011 -4001
- package/src/plugin/uri-ext.ts +60 -0
- package/src/plugin/webview-views.ts +228 -228
- package/src/plugin/webviews.ts +468 -468
- package/src/plugin/window-state.ts +75 -75
- package/src/plugin/word-helper.ts +162 -162
- package/src/plugin/workspace.ts +505 -505
- package/src/plugin-ext-backend-electron-module.ts +24 -24
- package/src/plugin-ext-backend-module.ts +24 -24
- package/src/plugin-ext-frontend-electron-module.ts +19 -19
- package/src/plugin-ext-frontend-module.ts +19 -19
- package/lib/common/proxy-handler.d.ts +0 -73
- package/lib/common/proxy-handler.d.ts.map +0 -1
- package/lib/common/proxy-handler.js +0 -106
- package/lib/common/proxy-handler.js.map +0 -1
- package/src/common/proxy-handler.ts +0 -143
|
@@ -1,425 +1,425 @@
|
|
|
1
|
-
// *****************************************************************************
|
|
2
|
-
// Copyright (C) 2018 Red Hat, Inc. 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 { interfaces } from '@theia/core/shared/inversify';
|
|
18
|
-
import * as monaco from '@theia/monaco-editor-core';
|
|
19
|
-
import { RPCProtocol } from '../../common/rpc-protocol';
|
|
20
|
-
import {
|
|
21
|
-
MAIN_RPC_CONTEXT,
|
|
22
|
-
EditorsAndDocumentsExt,
|
|
23
|
-
EditorsAndDocumentsDelta,
|
|
24
|
-
ModelAddedData,
|
|
25
|
-
TextEditorAddData,
|
|
26
|
-
EditorPosition
|
|
27
|
-
} from '../../common/plugin-api-rpc';
|
|
28
|
-
import { Disposable } from '@theia/core/lib/common/disposable';
|
|
29
|
-
import { EditorModelService } from './text-editor-model-service';
|
|
30
|
-
import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model';
|
|
31
|
-
import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor';
|
|
32
|
-
import { TextEditorMain } from './text-editor-main';
|
|
33
|
-
import { DisposableCollection, Emitter, URI } from '@theia/core';
|
|
34
|
-
import { EditorManager, EditorWidget } from '@theia/editor/lib/browser';
|
|
35
|
-
import { SaveableService } from '@theia/core/lib/browser/saveable-service';
|
|
36
|
-
import { TabsMainImpl } from './tabs/tabs-main';
|
|
37
|
-
|
|
38
|
-
export class EditorsAndDocumentsMain implements Disposable {
|
|
39
|
-
|
|
40
|
-
private readonly proxy: EditorsAndDocumentsExt;
|
|
41
|
-
|
|
42
|
-
private readonly stateComputer: EditorAndDocumentStateComputer;
|
|
43
|
-
private readonly textEditors = new Map<string, TextEditorMain>();
|
|
44
|
-
|
|
45
|
-
private readonly modelService: EditorModelService;
|
|
46
|
-
private readonly editorManager: EditorManager;
|
|
47
|
-
private readonly saveResourceService: SaveableService;
|
|
48
|
-
|
|
49
|
-
private readonly onTextEditorAddEmitter = new Emitter<TextEditorMain[]>();
|
|
50
|
-
private readonly onTextEditorRemoveEmitter = new Emitter<string[]>();
|
|
51
|
-
private readonly onDocumentAddEmitter = new Emitter<MonacoEditorModel[]>();
|
|
52
|
-
private readonly onDocumentRemoveEmitter = new Emitter<monaco.Uri[]>();
|
|
53
|
-
|
|
54
|
-
readonly onTextEditorAdd = this.onTextEditorAddEmitter.event;
|
|
55
|
-
readonly onTextEditorRemove = this.onTextEditorRemoveEmitter.event;
|
|
56
|
-
readonly onDocumentAdd = this.onDocumentAddEmitter.event;
|
|
57
|
-
readonly onDocumentRemove = this.onDocumentRemoveEmitter.event;
|
|
58
|
-
|
|
59
|
-
private readonly toDispose = new DisposableCollection(
|
|
60
|
-
Disposable.create(() => this.textEditors.clear())
|
|
61
|
-
);
|
|
62
|
-
|
|
63
|
-
constructor(rpc: RPCProtocol, container: interfaces.Container, tabsMain: TabsMainImpl) {
|
|
64
|
-
this.proxy = rpc.getProxy(MAIN_RPC_CONTEXT.EDITORS_AND_DOCUMENTS_EXT);
|
|
65
|
-
|
|
66
|
-
this.editorManager = container.get(EditorManager);
|
|
67
|
-
this.modelService = container.get(EditorModelService);
|
|
68
|
-
this.saveResourceService = container.get(SaveableService);
|
|
69
|
-
|
|
70
|
-
this.stateComputer = new EditorAndDocumentStateComputer(d => this.onDelta(d), this.editorManager, this.modelService, tabsMain);
|
|
71
|
-
this.toDispose.push(this.stateComputer);
|
|
72
|
-
this.toDispose.push(this.onTextEditorAddEmitter);
|
|
73
|
-
this.toDispose.push(this.onTextEditorRemoveEmitter);
|
|
74
|
-
this.toDispose.push(this.onDocumentAddEmitter);
|
|
75
|
-
this.toDispose.push(this.onDocumentRemoveEmitter);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
listen(): void {
|
|
79
|
-
this.stateComputer.listen();
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
dispose(): void {
|
|
83
|
-
this.toDispose.dispose();
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
private onDelta(delta: EditorAndDocumentStateDelta): void {
|
|
87
|
-
const removedEditors = new Array<string>();
|
|
88
|
-
const addedEditors = new Array<TextEditorMain>();
|
|
89
|
-
|
|
90
|
-
const removedDocuments = delta.removedDocuments.map(d => d.textEditorModel.uri);
|
|
91
|
-
|
|
92
|
-
for (const editor of delta.addedEditors) {
|
|
93
|
-
const textEditorMain = new TextEditorMain(editor.id, editor.editor.getControl().getModel()!, editor.editor);
|
|
94
|
-
this.textEditors.set(editor.id, textEditorMain);
|
|
95
|
-
this.toDispose.push(textEditorMain);
|
|
96
|
-
addedEditors.push(textEditorMain);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
for (const { id } of delta.removedEditors) {
|
|
100
|
-
const textEditorMain = this.textEditors.get(id);
|
|
101
|
-
if (textEditorMain) {
|
|
102
|
-
textEditorMain.dispose();
|
|
103
|
-
this.textEditors.delete(id);
|
|
104
|
-
removedEditors.push(id);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
const deltaExt: EditorsAndDocumentsDelta = {};
|
|
109
|
-
let empty = true;
|
|
110
|
-
|
|
111
|
-
if (delta.newActiveEditor !== undefined) {
|
|
112
|
-
empty = false;
|
|
113
|
-
deltaExt.newActiveEditor = delta.newActiveEditor;
|
|
114
|
-
}
|
|
115
|
-
if (removedDocuments.length > 0) {
|
|
116
|
-
empty = false;
|
|
117
|
-
deltaExt.removedDocuments = removedDocuments;
|
|
118
|
-
}
|
|
119
|
-
if (removedEditors.length > 0) {
|
|
120
|
-
empty = false;
|
|
121
|
-
deltaExt.removedEditors = removedEditors;
|
|
122
|
-
}
|
|
123
|
-
if (delta.addedDocuments.length > 0) {
|
|
124
|
-
empty = false;
|
|
125
|
-
deltaExt.addedDocuments = delta.addedDocuments.map(d => this.toModelAddData(d));
|
|
126
|
-
}
|
|
127
|
-
if (delta.addedEditors.length > 0) {
|
|
128
|
-
empty = false;
|
|
129
|
-
deltaExt.addedEditors = addedEditors.map(e => this.toTextEditorAddData(e));
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
if (!empty) {
|
|
133
|
-
this.proxy.$acceptEditorsAndDocumentsDelta(deltaExt);
|
|
134
|
-
this.onDocumentRemoveEmitter.fire(removedDocuments);
|
|
135
|
-
this.onDocumentAddEmitter.fire(delta.addedDocuments);
|
|
136
|
-
this.onTextEditorRemoveEmitter.fire(removedEditors);
|
|
137
|
-
this.onTextEditorAddEmitter.fire(addedEditors);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
private toModelAddData(model: MonacoEditorModel): ModelAddedData {
|
|
142
|
-
return {
|
|
143
|
-
uri: model.textEditorModel.uri,
|
|
144
|
-
versionId: model.textEditorModel.getVersionId(),
|
|
145
|
-
lines: model.textEditorModel.getLinesContent(),
|
|
146
|
-
languageId: model.getLanguageId(),
|
|
147
|
-
EOL: model.textEditorModel.getEOL(),
|
|
148
|
-
modeId: model.languageId,
|
|
149
|
-
isDirty: model.dirty
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
private toTextEditorAddData(textEditor: TextEditorMain): TextEditorAddData {
|
|
154
|
-
const properties = textEditor.getProperties();
|
|
155
|
-
return {
|
|
156
|
-
id: textEditor.getId(),
|
|
157
|
-
documentUri: textEditor.getModel().uri,
|
|
158
|
-
options: properties!.options,
|
|
159
|
-
selections: properties!.selections,
|
|
160
|
-
visibleRanges: properties!.visibleRanges,
|
|
161
|
-
editorPosition: this.findEditorPosition(textEditor)
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
private findEditorPosition(editor: TextEditorMain): EditorPosition | undefined {
|
|
167
|
-
return EditorPosition.ONE; // TODO: fix this when Theia has support splitting editors
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
getEditor(id: string): TextEditorMain | undefined {
|
|
171
|
-
return this.textEditors.get(id);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
async save(uri: URI): Promise<URI | undefined> {
|
|
175
|
-
const editor = await this.editorManager.getByUri(uri);
|
|
176
|
-
if (!editor) {
|
|
177
|
-
return undefined;
|
|
178
|
-
}
|
|
179
|
-
return this.saveResourceService.save(editor);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
async saveAs(uri: URI): Promise<URI | undefined> {
|
|
183
|
-
const editor = await this.editorManager.getByUri(uri);
|
|
184
|
-
if (!editor) {
|
|
185
|
-
return undefined;
|
|
186
|
-
}
|
|
187
|
-
if (!this.saveResourceService.canSaveAs(editor)) {
|
|
188
|
-
return undefined;
|
|
189
|
-
}
|
|
190
|
-
return this.saveResourceService.saveAs(editor);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
saveAll(includeUntitled?: boolean): Promise<boolean> {
|
|
194
|
-
return this.modelService.saveAll(includeUntitled);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
hideEditor(id: string): Promise<void> {
|
|
198
|
-
for (const editorWidget of this.editorManager.all) {
|
|
199
|
-
const monacoEditor = MonacoEditor.get(editorWidget);
|
|
200
|
-
if (monacoEditor) {
|
|
201
|
-
if (id === new EditorSnapshot(monacoEditor).id) {
|
|
202
|
-
editorWidget.close();
|
|
203
|
-
break;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
return Promise.resolve();
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
class EditorAndDocumentStateComputer implements Disposable {
|
|
212
|
-
private currentState: EditorAndDocumentState | undefined;
|
|
213
|
-
private readonly editors = new Map<string, DisposableCollection>();
|
|
214
|
-
private readonly toDispose = new DisposableCollection(
|
|
215
|
-
Disposable.create(() => this.currentState = undefined)
|
|
216
|
-
);
|
|
217
|
-
|
|
218
|
-
constructor(
|
|
219
|
-
private callback: (delta: EditorAndDocumentStateDelta) => void,
|
|
220
|
-
private readonly editorService: EditorManager,
|
|
221
|
-
private readonly modelService: EditorModelService,
|
|
222
|
-
private readonly tabsMain: TabsMainImpl
|
|
223
|
-
) { }
|
|
224
|
-
|
|
225
|
-
listen(): void {
|
|
226
|
-
if (this.toDispose.disposed) {
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
this.toDispose.push(this.editorService.onCreated(async widget => {
|
|
230
|
-
await this.tabsMain.waitForWidget(widget);
|
|
231
|
-
this.onTextEditorAdd(widget);
|
|
232
|
-
this.update();
|
|
233
|
-
}));
|
|
234
|
-
this.toDispose.push(this.editorService.onCurrentEditorChanged(async widget => {
|
|
235
|
-
if (widget) {
|
|
236
|
-
await this.tabsMain.waitForWidget(widget);
|
|
237
|
-
}
|
|
238
|
-
this.update();
|
|
239
|
-
}));
|
|
240
|
-
this.toDispose.push(this.modelService.onModelAdded(this.onModelAdded, this));
|
|
241
|
-
this.toDispose.push(this.modelService.onModelRemoved(() => this.update()));
|
|
242
|
-
|
|
243
|
-
for (const widget of this.editorService.all) {
|
|
244
|
-
this.onTextEditorAdd(widget);
|
|
245
|
-
}
|
|
246
|
-
this.update();
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
dispose(): void {
|
|
250
|
-
this.toDispose.dispose();
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
private onModelAdded(model: MonacoEditorModel): void {
|
|
254
|
-
if (!this.currentState) {
|
|
255
|
-
this.update();
|
|
256
|
-
return;
|
|
257
|
-
}
|
|
258
|
-
this.currentState = new EditorAndDocumentState(
|
|
259
|
-
this.currentState.documents.add(model),
|
|
260
|
-
this.currentState.editors,
|
|
261
|
-
this.currentState.activeEditor);
|
|
262
|
-
|
|
263
|
-
this.callback(new EditorAndDocumentStateDelta(
|
|
264
|
-
[],
|
|
265
|
-
[model],
|
|
266
|
-
[],
|
|
267
|
-
[],
|
|
268
|
-
undefined,
|
|
269
|
-
undefined
|
|
270
|
-
));
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
private onTextEditorAdd(widget: EditorWidget): void {
|
|
274
|
-
const editor = MonacoEditor.get(widget);
|
|
275
|
-
if (!editor) {
|
|
276
|
-
return;
|
|
277
|
-
}
|
|
278
|
-
const id = editor.getControl().getId();
|
|
279
|
-
const toDispose = new DisposableCollection(
|
|
280
|
-
editor.onDispose(() => this.onTextEditorRemove(editor)),
|
|
281
|
-
Disposable.create(() => this.editors.delete(id))
|
|
282
|
-
);
|
|
283
|
-
this.editors.set(id, toDispose);
|
|
284
|
-
this.toDispose.push(toDispose);
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
private onTextEditorRemove(e: MonacoEditor): void {
|
|
288
|
-
const toDispose = this.editors.get(e.getControl().getId());
|
|
289
|
-
if (toDispose) {
|
|
290
|
-
toDispose.dispose();
|
|
291
|
-
this.update();
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
private update(): void {
|
|
296
|
-
const models = new Set<MonacoEditorModel>();
|
|
297
|
-
for (const model of this.modelService.getModels()) {
|
|
298
|
-
models.add(model);
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
let activeId: string | null = null;
|
|
302
|
-
const activeEditor = MonacoEditor.getCurrent(this.editorService);
|
|
303
|
-
|
|
304
|
-
const editors = new Map<string, EditorSnapshot>();
|
|
305
|
-
for (const widget of this.editorService.all) {
|
|
306
|
-
const editor = MonacoEditor.get(widget);
|
|
307
|
-
// VS Code tracks only visible widgets
|
|
308
|
-
if (!editor || !widget.isVisible) {
|
|
309
|
-
continue;
|
|
310
|
-
}
|
|
311
|
-
const model = editor.getControl().getModel();
|
|
312
|
-
if (model && !model.isDisposed()) {
|
|
313
|
-
const editorSnapshot = new EditorSnapshot(editor);
|
|
314
|
-
editors.set(editorSnapshot.id, editorSnapshot);
|
|
315
|
-
if (activeEditor === editor) {
|
|
316
|
-
activeId = editorSnapshot.id;
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
const newState = new EditorAndDocumentState(models, editors, activeId);
|
|
322
|
-
const delta = EditorAndDocumentState.compute(this.currentState, newState);
|
|
323
|
-
if (!delta.isEmpty) {
|
|
324
|
-
this.currentState = newState;
|
|
325
|
-
this.callback(delta);
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
class EditorAndDocumentStateDelta {
|
|
332
|
-
readonly isEmpty: boolean;
|
|
333
|
-
|
|
334
|
-
constructor(
|
|
335
|
-
readonly removedDocuments: MonacoEditorModel[],
|
|
336
|
-
readonly addedDocuments: MonacoEditorModel[],
|
|
337
|
-
readonly removedEditors: EditorSnapshot[],
|
|
338
|
-
readonly addedEditors: EditorSnapshot[],
|
|
339
|
-
readonly oldActiveEditor: string | null | undefined,
|
|
340
|
-
readonly newActiveEditor: string | null | undefined
|
|
341
|
-
) {
|
|
342
|
-
this.isEmpty = this.removedDocuments.length === 0
|
|
343
|
-
&& this.addedDocuments.length === 0
|
|
344
|
-
&& this.addedEditors.length === 0
|
|
345
|
-
&& this.removedEditors.length === 0
|
|
346
|
-
&& this.newActiveEditor === this.oldActiveEditor;
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
class EditorAndDocumentState {
|
|
351
|
-
|
|
352
|
-
constructor(
|
|
353
|
-
readonly documents: Set<MonacoEditorModel>,
|
|
354
|
-
readonly editors: Map<string, EditorSnapshot>,
|
|
355
|
-
readonly activeEditor: string | null | undefined) {
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
static compute(before: EditorAndDocumentState | undefined, after: EditorAndDocumentState): EditorAndDocumentStateDelta {
|
|
359
|
-
if (!before) {
|
|
360
|
-
return new EditorAndDocumentStateDelta(
|
|
361
|
-
[],
|
|
362
|
-
Array.from(after.documents),
|
|
363
|
-
[],
|
|
364
|
-
Array.from(after.editors.values()),
|
|
365
|
-
undefined,
|
|
366
|
-
after.activeEditor
|
|
367
|
-
);
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
const documentDelta = Delta.ofSets(before.documents, after.documents);
|
|
371
|
-
const editorDelta = Delta.ofMaps(before.editors, after.editors);
|
|
372
|
-
const oldActiveEditor = before.activeEditor !== after.activeEditor ? before.activeEditor : undefined;
|
|
373
|
-
const newActiveEditor = before.activeEditor !== after.activeEditor ? after.activeEditor : undefined;
|
|
374
|
-
return new EditorAndDocumentStateDelta(
|
|
375
|
-
documentDelta.removed,
|
|
376
|
-
documentDelta.added,
|
|
377
|
-
editorDelta.removed,
|
|
378
|
-
editorDelta.added,
|
|
379
|
-
oldActiveEditor,
|
|
380
|
-
newActiveEditor
|
|
381
|
-
);
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
class EditorSnapshot {
|
|
386
|
-
readonly id: string;
|
|
387
|
-
constructor(readonly editor: MonacoEditor) {
|
|
388
|
-
this.id = `${editor.getControl().getId()},${editor.getControl().getModel()!.id}`;
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
namespace Delta {
|
|
393
|
-
|
|
394
|
-
export function ofSets<T>(before: Set<T>, after: Set<T>): { removed: T[], added: T[] } {
|
|
395
|
-
const removed: T[] = [];
|
|
396
|
-
const added: T[] = [];
|
|
397
|
-
before.forEach(element => {
|
|
398
|
-
if (!after.has(element)) {
|
|
399
|
-
removed.push(element);
|
|
400
|
-
}
|
|
401
|
-
});
|
|
402
|
-
after.forEach(element => {
|
|
403
|
-
if (!before.has(element)) {
|
|
404
|
-
added.push(element);
|
|
405
|
-
}
|
|
406
|
-
});
|
|
407
|
-
return { removed, added };
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
export function ofMaps<K, V>(before: Map<K, V>, after: Map<K, V>): { removed: V[], added: V[] } {
|
|
411
|
-
const removed: V[] = [];
|
|
412
|
-
const added: V[] = [];
|
|
413
|
-
before.forEach((value, index) => {
|
|
414
|
-
if (!after.has(index)) {
|
|
415
|
-
removed.push(value);
|
|
416
|
-
}
|
|
417
|
-
});
|
|
418
|
-
after.forEach((value, index) => {
|
|
419
|
-
if (!before.has(index)) {
|
|
420
|
-
added.push(value);
|
|
421
|
-
}
|
|
422
|
-
});
|
|
423
|
-
return { removed, added };
|
|
424
|
-
}
|
|
425
|
-
}
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2018 Red Hat, Inc. 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 { interfaces } from '@theia/core/shared/inversify';
|
|
18
|
+
import * as monaco from '@theia/monaco-editor-core';
|
|
19
|
+
import { RPCProtocol } from '../../common/rpc-protocol';
|
|
20
|
+
import {
|
|
21
|
+
MAIN_RPC_CONTEXT,
|
|
22
|
+
EditorsAndDocumentsExt,
|
|
23
|
+
EditorsAndDocumentsDelta,
|
|
24
|
+
ModelAddedData,
|
|
25
|
+
TextEditorAddData,
|
|
26
|
+
EditorPosition
|
|
27
|
+
} from '../../common/plugin-api-rpc';
|
|
28
|
+
import { Disposable } from '@theia/core/lib/common/disposable';
|
|
29
|
+
import { EditorModelService } from './text-editor-model-service';
|
|
30
|
+
import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model';
|
|
31
|
+
import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor';
|
|
32
|
+
import { TextEditorMain } from './text-editor-main';
|
|
33
|
+
import { DisposableCollection, Emitter, URI } from '@theia/core';
|
|
34
|
+
import { EditorManager, EditorWidget } from '@theia/editor/lib/browser';
|
|
35
|
+
import { SaveableService } from '@theia/core/lib/browser/saveable-service';
|
|
36
|
+
import { TabsMainImpl } from './tabs/tabs-main';
|
|
37
|
+
|
|
38
|
+
export class EditorsAndDocumentsMain implements Disposable {
|
|
39
|
+
|
|
40
|
+
private readonly proxy: EditorsAndDocumentsExt;
|
|
41
|
+
|
|
42
|
+
private readonly stateComputer: EditorAndDocumentStateComputer;
|
|
43
|
+
private readonly textEditors = new Map<string, TextEditorMain>();
|
|
44
|
+
|
|
45
|
+
private readonly modelService: EditorModelService;
|
|
46
|
+
private readonly editorManager: EditorManager;
|
|
47
|
+
private readonly saveResourceService: SaveableService;
|
|
48
|
+
|
|
49
|
+
private readonly onTextEditorAddEmitter = new Emitter<TextEditorMain[]>();
|
|
50
|
+
private readonly onTextEditorRemoveEmitter = new Emitter<string[]>();
|
|
51
|
+
private readonly onDocumentAddEmitter = new Emitter<MonacoEditorModel[]>();
|
|
52
|
+
private readonly onDocumentRemoveEmitter = new Emitter<monaco.Uri[]>();
|
|
53
|
+
|
|
54
|
+
readonly onTextEditorAdd = this.onTextEditorAddEmitter.event;
|
|
55
|
+
readonly onTextEditorRemove = this.onTextEditorRemoveEmitter.event;
|
|
56
|
+
readonly onDocumentAdd = this.onDocumentAddEmitter.event;
|
|
57
|
+
readonly onDocumentRemove = this.onDocumentRemoveEmitter.event;
|
|
58
|
+
|
|
59
|
+
private readonly toDispose = new DisposableCollection(
|
|
60
|
+
Disposable.create(() => this.textEditors.clear())
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
constructor(rpc: RPCProtocol, container: interfaces.Container, tabsMain: TabsMainImpl) {
|
|
64
|
+
this.proxy = rpc.getProxy(MAIN_RPC_CONTEXT.EDITORS_AND_DOCUMENTS_EXT);
|
|
65
|
+
|
|
66
|
+
this.editorManager = container.get(EditorManager);
|
|
67
|
+
this.modelService = container.get(EditorModelService);
|
|
68
|
+
this.saveResourceService = container.get(SaveableService);
|
|
69
|
+
|
|
70
|
+
this.stateComputer = new EditorAndDocumentStateComputer(d => this.onDelta(d), this.editorManager, this.modelService, tabsMain);
|
|
71
|
+
this.toDispose.push(this.stateComputer);
|
|
72
|
+
this.toDispose.push(this.onTextEditorAddEmitter);
|
|
73
|
+
this.toDispose.push(this.onTextEditorRemoveEmitter);
|
|
74
|
+
this.toDispose.push(this.onDocumentAddEmitter);
|
|
75
|
+
this.toDispose.push(this.onDocumentRemoveEmitter);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
listen(): void {
|
|
79
|
+
this.stateComputer.listen();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
dispose(): void {
|
|
83
|
+
this.toDispose.dispose();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
private onDelta(delta: EditorAndDocumentStateDelta): void {
|
|
87
|
+
const removedEditors = new Array<string>();
|
|
88
|
+
const addedEditors = new Array<TextEditorMain>();
|
|
89
|
+
|
|
90
|
+
const removedDocuments = delta.removedDocuments.map(d => d.textEditorModel.uri);
|
|
91
|
+
|
|
92
|
+
for (const editor of delta.addedEditors) {
|
|
93
|
+
const textEditorMain = new TextEditorMain(editor.id, editor.editor.getControl().getModel()!, editor.editor);
|
|
94
|
+
this.textEditors.set(editor.id, textEditorMain);
|
|
95
|
+
this.toDispose.push(textEditorMain);
|
|
96
|
+
addedEditors.push(textEditorMain);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
for (const { id } of delta.removedEditors) {
|
|
100
|
+
const textEditorMain = this.textEditors.get(id);
|
|
101
|
+
if (textEditorMain) {
|
|
102
|
+
textEditorMain.dispose();
|
|
103
|
+
this.textEditors.delete(id);
|
|
104
|
+
removedEditors.push(id);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const deltaExt: EditorsAndDocumentsDelta = {};
|
|
109
|
+
let empty = true;
|
|
110
|
+
|
|
111
|
+
if (delta.newActiveEditor !== undefined) {
|
|
112
|
+
empty = false;
|
|
113
|
+
deltaExt.newActiveEditor = delta.newActiveEditor;
|
|
114
|
+
}
|
|
115
|
+
if (removedDocuments.length > 0) {
|
|
116
|
+
empty = false;
|
|
117
|
+
deltaExt.removedDocuments = removedDocuments;
|
|
118
|
+
}
|
|
119
|
+
if (removedEditors.length > 0) {
|
|
120
|
+
empty = false;
|
|
121
|
+
deltaExt.removedEditors = removedEditors;
|
|
122
|
+
}
|
|
123
|
+
if (delta.addedDocuments.length > 0) {
|
|
124
|
+
empty = false;
|
|
125
|
+
deltaExt.addedDocuments = delta.addedDocuments.map(d => this.toModelAddData(d));
|
|
126
|
+
}
|
|
127
|
+
if (delta.addedEditors.length > 0) {
|
|
128
|
+
empty = false;
|
|
129
|
+
deltaExt.addedEditors = addedEditors.map(e => this.toTextEditorAddData(e));
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (!empty) {
|
|
133
|
+
this.proxy.$acceptEditorsAndDocumentsDelta(deltaExt);
|
|
134
|
+
this.onDocumentRemoveEmitter.fire(removedDocuments);
|
|
135
|
+
this.onDocumentAddEmitter.fire(delta.addedDocuments);
|
|
136
|
+
this.onTextEditorRemoveEmitter.fire(removedEditors);
|
|
137
|
+
this.onTextEditorAddEmitter.fire(addedEditors);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
private toModelAddData(model: MonacoEditorModel): ModelAddedData {
|
|
142
|
+
return {
|
|
143
|
+
uri: model.textEditorModel.uri,
|
|
144
|
+
versionId: model.textEditorModel.getVersionId(),
|
|
145
|
+
lines: model.textEditorModel.getLinesContent(),
|
|
146
|
+
languageId: model.getLanguageId(),
|
|
147
|
+
EOL: model.textEditorModel.getEOL(),
|
|
148
|
+
modeId: model.languageId,
|
|
149
|
+
isDirty: model.dirty
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
private toTextEditorAddData(textEditor: TextEditorMain): TextEditorAddData {
|
|
154
|
+
const properties = textEditor.getProperties();
|
|
155
|
+
return {
|
|
156
|
+
id: textEditor.getId(),
|
|
157
|
+
documentUri: textEditor.getModel().uri,
|
|
158
|
+
options: properties!.options,
|
|
159
|
+
selections: properties!.selections,
|
|
160
|
+
visibleRanges: properties!.visibleRanges,
|
|
161
|
+
editorPosition: this.findEditorPosition(textEditor)
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
private findEditorPosition(editor: TextEditorMain): EditorPosition | undefined {
|
|
167
|
+
return EditorPosition.ONE; // TODO: fix this when Theia has support splitting editors
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
getEditor(id: string): TextEditorMain | undefined {
|
|
171
|
+
return this.textEditors.get(id);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
async save(uri: URI): Promise<URI | undefined> {
|
|
175
|
+
const editor = await this.editorManager.getByUri(uri);
|
|
176
|
+
if (!editor) {
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
return this.saveResourceService.save(editor);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
async saveAs(uri: URI): Promise<URI | undefined> {
|
|
183
|
+
const editor = await this.editorManager.getByUri(uri);
|
|
184
|
+
if (!editor) {
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
if (!this.saveResourceService.canSaveAs(editor)) {
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
return this.saveResourceService.saveAs(editor);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
saveAll(includeUntitled?: boolean): Promise<boolean> {
|
|
194
|
+
return this.modelService.saveAll(includeUntitled);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
hideEditor(id: string): Promise<void> {
|
|
198
|
+
for (const editorWidget of this.editorManager.all) {
|
|
199
|
+
const monacoEditor = MonacoEditor.get(editorWidget);
|
|
200
|
+
if (monacoEditor) {
|
|
201
|
+
if (id === new EditorSnapshot(monacoEditor).id) {
|
|
202
|
+
editorWidget.close();
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return Promise.resolve();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
class EditorAndDocumentStateComputer implements Disposable {
|
|
212
|
+
private currentState: EditorAndDocumentState | undefined;
|
|
213
|
+
private readonly editors = new Map<string, DisposableCollection>();
|
|
214
|
+
private readonly toDispose = new DisposableCollection(
|
|
215
|
+
Disposable.create(() => this.currentState = undefined)
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
constructor(
|
|
219
|
+
private callback: (delta: EditorAndDocumentStateDelta) => void,
|
|
220
|
+
private readonly editorService: EditorManager,
|
|
221
|
+
private readonly modelService: EditorModelService,
|
|
222
|
+
private readonly tabsMain: TabsMainImpl
|
|
223
|
+
) { }
|
|
224
|
+
|
|
225
|
+
listen(): void {
|
|
226
|
+
if (this.toDispose.disposed) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
this.toDispose.push(this.editorService.onCreated(async widget => {
|
|
230
|
+
await this.tabsMain.waitForWidget(widget);
|
|
231
|
+
this.onTextEditorAdd(widget);
|
|
232
|
+
this.update();
|
|
233
|
+
}));
|
|
234
|
+
this.toDispose.push(this.editorService.onCurrentEditorChanged(async widget => {
|
|
235
|
+
if (widget) {
|
|
236
|
+
await this.tabsMain.waitForWidget(widget);
|
|
237
|
+
}
|
|
238
|
+
this.update();
|
|
239
|
+
}));
|
|
240
|
+
this.toDispose.push(this.modelService.onModelAdded(this.onModelAdded, this));
|
|
241
|
+
this.toDispose.push(this.modelService.onModelRemoved(() => this.update()));
|
|
242
|
+
|
|
243
|
+
for (const widget of this.editorService.all) {
|
|
244
|
+
this.onTextEditorAdd(widget);
|
|
245
|
+
}
|
|
246
|
+
this.update();
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
dispose(): void {
|
|
250
|
+
this.toDispose.dispose();
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
private onModelAdded(model: MonacoEditorModel): void {
|
|
254
|
+
if (!this.currentState) {
|
|
255
|
+
this.update();
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
this.currentState = new EditorAndDocumentState(
|
|
259
|
+
this.currentState.documents.add(model),
|
|
260
|
+
this.currentState.editors,
|
|
261
|
+
this.currentState.activeEditor);
|
|
262
|
+
|
|
263
|
+
this.callback(new EditorAndDocumentStateDelta(
|
|
264
|
+
[],
|
|
265
|
+
[model],
|
|
266
|
+
[],
|
|
267
|
+
[],
|
|
268
|
+
undefined,
|
|
269
|
+
undefined
|
|
270
|
+
));
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
private onTextEditorAdd(widget: EditorWidget): void {
|
|
274
|
+
const editor = MonacoEditor.get(widget);
|
|
275
|
+
if (!editor) {
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
const id = editor.getControl().getId();
|
|
279
|
+
const toDispose = new DisposableCollection(
|
|
280
|
+
editor.onDispose(() => this.onTextEditorRemove(editor)),
|
|
281
|
+
Disposable.create(() => this.editors.delete(id))
|
|
282
|
+
);
|
|
283
|
+
this.editors.set(id, toDispose);
|
|
284
|
+
this.toDispose.push(toDispose);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
private onTextEditorRemove(e: MonacoEditor): void {
|
|
288
|
+
const toDispose = this.editors.get(e.getControl().getId());
|
|
289
|
+
if (toDispose) {
|
|
290
|
+
toDispose.dispose();
|
|
291
|
+
this.update();
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
private update(): void {
|
|
296
|
+
const models = new Set<MonacoEditorModel>();
|
|
297
|
+
for (const model of this.modelService.getModels()) {
|
|
298
|
+
models.add(model);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
let activeId: string | null = null;
|
|
302
|
+
const activeEditor = MonacoEditor.getCurrent(this.editorService);
|
|
303
|
+
|
|
304
|
+
const editors = new Map<string, EditorSnapshot>();
|
|
305
|
+
for (const widget of this.editorService.all) {
|
|
306
|
+
const editor = MonacoEditor.get(widget);
|
|
307
|
+
// VS Code tracks only visible widgets
|
|
308
|
+
if (!editor || !widget.isVisible) {
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
const model = editor.getControl().getModel();
|
|
312
|
+
if (model && !model.isDisposed()) {
|
|
313
|
+
const editorSnapshot = new EditorSnapshot(editor);
|
|
314
|
+
editors.set(editorSnapshot.id, editorSnapshot);
|
|
315
|
+
if (activeEditor === editor) {
|
|
316
|
+
activeId = editorSnapshot.id;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const newState = new EditorAndDocumentState(models, editors, activeId);
|
|
322
|
+
const delta = EditorAndDocumentState.compute(this.currentState, newState);
|
|
323
|
+
if (!delta.isEmpty) {
|
|
324
|
+
this.currentState = newState;
|
|
325
|
+
this.callback(delta);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
class EditorAndDocumentStateDelta {
|
|
332
|
+
readonly isEmpty: boolean;
|
|
333
|
+
|
|
334
|
+
constructor(
|
|
335
|
+
readonly removedDocuments: MonacoEditorModel[],
|
|
336
|
+
readonly addedDocuments: MonacoEditorModel[],
|
|
337
|
+
readonly removedEditors: EditorSnapshot[],
|
|
338
|
+
readonly addedEditors: EditorSnapshot[],
|
|
339
|
+
readonly oldActiveEditor: string | null | undefined,
|
|
340
|
+
readonly newActiveEditor: string | null | undefined
|
|
341
|
+
) {
|
|
342
|
+
this.isEmpty = this.removedDocuments.length === 0
|
|
343
|
+
&& this.addedDocuments.length === 0
|
|
344
|
+
&& this.addedEditors.length === 0
|
|
345
|
+
&& this.removedEditors.length === 0
|
|
346
|
+
&& this.newActiveEditor === this.oldActiveEditor;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
class EditorAndDocumentState {
|
|
351
|
+
|
|
352
|
+
constructor(
|
|
353
|
+
readonly documents: Set<MonacoEditorModel>,
|
|
354
|
+
readonly editors: Map<string, EditorSnapshot>,
|
|
355
|
+
readonly activeEditor: string | null | undefined) {
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
static compute(before: EditorAndDocumentState | undefined, after: EditorAndDocumentState): EditorAndDocumentStateDelta {
|
|
359
|
+
if (!before) {
|
|
360
|
+
return new EditorAndDocumentStateDelta(
|
|
361
|
+
[],
|
|
362
|
+
Array.from(after.documents),
|
|
363
|
+
[],
|
|
364
|
+
Array.from(after.editors.values()),
|
|
365
|
+
undefined,
|
|
366
|
+
after.activeEditor
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
const documentDelta = Delta.ofSets(before.documents, after.documents);
|
|
371
|
+
const editorDelta = Delta.ofMaps(before.editors, after.editors);
|
|
372
|
+
const oldActiveEditor = before.activeEditor !== after.activeEditor ? before.activeEditor : undefined;
|
|
373
|
+
const newActiveEditor = before.activeEditor !== after.activeEditor ? after.activeEditor : undefined;
|
|
374
|
+
return new EditorAndDocumentStateDelta(
|
|
375
|
+
documentDelta.removed,
|
|
376
|
+
documentDelta.added,
|
|
377
|
+
editorDelta.removed,
|
|
378
|
+
editorDelta.added,
|
|
379
|
+
oldActiveEditor,
|
|
380
|
+
newActiveEditor
|
|
381
|
+
);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
class EditorSnapshot {
|
|
386
|
+
readonly id: string;
|
|
387
|
+
constructor(readonly editor: MonacoEditor) {
|
|
388
|
+
this.id = `${editor.getControl().getId()},${editor.getControl().getModel()!.id}`;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
namespace Delta {
|
|
393
|
+
|
|
394
|
+
export function ofSets<T>(before: Set<T>, after: Set<T>): { removed: T[], added: T[] } {
|
|
395
|
+
const removed: T[] = [];
|
|
396
|
+
const added: T[] = [];
|
|
397
|
+
before.forEach(element => {
|
|
398
|
+
if (!after.has(element)) {
|
|
399
|
+
removed.push(element);
|
|
400
|
+
}
|
|
401
|
+
});
|
|
402
|
+
after.forEach(element => {
|
|
403
|
+
if (!before.has(element)) {
|
|
404
|
+
added.push(element);
|
|
405
|
+
}
|
|
406
|
+
});
|
|
407
|
+
return { removed, added };
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
export function ofMaps<K, V>(before: Map<K, V>, after: Map<K, V>): { removed: V[], added: V[] } {
|
|
411
|
+
const removed: V[] = [];
|
|
412
|
+
const added: V[] = [];
|
|
413
|
+
before.forEach((value, index) => {
|
|
414
|
+
if (!after.has(index)) {
|
|
415
|
+
removed.push(value);
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
after.forEach((value, index) => {
|
|
419
|
+
if (!before.has(index)) {
|
|
420
|
+
added.push(value);
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
return { removed, added };
|
|
424
|
+
}
|
|
425
|
+
}
|