@theia/core 1.48.1 → 1.48.3

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.
Files changed (1497) hide show
  1. package/README.md +6 -6
  2. package/i18n/nls.cs.json +541 -541
  3. package/i18n/nls.de.json +541 -541
  4. package/i18n/nls.es.json +541 -541
  5. package/i18n/nls.fr.json +541 -541
  6. package/i18n/nls.hu.json +541 -541
  7. package/i18n/nls.it.json +541 -541
  8. package/i18n/nls.ja.json +541 -541
  9. package/i18n/nls.json +541 -541
  10. package/i18n/nls.pl.json +541 -541
  11. package/i18n/nls.pt-br.json +541 -541
  12. package/i18n/nls.pt-pt.json +541 -541
  13. package/i18n/nls.ru.json +541 -541
  14. package/i18n/nls.zh-cn.json +541 -541
  15. package/lib/browser/about-dialog.d.ts +33 -33
  16. package/lib/browser/about-dialog.js +125 -125
  17. package/lib/browser/authentication-service.d.ts +144 -144
  18. package/lib/browser/authentication-service.js +324 -324
  19. package/lib/browser/breadcrumbs/breadcrumb-popup-container.d.ts +34 -34
  20. package/lib/browser/breadcrumbs/breadcrumb-popup-container.js +106 -106
  21. package/lib/browser/breadcrumbs/breadcrumb-renderer.d.ts +12 -12
  22. package/lib/browser/breadcrumbs/breadcrumb-renderer.js +37 -37
  23. package/lib/browser/breadcrumbs/breadcrumbs-constants.d.ts +49 -49
  24. package/lib/browser/breadcrumbs/breadcrumbs-constants.js +27 -27
  25. package/lib/browser/breadcrumbs/breadcrumbs-renderer.d.ts +43 -43
  26. package/lib/browser/breadcrumbs/breadcrumbs-renderer.js +179 -179
  27. package/lib/browser/breadcrumbs/breadcrumbs-service.d.ts +32 -32
  28. package/lib/browser/breadcrumbs/breadcrumbs-service.js +111 -111
  29. package/lib/browser/breadcrumbs/index.d.ts +5 -5
  30. package/lib/browser/breadcrumbs/index.js +23 -23
  31. package/lib/browser/browser-clipboard-service.d.ts +23 -23
  32. package/lib/browser/browser-clipboard-service.js +107 -107
  33. package/lib/browser/browser.d.ts +37 -37
  34. package/lib/browser/browser.js +196 -196
  35. package/lib/browser/clipboard-service.d.ts +6 -6
  36. package/lib/browser/clipboard-service.js +19 -19
  37. package/lib/browser/color-application-contribution.d.ts +26 -26
  38. package/lib/browser/color-application-contribution.js +110 -110
  39. package/lib/browser/color-registry.d.ts +14 -14
  40. package/lib/browser/color-registry.js +58 -58
  41. package/lib/browser/command-open-handler.d.ts +9 -9
  42. package/lib/browser/command-open-handler.js +58 -58
  43. package/lib/browser/common-frontend-contribution.d.ts +212 -212
  44. package/lib/browser/common-frontend-contribution.js +2338 -2338
  45. package/lib/browser/common-styling-participants.d.ts +27 -27
  46. package/lib/browser/common-styling-participants.js +365 -365
  47. package/lib/browser/connection-status-service.d.ts +77 -77
  48. package/lib/browser/connection-status-service.js +198 -198
  49. package/lib/browser/connection-status-service.spec.d.ts +1 -1
  50. package/lib/browser/connection-status-service.spec.js +161 -161
  51. package/lib/browser/context-key-service.d.ts +82 -82
  52. package/lib/browser/context-key-service.js +83 -83
  53. package/lib/browser/context-menu-renderer.d.ts +54 -54
  54. package/lib/browser/context-menu-renderer.js +87 -87
  55. package/lib/browser/core-preferences.d.ts +37 -37
  56. package/lib/browser/core-preferences.js +300 -300
  57. package/lib/browser/credentials-service.d.ts +35 -35
  58. package/lib/browser/credentials-service.js +80 -80
  59. package/lib/browser/decoration-style.d.ts +6 -6
  60. package/lib/browser/decoration-style.js +64 -64
  61. package/lib/browser/decorations-service.d.ts +30 -30
  62. package/lib/browser/decorations-service.js +157 -157
  63. package/lib/browser/dialogs/react-dialog.d.ts +17 -17
  64. package/lib/browser/dialogs/react-dialog.js +49 -49
  65. package/lib/browser/dialogs.d.ts +135 -135
  66. package/lib/browser/dialogs.js +446 -446
  67. package/lib/browser/diff-uris.d.ts +17 -17
  68. package/lib/browser/diff-uris.js +115 -115
  69. package/lib/browser/encoding-registry.d.ts +18 -18
  70. package/lib/browser/encoding-registry.js +88 -88
  71. package/lib/browser/endpoint.d.ts +42 -42
  72. package/lib/browser/endpoint.js +120 -120
  73. package/lib/browser/endpoint.spec.d.ts +1 -1
  74. package/lib/browser/endpoint.spec.js +122 -122
  75. package/lib/browser/external-uri-service.d.ts +24 -24
  76. package/lib/browser/external-uri-service.js +72 -72
  77. package/lib/browser/frontend-application-bindings.d.ts +5 -5
  78. package/lib/browser/frontend-application-bindings.js +56 -56
  79. package/lib/browser/frontend-application-config-provider.d.ts +8 -8
  80. package/lib/browser/frontend-application-config-provider.js +46 -46
  81. package/lib/browser/frontend-application-config-provider.spec.d.ts +1 -1
  82. package/lib/browser/frontend-application-config-provider.spec.js +40 -40
  83. package/lib/browser/frontend-application-contribution.d.ts +75 -75
  84. package/lib/browser/frontend-application-contribution.js +45 -45
  85. package/lib/browser/frontend-application-module.d.ts +8 -8
  86. package/lib/browser/frontend-application-module.js +355 -355
  87. package/lib/browser/frontend-application-state.d.ts +19 -19
  88. package/lib/browser/frontend-application-state.js +71 -71
  89. package/lib/browser/frontend-application.d.ts +86 -86
  90. package/lib/browser/frontend-application.js +308 -308
  91. package/lib/browser/hover-service.d.ts +50 -50
  92. package/lib/browser/hover-service.js +199 -199
  93. package/lib/browser/http-open-handler.d.ts +14 -14
  94. package/lib/browser/http-open-handler.js +46 -46
  95. package/lib/browser/i18n/i18n-frontend-module.d.ts +3 -3
  96. package/lib/browser/i18n/i18n-frontend-module.js +25 -25
  97. package/lib/browser/i18n/language-quick-pick-service.d.ts +15 -15
  98. package/lib/browser/i18n/language-quick-pick-service.js +136 -136
  99. package/lib/browser/icon-registry.d.ts +56 -56
  100. package/lib/browser/icon-registry.js +24 -24
  101. package/lib/browser/icon-theme-contribution.d.ts +23 -23
  102. package/lib/browser/icon-theme-contribution.js +64 -64
  103. package/lib/browser/icon-theme-service.d.ts +63 -63
  104. package/lib/browser/icon-theme-service.js +198 -198
  105. package/lib/browser/index.d.ts +31 -31
  106. package/lib/browser/index.js +49 -49
  107. package/lib/browser/json-schema-store.d.ts +37 -37
  108. package/lib/browser/json-schema-store.js +111 -111
  109. package/lib/browser/keybinding.d.ts +288 -288
  110. package/lib/browser/keybinding.js +677 -677
  111. package/lib/browser/keybinding.js.map +1 -1
  112. package/lib/browser/keybinding.spec.d.ts +1 -1
  113. package/lib/browser/keybinding.spec.js +451 -451
  114. package/lib/browser/keyboard/browser-keyboard-frontend-contribution.d.ts +13 -13
  115. package/lib/browser/keyboard/browser-keyboard-frontend-contribution.js +110 -110
  116. package/lib/browser/keyboard/browser-keyboard-layout-provider.d.ts +91 -91
  117. package/lib/browser/keyboard/browser-keyboard-layout-provider.js +418 -418
  118. package/lib/browser/keyboard/browser-keyboard-layout-provider.spec.d.ts +1 -1
  119. package/lib/browser/keyboard/browser-keyboard-layout-provider.spec.js +152 -152
  120. package/lib/browser/keyboard/browser-keyboard-module.d.ts +3 -3
  121. package/lib/browser/keyboard/browser-keyboard-module.js +30 -30
  122. package/lib/browser/keyboard/index.d.ts +4 -4
  123. package/lib/browser/keyboard/index.js +22 -22
  124. package/lib/browser/keyboard/keyboard-layout-service.d.ts +49 -49
  125. package/lib/browser/keyboard/keyboard-layout-service.js +427 -427
  126. package/lib/browser/keyboard/keyboard-layout-service.spec.d.ts +1 -1
  127. package/lib/browser/keyboard/keyboard-layout-service.spec.js +110 -110
  128. package/lib/browser/keyboard/keys.d.ts +4 -4
  129. package/lib/browser/keyboard/keys.js +22 -22
  130. package/lib/browser/keyboard/keys.spec.d.ts +1 -1
  131. package/lib/browser/keyboard/keys.spec.js +205 -205
  132. package/lib/browser/keys.d.ts +2 -2
  133. package/lib/browser/keys.js +28 -28
  134. package/lib/browser/label-parser.d.ts +34 -34
  135. package/lib/browser/label-parser.js +107 -107
  136. package/lib/browser/label-parser.spec.d.ts +1 -1
  137. package/lib/browser/label-parser.spec.js +146 -146
  138. package/lib/browser/label-provider.d.ts +140 -140
  139. package/lib/browser/label-provider.js +310 -310
  140. package/lib/browser/label-provider.spec.d.ts +1 -1
  141. package/lib/browser/label-provider.spec.js +53 -53
  142. package/lib/browser/language-icon-provider.d.ts +14 -14
  143. package/lib/browser/language-icon-provider.js +65 -65
  144. package/lib/browser/language-service.d.ts +38 -38
  145. package/lib/browser/language-service.js +66 -66
  146. package/lib/browser/logger-frontend-module.d.ts +2 -2
  147. package/lib/browser/logger-frontend-module.js +63 -63
  148. package/lib/browser/markdown-rendering/markdown-renderer.d.ts +39 -39
  149. package/lib/browser/markdown-rendering/markdown-renderer.js +72 -72
  150. package/lib/browser/menu/browser-context-menu-renderer.d.ts +12 -12
  151. package/lib/browser/menu/browser-context-menu-renderer.js +51 -51
  152. package/lib/browser/menu/browser-menu-module.d.ts +3 -3
  153. package/lib/browser/menu/browser-menu-module.js +28 -28
  154. package/lib/browser/menu/browser-menu-plugin.d.ts +103 -103
  155. package/lib/browser/menu/browser-menu-plugin.js +439 -439
  156. package/lib/browser/menu/context-menu-context.d.ts +7 -7
  157. package/lib/browser/menu/context-menu-context.js +42 -42
  158. package/lib/browser/messaging/connection-source.d.ts +8 -8
  159. package/lib/browser/messaging/connection-source.js +19 -19
  160. package/lib/browser/messaging/frontend-id-provider.d.ts +12 -12
  161. package/lib/browser/messaging/frontend-id-provider.js +34 -34
  162. package/lib/browser/messaging/index.d.ts +1 -1
  163. package/lib/browser/messaging/index.js +19 -19
  164. package/lib/browser/messaging/messaging-frontend-module.d.ts +2 -2
  165. package/lib/browser/messaging/messaging-frontend-module.js +41 -41
  166. package/lib/browser/messaging/service-connection-provider.d.ts +47 -47
  167. package/lib/browser/messaging/service-connection-provider.js +106 -106
  168. package/lib/browser/messaging/ws-connection-provider.d.ts +12 -12
  169. package/lib/browser/messaging/ws-connection-provider.js +49 -49
  170. package/lib/browser/messaging/ws-connection-source.d.ts +42 -42
  171. package/lib/browser/messaging/ws-connection-source.js +217 -217
  172. package/lib/browser/mime-service.d.ts +7 -7
  173. package/lib/browser/mime-service.js +30 -30
  174. package/lib/browser/navigatable-types.d.ts +33 -33
  175. package/lib/browser/navigatable-types.js +63 -63
  176. package/lib/browser/navigatable.d.ts +8 -8
  177. package/lib/browser/navigatable.js +38 -38
  178. package/lib/browser/opener-service.d.ts +79 -79
  179. package/lib/browser/opener-service.js +79 -79
  180. package/lib/browser/opener-service.spec.d.ts +1 -1
  181. package/lib/browser/opener-service.spec.js +46 -46
  182. package/lib/browser/performance/frontend-stopwatch.d.ts +20 -20
  183. package/lib/browser/performance/frontend-stopwatch.js +66 -66
  184. package/lib/browser/performance/index.d.ts +2 -2
  185. package/lib/browser/performance/index.js +20 -20
  186. package/lib/browser/performance/measurement-frontend-bindings.d.ts +19 -19
  187. package/lib/browser/performance/measurement-frontend-bindings.js +32 -32
  188. package/lib/browser/preferences/index.d.ts +7 -7
  189. package/lib/browser/preferences/index.js +25 -25
  190. package/lib/browser/preferences/injectable-preference-proxy.d.ts +51 -51
  191. package/lib/browser/preferences/injectable-preference-proxy.js +276 -276
  192. package/lib/browser/preferences/preference-configurations.d.ts +22 -22
  193. package/lib/browser/preferences/preference-configurations.js +72 -72
  194. package/lib/browser/preferences/preference-contribution.d.ts +111 -111
  195. package/lib/browser/preferences/preference-contribution.js +386 -386
  196. package/lib/browser/preferences/preference-language-override-service.d.ts +39 -39
  197. package/lib/browser/preferences/preference-language-override-service.js +107 -107
  198. package/lib/browser/preferences/preference-provider.d.ts +132 -132
  199. package/lib/browser/preferences/preference-provider.js +219 -219
  200. package/lib/browser/preferences/preference-provider.spec.d.ts +1 -1
  201. package/lib/browser/preferences/preference-provider.spec.js +33 -33
  202. package/lib/browser/preferences/preference-proxy.d.ts +150 -150
  203. package/lib/browser/preferences/preference-proxy.js +229 -229
  204. package/lib/browser/preferences/preference-proxy.spec.d.ts +1 -1
  205. package/lib/browser/preferences/preference-proxy.spec.js +337 -337
  206. package/lib/browser/preferences/preference-schema-provider.spec.d.ts +1 -1
  207. package/lib/browser/preferences/preference-schema-provider.spec.js +115 -115
  208. package/lib/browser/preferences/preference-scope.d.ts +2 -2
  209. package/lib/browser/preferences/preference-scope.js +20 -20
  210. package/lib/browser/preferences/preference-service.d.ts +278 -278
  211. package/lib/browser/preferences/preference-service.js +350 -350
  212. package/lib/browser/preferences/preference-service.spec.d.ts +1 -1
  213. package/lib/browser/preferences/preference-service.spec.js +505 -505
  214. package/lib/browser/preferences/preference-validation-service.d.ts +57 -57
  215. package/lib/browser/preferences/preference-validation-service.js +346 -346
  216. package/lib/browser/preferences/preference-validation-service.spec.d.ts +1 -1
  217. package/lib/browser/preferences/preference-validation-service.spec.js +330 -330
  218. package/lib/browser/preferences/test/index.d.ts +3 -3
  219. package/lib/browser/preferences/test/index.js +21 -21
  220. package/lib/browser/preferences/test/mock-preference-provider.d.ts +16 -16
  221. package/lib/browser/preferences/test/mock-preference-provider.js +46 -46
  222. package/lib/browser/preferences/test/mock-preference-proxy.d.ts +3 -3
  223. package/lib/browser/preferences/test/mock-preference-proxy.js +49 -49
  224. package/lib/browser/preferences/test/mock-preference-service.d.ts +28 -28
  225. package/lib/browser/preferences/test/mock-preference-service.js +59 -59
  226. package/lib/browser/preload/i18n-preload-contribution.d.ts +6 -6
  227. package/lib/browser/preload/i18n-preload-contribution.js +54 -54
  228. package/lib/browser/preload/os-preload-contribution.d.ts +6 -6
  229. package/lib/browser/preload/os-preload-contribution.js +40 -40
  230. package/lib/browser/preload/preload-module.d.ts +3 -3
  231. package/lib/browser/preload/preload-module.js +38 -38
  232. package/lib/browser/preload/preloader.d.ts +11 -11
  233. package/lib/browser/preload/preloader.js +36 -36
  234. package/lib/browser/preload/theme-preload-contribution.d.ts +4 -4
  235. package/lib/browser/preload/theme-preload-contribution.js +34 -34
  236. package/lib/browser/progress-bar-factory.d.ts +11 -11
  237. package/lib/browser/progress-bar-factory.js +20 -20
  238. package/lib/browser/progress-bar.d.ts +15 -15
  239. package/lib/browser/progress-bar.js +81 -81
  240. package/lib/browser/progress-client.d.ts +12 -12
  241. package/lib/browser/progress-client.js +53 -53
  242. package/lib/browser/progress-location-service.d.ts +21 -21
  243. package/lib/browser/progress-location-service.js +91 -91
  244. package/lib/browser/progress-location-service.spec.d.ts +1 -1
  245. package/lib/browser/progress-location-service.spec.js +44 -44
  246. package/lib/browser/progress-status-bar-item.d.ts +16 -16
  247. package/lib/browser/progress-status-bar-item.js +81 -81
  248. package/lib/browser/quick-input/index.d.ts +8 -8
  249. package/lib/browser/quick-input/index.js +26 -26
  250. package/lib/browser/quick-input/quick-access.d.ts +53 -53
  251. package/lib/browser/quick-input/quick-access.js +20 -20
  252. package/lib/browser/quick-input/quick-command-frontend-contribution.d.ts +11 -11
  253. package/lib/browser/quick-input/quick-command-frontend-contribution.js +96 -96
  254. package/lib/browser/quick-input/quick-command-service.d.ts +59 -59
  255. package/lib/browser/quick-input/quick-command-service.js +225 -225
  256. package/lib/browser/quick-input/quick-help-service.d.ts +11 -11
  257. package/lib/browser/quick-input/quick-help-service.js +83 -83
  258. package/lib/browser/quick-input/quick-input-frontend-contribution.d.ts +7 -7
  259. package/lib/browser/quick-input/quick-input-frontend-contribution.js +38 -38
  260. package/lib/browser/quick-input/quick-input-service.d.ts +1 -1
  261. package/lib/browser/quick-input/quick-input-service.js +19 -19
  262. package/lib/browser/quick-input/quick-input-service.spec.d.ts +1 -1
  263. package/lib/browser/quick-input/quick-input-service.spec.js +159 -159
  264. package/lib/browser/quick-input/quick-pick-service-impl.d.ts +30 -30
  265. package/lib/browser/quick-input/quick-pick-service-impl.js +69 -69
  266. package/lib/browser/quick-input/quick-view-service.d.ts +23 -23
  267. package/lib/browser/quick-input/quick-view-service.js +78 -78
  268. package/lib/browser/request/browser-request-module.d.ts +18 -18
  269. package/lib/browser/request/browser-request-module.js +23 -23
  270. package/lib/browser/request/browser-request-service.d.ts +41 -41
  271. package/lib/browser/request/browser-request-service.js +172 -172
  272. package/lib/browser/resource-context-key.d.ts +19 -19
  273. package/lib/browser/resource-context-key.js +75 -75
  274. package/lib/browser/save-resource-service.d.ts +35 -35
  275. package/lib/browser/save-resource-service.js +64 -64
  276. package/lib/browser/saveable.d.ts +124 -124
  277. package/lib/browser/saveable.js +274 -274
  278. package/lib/browser/secondary-window-handler.d.ts +65 -65
  279. package/lib/browser/secondary-window-handler.js +193 -193
  280. package/lib/browser/shell/additional-views-menu-widget.d.ts +19 -19
  281. package/lib/browser/shell/additional-views-menu-widget.js +73 -73
  282. package/lib/browser/shell/application-shell-mouse-tracker.d.ts +30 -30
  283. package/lib/browser/shell/application-shell-mouse-tracker.js +99 -99
  284. package/lib/browser/shell/application-shell.d.ts +574 -574
  285. package/lib/browser/shell/application-shell.js +1992 -1992
  286. package/lib/browser/shell/current-widget-command-adapter.d.ts +23 -23
  287. package/lib/browser/shell/current-widget-command-adapter.js +41 -41
  288. package/lib/browser/shell/index.d.ts +7 -7
  289. package/lib/browser/shell/index.js +25 -25
  290. package/lib/browser/shell/shell-layout-restorer.d.ts +123 -123
  291. package/lib/browser/shell/shell-layout-restorer.js +336 -336
  292. package/lib/browser/shell/side-panel-handler.d.ts +286 -286
  293. package/lib/browser/shell/side-panel-handler.js +659 -659
  294. package/lib/browser/shell/side-panel-toolbar.d.ts +25 -25
  295. package/lib/browser/shell/side-panel-toolbar.js +96 -96
  296. package/lib/browser/shell/sidebar-bottom-menu-widget.d.ts +9 -9
  297. package/lib/browser/shell/sidebar-bottom-menu-widget.js +41 -41
  298. package/lib/browser/shell/sidebar-menu-widget.d.ts +38 -38
  299. package/lib/browser/shell/sidebar-menu-widget.js +113 -113
  300. package/lib/browser/shell/sidebar-top-menu-widget.d.ts +6 -6
  301. package/lib/browser/shell/sidebar-top-menu-widget.js +30 -30
  302. package/lib/browser/shell/split-panels.d.ts +42 -42
  303. package/lib/browser/shell/split-panels.js +172 -172
  304. package/lib/browser/shell/tab-bar-decorator.d.ts +40 -40
  305. package/lib/browser/shell/tab-bar-decorator.js +87 -87
  306. package/lib/browser/shell/tab-bar-toolbar/index.d.ts +3 -3
  307. package/lib/browser/shell/tab-bar-toolbar/index.js +21 -21
  308. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.d.ts +15 -15
  309. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js +35 -35
  310. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.d.ts +95 -95
  311. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.js +245 -245
  312. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.d.ts +136 -136
  313. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.js +88 -88
  314. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.d.ts +89 -89
  315. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js +414 -414
  316. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.spec.d.ts +1 -1
  317. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.spec.js +51 -51
  318. package/lib/browser/shell/tab-bars.d.ts +341 -341
  319. package/lib/browser/shell/tab-bars.js +1312 -1312
  320. package/lib/browser/shell/tab-bars.spec.d.ts +1 -1
  321. package/lib/browser/shell/tab-bars.spec.js +56 -56
  322. package/lib/browser/shell/theia-dock-panel.d.ts +59 -59
  323. package/lib/browser/shell/theia-dock-panel.js +226 -226
  324. package/lib/browser/shell/view-contribution.d.ts +43 -43
  325. package/lib/browser/shell/view-contribution.js +159 -159
  326. package/lib/browser/source-tree/index.d.ts +3 -3
  327. package/lib/browser/source-tree/index.js +21 -21
  328. package/lib/browser/source-tree/source-tree-widget.d.ts +21 -21
  329. package/lib/browser/source-tree/source-tree-widget.js +110 -110
  330. package/lib/browser/source-tree/source-tree.d.ts +36 -36
  331. package/lib/browser/source-tree/source-tree.js +129 -129
  332. package/lib/browser/source-tree/tree-source.d.ts +35 -35
  333. package/lib/browser/source-tree/tree-source.js +53 -53
  334. package/lib/browser/status-bar/index.d.ts +5 -5
  335. package/lib/browser/status-bar/index.js +31 -31
  336. package/lib/browser/status-bar/status-bar-types.d.ts +72 -72
  337. package/lib/browser/status-bar/status-bar-types.js +25 -25
  338. package/lib/browser/status-bar/status-bar-view-model.d.ts +35 -35
  339. package/lib/browser/status-bar/status-bar-view-model.js +207 -207
  340. package/lib/browser/status-bar/status-bar.d.ts +34 -34
  341. package/lib/browser/status-bar/status-bar.js +181 -181
  342. package/lib/browser/storage-service.d.ts +35 -35
  343. package/lib/browser/storage-service.js +122 -122
  344. package/lib/browser/storage-service.spec.d.ts +1 -1
  345. package/lib/browser/storage-service.spec.js +68 -68
  346. package/lib/browser/styling-service.d.ts +29 -29
  347. package/lib/browser/styling-service.js +86 -86
  348. package/lib/browser/supported-encodings.d.ts +9 -9
  349. package/lib/browser/supported-encodings.js +263 -263
  350. package/lib/browser/test/jsdom.d.ts +8 -8
  351. package/lib/browser/test/jsdom.js +69 -69
  352. package/lib/browser/test/mock-connection-status-service.d.ts +5 -5
  353. package/lib/browser/test/mock-connection-status-service.js +32 -32
  354. package/lib/browser/test/mock-env-variables-server.d.ts +12 -12
  355. package/lib/browser/test/mock-env-variables-server.js +42 -42
  356. package/lib/browser/test/mock-opener-service.d.ts +8 -8
  357. package/lib/browser/test/mock-opener-service.js +35 -35
  358. package/lib/browser/test/mock-storage-service.d.ts +11 -11
  359. package/lib/browser/test/mock-storage-service.js +49 -49
  360. package/lib/browser/theming.d.ts +50 -50
  361. package/lib/browser/theming.js +203 -203
  362. package/lib/browser/tooltip-service.d.ts +34 -34
  363. package/lib/browser/tooltip-service.js +76 -76
  364. package/lib/browser/tree/fuzzy-search.d.ts +60 -60
  365. package/lib/browser/tree/fuzzy-search.js +75 -75
  366. package/lib/browser/tree/fuzzy-search.spec.d.ts +1 -1
  367. package/lib/browser/tree/fuzzy-search.spec.js +89 -89
  368. package/lib/browser/tree/index.d.ts +13 -13
  369. package/lib/browser/tree/index.js +31 -31
  370. package/lib/browser/tree/search-box-debounce.d.ts +33 -33
  371. package/lib/browser/tree/search-box-debounce.js +75 -75
  372. package/lib/browser/tree/search-box.d.ts +105 -105
  373. package/lib/browser/tree/search-box.js +265 -265
  374. package/lib/browser/tree/test/mock-selectable-tree-model.d.ts +14 -14
  375. package/lib/browser/tree/test/mock-selectable-tree-model.js +102 -102
  376. package/lib/browser/tree/test/mock-tree-model.d.ts +12 -12
  377. package/lib/browser/tree/test/mock-tree-model.js +129 -129
  378. package/lib/browser/tree/test/tree-test-container.d.ts +2 -2
  379. package/lib/browser/tree/test/tree-test-container.js +52 -52
  380. package/lib/browser/tree/tree-compression/compressed-tree-expansion-service.d.ts +8 -8
  381. package/lib/browser/tree/tree-compression/compressed-tree-expansion-service.js +59 -59
  382. package/lib/browser/tree/tree-compression/compressed-tree-model.d.ts +23 -23
  383. package/lib/browser/tree/tree-compression/compressed-tree-model.js +89 -89
  384. package/lib/browser/tree/tree-compression/compressed-tree-widget.d.ts +38 -38
  385. package/lib/browser/tree/tree-compression/compressed-tree-widget.js +187 -187
  386. package/lib/browser/tree/tree-compression/index.d.ts +4 -4
  387. package/lib/browser/tree/tree-compression/index.js +22 -22
  388. package/lib/browser/tree/tree-compression/tree-compression-service.d.ts +58 -58
  389. package/lib/browser/tree/tree-compression/tree-compression-service.js +98 -98
  390. package/lib/browser/tree/tree-consistency.spec.d.ts +1 -1
  391. package/lib/browser/tree/tree-consistency.spec.js +99 -99
  392. package/lib/browser/tree/tree-container.d.ts +51 -51
  393. package/lib/browser/tree/tree-container.js +115 -115
  394. package/lib/browser/tree/tree-container.spec.d.ts +1 -1
  395. package/lib/browser/tree/tree-container.spec.js +45 -45
  396. package/lib/browser/tree/tree-decorator.d.ts +143 -143
  397. package/lib/browser/tree/tree-decorator.js +115 -115
  398. package/lib/browser/tree/tree-decorator.spec.d.ts +1 -1
  399. package/lib/browser/tree/tree-decorator.spec.js +145 -145
  400. package/lib/browser/tree/tree-expansion.d.ts +65 -65
  401. package/lib/browser/tree/tree-expansion.js +124 -124
  402. package/lib/browser/tree/tree-expansion.spec.d.ts +1 -1
  403. package/lib/browser/tree/tree-expansion.spec.js +155 -155
  404. package/lib/browser/tree/tree-focus-service.d.ts +19 -19
  405. package/lib/browser/tree/tree-focus-service.js +53 -53
  406. package/lib/browser/tree/tree-iterator.d.ts +94 -94
  407. package/lib/browser/tree/tree-iterator.js +223 -223
  408. package/lib/browser/tree/tree-iterator.spec.d.ts +1 -1
  409. package/lib/browser/tree/tree-iterator.spec.js +150 -150
  410. package/lib/browser/tree/tree-label-provider.d.ts +8 -8
  411. package/lib/browser/tree/tree-label-provider.js +39 -39
  412. package/lib/browser/tree/tree-model.d.ts +202 -202
  413. package/lib/browser/tree/tree-model.js +395 -395
  414. package/lib/browser/tree/tree-navigation.d.ts +10 -10
  415. package/lib/browser/tree/tree-navigation.js +57 -57
  416. package/lib/browser/tree/tree-preference.d.ts +10 -10
  417. package/lib/browser/tree/tree-preference.js +46 -46
  418. package/lib/browser/tree/tree-search.d.ts +36 -36
  419. package/lib/browser/tree/tree-search.js +130 -130
  420. package/lib/browser/tree/tree-selectable.spec.d.ts +1 -1
  421. package/lib/browser/tree/tree-selectable.spec.js +146 -146
  422. package/lib/browser/tree/tree-selection-impl.d.ts +44 -44
  423. package/lib/browser/tree/tree-selection-impl.js +158 -158
  424. package/lib/browser/tree/tree-selection-state.d.ts +48 -48
  425. package/lib/browser/tree/tree-selection-state.js +227 -227
  426. package/lib/browser/tree/tree-selection-state.spec.d.ts +1 -1
  427. package/lib/browser/tree/tree-selection-state.spec.js +420 -420
  428. package/lib/browser/tree/tree-selection.d.ts +86 -86
  429. package/lib/browser/tree/tree-selection.js +86 -86
  430. package/lib/browser/tree/tree-view-welcome-widget.d.ts +45 -45
  431. package/lib/browser/tree/tree-view-welcome-widget.js +192 -192
  432. package/lib/browser/tree/tree-widget-selection.d.ts +11 -11
  433. package/lib/browser/tree/tree-widget-selection.js +46 -46
  434. package/lib/browser/tree/tree-widget.d.ts +559 -559
  435. package/lib/browser/tree/tree-widget.js +1352 -1352
  436. package/lib/browser/tree/tree.d.ts +180 -180
  437. package/lib/browser/tree/tree.js +288 -288
  438. package/lib/browser/tree/tree.spec.d.ts +1 -1
  439. package/lib/browser/tree/tree.spec.js +226 -226
  440. package/lib/browser/user-working-directory-provider.d.ts +23 -23
  441. package/lib/browser/user-working-directory-provider.js +76 -76
  442. package/lib/browser/view-container.d.ts +312 -312
  443. package/lib/browser/view-container.js +1458 -1458
  444. package/lib/browser/widget-decoration.d.ts +299 -299
  445. package/lib/browser/widget-decoration.js +140 -140
  446. package/lib/browser/widget-manager.d.ts +172 -172
  447. package/lib/browser/widget-manager.js +222 -222
  448. package/lib/browser/widget-manager.spec.d.ts +1 -1
  449. package/lib/browser/widget-manager.spec.js +91 -91
  450. package/lib/browser/widget-open-handler.d.ts +88 -88
  451. package/lib/browser/widget-open-handler.js +137 -137
  452. package/lib/browser/widgets/alert-message.d.ts +23 -23
  453. package/lib/browser/widgets/alert-message.js +38 -38
  454. package/lib/browser/widgets/enhanced-preview-widget.d.ts +6 -6
  455. package/lib/browser/widgets/enhanced-preview-widget.js +26 -26
  456. package/lib/browser/widgets/extractable-widget.d.ts +13 -13
  457. package/lib/browser/widgets/extractable-widget.js +26 -26
  458. package/lib/browser/widgets/index.d.ts +4 -4
  459. package/lib/browser/widgets/index.js +22 -22
  460. package/lib/browser/widgets/previewable-widget.d.ts +8 -8
  461. package/lib/browser/widgets/previewable-widget.js +30 -30
  462. package/lib/browser/widgets/react-renderer.d.ts +14 -14
  463. package/lib/browser/widgets/react-renderer.js +48 -48
  464. package/lib/browser/widgets/react-widget.d.ts +16 -16
  465. package/lib/browser/widgets/react-widget.js +46 -46
  466. package/lib/browser/widgets/select-component.d.ts +53 -53
  467. package/lib/browser/widgets/select-component.js +307 -307
  468. package/lib/browser/widgets/widget.d.ts +108 -108
  469. package/lib/browser/widgets/widget.js +367 -367
  470. package/lib/browser/window/browser-window-module.d.ts +3 -3
  471. package/lib/browser/window/browser-window-module.js +32 -32
  472. package/lib/browser/window/default-secondary-window-service.d.ts +25 -25
  473. package/lib/browser/window/default-secondary-window-service.js +187 -187
  474. package/lib/browser/window/default-window-service.d.ts +50 -50
  475. package/lib/browser/window/default-window-service.js +167 -167
  476. package/lib/browser/window/default-window-service.spec.d.ts +1 -1
  477. package/lib/browser/window/default-window-service.spec.js +80 -80
  478. package/lib/browser/window/secondary-window-service.d.ts +20 -20
  479. package/lib/browser/window/secondary-window-service.js +19 -19
  480. package/lib/browser/window/test/mock-window-service.d.ts +11 -11
  481. package/lib/browser/window/test/mock-window-service.js +34 -34
  482. package/lib/browser/window/window-service.d.ts +53 -53
  483. package/lib/browser/window/window-service.js +22 -22
  484. package/lib/browser/window/window-title-service.d.ts +31 -31
  485. package/lib/browser/window/window-title-service.js +112 -112
  486. package/lib/browser/window/window-title-updater.d.ts +19 -19
  487. package/lib/browser/window/window-title-updater.js +99 -99
  488. package/lib/browser/window-contribution.d.ts +14 -14
  489. package/lib/browser/window-contribution.js +62 -62
  490. package/lib/browser-only/frontend-only-application-module.d.ts +4 -4
  491. package/lib/browser-only/frontend-only-application-module.js +114 -114
  492. package/lib/browser-only/i18n/i18n-frontend-only-module.d.ts +3 -3
  493. package/lib/browser-only/i18n/i18n-frontend-only-module.js +34 -34
  494. package/lib/browser-only/logger-frontend-only-module.d.ts +2 -2
  495. package/lib/browser-only/logger-frontend-only-module.js +60 -60
  496. package/lib/browser-only/messaging/frontend-only-service-connection-provider.d.ts +13 -13
  497. package/lib/browser-only/messaging/frontend-only-service-connection-provider.js +51 -51
  498. package/lib/browser-only/messaging/messaging-frontend-only-module.d.ts +2 -2
  499. package/lib/browser-only/messaging/messaging-frontend-only-module.js +47 -47
  500. package/lib/browser-only/preload/frontend-only-preload-module.d.ts +3 -3
  501. package/lib/browser-only/preload/frontend-only-preload-module.js +51 -51
  502. package/lib/common/accessibility.d.ts +16 -16
  503. package/lib/common/accessibility.js +17 -17
  504. package/lib/common/application-error.d.ts +20 -20
  505. package/lib/common/application-error.js +62 -62
  506. package/lib/common/application-error.spec.d.ts +1 -1
  507. package/lib/common/application-error.spec.js +26 -26
  508. package/lib/common/application-protocol.d.ts +20 -20
  509. package/lib/common/application-protocol.js +20 -20
  510. package/lib/common/array-utils.d.ts +55 -55
  511. package/lib/common/array-utils.js +118 -118
  512. package/lib/common/buffer.d.ts +43 -43
  513. package/lib/common/buffer.js +205 -205
  514. package/lib/common/cancellation.d.ts +24 -24
  515. package/lib/common/cancellation.js +142 -142
  516. package/lib/common/char-code.d.ts +401 -401
  517. package/lib/common/char-code.js +22 -22
  518. package/lib/common/collections.d.ts +29 -29
  519. package/lib/common/collections.js +121 -121
  520. package/lib/common/color.d.ts +71 -71
  521. package/lib/common/color.js +43 -43
  522. package/lib/common/command.d.ts +232 -232
  523. package/lib/common/command.js +353 -353
  524. package/lib/common/command.spec.d.ts +1 -1
  525. package/lib/common/command.spec.js +173 -173
  526. package/lib/common/contribution-filter/contribution-filter-registry.d.ts +17 -17
  527. package/lib/common/contribution-filter/contribution-filter-registry.js +77 -77
  528. package/lib/common/contribution-filter/contribution-filter.d.ts +41 -41
  529. package/lib/common/contribution-filter/contribution-filter.js +20 -20
  530. package/lib/common/contribution-filter/filter.d.ts +6 -6
  531. package/lib/common/contribution-filter/filter.js +19 -19
  532. package/lib/common/contribution-filter/index.d.ts +3 -3
  533. package/lib/common/contribution-filter/index.js +21 -21
  534. package/lib/common/contribution-provider.d.ts +20 -20
  535. package/lib/common/contribution-provider.js +82 -82
  536. package/lib/common/disposable.d.ts +80 -80
  537. package/lib/common/disposable.js +173 -173
  538. package/lib/common/disposable.spec.d.ts +1 -1
  539. package/lib/common/disposable.spec.js +80 -80
  540. package/lib/common/encoding-service.d.ts +38 -38
  541. package/lib/common/encoding-service.js +302 -302
  542. package/lib/common/encodings.d.ts +7 -7
  543. package/lib/common/encodings.js +25 -25
  544. package/lib/common/env-variables/env-variables-protocol.d.ts +20 -20
  545. package/lib/common/env-variables/env-variables-protocol.js +20 -20
  546. package/lib/common/env-variables/index.d.ts +1 -1
  547. package/lib/common/env-variables/index.js +19 -19
  548. package/lib/common/event.d.ts +115 -115
  549. package/lib/common/event.js +385 -385
  550. package/lib/common/event.spec.d.ts +1 -1
  551. package/lib/common/event.spec.js +29 -29
  552. package/lib/common/file-uri.d.ts +14 -14
  553. package/lib/common/file-uri.js +62 -62
  554. package/lib/common/frontend-application-state.d.ts +15 -15
  555. package/lib/common/frontend-application-state.js +33 -33
  556. package/lib/common/glob.d.ts +50 -50
  557. package/lib/common/glob.js +591 -591
  558. package/lib/common/hash.d.ts +7 -7
  559. package/lib/common/hash.js +84 -84
  560. package/lib/common/i18n/localization-server.d.ts +6 -6
  561. package/lib/common/i18n/localization-server.js +20 -20
  562. package/lib/common/i18n/localization.d.ts +34 -34
  563. package/lib/common/i18n/localization.js +59 -59
  564. package/lib/common/index.d.ts +35 -35
  565. package/lib/common/index.js +56 -56
  566. package/lib/common/json-schema.d.ts +72 -72
  567. package/lib/common/json-schema.js +17 -17
  568. package/lib/common/key-store.d.ts +12 -12
  569. package/lib/common/key-store.js +20 -20
  570. package/lib/common/keybinding.d.ts +75 -75
  571. package/lib/common/keybinding.js +113 -113
  572. package/lib/common/keyboard/keyboard-layout-provider.d.ts +26 -26
  573. package/lib/common/keyboard/keyboard-layout-provider.js +22 -22
  574. package/lib/common/keys.d.ts +253 -253
  575. package/lib/common/keys.js +634 -634
  576. package/lib/common/label-protocol.d.ts +13 -13
  577. package/lib/common/label-protocol.js +17 -17
  578. package/lib/common/logger-protocol.d.ts +41 -41
  579. package/lib/common/logger-protocol.js +100 -100
  580. package/lib/common/logger-watcher.d.ts +9 -9
  581. package/lib/common/logger-watcher.js +49 -49
  582. package/lib/common/logger.d.ts +207 -207
  583. package/lib/common/logger.js +204 -204
  584. package/lib/common/logger.spec.d.ts +1 -1
  585. package/lib/common/logger.spec.js +41 -41
  586. package/lib/common/lsp-types.d.ts +9 -9
  587. package/lib/common/lsp-types.js +30 -30
  588. package/lib/common/markdown-rendering/icon-utilities.d.ts +7 -7
  589. package/lib/common/markdown-rendering/icon-utilities.js +32 -32
  590. package/lib/common/markdown-rendering/index.d.ts +2 -2
  591. package/lib/common/markdown-rendering/index.js +20 -20
  592. package/lib/common/markdown-rendering/markdown-string.d.ts +46 -46
  593. package/lib/common/markdown-rendering/markdown-string.js +126 -126
  594. package/lib/common/menu/action-menu-node.d.ts +19 -19
  595. package/lib/common/menu/action-menu-node.js +56 -56
  596. package/lib/common/menu/composite-menu-node.d.ts +46 -46
  597. package/lib/common/menu/composite-menu-node.js +93 -93
  598. package/lib/common/menu/composite-menu-node.spec.d.ts +1 -1
  599. package/lib/common/menu/composite-menu-node.spec.js +67 -67
  600. package/lib/common/menu/index.d.ts +5 -5
  601. package/lib/common/menu/index.js +23 -23
  602. package/lib/common/menu/menu-adapter.d.ts +35 -35
  603. package/lib/common/menu/menu-adapter.js +92 -92
  604. package/lib/common/menu/menu-model-registry.d.ts +145 -145
  605. package/lib/common/menu/menu-model-registry.js +275 -275
  606. package/lib/common/menu/menu-types.d.ts +148 -148
  607. package/lib/common/menu/menu-types.js +93 -93
  608. package/lib/common/menu/menu.spec.d.ts +1 -1
  609. package/lib/common/menu/menu.spec.js +96 -96
  610. package/lib/common/message-rpc/channel.d.ts +123 -123
  611. package/lib/common/message-rpc/channel.js +230 -230
  612. package/lib/common/message-rpc/channel.spec.d.ts +8 -8
  613. package/lib/common/message-rpc/channel.spec.js +79 -79
  614. package/lib/common/message-rpc/index.d.ts +3 -3
  615. package/lib/common/message-rpc/index.js +24 -24
  616. package/lib/common/message-rpc/message-buffer.d.ts +51 -51
  617. package/lib/common/message-rpc/message-buffer.js +59 -59
  618. package/lib/common/message-rpc/msg-pack-extension-manager.d.ts +22 -22
  619. package/lib/common/message-rpc/msg-pack-extension-manager.js +57 -57
  620. package/lib/common/message-rpc/rpc-message-encoder.d.ts +103 -103
  621. package/lib/common/message-rpc/rpc-message-encoder.js +113 -113
  622. package/lib/common/message-rpc/rpc-message-encoder.spec.d.ts +1 -1
  623. package/lib/common/message-rpc/rpc-message-encoder.spec.js +58 -58
  624. package/lib/common/message-rpc/rpc-protocol.d.ts +67 -67
  625. package/lib/common/message-rpc/rpc-protocol.js +209 -209
  626. package/lib/common/message-rpc/uint8-array-message-buffer.d.ts +52 -52
  627. package/lib/common/message-rpc/uint8-array-message-buffer.js +174 -174
  628. package/lib/common/message-rpc/uint8-array-message-buffer.spec.d.ts +1 -1
  629. package/lib/common/message-rpc/uint8-array-message-buffer.spec.js +38 -38
  630. package/lib/common/message-service-protocol.d.ts +110 -110
  631. package/lib/common/message-service-protocol.js +73 -73
  632. package/lib/common/message-service.d.ts +134 -134
  633. package/lib/common/message-service.js +151 -151
  634. package/lib/common/messaging/connection-error-handler.d.ts +28 -28
  635. package/lib/common/messaging/connection-error-handler.js +47 -47
  636. package/lib/common/messaging/connection-management.d.ts +24 -24
  637. package/lib/common/messaging/connection-management.js +37 -37
  638. package/lib/common/messaging/handler.d.ts +7 -7
  639. package/lib/common/messaging/handler.js +20 -20
  640. package/lib/common/messaging/index.d.ts +3 -3
  641. package/lib/common/messaging/index.js +21 -21
  642. package/lib/common/messaging/proxy-factory.d.ts +180 -180
  643. package/lib/common/messaging/proxy-factory.js +280 -280
  644. package/lib/common/messaging/proxy-factory.spec.d.ts +1 -1
  645. package/lib/common/messaging/proxy-factory.spec.js +99 -99
  646. package/lib/common/messaging/socket-write-buffer.d.ts +10 -10
  647. package/lib/common/messaging/socket-write-buffer.js +49 -49
  648. package/lib/common/messaging/web-socket-channel.d.ts +19 -19
  649. package/lib/common/messaging/web-socket-channel.js +64 -64
  650. package/lib/common/nls.d.ts +15 -15
  651. package/lib/common/nls.js +135 -135
  652. package/lib/common/numbers.d.ts +5 -5
  653. package/lib/common/numbers.js +23 -23
  654. package/lib/common/objects.d.ts +8 -8
  655. package/lib/common/objects.js +118 -118
  656. package/lib/common/objects.spec.d.ts +1 -1
  657. package/lib/common/objects.spec.js +101 -101
  658. package/lib/common/os.d.ts +31 -31
  659. package/lib/common/os.js +73 -73
  660. package/lib/common/path.d.ts +93 -93
  661. package/lib/common/path.js +307 -307
  662. package/lib/common/path.spec.d.ts +1 -1
  663. package/lib/common/path.spec.js +350 -350
  664. package/lib/common/paths.d.ts +24 -24
  665. package/lib/common/paths.js +226 -226
  666. package/lib/common/performance/index.d.ts +3 -3
  667. package/lib/common/performance/index.js +21 -21
  668. package/lib/common/performance/measurement-protocol.d.ts +64 -64
  669. package/lib/common/performance/measurement-protocol.js +70 -70
  670. package/lib/common/performance/measurement.d.ts +111 -111
  671. package/lib/common/performance/measurement.js +17 -17
  672. package/lib/common/performance/stopwatch.d.ts +75 -75
  673. package/lib/common/performance/stopwatch.js +148 -148
  674. package/lib/common/preferences/preference-schema.d.ts +52 -52
  675. package/lib/common/preferences/preference-schema.js +58 -58
  676. package/lib/common/preferences/preference-scope.d.ts +19 -19
  677. package/lib/common/preferences/preference-scope.js +71 -71
  678. package/lib/common/preferences/preference-scope.spec.d.ts +1 -1
  679. package/lib/common/preferences/preference-scope.spec.js +44 -44
  680. package/lib/common/prioritizeable.d.ts +16 -16
  681. package/lib/common/prioritizeable.js +55 -55
  682. package/lib/common/progress-service-protocol.d.ts +13 -13
  683. package/lib/common/progress-service-protocol.js +19 -19
  684. package/lib/common/progress-service.d.ts +13 -13
  685. package/lib/common/progress-service.js +88 -88
  686. package/lib/common/promise-util.d.ts +51 -51
  687. package/lib/common/promise-util.js +132 -132
  688. package/lib/common/promise-util.spec.d.ts +1 -1
  689. package/lib/common/promise-util.spec.js +80 -80
  690. package/lib/common/quick-pick-service.d.ts +270 -270
  691. package/lib/common/quick-pick-service.js +133 -133
  692. package/lib/common/reference.d.ts +95 -95
  693. package/lib/common/reference.js +207 -207
  694. package/lib/common/reference.spec.d.ts +1 -1
  695. package/lib/common/reference.spec.js +125 -125
  696. package/lib/common/resource.d.ts +207 -207
  697. package/lib/common/resource.js +322 -322
  698. package/lib/common/selection-command-handler.d.ts +24 -24
  699. package/lib/common/selection-command-handler.js +83 -83
  700. package/lib/common/selection-service.d.ts +18 -18
  701. package/lib/common/selection-service.js +43 -43
  702. package/lib/common/selection-service.spec.d.ts +1 -1
  703. package/lib/common/selection-service.spec.js +38 -38
  704. package/lib/common/selection.d.ts +9 -9
  705. package/lib/common/selection.js +47 -47
  706. package/lib/common/severity.d.ts +15 -15
  707. package/lib/common/severity.js +113 -113
  708. package/lib/common/stream.d.ts +176 -176
  709. package/lib/common/stream.js +474 -474
  710. package/lib/common/strings.d.ts +24 -24
  711. package/lib/common/strings.js +215 -215
  712. package/lib/common/telemetry.d.ts +19 -19
  713. package/lib/common/telemetry.js +24 -24
  714. package/lib/common/ternary-search-tree.d.ts +50 -50
  715. package/lib/common/ternary-search-tree.js +381 -381
  716. package/lib/common/test/expect.d.ts +2 -2
  717. package/lib/common/test/expect.js +34 -34
  718. package/lib/common/test/mock-logger.d.ts +27 -27
  719. package/lib/common/test/mock-logger.js +99 -99
  720. package/lib/common/test/mock-menu.d.ts +7 -7
  721. package/lib/common/test/mock-menu.js +34 -34
  722. package/lib/common/test/mock-resource-provider.d.ts +6 -6
  723. package/lib/common/test/mock-resource-provider.js +36 -36
  724. package/lib/common/theme.d.ts +40 -40
  725. package/lib/common/theme.js +22 -22
  726. package/lib/common/types.d.ts +58 -58
  727. package/lib/common/types.js +126 -126
  728. package/lib/common/types.spec.d.ts +1 -1
  729. package/lib/common/types.spec.js +73 -73
  730. package/lib/common/uri-command-handler.d.ts +53 -53
  731. package/lib/common/uri-command-handler.js +99 -99
  732. package/lib/common/uri-command-handler.spec.d.ts +1 -1
  733. package/lib/common/uri-command-handler.spec.js +80 -80
  734. package/lib/common/uri.d.ts +87 -87
  735. package/lib/common/uri.js +236 -236
  736. package/lib/common/uri.spec.d.ts +1 -1
  737. package/lib/common/uri.spec.js +230 -230
  738. package/lib/common/uuid.d.ts +8 -8
  739. package/lib/common/uuid.js +44 -44
  740. package/lib/common/version.d.ts +1 -1
  741. package/lib/common/version.js +19 -19
  742. package/lib/common/view-column.d.ts +17 -17
  743. package/lib/common/view-column.js +36 -36
  744. package/lib/common/window.d.ts +16 -16
  745. package/lib/common/window.js +22 -22
  746. package/lib/electron-browser/electron-clipboard-service.d.ts +5 -5
  747. package/lib/electron-browser/electron-clipboard-service.js +33 -33
  748. package/lib/electron-browser/keyboard/electron-keyboard-layout-change-notifier.d.ts +11 -11
  749. package/lib/electron-browser/keyboard/electron-keyboard-layout-change-notifier.js +46 -46
  750. package/lib/electron-browser/keyboard/electron-keyboard-module.d.ts +3 -3
  751. package/lib/electron-browser/keyboard/electron-keyboard-module.js +26 -26
  752. package/lib/electron-browser/menu/electron-context-menu-renderer.d.ts +30 -30
  753. package/lib/electron-browser/menu/electron-context-menu-renderer.js +128 -128
  754. package/lib/electron-browser/menu/electron-main-menu-factory.d.ts +59 -59
  755. package/lib/electron-browser/menu/electron-main-menu-factory.js +274 -274
  756. package/lib/electron-browser/menu/electron-menu-contribution.d.ts +78 -78
  757. package/lib/electron-browser/menu/electron-menu-contribution.js +471 -471
  758. package/lib/electron-browser/menu/electron-menu-module.d.ts +3 -3
  759. package/lib/electron-browser/menu/electron-menu-module.js +39 -39
  760. package/lib/electron-browser/messaging/electron-frontend-id-provider.d.ts +4 -4
  761. package/lib/electron-browser/messaging/electron-frontend-id-provider.js +29 -29
  762. package/lib/electron-browser/messaging/electron-ipc-connection-source.d.ts +23 -23
  763. package/lib/electron-browser/messaging/electron-ipc-connection-source.js +59 -59
  764. package/lib/electron-browser/messaging/electron-local-ws-connection-source.d.ts +6 -6
  765. package/lib/electron-browser/messaging/electron-local-ws-connection-source.js +49 -49
  766. package/lib/electron-browser/messaging/electron-messaging-frontend-module.d.ts +2 -2
  767. package/lib/electron-browser/messaging/electron-messaging-frontend-module.js +75 -75
  768. package/lib/electron-browser/messaging/electron-ws-connection-source.d.ts +11 -11
  769. package/lib/electron-browser/messaging/electron-ws-connection-source.js +42 -42
  770. package/lib/electron-browser/preload.d.ts +1 -1
  771. package/lib/electron-browser/preload.js +201 -201
  772. package/lib/electron-browser/preload.js.map +1 -1
  773. package/lib/electron-browser/request/electron-browser-request-module.d.ts +18 -18
  774. package/lib/electron-browser/request/electron-browser-request-module.js +26 -26
  775. package/lib/electron-browser/token/electron-token-frontend-module.d.ts +3 -3
  776. package/lib/electron-browser/token/electron-token-frontend-module.js +22 -22
  777. package/lib/electron-browser/window/electron-frontend-application-state.d.ts +4 -4
  778. package/lib/electron-browser/window/electron-frontend-application-state.js +31 -31
  779. package/lib/electron-browser/window/electron-secondary-window-service.d.ts +7 -7
  780. package/lib/electron-browser/window/electron-secondary-window-service.js +38 -38
  781. package/lib/electron-browser/window/electron-window-module.d.ts +3 -3
  782. package/lib/electron-browser/window/electron-window-module.js +39 -39
  783. package/lib/electron-browser/window/electron-window-preferences.d.ts +18 -18
  784. package/lib/electron-browser/window/electron-window-preferences.js +72 -72
  785. package/lib/electron-browser/window/electron-window-service.d.ts +31 -31
  786. package/lib/electron-browser/window/electron-window-service.js +116 -116
  787. package/lib/electron-browser/window/electron-window-service.js.map +1 -1
  788. package/lib/electron-common/electron-api.d.ts +104 -104
  789. package/lib/electron-common/electron-api.d.ts.map +1 -1
  790. package/lib/electron-common/electron-api.js +56 -56
  791. package/lib/electron-common/electron-main-window-service.d.ts +7 -7
  792. package/lib/electron-common/electron-main-window-service.js +20 -20
  793. package/lib/electron-common/electron-token.d.ts +10 -10
  794. package/lib/electron-common/electron-token.js +27 -27
  795. package/lib/electron-main/electron-api-main.d.ts +22 -22
  796. package/lib/electron-main/electron-api-main.d.ts.map +1 -1
  797. package/lib/electron-main/electron-api-main.js +296 -294
  798. package/lib/electron-main/electron-api-main.js.map +1 -1
  799. package/lib/electron-main/electron-main-application-module.d.ts +3 -3
  800. package/lib/electron-main/electron-main-application-module.js +56 -56
  801. package/lib/electron-main/electron-main-application.d.ts +159 -159
  802. package/lib/electron-main/electron-main-application.js +603 -603
  803. package/lib/electron-main/electron-main-constants.d.ts +6 -6
  804. package/lib/electron-main/electron-main-constants.js +19 -19
  805. package/lib/electron-main/electron-main-window-service-impl.d.ts +8 -8
  806. package/lib/electron-main/electron-main-window-service-impl.js +46 -46
  807. package/lib/electron-main/electron-security-token-service.d.ts +5 -5
  808. package/lib/electron-main/electron-security-token-service.js +41 -41
  809. package/lib/electron-main/event-utils.d.ts +8 -8
  810. package/lib/electron-main/event-utils.js +33 -33
  811. package/lib/electron-main/messaging/electron-connection-handler.d.ts +5 -5
  812. package/lib/electron-main/messaging/electron-connection-handler.js +23 -23
  813. package/lib/electron-main/messaging/electron-messaging-contribution.d.ts +41 -41
  814. package/lib/electron-main/messaging/electron-messaging-contribution.js +142 -142
  815. package/lib/electron-main/messaging/electron-messaging-service.d.ts +17 -17
  816. package/lib/electron-main/messaging/electron-messaging-service.js +22 -22
  817. package/lib/electron-main/theia-electron-window.d.ts +53 -53
  818. package/lib/electron-main/theia-electron-window.js +186 -186
  819. package/lib/electron-node/hosting/electron-backend-hosting-module.d.ts +3 -3
  820. package/lib/electron-node/hosting/electron-backend-hosting-module.js +24 -24
  821. package/lib/electron-node/hosting/electron-ws-origin-validator.d.ts +8 -8
  822. package/lib/electron-node/hosting/electron-ws-origin-validator.js +40 -40
  823. package/lib/electron-node/keyboard/electron-backend-keyboard-module.d.ts +3 -3
  824. package/lib/electron-node/keyboard/electron-backend-keyboard-module.js +26 -26
  825. package/lib/electron-node/keyboard/electron-keyboard-layout-provider.d.ts +5 -5
  826. package/lib/electron-node/keyboard/electron-keyboard-layout-provider.js +36 -36
  827. package/lib/electron-node/request/electron-backend-request-module.d.ts +18 -18
  828. package/lib/electron-node/request/electron-backend-request-module.js +23 -23
  829. package/lib/electron-node/request/electron-backend-request-service.d.ts +22 -22
  830. package/lib/electron-node/request/electron-backend-request-service.js +81 -81
  831. package/lib/electron-node/token/electron-token-backend-contribution.d.ts +15 -15
  832. package/lib/electron-node/token/electron-token-backend-contribution.js +50 -50
  833. package/lib/electron-node/token/electron-token-backend-module.d.ts +3 -3
  834. package/lib/electron-node/token/electron-token-backend-module.js +28 -28
  835. package/lib/electron-node/token/electron-token-validator.d.ts +29 -29
  836. package/lib/electron-node/token/electron-token-validator.js +95 -95
  837. package/lib/node/application-server.d.ts +10 -10
  838. package/lib/node/application-server.js +55 -55
  839. package/lib/node/backend-application-config-provider.d.ts +7 -7
  840. package/lib/node/backend-application-config-provider.js +45 -45
  841. package/lib/node/backend-application-config-provider.spec.d.ts +1 -1
  842. package/lib/node/backend-application-config-provider.spec.js +28 -28
  843. package/lib/node/backend-application-module.d.ts +2 -2
  844. package/lib/node/backend-application-module.js +108 -108
  845. package/lib/node/backend-application.d.ts +108 -108
  846. package/lib/node/backend-application.js +290 -290
  847. package/lib/node/backend-remote-service.d.ts +3 -3
  848. package/lib/node/backend-remote-service.js +29 -29
  849. package/lib/node/cli.d.ts +17 -17
  850. package/lib/node/cli.js +59 -59
  851. package/lib/node/cli.spec.d.ts +1 -1
  852. package/lib/node/cli.spec.js +89 -89
  853. package/lib/node/console-logger-server.d.ts +15 -15
  854. package/lib/node/console-logger-server.js +82 -82
  855. package/lib/node/console-logger-server.spec.d.ts +1 -1
  856. package/lib/node/console-logger-server.spec.js +61 -61
  857. package/lib/node/debug.d.ts +1 -1
  858. package/lib/node/debug.js +28 -28
  859. package/lib/node/dynamic-require.d.ts +7 -7
  860. package/lib/node/dynamic-require.js +56 -56
  861. package/lib/node/env-variables/env-variables-server.d.ts +23 -23
  862. package/lib/node/env-variables/env-variables-server.js +117 -117
  863. package/lib/node/env-variables/index.d.ts +1 -1
  864. package/lib/node/env-variables/index.js +19 -19
  865. package/lib/node/environment-utils.d.ts +21 -21
  866. package/lib/node/environment-utils.js +72 -72
  867. package/lib/node/environment-utils.spec.d.ts +1 -1
  868. package/lib/node/environment-utils.spec.js +77 -77
  869. package/lib/node/file-uri.spec.d.ts +1 -1
  870. package/lib/node/file-uri.spec.js +66 -66
  871. package/lib/node/filesystem-locking.d.ts +23 -23
  872. package/lib/node/filesystem-locking.js +65 -65
  873. package/lib/node/hosting/backend-application-hosts.d.ts +23 -23
  874. package/lib/node/hosting/backend-application-hosts.js +69 -69
  875. package/lib/node/hosting/backend-hosting-module.d.ts +3 -3
  876. package/lib/node/hosting/backend-hosting-module.js +26 -26
  877. package/lib/node/hosting/ws-origin-validator.d.ts +8 -8
  878. package/lib/node/hosting/ws-origin-validator.js +39 -39
  879. package/lib/node/i18n/i18n-backend-module.d.ts +3 -3
  880. package/lib/node/i18n/i18n-backend-module.js +38 -38
  881. package/lib/node/i18n/localization-contribution.d.ts +18 -18
  882. package/lib/node/i18n/localization-contribution.js +108 -108
  883. package/lib/node/i18n/localization-provider.d.ts +23 -23
  884. package/lib/node/i18n/localization-provider.js +109 -109
  885. package/lib/node/i18n/localization-server.d.ts +14 -14
  886. package/lib/node/i18n/localization-server.js +54 -54
  887. package/lib/node/i18n/theia-localization-contribution.d.ts +4 -4
  888. package/lib/node/i18n/theia-localization-contribution.js +40 -40
  889. package/lib/node/index.d.ts +6 -6
  890. package/lib/node/index.js +26 -26
  891. package/lib/node/key-store-server.d.ts +27 -27
  892. package/lib/node/key-store-server.js +145 -145
  893. package/lib/node/logger-backend-module.d.ts +9 -9
  894. package/lib/node/logger-backend-module.js +78 -78
  895. package/lib/node/logger-cli-contribution.d.ts +33 -33
  896. package/lib/node/logger-cli-contribution.js +147 -147
  897. package/lib/node/logger-cli-contribution.spec.d.ts +1 -1
  898. package/lib/node/logger-cli-contribution.spec.js +207 -207
  899. package/lib/node/main.d.ts +7 -7
  900. package/lib/node/main.js +29 -29
  901. package/lib/node/messaging/binary-message-pipe.d.ts +44 -44
  902. package/lib/node/messaging/binary-message-pipe.js +151 -151
  903. package/lib/node/messaging/connection-container-module.d.ts +53 -53
  904. package/lib/node/messaging/connection-container-module.js +81 -81
  905. package/lib/node/messaging/default-messaging-service.d.ts +28 -28
  906. package/lib/node/messaging/default-messaging-service.js +131 -131
  907. package/lib/node/messaging/frontend-connection-service.d.ts +6 -6
  908. package/lib/node/messaging/frontend-connection-service.js +18 -18
  909. package/lib/node/messaging/index.d.ts +3 -3
  910. package/lib/node/messaging/index.js +21 -21
  911. package/lib/node/messaging/ipc-bootstrap.d.ts +1 -1
  912. package/lib/node/messaging/ipc-bootstrap.js +24 -24
  913. package/lib/node/messaging/ipc-channel.d.ts +17 -17
  914. package/lib/node/messaging/ipc-channel.js +69 -69
  915. package/lib/node/messaging/ipc-connection-provider.d.ts +21 -21
  916. package/lib/node/messaging/ipc-connection-provider.js +92 -92
  917. package/lib/node/messaging/ipc-protocol.d.ts +19 -19
  918. package/lib/node/messaging/ipc-protocol.js +68 -68
  919. package/lib/node/messaging/messaging-backend-module.d.ts +2 -2
  920. package/lib/node/messaging/messaging-backend-module.js +52 -52
  921. package/lib/node/messaging/messaging-listeners.d.ts +27 -27
  922. package/lib/node/messaging/messaging-listeners.js +45 -45
  923. package/lib/node/messaging/messaging-service.d.ts +28 -28
  924. package/lib/node/messaging/messaging-service.js +24 -24
  925. package/lib/node/messaging/test/test-web-socket-channel.d.ts +12 -12
  926. package/lib/node/messaging/test/test-web-socket-channel.js +54 -54
  927. package/lib/node/messaging/websocket-endpoint.d.ts +20 -20
  928. package/lib/node/messaging/websocket-endpoint.js +80 -80
  929. package/lib/node/messaging/websocket-frontend-connection-service.d.ts +30 -30
  930. package/lib/node/messaging/websocket-frontend-connection-service.js +169 -169
  931. package/lib/node/os-backend-provider.d.ts +4 -4
  932. package/lib/node/os-backend-provider.js +30 -30
  933. package/lib/node/performance/index.d.ts +2 -2
  934. package/lib/node/performance/index.js +20 -20
  935. package/lib/node/performance/measurement-backend-bindings.d.ts +19 -19
  936. package/lib/node/performance/measurement-backend-bindings.js +30 -30
  937. package/lib/node/performance/node-stopwatch.d.ts +20 -20
  938. package/lib/node/performance/node-stopwatch.js +43 -43
  939. package/lib/node/process-utils.d.ts +13 -13
  940. package/lib/node/process-utils.js +105 -105
  941. package/lib/node/process-utils.spec.d.ts +1 -1
  942. package/lib/node/process-utils.spec.js +44 -44
  943. package/lib/node/request/backend-request-facade.d.ts +22 -22
  944. package/lib/node/request/backend-request-facade.js +41 -41
  945. package/lib/node/request/backend-request-module.d.ts +18 -18
  946. package/lib/node/request/backend-request-module.js +24 -24
  947. package/lib/node/request/proxy-cli-contribution.d.ts +27 -27
  948. package/lib/node/request/proxy-cli-contribution.js +64 -64
  949. package/lib/node/ws-request-validators.d.ts +25 -25
  950. package/lib/node/ws-request-validators.js +52 -52
  951. package/package.json +6 -6
  952. package/shared/ajv/index.d.ts +2 -2
  953. package/shared/markdown-it.d.ts +2 -2
  954. package/shared/markdown-it.js +1 -1
  955. package/shared/reflect-metadata/index.d.ts +1 -1
  956. package/shared/reflect-metadata/index.js +1 -1
  957. package/shared/vscode-languageserver-types/index.d.ts +1 -1
  958. package/src/browser/about-dialog.tsx +137 -137
  959. package/src/browser/authentication-service.ts +456 -456
  960. package/src/browser/breadcrumbs/breadcrumb-popup-container.ts +101 -101
  961. package/src/browser/breadcrumbs/breadcrumb-renderer.tsx +41 -41
  962. package/src/browser/breadcrumbs/breadcrumbs-constants.ts +79 -79
  963. package/src/browser/breadcrumbs/breadcrumbs-renderer.tsx +185 -185
  964. package/src/browser/breadcrumbs/breadcrumbs-service.ts +108 -108
  965. package/src/browser/breadcrumbs/index.ts +21 -21
  966. package/src/browser/browser-clipboard-service.ts +122 -122
  967. package/src/browser/browser.ts +225 -225
  968. package/src/browser/clipboard-service.ts +23 -23
  969. package/src/browser/color-application-contribution.ts +110 -110
  970. package/src/browser/color-registry.ts +60 -60
  971. package/src/browser/command-open-handler.ts +54 -54
  972. package/src/browser/common-frontend-contribution.ts +2569 -2569
  973. package/src/browser/common-styling-participants.ts +361 -361
  974. package/src/browser/connection-status-service.spec.ts +200 -200
  975. package/src/browser/connection-status-service.ts +216 -216
  976. package/src/browser/context-key-service.ts +142 -142
  977. package/src/browser/context-menu-renderer.ts +124 -124
  978. package/src/browser/core-preferences.ts +334 -334
  979. package/src/browser/credentials-service.ts +106 -106
  980. package/src/browser/decoration-style.ts +65 -65
  981. package/src/browser/decorations-service.ts +209 -209
  982. package/src/browser/dialogs/react-dialog.tsx +56 -56
  983. package/src/browser/dialogs.ts +534 -534
  984. package/src/browser/diff-uris.ts +117 -117
  985. package/src/browser/encoding-registry.ts +97 -97
  986. package/src/browser/endpoint.spec.ts +148 -148
  987. package/src/browser/endpoint.ts +136 -136
  988. package/src/browser/external-uri-service.ts +79 -79
  989. package/src/browser/file-icons-js.d.ts +20 -20
  990. package/src/browser/frontend-application-bindings.ts +62 -62
  991. package/src/browser/frontend-application-config-provider.spec.ts +45 -45
  992. package/src/browser/frontend-application-config-provider.ts +50 -50
  993. package/src/browser/frontend-application-contribution.ts +110 -110
  994. package/src/browser/frontend-application-module.ts +460 -460
  995. package/src/browser/frontend-application-state.ts +74 -74
  996. package/src/browser/frontend-application.ts +326 -326
  997. package/src/browser/hover-service.ts +218 -218
  998. package/src/browser/http-open-handler.ts +47 -47
  999. package/src/browser/i18n/i18n-frontend-module.ts +27 -27
  1000. package/src/browser/i18n/language-quick-pick-service.ts +130 -130
  1001. package/src/browser/icon-registry.ts +87 -87
  1002. package/src/browser/icon-theme-contribution.ts +64 -64
  1003. package/src/browser/icon-theme-service.ts +217 -217
  1004. package/src/browser/icons/CollapseAll.svg +7 -7
  1005. package/src/browser/icons/CollapseAll_inverse.svg +7 -7
  1006. package/src/browser/icons/Refresh.svg +7 -7
  1007. package/src/browser/icons/Refresh_inverse.svg +7 -7
  1008. package/src/browser/icons/add-inverse.svg +4 -4
  1009. package/src/browser/icons/add.svg +4 -4
  1010. package/src/browser/icons/arrow-down-bright.svg +6 -6
  1011. package/src/browser/icons/arrow-down-dark.svg +6 -6
  1012. package/src/browser/icons/arrow-up-bright.svg +6 -6
  1013. package/src/browser/icons/arrow-up-dark.svg +6 -6
  1014. package/src/browser/icons/case-sensitive-dark.svg +16 -16
  1015. package/src/browser/icons/case-sensitive.svg +16 -16
  1016. package/src/browser/icons/chevron-right-dark.svg +5 -5
  1017. package/src/browser/icons/chevron-right-light.svg +6 -6
  1018. package/src/browser/icons/circle-bright.svg +7 -7
  1019. package/src/browser/icons/circle-dark.svg +7 -7
  1020. package/src/browser/icons/clear-search-results-dark.svg +7 -7
  1021. package/src/browser/icons/clear-search-results.svg +7 -7
  1022. package/src/browser/icons/close-all-bright.svg +7 -7
  1023. package/src/browser/icons/close-all-dark.svg +7 -7
  1024. package/src/browser/icons/close-bright.svg +7 -7
  1025. package/src/browser/icons/close-dark.svg +7 -7
  1026. package/src/browser/icons/collapse.svg +4 -4
  1027. package/src/browser/icons/edit-json-dark.svg +6 -6
  1028. package/src/browser/icons/edit-json.svg +6 -6
  1029. package/src/browser/icons/expand.svg +4 -4
  1030. package/src/browser/icons/loading-dark.svg +6 -6
  1031. package/src/browser/icons/loading-light.svg +6 -6
  1032. package/src/browser/icons/open-change-bright.svg +3 -3
  1033. package/src/browser/icons/open-change-dark.svg +4 -4
  1034. package/src/browser/icons/open-file-bright.svg +4 -4
  1035. package/src/browser/icons/open-file-dark.svg +4 -4
  1036. package/src/browser/icons/preview-bright.svg +3 -3
  1037. package/src/browser/icons/preview-dark.svg +3 -3
  1038. package/src/browser/icons/regex-dark.svg +10 -10
  1039. package/src/browser/icons/regex.svg +10 -10
  1040. package/src/browser/icons/remove-all-inverse.svg +4 -4
  1041. package/src/browser/icons/remove-all.svg +4 -4
  1042. package/src/browser/icons/replace-all-inverse.svg +13 -13
  1043. package/src/browser/icons/replace-all.svg +13 -13
  1044. package/src/browser/icons/replace-inverse.svg +15 -15
  1045. package/src/browser/icons/replace.svg +15 -15
  1046. package/src/browser/icons/whole-word-dark.svg +19 -19
  1047. package/src/browser/icons/whole-word.svg +19 -19
  1048. package/src/browser/index.ts +47 -47
  1049. package/src/browser/json-schema-store.ts +127 -127
  1050. package/src/browser/keybinding.spec.ts +553 -553
  1051. package/src/browser/keybinding.ts +759 -759
  1052. package/src/browser/keyboard/browser-keyboard-frontend-contribution.ts +108 -108
  1053. package/src/browser/keyboard/browser-keyboard-layout-provider.spec.ts +171 -171
  1054. package/src/browser/keyboard/browser-keyboard-layout-provider.ts +469 -469
  1055. package/src/browser/keyboard/browser-keyboard-module.ts +30 -30
  1056. package/src/browser/keyboard/index.ts +20 -20
  1057. package/src/browser/keyboard/keyboard-layout-service.spec.ts +121 -121
  1058. package/src/browser/keyboard/keyboard-layout-service.ts +455 -455
  1059. package/src/browser/keyboard/keys.spec.ts +258 -258
  1060. package/src/browser/keyboard/keys.ts +20 -20
  1061. package/src/browser/keys.ts +21 -21
  1062. package/src/browser/label-parser.spec.ts +165 -165
  1063. package/src/browser/label-parser.ts +108 -108
  1064. package/src/browser/label-provider.spec.ts +62 -62
  1065. package/src/browser/label-provider.ts +385 -385
  1066. package/src/browser/language-icon-provider.ts +55 -55
  1067. package/src/browser/language-service.ts +77 -77
  1068. package/src/browser/logger-frontend-module.ts +65 -65
  1069. package/src/browser/markdown-rendering/markdown-renderer.ts +98 -98
  1070. package/src/browser/menu/browser-context-menu-renderer.ts +48 -48
  1071. package/src/browser/menu/browser-menu-module.ts +28 -28
  1072. package/src/browser/menu/browser-menu-plugin.ts +484 -484
  1073. package/src/browser/menu/context-menu-context.ts +41 -41
  1074. package/src/browser/messaging/connection-source.ts +26 -26
  1075. package/src/browser/messaging/frontend-id-provider.ts +37 -37
  1076. package/src/browser/messaging/index.ts +17 -17
  1077. package/src/browser/messaging/messaging-frontend-module.ts +41 -41
  1078. package/src/browser/messaging/service-connection-provider.ts +126 -126
  1079. package/src/browser/messaging/ws-connection-provider.ts +48 -48
  1080. package/src/browser/messaging/ws-connection-source.ts +230 -230
  1081. package/src/browser/mime-service.ts +30 -30
  1082. package/src/browser/navigatable-types.ts +81 -81
  1083. package/src/browser/navigatable.ts +39 -39
  1084. package/src/browser/opener-service.spec.ts +49 -49
  1085. package/src/browser/opener-service.ts +146 -146
  1086. package/src/browser/performance/frontend-stopwatch.ts +65 -65
  1087. package/src/browser/performance/index.ts +18 -18
  1088. package/src/browser/performance/measurement-frontend-bindings.ts +31 -31
  1089. package/src/browser/preferences/index.ts +23 -23
  1090. package/src/browser/preferences/injectable-preference-proxy.ts +283 -283
  1091. package/src/browser/preferences/preference-configurations.ts +82 -82
  1092. package/src/browser/preferences/preference-contribution.ts +436 -436
  1093. package/src/browser/preferences/preference-language-override-service.ts +111 -111
  1094. package/src/browser/preferences/preference-provider.spec.ts +36 -36
  1095. package/src/browser/preferences/preference-provider.ts +277 -277
  1096. package/src/browser/preferences/preference-proxy.spec.ts +367 -367
  1097. package/src/browser/preferences/preference-proxy.ts +367 -367
  1098. package/src/browser/preferences/preference-schema-provider.spec.ts +130 -130
  1099. package/src/browser/preferences/preference-scope.ts +18 -18
  1100. package/src/browser/preferences/preference-service.spec.ts +613 -613
  1101. package/src/browser/preferences/preference-service.ts +594 -594
  1102. package/src/browser/preferences/preference-validation-service.spec.ts +334 -334
  1103. package/src/browser/preferences/preference-validation-service.ts +358 -358
  1104. package/src/browser/preferences/test/index.ts +19 -19
  1105. package/src/browser/preferences/test/mock-preference-provider.ts +50 -50
  1106. package/src/browser/preferences/test/mock-preference-proxy.ts +48 -48
  1107. package/src/browser/preferences/test/mock-preference-service.ts +63 -63
  1108. package/src/browser/preload/i18n-preload-contribution.ts +50 -50
  1109. package/src/browser/preload/os-preload-contribution.ts +37 -37
  1110. package/src/browser/preload/preload-module.ts +45 -45
  1111. package/src/browser/preload/preloader.ts +37 -37
  1112. package/src/browser/preload/theme-preload-contribution.ts +31 -31
  1113. package/src/browser/progress-bar-factory.ts +29 -29
  1114. package/src/browser/progress-bar.ts +76 -76
  1115. package/src/browser/progress-client.ts +53 -53
  1116. package/src/browser/progress-location-service.spec.ts +50 -50
  1117. package/src/browser/progress-location-service.ts +96 -96
  1118. package/src/browser/progress-status-bar-item.ts +83 -83
  1119. package/src/browser/quick-input/index.ts +23 -23
  1120. package/src/browser/quick-input/quick-access.ts +75 -75
  1121. package/src/browser/quick-input/quick-command-frontend-contribution.ts +89 -89
  1122. package/src/browser/quick-input/quick-command-service.ts +246 -246
  1123. package/src/browser/quick-input/quick-help-service.ts +87 -87
  1124. package/src/browser/quick-input/quick-input-frontend-contribution.ts +33 -33
  1125. package/src/browser/quick-input/quick-input-service.spec.ts +176 -176
  1126. package/src/browser/quick-input/quick-input-service.ts +17 -17
  1127. package/src/browser/quick-input/quick-pick-service-impl.ts +69 -69
  1128. package/src/browser/quick-input/quick-view-service.ts +83 -83
  1129. package/src/browser/request/browser-request-module.ts +23 -23
  1130. package/src/browser/request/browser-request-service.ts +172 -172
  1131. package/src/browser/resource-context-key.ts +77 -77
  1132. package/src/browser/save-resource-service.ts +60 -60
  1133. package/src/browser/saveable.ts +365 -365
  1134. package/src/browser/secondary-window-handler.ts +211 -211
  1135. package/src/browser/shell/additional-views-menu-widget.tsx +71 -71
  1136. package/src/browser/shell/application-shell-mouse-tracker.ts +103 -103
  1137. package/src/browser/shell/application-shell.ts +2261 -2261
  1138. package/src/browser/shell/current-widget-command-adapter.ts +57 -57
  1139. package/src/browser/shell/index.ts +23 -23
  1140. package/src/browser/shell/shell-layout-restorer.ts +399 -399
  1141. package/src/browser/shell/side-panel-handler.ts +793 -793
  1142. package/src/browser/shell/side-panel-toolbar.ts +111 -111
  1143. package/src/browser/shell/sidebar-bottom-menu-widget.tsx +39 -39
  1144. package/src/browser/shell/sidebar-menu-widget.tsx +140 -140
  1145. package/src/browser/shell/sidebar-top-menu-widget.tsx +26 -26
  1146. package/src/browser/shell/split-panels.ts +190 -190
  1147. package/src/browser/shell/tab-bar-decorator.ts +106 -106
  1148. package/src/browser/shell/tab-bar-toolbar/index.ts +19 -19
  1149. package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.ts +31 -31
  1150. package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.ts +256 -256
  1151. package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.ts +207 -207
  1152. package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.spec.ts +62 -62
  1153. package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx +428 -428
  1154. package/src/browser/shell/tab-bars.spec.ts +63 -63
  1155. package/src/browser/shell/tab-bars.ts +1485 -1485
  1156. package/src/browser/shell/theia-dock-panel.ts +255 -255
  1157. package/src/browser/shell/view-contribution.ts +177 -177
  1158. package/src/browser/source-tree/index.ts +19 -19
  1159. package/src/browser/source-tree/source-tree-widget.tsx +107 -107
  1160. package/src/browser/source-tree/source-tree.ts +146 -146
  1161. package/src/browser/source-tree/tree-source.ts +73 -73
  1162. package/src/browser/status-bar/index.ts +29 -29
  1163. package/src/browser/status-bar/status-bar-types.ts +97 -97
  1164. package/src/browser/status-bar/status-bar-view-model.ts +209 -209
  1165. package/src/browser/status-bar/status-bar.tsx +189 -189
  1166. package/src/browser/storage-service.spec.ts +76 -76
  1167. package/src/browser/storage-service.ts +129 -129
  1168. package/src/browser/style/about.css +36 -36
  1169. package/src/browser/style/alert-messages.css +62 -62
  1170. package/src/browser/style/ansi.css +88 -88
  1171. package/src/browser/style/breadcrumbs.css +130 -130
  1172. package/src/browser/style/dialog.css +126 -126
  1173. package/src/browser/style/dockpanel.css +76 -76
  1174. package/src/browser/style/hover-service.css +101 -101
  1175. package/src/browser/style/icons.css +61 -61
  1176. package/src/browser/style/index.css +351 -351
  1177. package/src/browser/style/materialcolors.css +278 -278
  1178. package/src/browser/style/menus.css +230 -230
  1179. package/src/browser/style/notification.css +39 -39
  1180. package/src/browser/style/os.css +87 -87
  1181. package/src/browser/style/progress-bar.css +43 -43
  1182. package/src/browser/style/quick-title-bar.css +45 -45
  1183. package/src/browser/style/scrollbars.css +172 -172
  1184. package/src/browser/style/search-box.css +123 -123
  1185. package/src/browser/style/select-component.css +107 -107
  1186. package/src/browser/style/sidepanel.css +364 -364
  1187. package/src/browser/style/status-bar.css +127 -127
  1188. package/src/browser/style/tabs.css +647 -647
  1189. package/src/browser/style/tooltip.css +28 -28
  1190. package/src/browser/style/tree-decorators.css +81 -81
  1191. package/src/browser/style/tree.css +232 -232
  1192. package/src/browser/style/view-container.css +194 -194
  1193. package/src/browser/style/widget.css +19 -19
  1194. package/src/browser/styling-service.ts +96 -96
  1195. package/src/browser/supported-encodings.ts +262 -262
  1196. package/src/browser/test/jsdom.ts +69 -69
  1197. package/src/browser/test/mock-connection-status-service.ts +33 -33
  1198. package/src/browser/test/mock-env-variables-server.ts +47 -47
  1199. package/src/browser/test/mock-opener-service.ts +34 -34
  1200. package/src/browser/test/mock-storage-service.ts +49 -49
  1201. package/src/browser/theming.ts +206 -206
  1202. package/src/browser/tooltip-service.tsx +96 -96
  1203. package/src/browser/tree/fuzzy-search.spec.ts +99 -99
  1204. package/src/browser/tree/fuzzy-search.ts +136 -136
  1205. package/src/browser/tree/index.ts +29 -29
  1206. package/src/browser/tree/search-box-debounce.ts +96 -96
  1207. package/src/browser/tree/search-box.ts +355 -355
  1208. package/src/browser/tree/test/mock-selectable-tree-model.ts +109 -109
  1209. package/src/browser/tree/test/mock-tree-model.ts +136 -136
  1210. package/src/browser/tree/test/tree-test-container.ts +50 -50
  1211. package/src/browser/tree/tree-compression/compressed-tree-expansion-service.ts +46 -46
  1212. package/src/browser/tree/tree-compression/compressed-tree-model.ts +88 -88
  1213. package/src/browser/tree/tree-compression/compressed-tree-widget.tsx +203 -203
  1214. package/src/browser/tree/tree-compression/index.ts +20 -20
  1215. package/src/browser/tree/tree-compression/tree-compression-service.ts +125 -125
  1216. package/src/browser/tree/tree-compression/tree-compression.css +28 -28
  1217. package/src/browser/tree/tree-consistency.spec.ts +105 -105
  1218. package/src/browser/tree/tree-container.spec.ts +45 -45
  1219. package/src/browser/tree/tree-container.ts +155 -155
  1220. package/src/browser/tree/tree-decorator.spec.ts +162 -162
  1221. package/src/browser/tree/tree-decorator.ts +238 -238
  1222. package/src/browser/tree/tree-expansion.spec.ts +173 -173
  1223. package/src/browser/tree/tree-expansion.ts +165 -165
  1224. package/src/browser/tree/tree-focus-service.ts +55 -55
  1225. package/src/browser/tree/tree-iterator.spec.ts +170 -170
  1226. package/src/browser/tree/tree-iterator.ts +256 -256
  1227. package/src/browser/tree/tree-label-provider.ts +40 -40
  1228. package/src/browser/tree/tree-model.ts +562 -562
  1229. package/src/browser/tree/tree-navigation.ts +58 -58
  1230. package/src/browser/tree/tree-preference.ts +50 -50
  1231. package/src/browser/tree/tree-search.ts +128 -128
  1232. package/src/browser/tree/tree-selectable.spec.ts +152 -152
  1233. package/src/browser/tree/tree-selection-impl.ts +176 -176
  1234. package/src/browser/tree/tree-selection-state.spec.ts +462 -462
  1235. package/src/browser/tree/tree-selection-state.ts +245 -245
  1236. package/src/browser/tree/tree-selection.ts +159 -159
  1237. package/src/browser/tree/tree-view-welcome-widget.tsx +263 -263
  1238. package/src/browser/tree/tree-widget-selection.ts +45 -45
  1239. package/src/browser/tree/tree-widget.tsx +1585 -1585
  1240. package/src/browser/tree/tree.spec.ts +241 -241
  1241. package/src/browser/tree/tree.ts +425 -425
  1242. package/src/browser/user-working-directory-provider.ts +77 -77
  1243. package/src/browser/view-container.ts +1640 -1640
  1244. package/src/browser/widget-decoration.ts +358 -358
  1245. package/src/browser/widget-manager.spec.ts +102 -102
  1246. package/src/browser/widget-manager.ts +310 -310
  1247. package/src/browser/widget-open-handler.ts +165 -165
  1248. package/src/browser/widgets/alert-message.tsx +56 -56
  1249. package/src/browser/widgets/enhanced-preview-widget.ts +27 -27
  1250. package/src/browser/widgets/extractable-widget.ts +33 -33
  1251. package/src/browser/widgets/index.ts +20 -20
  1252. package/src/browser/widgets/previewable-widget.ts +31 -31
  1253. package/src/browser/widgets/react-renderer.tsx +50 -50
  1254. package/src/browser/widgets/react-widget.tsx +51 -51
  1255. package/src/browser/widgets/select-component.tsx +367 -367
  1256. package/src/browser/widgets/widget.ts +406 -406
  1257. package/src/browser/window/browser-window-module.ts +32 -32
  1258. package/src/browser/window/default-secondary-window-service.ts +185 -185
  1259. package/src/browser/window/default-window-service.spec.ts +78 -78
  1260. package/src/browser/window/default-window-service.ts +171 -171
  1261. package/src/browser/window/secondary-window-service.ts +39 -39
  1262. package/src/browser/window/test/mock-window-service.ts +29 -29
  1263. package/src/browser/window/window-service.ts +78 -78
  1264. package/src/browser/window/window-title-service.ts +107 -107
  1265. package/src/browser/window/window-title-updater.ts +95 -95
  1266. package/src/browser/window-contribution.ts +64 -64
  1267. package/src/browser-only/frontend-only-application-module.ts +115 -115
  1268. package/src/browser-only/i18n/i18n-frontend-only-module.ts +37 -37
  1269. package/src/browser-only/logger-frontend-only-module.ts +63 -63
  1270. package/src/browser-only/messaging/frontend-only-service-connection-provider.ts +39 -39
  1271. package/src/browser-only/messaging/messaging-frontend-only-module.ts +42 -42
  1272. package/src/browser-only/preload/frontend-only-preload-module.ts +49 -49
  1273. package/src/common/accessibility.ts +33 -33
  1274. package/src/common/application-error.spec.ts +27 -27
  1275. package/src/common/application-error.ts +76 -76
  1276. package/src/common/application-protocol.ts +41 -41
  1277. package/src/common/array-utils.ts +129 -129
  1278. package/src/common/buffer.ts +228 -228
  1279. package/src/common/cancellation.ts +163 -163
  1280. package/src/common/char-code.ts +438 -438
  1281. package/src/common/collections.ts +125 -125
  1282. package/src/common/color.ts +103 -103
  1283. package/src/common/command.spec.ts +208 -208
  1284. package/src/common/command.ts +485 -485
  1285. package/src/common/contribution-filter/contribution-filter-registry.ts +79 -79
  1286. package/src/common/contribution-filter/contribution-filter.ts +64 -64
  1287. package/src/common/contribution-filter/filter.ts +23 -23
  1288. package/src/common/contribution-filter/index.ts +19 -19
  1289. package/src/common/contribution-provider.ts +96 -96
  1290. package/src/common/disposable.spec.ts +94 -94
  1291. package/src/common/disposable.ts +188 -188
  1292. package/src/common/encoding-service.ts +380 -380
  1293. package/src/common/encodings.ts +24 -24
  1294. package/src/common/env-variables/env-variables-protocol.ts +38 -38
  1295. package/src/common/env-variables/index.ts +17 -17
  1296. package/src/common/event.spec.ts +32 -32
  1297. package/src/common/event.ts +469 -469
  1298. package/src/common/file-uri.ts +61 -61
  1299. package/src/common/frontend-application-state.ts +38 -38
  1300. package/src/common/glob.ts +741 -741
  1301. package/src/common/hash.ts +85 -85
  1302. package/src/common/i18n/localization-server.ts +25 -25
  1303. package/src/common/i18n/localization.ts +80 -80
  1304. package/src/common/i18n/nls.metadata.json +31314 -31314
  1305. package/src/common/index.ts +51 -51
  1306. package/src/common/json-schema.ts +106 -106
  1307. package/src/common/key-store.ts +26 -26
  1308. package/src/common/keybinding.ts +152 -152
  1309. package/src/common/keyboard/keyboard-layout-provider.ts +51 -51
  1310. package/src/common/keys.ts +694 -694
  1311. package/src/common/label-protocol.ts +35 -35
  1312. package/src/common/logger-protocol.ts +119 -119
  1313. package/src/common/logger-watcher.ts +48 -48
  1314. package/src/common/logger.spec.ts +46 -46
  1315. package/src/common/logger.ts +389 -389
  1316. package/src/common/lsp-types.ts +34 -34
  1317. package/src/common/markdown-rendering/icon-utilities.ts +30 -30
  1318. package/src/common/markdown-rendering/index.ts +18 -18
  1319. package/src/common/markdown-rendering/markdown-string.ts +152 -152
  1320. package/src/common/menu/action-menu-node.ts +65 -65
  1321. package/src/common/menu/composite-menu-node.spec.ts +67 -67
  1322. package/src/common/menu/composite-menu-node.ts +114 -114
  1323. package/src/common/menu/index.ts +21 -21
  1324. package/src/common/menu/menu-adapter.ts +103 -103
  1325. package/src/common/menu/menu-model-registry.ts +343 -343
  1326. package/src/common/menu/menu-types.ts +219 -219
  1327. package/src/common/menu/menu.spec.ts +101 -101
  1328. package/src/common/message-rpc/channel.spec.ts +88 -88
  1329. package/src/common/message-rpc/channel.ts +300 -300
  1330. package/src/common/message-rpc/index.ts +22 -22
  1331. package/src/common/message-rpc/message-buffer.ts +105 -105
  1332. package/src/common/message-rpc/msg-pack-extension-manager.ts +70 -70
  1333. package/src/common/message-rpc/rpc-message-encoder.spec.ts +65 -65
  1334. package/src/common/message-rpc/rpc-message-encoder.ts +190 -190
  1335. package/src/common/message-rpc/rpc-protocol.ts +255 -255
  1336. package/src/common/message-rpc/uint8-array-message-buffer.spec.ts +41 -41
  1337. package/src/common/message-rpc/uint8-array-message-buffer.ts +213 -213
  1338. package/src/common/message-service-protocol.ts +148 -148
  1339. package/src/common/message-service.ts +226 -226
  1340. package/src/common/messaging/connection-error-handler.ts +73 -73
  1341. package/src/common/messaging/connection-management.ts +43 -43
  1342. package/src/common/messaging/handler.ts +26 -26
  1343. package/src/common/messaging/index.ts +19 -19
  1344. package/src/common/messaging/proxy-factory.spec.ts +108 -108
  1345. package/src/common/messaging/proxy-factory.ts +336 -336
  1346. package/src/common/messaging/socket-write-buffer.ts +52 -52
  1347. package/src/common/messaging/web-socket-channel.ts +76 -76
  1348. package/src/common/nls.ts +151 -151
  1349. package/src/common/numbers.ts +21 -21
  1350. package/src/common/objects.spec.ts +112 -112
  1351. package/src/common/objects.ts +123 -123
  1352. package/src/common/os.ts +82 -82
  1353. package/src/common/path.spec.ts +415 -415
  1354. package/src/common/path.ts +334 -334
  1355. package/src/common/paths.ts +250 -250
  1356. package/src/common/performance/index.ts +19 -19
  1357. package/src/common/performance/measurement-protocol.ts +104 -104
  1358. package/src/common/performance/measurement.ts +130 -130
  1359. package/src/common/performance/stopwatch.ts +183 -183
  1360. package/src/common/preferences/preference-schema.ts +95 -95
  1361. package/src/common/preferences/preference-scope.spec.ts +48 -48
  1362. package/src/common/preferences/preference-scope.ts +68 -68
  1363. package/src/common/prioritizeable.ts +58 -58
  1364. package/src/common/progress-service-protocol.ts +35 -35
  1365. package/src/common/progress-service.ts +82 -82
  1366. package/src/common/promise-util.spec.ts +102 -102
  1367. package/src/common/promise-util.ts +143 -143
  1368. package/src/common/quick-pick-service.ts +356 -356
  1369. package/src/common/reference.spec.ts +145 -145
  1370. package/src/common/reference.ts +230 -230
  1371. package/src/common/resource.ts +430 -430
  1372. package/src/common/selection-command-handler.ts +101 -101
  1373. package/src/common/selection-service.spec.ts +43 -43
  1374. package/src/common/selection-service.ts +49 -49
  1375. package/src/common/selection.ts +50 -50
  1376. package/src/common/severity.ts +111 -111
  1377. package/src/common/stream.ts +718 -718
  1378. package/src/common/strings.ts +231 -231
  1379. package/src/common/telemetry.ts +45 -45
  1380. package/src/common/ternary-search-tree.ts +417 -417
  1381. package/src/common/test/expect.ts +34 -34
  1382. package/src/common/test/mock-logger.ts +118 -118
  1383. package/src/common/test/mock-menu.ts +35 -35
  1384. package/src/common/test/mock-resource-provider.ts +33 -33
  1385. package/src/common/theme.ts +68 -68
  1386. package/src/common/types.spec.ts +86 -86
  1387. package/src/common/types.ts +140 -140
  1388. package/src/common/uri-command-handler.spec.ts +90 -90
  1389. package/src/common/uri-command-handler.ts +148 -148
  1390. package/src/common/uri.spec.ts +278 -278
  1391. package/src/common/uri.ts +279 -279
  1392. package/src/common/uuid.ts +45 -45
  1393. package/src/common/version.ts +17 -17
  1394. package/src/common/view-column.ts +33 -33
  1395. package/src/common/window.ts +34 -34
  1396. package/src/electron-browser/electron-clipboard-service.ts +32 -32
  1397. package/src/electron-browser/keyboard/electron-keyboard-layout-change-notifier.ts +39 -39
  1398. package/src/electron-browser/keyboard/electron-keyboard-module.ts +28 -28
  1399. package/src/electron-browser/menu/electron-context-menu-renderer.ts +122 -122
  1400. package/src/electron-browser/menu/electron-main-menu-factory.ts +335 -335
  1401. package/src/electron-browser/menu/electron-menu-contribution.ts +506 -506
  1402. package/src/electron-browser/menu/electron-menu-module.ts +40 -40
  1403. package/src/electron-browser/menu/electron-menu-style.css +110 -110
  1404. package/src/electron-browser/messaging/electron-frontend-id-provider.ts +25 -25
  1405. package/src/electron-browser/messaging/electron-ipc-connection-source.ts +65 -65
  1406. package/src/electron-browser/messaging/electron-local-ws-connection-source.ts +45 -45
  1407. package/src/electron-browser/messaging/electron-messaging-frontend-module.ts +78 -78
  1408. package/src/electron-browser/messaging/electron-ws-connection-source.ts +38 -38
  1409. package/src/electron-browser/preload.ts +246 -246
  1410. package/src/electron-browser/request/electron-browser-request-module.ts +26 -26
  1411. package/src/electron-browser/token/electron-token-frontend-module.ts +22 -22
  1412. package/src/electron-browser/window/electron-frontend-application-state.ts +26 -26
  1413. package/src/electron-browser/window/electron-secondary-window-service.ts +35 -35
  1414. package/src/electron-browser/window/electron-window-module.ts +41 -41
  1415. package/src/electron-browser/window/electron-window-preferences.ts +76 -76
  1416. package/src/electron-browser/window/electron-window-service.ts +109 -109
  1417. package/src/electron-common/electron-api.ts +148 -148
  1418. package/src/electron-common/electron-main-window-service.ts +24 -24
  1419. package/src/electron-common/electron-token.ts +27 -27
  1420. package/src/electron-main/electron-api-main.ts +342 -340
  1421. package/src/electron-main/electron-main-application-module.ts +65 -65
  1422. package/src/electron-main/electron-main-application.ts +685 -685
  1423. package/src/electron-main/electron-main-constants.ts +22 -22
  1424. package/src/electron-main/electron-main-window-service-impl.ts +44 -44
  1425. package/src/electron-main/electron-security-token-service.ts +36 -36
  1426. package/src/electron-main/event-utils.ts +36 -36
  1427. package/src/electron-main/messaging/electron-connection-handler.ts +21 -21
  1428. package/src/electron-main/messaging/electron-messaging-contribution.ts +143 -143
  1429. package/src/electron-main/messaging/electron-messaging-service.ts +35 -35
  1430. package/src/electron-main/theia-electron-window.ts +202 -202
  1431. package/src/electron-node/hosting/electron-backend-hosting-module.ts +24 -24
  1432. package/src/electron-node/hosting/electron-ws-origin-validator.ts +37 -37
  1433. package/src/electron-node/keyboard/electron-backend-keyboard-module.ts +30 -30
  1434. package/src/electron-node/keyboard/electron-keyboard-layout-provider.ts +35 -35
  1435. package/src/electron-node/request/electron-backend-request-module.ts +23 -23
  1436. package/src/electron-node/request/electron-backend-request-service.ts +78 -78
  1437. package/src/electron-node/token/electron-token-backend-contribution.ts +48 -48
  1438. package/src/electron-node/token/electron-token-backend-module.ts +28 -28
  1439. package/src/electron-node/token/electron-token-validator.ts +93 -93
  1440. package/src/node/application-server.ts +55 -55
  1441. package/src/node/backend-application-config-provider.spec.ts +29 -29
  1442. package/src/node/backend-application-config-provider.ts +48 -48
  1443. package/src/node/backend-application-module.ts +140 -140
  1444. package/src/node/backend-application.ts +382 -382
  1445. package/src/node/backend-remote-service.ts +25 -25
  1446. package/src/node/cli.spec.ts +94 -94
  1447. package/src/node/cli.ts +63 -63
  1448. package/src/node/console-logger-server.spec.ts +59 -59
  1449. package/src/node/console-logger-server.ts +76 -76
  1450. package/src/node/debug.ts +30 -30
  1451. package/src/node/dynamic-require.ts +56 -56
  1452. package/src/node/env-variables/env-variables-server.ts +120 -120
  1453. package/src/node/env-variables/index.ts +17 -17
  1454. package/src/node/environment-utils.spec.ts +92 -92
  1455. package/src/node/environment-utils.ts +66 -66
  1456. package/src/node/file-uri.spec.ts +76 -76
  1457. package/src/node/filesystem-locking.ts +77 -77
  1458. package/src/node/hosting/backend-application-hosts.ts +60 -60
  1459. package/src/node/hosting/backend-hosting-module.ts +26 -26
  1460. package/src/node/hosting/ws-origin-validator.ts +36 -36
  1461. package/src/node/i18n/i18n-backend-module.ts +42 -42
  1462. package/src/node/i18n/localization-contribution.ts +112 -112
  1463. package/src/node/i18n/localization-provider.ts +125 -125
  1464. package/src/node/i18n/localization-server.ts +52 -52
  1465. package/src/node/i18n/theia-localization-contribution.ts +36 -36
  1466. package/src/node/index.ts +22 -22
  1467. package/src/node/key-store-server.ts +162 -162
  1468. package/src/node/logger-backend-module.ts +88 -88
  1469. package/src/node/logger-cli-contribution.spec.ts +245 -245
  1470. package/src/node/logger-cli-contribution.ts +168 -168
  1471. package/src/node/main.ts +33 -33
  1472. package/src/node/messaging/binary-message-pipe.ts +168 -168
  1473. package/src/node/messaging/connection-container-module.ts +96 -96
  1474. package/src/node/messaging/default-messaging-service.ts +129 -129
  1475. package/src/node/messaging/frontend-connection-service.ts +24 -24
  1476. package/src/node/messaging/index.ts +19 -19
  1477. package/src/node/messaging/ipc-bootstrap.ts +27 -27
  1478. package/src/node/messaging/ipc-channel.ts +77 -77
  1479. package/src/node/messaging/ipc-connection-provider.ts +107 -107
  1480. package/src/node/messaging/ipc-protocol.ts +76 -76
  1481. package/src/node/messaging/messaging-backend-module.ts +52 -52
  1482. package/src/node/messaging/messaging-listeners.ts +52 -52
  1483. package/src/node/messaging/messaging-service.ts +46 -46
  1484. package/src/node/messaging/test/test-web-socket-channel.ts +61 -61
  1485. package/src/node/messaging/websocket-endpoint.ts +79 -79
  1486. package/src/node/messaging/websocket-frontend-connection-service.ts +176 -176
  1487. package/src/node/os-backend-provider.ts +25 -25
  1488. package/src/node/performance/index.ts +18 -18
  1489. package/src/node/performance/measurement-backend-bindings.ts +35 -35
  1490. package/src/node/performance/node-stopwatch.ts +40 -40
  1491. package/src/node/process-utils.spec.ts +48 -48
  1492. package/src/node/process-utils.ts +102 -102
  1493. package/src/node/request/backend-request-facade.ts +39 -39
  1494. package/src/node/request/backend-request-module.ts +25 -25
  1495. package/src/node/request/proxy-cli-contribution.ts +65 -65
  1496. package/src/node/ws-request-validators.ts +56 -56
  1497. package/src/typings/native-keymap.d.ts +108 -108
@@ -1,1640 +1,1640 @@
1
- // *****************************************************************************
2
- // Copyright (C) 2018-2019 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 { interfaces, injectable, inject, postConstruct } from 'inversify';
18
- import { IIterator, toArray, find, some, every, map, ArrayExt } from '@phosphor/algorithm';
19
- import {
20
- Widget, EXPANSION_TOGGLE_CLASS, COLLAPSED_CLASS, CODICON_TREE_ITEM_CLASSES, MessageLoop, Message, SplitPanel,
21
- BaseWidget, addEventListener, SplitLayout, LayoutItem, PanelLayout, addKeyListener, waitForRevealed, UnsafeWidgetUtilities, DockPanel, PINNED_CLASS
22
- } from './widgets';
23
- import { Event as CommonEvent, Emitter } from '../common/event';
24
- import { Disposable, DisposableCollection } from '../common/disposable';
25
- import { CommandRegistry } from '../common/command';
26
- import { MenuModelRegistry, MenuPath, MenuAction } from '../common/menu';
27
- import { ApplicationShell, StatefulWidget, SplitPositionHandler, SplitPositionOptions, SIDE_PANEL_TOOLBAR_CONTEXT_MENU } from './shell';
28
- import { MAIN_AREA_ID, BOTTOM_AREA_ID } from './shell/theia-dock-panel';
29
- import { FrontendApplicationStateService } from './frontend-application-state';
30
- import { ContextMenuRenderer, Anchor } from './context-menu-renderer';
31
- import { parseCssMagnitude } from './browser';
32
- import { TabBarToolbarRegistry, TabBarToolbarFactory, TabBarToolbar, TabBarDelegator, TabBarToolbarItem } from './shell/tab-bar-toolbar';
33
- import { isEmpty, isObject, nls } from '../common';
34
- import { WidgetManager } from './widget-manager';
35
- import { Key } from './keys';
36
- import { ProgressBarFactory } from './progress-bar-factory';
37
- import { Drag, IDragEvent } from '@phosphor/dragdrop';
38
- import { MimeData } from '@phosphor/coreutils';
39
- import { ElementExt } from '@phosphor/domutils';
40
- import { TabBarDecoratorService } from './shell/tab-bar-decorator';
41
-
42
- export interface ViewContainerTitleOptions {
43
- label: string;
44
- caption?: string;
45
- iconClass?: string;
46
- closeable?: boolean;
47
- }
48
-
49
- @injectable()
50
- export class ViewContainerIdentifier {
51
- id: string;
52
- progressLocationId?: string;
53
- }
54
-
55
- export interface DescriptionWidget {
56
- description: string;
57
- onDidChangeDescription: CommonEvent<void>;
58
- }
59
-
60
- export interface BadgeWidget {
61
- badge?: number;
62
- badgeTooltip?: string;
63
- onDidChangeBadge: CommonEvent<void>;
64
- onDidChangeBadgeTooltip: CommonEvent<void>;
65
- }
66
-
67
- export namespace DescriptionWidget {
68
- export function is(arg: unknown): arg is DescriptionWidget {
69
- return isObject(arg) && 'onDidChangeDescription' in arg;
70
- }
71
- }
72
-
73
- export namespace BadgeWidget {
74
- export function is(arg: unknown): arg is BadgeWidget {
75
- return isObject(arg) && 'onDidChangeBadge' in arg && 'onDidChangeBadgeTooltip' in arg;
76
- }
77
- }
78
-
79
- /**
80
- * A widget that may change it's internal structure dynamically.
81
- * Current use is to update the toolbar when a contributed view is constructed "lazily".
82
- */
83
- export interface DynamicToolbarWidget {
84
- onDidChangeToolbarItems: CommonEvent<void>;
85
- }
86
-
87
- export namespace DynamicToolbarWidget {
88
- export function is(arg: unknown): arg is DynamicToolbarWidget {
89
- return isObject(arg) && 'onDidChangeToolbarItems' in arg;
90
- }
91
- }
92
-
93
- /**
94
- * A view container holds an arbitrary number of widgets inside a split panel.
95
- * Each widget is wrapped in a _part_ that displays the widget title and toolbar
96
- * and allows to collapse / expand the widget content.
97
- */
98
- @injectable()
99
- export class ViewContainer extends BaseWidget implements StatefulWidget, ApplicationShell.TrackableWidgetProvider, TabBarDelegator {
100
-
101
- protected panel: SplitPanel;
102
-
103
- protected currentPart: ViewContainerPart | undefined;
104
-
105
- /**
106
- * Disable dragging parts from/to this view container.
107
- */
108
- disableDNDBetweenContainers = false;
109
-
110
- @inject(FrontendApplicationStateService)
111
- protected readonly applicationStateService: FrontendApplicationStateService;
112
-
113
- @inject(ContextMenuRenderer)
114
- protected readonly contextMenuRenderer: ContextMenuRenderer;
115
-
116
- @inject(CommandRegistry)
117
- protected readonly commandRegistry: CommandRegistry;
118
-
119
- @inject(MenuModelRegistry)
120
- protected readonly menuRegistry: MenuModelRegistry;
121
-
122
- @inject(WidgetManager)
123
- protected readonly widgetManager: WidgetManager;
124
-
125
- @inject(SplitPositionHandler)
126
- protected readonly splitPositionHandler: SplitPositionHandler;
127
-
128
- @inject(ViewContainerIdentifier)
129
- readonly options: ViewContainerIdentifier;
130
-
131
- @inject(TabBarToolbarRegistry)
132
- protected readonly toolbarRegistry: TabBarToolbarRegistry;
133
-
134
- @inject(TabBarToolbarFactory)
135
- protected readonly toolbarFactory: TabBarToolbarFactory;
136
-
137
- protected readonly onDidChangeTrackableWidgetsEmitter = new Emitter<Widget[]>();
138
- readonly onDidChangeTrackableWidgets = this.onDidChangeTrackableWidgetsEmitter.event;
139
-
140
- @inject(ProgressBarFactory)
141
- protected readonly progressBarFactory: ProgressBarFactory;
142
-
143
- @inject(ApplicationShell)
144
- protected readonly shell: ApplicationShell;
145
-
146
- @inject(TabBarDecoratorService)
147
- protected readonly decoratorService: TabBarDecoratorService;
148
-
149
- @postConstruct()
150
- protected init(): void {
151
- this.id = this.options.id;
152
- this.addClass('theia-view-container');
153
- const layout = new PanelLayout();
154
- this.layout = layout;
155
- this.panel = new SplitPanel({
156
- layout: new ViewContainerLayout({
157
- renderer: SplitPanel.defaultRenderer,
158
- orientation: this.orientation,
159
- spacing: 2,
160
- headerSize: ViewContainerPart.HEADER_HEIGHT,
161
- animationDuration: 200
162
- }, this.splitPositionHandler)
163
- });
164
- this.panel.node.tabIndex = -1;
165
- this.configureLayout(layout);
166
-
167
- const { commandRegistry, menuRegistry, contextMenuRenderer } = this;
168
- this.toDispose.pushAll([
169
- addEventListener(this.node, 'contextmenu', event => {
170
- if (event.button === 2 && every(this.containerLayout.iter(), part => !!part.isHidden)) {
171
- event.stopPropagation();
172
- event.preventDefault();
173
- contextMenuRenderer.render({ menuPath: this.contextMenuPath, anchor: event });
174
- }
175
- }),
176
- commandRegistry.registerCommand({ id: this.globalHideCommandId }, {
177
- execute: (anchor: Anchor) => {
178
- const toHide = this.findPartForAnchor(anchor);
179
- if (toHide && toHide.canHide) {
180
- toHide.hide();
181
- }
182
- },
183
- isVisible: (anchor: Anchor) => {
184
- const toHide = this.findPartForAnchor(anchor);
185
- if (toHide) {
186
- return toHide.canHide && !toHide.isHidden;
187
- } else {
188
- return some(this.containerLayout.iter(), part => !part.isHidden);
189
- }
190
- }
191
- }),
192
- menuRegistry.registerMenuAction([...this.contextMenuPath, '0_global'], {
193
- commandId: this.globalHideCommandId,
194
- label: nls.localizeByDefault('Hide')
195
- }),
196
- this.onDidChangeTrackableWidgetsEmitter,
197
- this.onDidChangeTrackableWidgets(() => this.decoratorService.fireDidChangeDecorations())
198
- ]);
199
- if (this.options.progressLocationId) {
200
- this.toDispose.push(this.progressBarFactory({ container: this.node, insertMode: 'prepend', locationId: this.options.progressLocationId }));
201
- }
202
- }
203
-
204
- protected configureLayout(layout: PanelLayout): void {
205
- layout.addWidget(this.panel);
206
- }
207
-
208
- protected readonly toDisposeOnCurrentPart = new DisposableCollection();
209
-
210
- protected updateCurrentPart(part?: ViewContainerPart): void {
211
- if (part && this.getParts().indexOf(part) !== -1) {
212
- this.currentPart = part;
213
- }
214
- if (this.currentPart && !this.currentPart.isDisposed) {
215
- return;
216
- }
217
- const visibleParts = this.getParts().filter(p => !p.isHidden);
218
- const expandedParts = visibleParts.filter(p => !p.collapsed);
219
- this.currentPart = expandedParts[0] || visibleParts[0];
220
- }
221
-
222
- protected updateSplitterVisibility(): void {
223
- const className = 'p-first-visible';
224
- let firstFound = false;
225
- for (const part of this.getParts()) {
226
- if (!part.isHidden && !firstFound) {
227
- part.addClass(className);
228
- firstFound = true;
229
- } else {
230
- part.removeClass(className);
231
- }
232
- }
233
- }
234
-
235
- protected titleOptions: ViewContainerTitleOptions | undefined;
236
-
237
- setTitleOptions(titleOptions: ViewContainerTitleOptions | undefined): void {
238
- this.titleOptions = titleOptions;
239
- this.updateTitle();
240
- }
241
-
242
- protected readonly toDisposeOnUpdateTitle = new DisposableCollection();
243
-
244
- protected _tabBarDelegate: Widget = this;
245
- updateTabBarDelegate(): void {
246
- const visibleParts = this.getParts().filter(part => !part.isHidden);
247
- if (visibleParts.length === 1) {
248
- this._tabBarDelegate = visibleParts[0].wrapped;
249
- } else {
250
- this._tabBarDelegate = this;
251
- }
252
- }
253
-
254
- getTabBarDelegate(): Widget | undefined {
255
- return this._tabBarDelegate;
256
- }
257
-
258
- protected updateTitle(): void {
259
- this.toDisposeOnUpdateTitle.dispose();
260
- this.toDispose.push(this.toDisposeOnUpdateTitle);
261
- this.updateTabBarDelegate();
262
- let title = Object.assign({}, this.titleOptions);
263
- if (isEmpty(title)) {
264
- return;
265
- }
266
- const allParts = this.getParts();
267
- const visibleParts = allParts.filter(part => !part.isHidden);
268
- this.title.label = title.label;
269
- // If there's only one visible part - inline it's title into the container title except in case the part
270
- // isn't originally belongs to this container but there are other **original** hidden parts.
271
- if (visibleParts.length === 1 && (visibleParts[0].originalContainerId === this.id || !this.findOriginalPart())) {
272
- const part = visibleParts[0];
273
- this.toDisposeOnUpdateTitle.push(part.onTitleChanged(() => this.updateTitle()));
274
- const partLabel = part.wrapped.title.label;
275
- // Change the container title if it contains only one part that originally belongs to another container.
276
- if (allParts.length === 1 && part.originalContainerId !== this.id && !this.isCurrentTitle(part.originalContainerTitle)) {
277
- title = Object.assign({}, part.originalContainerTitle);
278
- this.setTitleOptions(title);
279
- return;
280
- }
281
- if (partLabel) {
282
- if (this.title.label && this.title.label !== partLabel) {
283
- this.title.label += ': ' + partLabel;
284
- } else {
285
- this.title.label = partLabel;
286
- }
287
- }
288
- part.collapsed = false;
289
- part.hideTitle();
290
- } else {
291
- visibleParts.forEach(part => part.showTitle());
292
- // If at least one part originally belongs to this container the title should return to its original value.
293
- const originalPart = this.findOriginalPart();
294
- if (originalPart && !this.isCurrentTitle(originalPart.originalContainerTitle)) {
295
- title = Object.assign({}, originalPart.originalContainerTitle);
296
- this.setTitleOptions(title);
297
- return;
298
- }
299
- }
300
- this.updateToolbarItems(allParts);
301
- this.title.caption = title?.caption || title?.label;
302
- if (title.iconClass) {
303
- this.title.iconClass = title.iconClass;
304
- }
305
- if (this.title.className.includes(PINNED_CLASS)) {
306
- this.title.closable &&= false;
307
- } else if (title.closeable !== undefined) {
308
- this.title.closable = title.closeable;
309
- }
310
- }
311
-
312
- protected updateToolbarItems(allParts: ViewContainerPart[]): void {
313
- if (allParts.length > 1) {
314
- const group = this.getToggleVisibilityGroupLabel();
315
- for (const part of allParts) {
316
- const existingId = this.toggleVisibilityCommandId(part);
317
- const { caption, label, dataset: { visibilityCommandLabel } } = part.wrapped.title;
318
- this.registerToolbarItem(existingId, { tooltip: visibilityCommandLabel || caption || label, group });
319
- }
320
- }
321
- }
322
-
323
- protected getToggleVisibilityGroupLabel(): string {
324
- return 'view';
325
- }
326
-
327
- protected registerToolbarItem(commandId: string, options?: Partial<Omit<TabBarToolbarItem, 'id' | 'command'>>): void {
328
- const newId = `${this.id}-tabbar-toolbar-${commandId}`;
329
- const existingHandler = this.commandRegistry.getAllHandlers(commandId)[0];
330
- const existingCommand = this.commandRegistry.getCommand(commandId);
331
- if (existingHandler && existingCommand) {
332
- this.toDisposeOnUpdateTitle.push(this.commandRegistry.registerCommand({ ...existingCommand, id: newId }, {
333
- execute: (_widget, ...args) => this.commandRegistry.executeCommand(commandId, ...args),
334
- isToggled: (_widget, ...args) => this.commandRegistry.isToggled(commandId, ...args),
335
- isEnabled: (_widget, ...args) => this.commandRegistry.isEnabled(commandId, ...args),
336
- isVisible: (widget, ...args) => widget === this.getTabBarDelegate() && this.commandRegistry.isVisible(commandId, ...args),
337
- }));
338
- this.toDisposeOnUpdateTitle.push(this.toolbarRegistry.registerItem({
339
- ...options,
340
- id: newId,
341
- command: newId,
342
- }));
343
- }
344
- }
345
-
346
- protected findOriginalPart(): ViewContainerPart | undefined {
347
- return this.getParts().find(part => part.originalContainerId === this.id);
348
- }
349
-
350
- protected isCurrentTitle(titleOptions: ViewContainerTitleOptions | undefined): boolean {
351
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
352
- return (!!titleOptions && !!this.titleOptions && Object.keys(titleOptions).every(key => (titleOptions as any)[key] === (this.titleOptions as any)[key]))
353
- || (!titleOptions && !this.titleOptions);
354
- }
355
-
356
- protected findPartForAnchor(anchor: Anchor): ViewContainerPart | undefined {
357
- const element = document.elementFromPoint(anchor.x, anchor.y);
358
- if (element instanceof Element) {
359
- const closestPart = ViewContainerPart.closestPart(element);
360
- if (closestPart && closestPart.id) {
361
- return find(this.containerLayout.iter(), part => part.id === closestPart.id);
362
- }
363
- }
364
- return undefined;
365
- }
366
-
367
- protected readonly toRemoveWidgets = new Map<string, DisposableCollection>();
368
-
369
- protected createPartId(widget: Widget): string {
370
- const description = this.widgetManager.getDescription(widget);
371
- return widget.id || JSON.stringify(description);
372
- }
373
-
374
- addWidget(widget: Widget, options?: ViewContainer.Factory.WidgetOptions, originalContainerId?: string, originalContainerTitle?: ViewContainerTitleOptions): Disposable {
375
- const existing = this.toRemoveWidgets.get(widget.id);
376
- if (existing) {
377
- return existing;
378
- }
379
- const partId = this.createPartId(widget);
380
- const newPart = this.createPart(widget, partId, originalContainerId || this.id, originalContainerTitle || this.titleOptions, options);
381
- return this.attachNewPart(newPart);
382
- }
383
-
384
- protected attachNewPart(newPart: ViewContainerPart, insertIndex?: number): Disposable {
385
- const toRemoveWidget = new DisposableCollection();
386
- this.toDispose.push(toRemoveWidget);
387
- this.toRemoveWidgets.set(newPart.wrapped.id, toRemoveWidget);
388
- toRemoveWidget.push(Disposable.create(() => this.toRemoveWidgets.delete(newPart.wrapped.id)));
389
- this.registerPart(newPart);
390
- if (insertIndex !== undefined || (newPart.options && newPart.options.order !== undefined)) {
391
- const index = insertIndex ?? this.getParts().findIndex(part => part.options.order === undefined || part.options.order > newPart.options.order!);
392
- if (index >= 0) {
393
- this.containerLayout.insertWidget(index, newPart);
394
- } else {
395
- this.containerLayout.addWidget(newPart);
396
- }
397
- } else {
398
- this.containerLayout.addWidget(newPart);
399
- }
400
- this.refreshMenu(newPart);
401
- this.updateTitle();
402
- this.updateCurrentPart();
403
- this.updateSplitterVisibility();
404
- this.update();
405
- this.fireDidChangeTrackableWidgets();
406
- toRemoveWidget.pushAll([
407
- Disposable.create(() => {
408
- if (newPart.currentViewContainerId === this.id) {
409
- newPart.dispose();
410
- }
411
- this.unregisterPart(newPart);
412
- if (!newPart.isDisposed && this.getPartIndex(newPart.id) > -1) {
413
- this.containerLayout.removeWidget(newPart);
414
- }
415
- if (!this.isDisposed) {
416
- this.update();
417
- this.updateTitle();
418
- this.updateCurrentPart();
419
- this.updateSplitterVisibility();
420
- this.fireDidChangeTrackableWidgets();
421
- }
422
- }),
423
- this.registerDND(newPart),
424
- newPart.onDidChangeVisibility(() => {
425
- this.updateTitle();
426
- this.updateCurrentPart();
427
- this.updateSplitterVisibility();
428
- this.containerLayout.updateSashes();
429
- }),
430
- newPart.onCollapsed(() => {
431
- this.containerLayout.updateCollapsed(newPart, this.enableAnimation);
432
- this.containerLayout.updateSashes();
433
- this.updateCurrentPart();
434
- }),
435
- newPart.onContextMenu(event => {
436
- if (event.button === 2) {
437
- event.preventDefault();
438
- event.stopPropagation();
439
- this.contextMenuRenderer.render({ menuPath: this.contextMenuPath, anchor: event });
440
- }
441
- }),
442
- newPart.onTitleChanged(() => this.refreshMenu(newPart)),
443
- newPart.onDidFocus(() => this.updateCurrentPart(newPart))
444
- ]);
445
-
446
- newPart.disposed.connect(() => toRemoveWidget.dispose());
447
- return toRemoveWidget;
448
- }
449
-
450
- protected createPart(widget: Widget, partId: string, originalContainerId: string, originalContainerTitle?: ViewContainerTitleOptions,
451
- options?: ViewContainer.Factory.WidgetOptions): ViewContainerPart {
452
-
453
- return new ViewContainerPart(widget, partId, this.id, originalContainerId, originalContainerTitle, this.toolbarRegistry, this.toolbarFactory, options);
454
- }
455
-
456
- removeWidget(widget: Widget): boolean {
457
- const disposable = this.toRemoveWidgets.get(widget.id);
458
- if (disposable) {
459
- disposable.dispose();
460
- return true;
461
- }
462
- return false;
463
- }
464
-
465
- getParts(): ViewContainerPart[] {
466
- return this.containerLayout.widgets;
467
- }
468
-
469
- protected getPartIndex(partId: string | undefined): number {
470
- if (partId) {
471
- return this.getParts().findIndex(part => part.id === partId);
472
- }
473
- return -1;
474
- }
475
-
476
- getPartFor(widget: Widget): ViewContainerPart | undefined {
477
- return this.getParts().find(p => p.wrapped.id === widget.id);
478
- }
479
-
480
- get containerLayout(): ViewContainerLayout {
481
- const layout = this.panel.layout;
482
- if (layout instanceof ViewContainerLayout) {
483
- return layout;
484
- }
485
- throw new Error('view container is disposed');
486
- }
487
-
488
- protected get orientation(): SplitLayout.Orientation {
489
- return ViewContainer.getOrientation(this.node);
490
- }
491
-
492
- protected get enableAnimation(): boolean {
493
- return this.applicationStateService.state === 'ready';
494
- }
495
-
496
- protected lastVisibleState: ViewContainer.State | undefined;
497
-
498
- storeState(): ViewContainer.State {
499
- if (!this.isVisible && this.lastVisibleState) {
500
- return this.lastVisibleState;
501
- }
502
- return this.doStoreState();
503
- }
504
- protected doStoreState(): ViewContainer.State {
505
- const parts = this.getParts();
506
- const availableSize = this.containerLayout.getAvailableSize();
507
- const orientation = this.orientation;
508
- const partStates = parts.map(part => {
509
- let size = this.containerLayout.getPartSize(part);
510
- if (size && size > ViewContainerPart.HEADER_HEIGHT && orientation === 'vertical') {
511
- size -= ViewContainerPart.HEADER_HEIGHT;
512
- }
513
- return <ViewContainerPart.State>{
514
- widget: part.wrapped,
515
- partId: part.partId,
516
- collapsed: part.collapsed,
517
- hidden: part.isHidden,
518
- relativeSize: size && availableSize ? size / availableSize : undefined,
519
- originalContainerId: part.originalContainerId,
520
- originalContainerTitle: part.originalContainerTitle
521
- };
522
- });
523
- return { parts: partStates, title: this.titleOptions };
524
- }
525
-
526
- restoreState(state: ViewContainer.State): void {
527
- this.lastVisibleState = state;
528
- this.doRestoreState(state);
529
- }
530
- protected doRestoreState(state: ViewContainer.State): void {
531
- this.setTitleOptions(state.title);
532
- // restore widgets
533
- for (const part of state.parts) {
534
- if (part.widget) {
535
- this.addWidget(part.widget, undefined, part.originalContainerId, part.originalContainerTitle || {} as ViewContainerTitleOptions);
536
- }
537
- }
538
- const partStates = state.parts.filter(partState => some(this.containerLayout.iter(), p => p.partId === partState.partId));
539
-
540
- // Reorder the parts according to the stored state
541
- for (let index = 0; index < partStates.length; index++) {
542
- const partState = partStates[index];
543
- const widget = this.getParts().find(part => part.partId === partState.partId);
544
- if (widget) {
545
- this.containerLayout.insertWidget(index, widget);
546
- }
547
- }
548
-
549
- // Restore visibility and collapsed state
550
- const parts = this.getParts();
551
- for (let index = 0; index < parts.length; index++) {
552
- const part = parts[index];
553
- const partState = partStates.find(s => part.partId === s.partId);
554
- if (partState) {
555
- part.setHidden(partState.hidden);
556
- part.collapsed = partState.collapsed || !partState.relativeSize;
557
- } else if (part.canHide) {
558
- part.hide();
559
- }
560
- this.refreshMenu(part);
561
- }
562
-
563
- // Restore part sizes
564
- waitForRevealed(this).then(() => {
565
- this.containerLayout.setPartSizes(partStates.map(partState => partState.relativeSize));
566
- this.updateSplitterVisibility();
567
- });
568
- }
569
-
570
- /**
571
- * Register a command to toggle the visibility of the new part.
572
- */
573
- protected registerPart(toRegister: ViewContainerPart): void {
574
- const commandId = this.toggleVisibilityCommandId(toRegister);
575
- this.commandRegistry.registerCommand({ id: commandId }, {
576
- execute: () => {
577
- const toHide = find(this.containerLayout.iter(), part => part.id === toRegister.id);
578
- if (toHide) {
579
- toHide.setHidden(!toHide.isHidden);
580
- }
581
- },
582
- isToggled: () => {
583
- if (!toRegister.canHide) {
584
- return true;
585
- }
586
- const widgetToToggle = find(this.containerLayout.iter(), part => part.id === toRegister.id);
587
- if (widgetToToggle) {
588
- return !widgetToToggle.isHidden;
589
- }
590
- return false;
591
- },
592
- isEnabled: arg => toRegister.canHide && (!this.titleOptions || !(arg instanceof Widget) || (arg instanceof ViewContainer && arg.id === this.id)),
593
- isVisible: arg => !this.titleOptions || !(arg instanceof Widget) || (arg instanceof ViewContainer && arg.id === this.id)
594
- });
595
- }
596
-
597
- /**
598
- * Register a menu action to toggle the visibility of the new part.
599
- * The menu action is unregistered first to enable refreshing the order of menu actions.
600
- */
601
- protected refreshMenu(part: ViewContainerPart): void {
602
- const commandId = this.toggleVisibilityCommandId(part);
603
- this.menuRegistry.unregisterMenuAction(commandId);
604
- if (!part.wrapped.title.label) {
605
- return;
606
- }
607
- const { dataset: { visibilityCommandLabel }, caption, label } = part.wrapped.title;
608
- const action: MenuAction = {
609
- commandId: commandId,
610
- label: visibilityCommandLabel || caption || label,
611
- order: this.getParts().indexOf(part).toString()
612
- };
613
- this.menuRegistry.registerMenuAction([...this.contextMenuPath, '1_widgets'], action);
614
- if (this.titleOptions) {
615
- this.menuRegistry.registerMenuAction([...SIDE_PANEL_TOOLBAR_CONTEXT_MENU, 'navigation'], action);
616
- }
617
- }
618
-
619
- protected unregisterPart(part: ViewContainerPart): void {
620
- const commandId = this.toggleVisibilityCommandId(part);
621
- this.commandRegistry.unregisterCommand(commandId);
622
- this.menuRegistry.unregisterMenuAction(commandId);
623
- }
624
-
625
- protected get contextMenuPath(): MenuPath {
626
- return [`${this.id}-context-menu`];
627
- }
628
-
629
- protected toggleVisibilityCommandId(part: ViewContainerPart): string {
630
- return `${this.id}:toggle-visibility-${part.id}`;
631
- }
632
-
633
- protected get globalHideCommandId(): string {
634
- return `${this.id}:toggle-visibility`;
635
- }
636
-
637
- protected moveBefore(toMovedId: string, moveBeforeThisId: string): void {
638
- const parts = this.getParts();
639
- const indexToMove = parts.findIndex(part => part.id === toMovedId);
640
- const targetIndex = parts.findIndex(part => part.id === moveBeforeThisId);
641
- if (indexToMove >= 0 && targetIndex >= 0) {
642
- this.containerLayout.insertWidget(targetIndex, parts[indexToMove]);
643
- for (let index = Math.min(indexToMove, targetIndex); index < parts.length; index++) {
644
- this.refreshMenu(parts[index]);
645
- this.activate();
646
- }
647
- }
648
- this.updateSplitterVisibility();
649
- }
650
-
651
- getTrackableWidgets(): Widget[] {
652
- return this.getParts().map(w => w.wrapped);
653
- }
654
-
655
- protected fireDidChangeTrackableWidgets(): void {
656
- this.onDidChangeTrackableWidgetsEmitter.fire(this.getTrackableWidgets());
657
- }
658
-
659
- activateWidget(id: string): Widget | undefined {
660
- const part = this.revealPart(id);
661
- if (!part) {
662
- return undefined;
663
- }
664
- this.updateCurrentPart(part);
665
- part.collapsed = false;
666
- return part.wrapped;
667
- }
668
-
669
- revealWidget(id: string): Widget | undefined {
670
- const part = this.revealPart(id);
671
- return part && part.wrapped;
672
- }
673
-
674
- protected revealPart(id: string): ViewContainerPart | undefined {
675
- const part = this.getParts().find(p => p.wrapped.id === id);
676
- if (!part) {
677
- return undefined;
678
- }
679
- part.setHidden(false);
680
- return part;
681
- }
682
-
683
- protected override onActivateRequest(msg: Message): void {
684
- super.onActivateRequest(msg);
685
- if (this.currentPart) {
686
- this.currentPart.activate();
687
- } else {
688
- this.panel.node.focus({ preventScroll: true });
689
- }
690
- }
691
-
692
- protected override onAfterAttach(msg: Message): void {
693
- const orientation = this.orientation;
694
- this.containerLayout.orientation = orientation;
695
- if (orientation === 'horizontal') {
696
- for (const part of this.getParts()) {
697
- part.collapsed = false;
698
- }
699
- }
700
- super.onAfterAttach(msg);
701
- }
702
-
703
- protected override onBeforeHide(msg: Message): void {
704
- super.onBeforeHide(msg);
705
- this.lastVisibleState = this.storeState();
706
- }
707
-
708
- protected override onAfterShow(msg: Message): void {
709
- super.onAfterShow(msg);
710
- this.updateTitle();
711
- this.lastVisibleState = undefined;
712
- }
713
-
714
- protected override onBeforeAttach(msg: Message): void {
715
- super.onBeforeAttach(msg);
716
- this.node.addEventListener('p-dragenter', this, true);
717
- this.node.addEventListener('p-dragover', this, true);
718
- this.node.addEventListener('p-dragleave', this, true);
719
- this.node.addEventListener('p-drop', this, true);
720
- }
721
-
722
- protected override onAfterDetach(msg: Message): void {
723
- super.onAfterDetach(msg);
724
- this.node.removeEventListener('p-dragenter', this, true);
725
- this.node.removeEventListener('p-dragover', this, true);
726
- this.node.removeEventListener('p-dragleave', this, true);
727
- this.node.removeEventListener('p-drop', this, true);
728
- }
729
-
730
- handleEvent(event: Event): void {
731
- switch (event.type) {
732
- case 'p-dragenter':
733
- this.handleDragEnter(event as IDragEvent);
734
- break;
735
- case 'p-dragover':
736
- this.handleDragOver(event as IDragEvent);
737
- break;
738
- case 'p-dragleave':
739
- this.handleDragLeave(event as IDragEvent);
740
- break;
741
- case 'p-drop':
742
- this.handleDrop(event as IDragEvent);
743
- break;
744
- }
745
- }
746
-
747
- handleDragEnter(event: IDragEvent): void {
748
- if (event.mimeData.hasData('application/vnd.phosphor.view-container-factory')) {
749
- event.preventDefault();
750
- event.stopPropagation();
751
- }
752
- }
753
-
754
- toDisposeOnDragEnd = new DisposableCollection();
755
- handleDragOver(event: IDragEvent): void {
756
- const factory = event.mimeData.getData('application/vnd.phosphor.view-container-factory');
757
- const widget = factory && factory();
758
- if (!(widget instanceof ViewContainerPart)) {
759
- return;
760
- }
761
- event.preventDefault();
762
- event.stopPropagation();
763
-
764
- const sameContainers = this.id === widget.currentViewContainerId;
765
- const targetPart = ArrayExt.findFirstValue(this.getParts(), (p => ElementExt.hitTest(p.node, event.clientX, event.clientY)));
766
- if (!targetPart && sameContainers) {
767
- event.dropAction = 'none';
768
- return;
769
- }
770
- if (targetPart) {
771
- // add overlay class style to the `targetPart` node.
772
- targetPart.node.classList.add('drop-target');
773
- this.toDisposeOnDragEnd.push(Disposable.create(() => targetPart.node.classList.remove('drop-target')));
774
- } else {
775
- // show panel overlay.
776
- const dockPanel = this.getDockPanel();
777
- if (dockPanel) {
778
- dockPanel.overlay.show({ top: 0, bottom: 0, right: 0, left: 0 });
779
- this.toDisposeOnDragEnd.push(Disposable.create(() => dockPanel.overlay.hide(100)));
780
- }
781
- }
782
-
783
- const isDraggingOutsideDisabled = this.disableDNDBetweenContainers || widget.viewContainer?.disableDNDBetweenContainers
784
- || widget.options.disableDraggingToOtherContainers;
785
- if (isDraggingOutsideDisabled && !sameContainers) {
786
- const { target } = event;
787
- if (target instanceof HTMLElement) {
788
- target.classList.add('theia-cursor-no-drop');
789
- this.toDisposeOnDragEnd.push(Disposable.create(() => {
790
- target.classList.remove('theia-cursor-no-drop');
791
- }));
792
- }
793
- event.dropAction = 'none';
794
- return;
795
- };
796
-
797
- event.dropAction = event.proposedAction;
798
- };
799
-
800
- handleDragLeave(event: IDragEvent): void {
801
- this.toDisposeOnDragEnd.dispose();
802
- if (event.mimeData.hasData('application/vnd.phosphor.view-container-factory')) {
803
- event.preventDefault();
804
- event.stopPropagation();
805
- }
806
- };
807
-
808
- handleDrop(event: IDragEvent): void {
809
- this.toDisposeOnDragEnd.dispose();
810
- const factory = event.mimeData.getData('application/vnd.phosphor.view-container-factory');
811
- const draggedPart = factory && factory();
812
- if (!(draggedPart instanceof ViewContainerPart)) {
813
- event.dropAction = 'none';
814
- return;
815
- }
816
- event.preventDefault();
817
- event.stopPropagation();
818
- const parts = this.getParts();
819
- const toIndex = ArrayExt.findFirstIndex(parts, part => ElementExt.hitTest(part.node, event.clientX, event.clientY));
820
- if (draggedPart.currentViewContainerId !== this.id) {
821
- this.attachNewPart(draggedPart, toIndex > -1 ? toIndex + 1 : toIndex);
822
- draggedPart.onPartMoved(this);
823
- } else {
824
- this.moveBefore(draggedPart.id, parts[toIndex].id);
825
- }
826
- event.dropAction = event.proposedAction;
827
- }
828
-
829
- protected registerDND(part: ViewContainerPart): Disposable {
830
- part.headerElement.draggable = true;
831
-
832
- return new DisposableCollection(
833
- addEventListener(part.headerElement, 'dragstart',
834
- event => {
835
- event.preventDefault();
836
- const mimeData = new MimeData();
837
- mimeData.setData('application/vnd.phosphor.view-container-factory', () => part);
838
- const clonedHeader = part.headerElement.cloneNode(true) as HTMLElement;
839
- clonedHeader.style.width = part.node.style.width;
840
- clonedHeader.style.opacity = '0.6';
841
- const drag = new Drag({
842
- mimeData,
843
- dragImage: clonedHeader,
844
- proposedAction: 'move',
845
- supportedActions: 'move'
846
- });
847
- part.node.classList.add('p-mod-hidden');
848
- drag.start(event.clientX, event.clientY).then(dropAction => {
849
- // The promise is resolved when the drag has ended
850
- if (dropAction === 'move' && part.currentViewContainerId !== this.id) {
851
- this.removeWidget(part.wrapped);
852
- this.lastVisibleState = this.doStoreState();
853
- }
854
- });
855
- setTimeout(() => { part.node.classList.remove('p-mod-hidden'); }, 0);
856
- }, false));
857
- }
858
-
859
- protected getDockPanel(): DockPanel | undefined {
860
- let panel: DockPanel | undefined;
861
- let parent = this.parent;
862
- while (!panel && parent) {
863
- if (this.isSideDockPanel(parent)) {
864
- panel = parent as DockPanel;
865
- } else {
866
- parent = parent.parent;
867
- }
868
- }
869
- return panel;
870
- }
871
-
872
- protected isSideDockPanel(widget: Widget): boolean {
873
- const { leftPanelHandler, rightPanelHandler } = this.shell;
874
- if (widget instanceof DockPanel && (widget.id === rightPanelHandler.dockPanel.id || widget.id === leftPanelHandler.dockPanel.id)) {
875
- return true;
876
- }
877
- return false;
878
- }
879
-
880
- }
881
-
882
- export namespace ViewContainer {
883
-
884
- export const Factory = Symbol('ViewContainerFactory');
885
- export interface Factory {
886
- (options: ViewContainerIdentifier): ViewContainer;
887
- }
888
-
889
- export namespace Factory {
890
-
891
- export interface WidgetOptions {
892
- readonly order?: number;
893
- readonly weight?: number;
894
- readonly initiallyCollapsed?: boolean;
895
- readonly canHide?: boolean;
896
- readonly initiallyHidden?: boolean;
897
- /**
898
- * Disable dragging this part from its original container to other containers,
899
- * But allow dropping parts from other containers on it,
900
- * This option only applies to the `ViewContainerPart` and has no effect on the ViewContainer.
901
- */
902
- readonly disableDraggingToOtherContainers?: boolean;
903
- }
904
-
905
- export interface WidgetDescriptor {
906
- readonly widget: Widget | interfaces.ServiceIdentifier<Widget>;
907
- readonly options?: WidgetOptions;
908
- }
909
-
910
- }
911
-
912
- export interface State {
913
- title?: ViewContainerTitleOptions;
914
- parts: ViewContainerPart.State[]
915
- }
916
-
917
- export function getOrientation(node: HTMLElement): 'horizontal' | 'vertical' {
918
- if (node.closest(`#${MAIN_AREA_ID}`) || node.closest(`#${BOTTOM_AREA_ID}`)) {
919
- return 'horizontal';
920
- }
921
- return 'vertical';
922
- }
923
- }
924
-
925
- /**
926
- * Wrapper around a widget held by a view container. Adds a header to display the
927
- * title, toolbar, and collapse / expand handle.
928
- */
929
- export class ViewContainerPart extends BaseWidget {
930
-
931
- protected readonly header: HTMLElement;
932
- protected readonly body: HTMLElement;
933
- protected readonly collapsedEmitter = new Emitter<boolean>();
934
- protected readonly contextMenuEmitter = new Emitter<MouseEvent>();
935
-
936
- protected readonly onTitleChangedEmitter = new Emitter<void>();
937
- readonly onTitleChanged = this.onTitleChangedEmitter.event;
938
- protected readonly onDidFocusEmitter = new Emitter<this>();
939
- readonly onDidFocus = this.onDidFocusEmitter.event;
940
- protected readonly onPartMovedEmitter = new Emitter<ViewContainer>();
941
- readonly onDidMove = this.onPartMovedEmitter.event;
942
- protected readonly onDidChangeDescriptionEmitter = new Emitter<void>();
943
- readonly onDidChangeDescription = this.onDidChangeDescriptionEmitter.event;
944
- protected readonly onDidChangeBadgeEmitter = new Emitter<void>();
945
- readonly onDidChangeBadge = this.onDidChangeBadgeEmitter.event;
946
- protected readonly onDidChangeBadgeTooltipEmitter = new Emitter<void>();
947
- readonly onDidChangeBadgeTooltip = this.onDidChangeBadgeTooltipEmitter.event;
948
-
949
- protected readonly toolbar: TabBarToolbar;
950
-
951
- protected _collapsed: boolean;
952
-
953
- uncollapsedSize: number | undefined;
954
- animatedSize: number | undefined;
955
-
956
- protected readonly toNoDisposeWrapped: Disposable;
957
-
958
- constructor(
959
- readonly wrapped: Widget,
960
- readonly partId: string,
961
- protected currentContainerId: string,
962
- readonly originalContainerId: string,
963
- readonly originalContainerTitle: ViewContainerTitleOptions | undefined,
964
- protected readonly toolbarRegistry: TabBarToolbarRegistry,
965
- protected readonly toolbarFactory: TabBarToolbarFactory,
966
- readonly options: ViewContainer.Factory.WidgetOptions = {}
967
- ) {
968
- super();
969
- wrapped.parent = this;
970
- wrapped.disposed.connect(() => this.dispose());
971
- this.id = `${originalContainerId}--${wrapped.id}`;
972
- this.addClass('part');
973
-
974
- const fireTitleChanged = () => this.onTitleChangedEmitter.fire(undefined);
975
- this.wrapped.title.changed.connect(fireTitleChanged);
976
- this.toDispose.push(Disposable.create(() => this.wrapped.title.changed.disconnect(fireTitleChanged)));
977
-
978
- if (DescriptionWidget.is(this.wrapped)) {
979
- this.wrapped?.onDidChangeDescription(() => this.onDidChangeDescriptionEmitter.fire(), undefined, this.toDispose);
980
- }
981
-
982
- if (BadgeWidget.is(this.wrapped)) {
983
- this.wrapped.onDidChangeBadge(() => this.onDidChangeBadgeEmitter.fire(), undefined, this.toDispose);
984
- this.wrapped.onDidChangeBadgeTooltip(() => this.onDidChangeBadgeTooltipEmitter.fire(), undefined, this.toDispose);
985
- }
986
-
987
- if (DynamicToolbarWidget.is(this.wrapped)) {
988
- this.wrapped.onDidChangeToolbarItems(() => {
989
- this.toolbar.updateTarget(this.wrapped);
990
- this.viewContainer?.update();
991
- });
992
- }
993
-
994
- const { header, body, disposable } = this.createContent();
995
- this.header = header;
996
- this.body = body;
997
-
998
- this.toNoDisposeWrapped = this.toDispose.push(wrapped);
999
- this.toolbar = this.toolbarFactory();
1000
- this.toolbar.addClass('theia-view-container-part-title');
1001
-
1002
- this.toDispose.pushAll([
1003
- disposable,
1004
- this.toolbar,
1005
- this.toolbarRegistry.onDidChange(() => this.toolbar.updateTarget(this.wrapped)),
1006
- this.collapsedEmitter,
1007
- this.contextMenuEmitter,
1008
- this.onTitleChangedEmitter,
1009
- this.onDidChangeDescriptionEmitter,
1010
- this.onDidChangeBadgeEmitter,
1011
- this.onDidChangeBadgeTooltipEmitter,
1012
- this.registerContextMenu(),
1013
- this.onDidFocusEmitter,
1014
- // focus event does not bubble, capture it
1015
- addEventListener(this.node, 'focus', () => this.onDidFocusEmitter.fire(this), true)
1016
- ]);
1017
- this.scrollOptions = {
1018
- suppressScrollX: true,
1019
- minScrollbarLength: 35
1020
- };
1021
- this.collapsed = !!options.initiallyCollapsed;
1022
- if (options.initiallyHidden && this.canHide) {
1023
- this.hide();
1024
- }
1025
- }
1026
-
1027
- get viewContainer(): ViewContainer | undefined {
1028
- return this.parent ? this.parent.parent as ViewContainer : undefined;
1029
- }
1030
-
1031
- get currentViewContainerId(): string {
1032
- return this.currentContainerId;
1033
- }
1034
-
1035
- get headerElement(): HTMLElement {
1036
- return this.header;
1037
- }
1038
-
1039
- get collapsed(): boolean {
1040
- return this._collapsed;
1041
- }
1042
-
1043
- set collapsed(collapsed: boolean) {
1044
- // Cannot collapse/expand if the orientation of the container is `horizontal`.
1045
- const orientation = ViewContainer.getOrientation(this.node);
1046
- if (this._collapsed === collapsed || (orientation === 'horizontal' && collapsed)) {
1047
- return;
1048
- }
1049
- this._collapsed = collapsed;
1050
- this.node.classList.toggle('collapsed', collapsed);
1051
-
1052
- if (collapsed && this.wrapped.node.contains(document.activeElement)) {
1053
- this.header.focus();
1054
- }
1055
- this.wrapped.setHidden(collapsed);
1056
- const toggleIcon = this.header.querySelector(`span.${EXPANSION_TOGGLE_CLASS}`);
1057
- if (toggleIcon) {
1058
- if (collapsed) {
1059
- toggleIcon.classList.add(COLLAPSED_CLASS);
1060
- } else {
1061
- toggleIcon.classList.remove(COLLAPSED_CLASS);
1062
- }
1063
- }
1064
- this.update();
1065
- this.collapsedEmitter.fire(collapsed);
1066
- }
1067
-
1068
- onPartMoved(newContainer: ViewContainer): void {
1069
- this.currentContainerId = newContainer.id;
1070
- this.onPartMovedEmitter.fire(newContainer);
1071
- }
1072
-
1073
- override setHidden(hidden: boolean): void {
1074
- if (!this.canHide) {
1075
- return;
1076
- }
1077
- super.setHidden(hidden);
1078
- }
1079
-
1080
- get canHide(): boolean {
1081
- return this.options.canHide === undefined || this.options.canHide;
1082
- }
1083
-
1084
- get onCollapsed(): CommonEvent<boolean> {
1085
- return this.collapsedEmitter.event;
1086
- }
1087
-
1088
- get onContextMenu(): CommonEvent<MouseEvent> {
1089
- return this.contextMenuEmitter.event;
1090
- }
1091
-
1092
- get minSize(): number {
1093
- const style = getComputedStyle(this.body);
1094
- if (ViewContainer.getOrientation(this.node) === 'horizontal') {
1095
- return parseCssMagnitude(style.minWidth, 0);
1096
- } else {
1097
- return parseCssMagnitude(style.minHeight, 0);
1098
- }
1099
- }
1100
-
1101
- protected readonly toShowHeader = new DisposableCollection();
1102
- showTitle(): void {
1103
- this.toShowHeader.dispose();
1104
- }
1105
-
1106
- hideTitle(): void {
1107
- if (this.titleHidden) {
1108
- return;
1109
- }
1110
- const display = this.header.style.display;
1111
- const height = this.body.style.height;
1112
- this.body.style.height = '100%';
1113
- this.header.style.display = 'none';
1114
- this.toShowHeader.push(Disposable.create(() => {
1115
- this.header.style.display = display;
1116
- this.body.style.height = height;
1117
- }));
1118
- }
1119
-
1120
- get titleHidden(): boolean {
1121
- return !this.toShowHeader.disposed || this.collapsed;
1122
- }
1123
-
1124
- protected override getScrollContainer(): HTMLElement {
1125
- return this.body;
1126
- }
1127
-
1128
- protected registerContextMenu(): Disposable {
1129
- return new DisposableCollection(
1130
- addEventListener(this.header, 'contextmenu', event => {
1131
- this.contextMenuEmitter.fire(event);
1132
- })
1133
- );
1134
- }
1135
-
1136
- protected createContent(): { header: HTMLElement, body: HTMLElement, disposable: Disposable } {
1137
- const disposable = new DisposableCollection();
1138
- const { header, disposable: headerDisposable } = this.createHeader();
1139
- const body = document.createElement('div');
1140
- body.classList.add('body');
1141
- this.node.appendChild(header);
1142
- this.node.appendChild(body);
1143
- disposable.push(headerDisposable);
1144
- return {
1145
- header,
1146
- body,
1147
- disposable,
1148
- };
1149
- }
1150
-
1151
- protected createHeader(): { header: HTMLElement, disposable: Disposable } {
1152
- const disposable = new DisposableCollection();
1153
- const header = document.createElement('div');
1154
- header.tabIndex = 0;
1155
- header.classList.add('theia-header', 'header', 'theia-view-container-part-header');
1156
- disposable.push(addEventListener(header, 'click', event => {
1157
- if (this.toolbar && this.toolbar.shouldHandleMouseEvent(event)) {
1158
- return;
1159
- }
1160
- this.collapsed = !this.collapsed;
1161
- }));
1162
- disposable.push(addKeyListener(header, Key.ARROW_LEFT, () => this.collapsed = true));
1163
- disposable.push(addKeyListener(header, Key.ARROW_RIGHT, () => this.collapsed = false));
1164
- disposable.push(addKeyListener(header, Key.ENTER, () => this.collapsed = !this.collapsed));
1165
-
1166
- const toggleIcon = document.createElement('span');
1167
- toggleIcon.classList.add(EXPANSION_TOGGLE_CLASS, ...CODICON_TREE_ITEM_CLASSES);
1168
- if (this.collapsed) {
1169
- toggleIcon.classList.add(COLLAPSED_CLASS);
1170
- }
1171
- header.appendChild(toggleIcon);
1172
-
1173
- const title = document.createElement('span');
1174
- title.classList.add('label', 'noselect');
1175
-
1176
- const description = document.createElement('span');
1177
- description.classList.add('description');
1178
-
1179
- const badgeSpan = document.createElement('span');
1180
- badgeSpan.classList.add('notification-count');
1181
-
1182
- const badgeContainer = document.createElement('div');
1183
- badgeContainer.classList.add('notification-count-container');
1184
- badgeContainer.appendChild(badgeSpan);
1185
- const badgeContainerDisplay = badgeContainer.style.display;
1186
-
1187
- const updateTitle = () => {
1188
- if (this.currentContainerId !== this.originalContainerId && this.originalContainerTitle?.label) {
1189
- // Creating a title in format: <original_container_title>: <part_title>.
1190
- title.innerText = this.originalContainerTitle.label + ': ' + this.wrapped.title.label;
1191
- } else {
1192
- title.innerText = this.wrapped.title.label;
1193
- }
1194
- };
1195
- const updateCaption = () => title.title = this.wrapped.title.caption || this.wrapped.title.label;
1196
- const updateDescription = () => {
1197
- description.innerText = DescriptionWidget.is(this.wrapped) && !this.collapsed && this.wrapped.description || '';
1198
- };
1199
- const updateBadge = () => {
1200
- if (BadgeWidget.is(this.wrapped)) {
1201
- const visibleToolBarItems = this.toolbarRegistry.visibleItems(this.wrapped).length > 0;
1202
- const badge = this.wrapped.badge;
1203
- if (badge && !visibleToolBarItems) {
1204
- badgeSpan.innerText = badge.toString();
1205
- badgeSpan.title = this.wrapped.badgeTooltip || '';
1206
- badgeContainer.style.display = badgeContainerDisplay;
1207
- return;
1208
- }
1209
- }
1210
- badgeContainer.style.display = 'none';
1211
- };
1212
-
1213
- updateTitle();
1214
- updateCaption();
1215
- updateDescription();
1216
- updateBadge();
1217
-
1218
- disposable.pushAll([
1219
- this.onTitleChanged(updateTitle),
1220
- this.onTitleChanged(updateCaption),
1221
- this.onDidMove(updateTitle),
1222
- this.onDidChangeDescription(updateDescription),
1223
- this.onDidChangeBadge(updateBadge),
1224
- this.onDidChangeBadgeTooltip(updateBadge),
1225
- this.onCollapsed(updateDescription)
1226
- ]);
1227
- header.appendChild(title);
1228
- header.appendChild(description);
1229
- header.appendChild(badgeContainer);
1230
-
1231
- return {
1232
- header,
1233
- disposable
1234
- };
1235
- }
1236
-
1237
- protected handleResize(): void {
1238
- const handleMouseEnter = () => {
1239
- this.node?.classList.add('no-pointer-events');
1240
- setTimeout(() => {
1241
- this.node?.classList.remove('no-pointer-events');
1242
- this.node?.removeEventListener('mouseenter', handleMouseEnter);
1243
- }, 100);
1244
- };
1245
- this.node?.addEventListener('mouseenter', handleMouseEnter);
1246
- }
1247
-
1248
- protected override onResize(msg: Widget.ResizeMessage): void {
1249
- this.handleResize();
1250
- if (this.wrapped.isAttached && !this.collapsed) {
1251
- MessageLoop.sendMessage(this.wrapped, Widget.ResizeMessage.UnknownSize);
1252
- }
1253
- super.onResize(msg);
1254
- }
1255
-
1256
- protected override onUpdateRequest(msg: Message): void {
1257
- if (this.wrapped.isAttached && !this.collapsed) {
1258
- MessageLoop.sendMessage(this.wrapped, msg);
1259
- }
1260
- super.onUpdateRequest(msg);
1261
- }
1262
-
1263
- protected override onAfterAttach(msg: Message): void {
1264
- if (!this.wrapped.isAttached) {
1265
- UnsafeWidgetUtilities.attach(this.wrapped, this.body);
1266
- }
1267
- UnsafeWidgetUtilities.attach(this.toolbar, this.header);
1268
- super.onAfterAttach(msg);
1269
- }
1270
-
1271
- protected override onBeforeDetach(msg: Message): void {
1272
- super.onBeforeDetach(msg);
1273
- if (this.toolbar.isAttached) {
1274
- Widget.detach(this.toolbar);
1275
- }
1276
- if (this.wrapped.isAttached) {
1277
- UnsafeWidgetUtilities.detach(this.wrapped);
1278
- }
1279
- }
1280
-
1281
- protected override onBeforeShow(msg: Message): void {
1282
- if (this.wrapped.isAttached && !this.collapsed) {
1283
- MessageLoop.sendMessage(this.wrapped, msg);
1284
- }
1285
- super.onBeforeShow(msg);
1286
- }
1287
-
1288
- protected override onAfterShow(msg: Message): void {
1289
- super.onAfterShow(msg);
1290
- if (this.wrapped.isAttached && !this.collapsed) {
1291
- MessageLoop.sendMessage(this.wrapped, msg);
1292
- }
1293
- }
1294
-
1295
- protected override onBeforeHide(msg: Message): void {
1296
- if (this.wrapped.isAttached && !this.collapsed) {
1297
- MessageLoop.sendMessage(this.wrapped, msg);
1298
- }
1299
- super.onBeforeShow(msg);
1300
- }
1301
-
1302
- protected override onAfterHide(msg: Message): void {
1303
- super.onAfterHide(msg);
1304
- if (this.wrapped.isAttached && !this.collapsed) {
1305
- MessageLoop.sendMessage(this.wrapped, msg);
1306
- }
1307
- }
1308
-
1309
- protected override onChildRemoved(msg: Widget.ChildMessage): void {
1310
- super.onChildRemoved(msg);
1311
- // if wrapped is not disposed, but detached then we should not dispose it, but only get rid of this part
1312
- this.toNoDisposeWrapped.dispose();
1313
- this.dispose();
1314
- }
1315
-
1316
- protected override onActivateRequest(msg: Message): void {
1317
- super.onActivateRequest(msg);
1318
- if (this.collapsed) {
1319
- this.header.focus();
1320
- } else {
1321
- this.wrapped.activate();
1322
- }
1323
- }
1324
- }
1325
-
1326
- export namespace ViewContainerPart {
1327
-
1328
- /**
1329
- * Make sure to adjust the `line-height` of the `.theia-view-container .part > .header` CSS class when modifying this, and vice versa.
1330
- */
1331
- export const HEADER_HEIGHT = 22;
1332
-
1333
- export interface State {
1334
- widget?: Widget
1335
- partId: string;
1336
- collapsed: boolean;
1337
- hidden: boolean;
1338
- relativeSize?: number;
1339
- description?: string;
1340
- /** The original container to which this part belongs */
1341
- originalContainerId: string;
1342
- originalContainerTitle?: ViewContainerTitleOptions;
1343
- }
1344
-
1345
- export function closestPart(element: Element | EventTarget | null, selector: string = 'div.part'): Element | undefined {
1346
- if (element instanceof Element) {
1347
- const part = element.closest(selector);
1348
- if (part instanceof Element) {
1349
- return part;
1350
- }
1351
- }
1352
- return undefined;
1353
- }
1354
- }
1355
-
1356
- export class ViewContainerLayout extends SplitLayout {
1357
-
1358
- constructor(protected options: ViewContainerLayout.Options, protected readonly splitPositionHandler: SplitPositionHandler) {
1359
- super(options);
1360
- }
1361
-
1362
- protected get items(): ReadonlyArray<LayoutItem & ViewContainerLayout.Item> {
1363
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1364
- return (this as any)._items as Array<LayoutItem & ViewContainerLayout.Item>;
1365
- }
1366
-
1367
- override iter(): IIterator<ViewContainerPart> {
1368
- return map(this.items, item => item.widget);
1369
- }
1370
-
1371
- // @ts-expect-error TS2611 `SplitLayout.widgets` is declared as `readonly widgets` but is implemented as a getter.
1372
- get widgets(): ViewContainerPart[] {
1373
- return toArray(this.iter());
1374
- }
1375
-
1376
- override attachWidget(index: number, widget: ViewContainerPart): void {
1377
- super.attachWidget(index, widget);
1378
- if (index > -1 && this.parent && this.parent.node.contains(this.widgets[index + 1]?.node)) {
1379
- // Set the correct attach index to the DOM elements.
1380
- const ref = this.widgets[index + 1].node;
1381
- this.parent.node.insertBefore(widget.node, ref);
1382
- this.parent.node.insertBefore(this.handles[index], ref);
1383
- this.parent.fit();
1384
- }
1385
- }
1386
-
1387
- getPartSize(part: ViewContainerPart): number | undefined {
1388
- if (part.collapsed || part.isHidden) {
1389
- return part.uncollapsedSize;
1390
- }
1391
- if (this.orientation === 'horizontal') {
1392
- return part.node.offsetWidth;
1393
- } else {
1394
- return part.node.offsetHeight;
1395
- }
1396
- }
1397
-
1398
- /**
1399
- * Set the sizes of the view container parts according to the given weights
1400
- * by moving the split handles. This is similar to `setRelativeSizes` defined
1401
- * in `SplitLayout`, but here we properly consider the collapsed / expanded state.
1402
- */
1403
- setPartSizes(weights: (number | undefined)[]): void {
1404
- const parts = this.widgets;
1405
- const availableSize = this.getAvailableSize();
1406
-
1407
- // Sum up the weights of visible parts
1408
- let totalWeight = 0;
1409
- let weightCount = 0;
1410
- for (let index = 0; index < weights.length && index < parts.length; index++) {
1411
- const part = parts[index];
1412
- const weight = weights[index];
1413
- if (weight && !part.isHidden && !part.collapsed) {
1414
- totalWeight += weight;
1415
- weightCount++;
1416
- }
1417
- }
1418
- if (weightCount === 0 || availableSize === 0) {
1419
- return;
1420
- }
1421
-
1422
- // Add the average weight for visible parts without weight
1423
- const averageWeight = totalWeight / weightCount;
1424
- for (let index = 0; index < weights.length && index < parts.length; index++) {
1425
- const part = parts[index];
1426
- const weight = weights[index];
1427
- if (!weight && !part.isHidden && !part.collapsed) {
1428
- totalWeight += averageWeight;
1429
- }
1430
- }
1431
-
1432
- // Apply the weights to compute actual sizes
1433
- let position = 0;
1434
- for (let index = 0; index < weights.length && index < parts.length - 1; index++) {
1435
- const part = parts[index];
1436
- if (!part.isHidden) {
1437
- if (this.orientation === 'vertical') {
1438
- position += this.options.headerSize;
1439
- }
1440
- const weight = weights[index];
1441
- if (part.collapsed) {
1442
- if (weight) {
1443
- part.uncollapsedSize = weight / totalWeight * availableSize;
1444
- }
1445
- } else {
1446
- let contentSize = (weight || averageWeight) / totalWeight * availableSize;
1447
- const minSize = part.minSize;
1448
- if (contentSize < minSize) {
1449
- contentSize = minSize;
1450
- }
1451
- position += contentSize;
1452
- }
1453
- this.setHandlePosition(index, position);
1454
- position += this.spacing;
1455
- }
1456
- }
1457
- }
1458
-
1459
- /**
1460
- * Determine the size of the split panel area that is available for widget content,
1461
- * i.e. excluding part headers and split handles.
1462
- */
1463
- getAvailableSize(): number {
1464
- if (!this.parent || !this.parent.isAttached) {
1465
- return 0;
1466
- }
1467
- const parts = this.widgets;
1468
- const visiblePartCount = parts.filter(part => !part.isHidden).length;
1469
- let availableSize: number;
1470
- if (this.orientation === 'horizontal') {
1471
- availableSize = this.parent.node.offsetWidth;
1472
- } else {
1473
- availableSize = this.parent.node.offsetHeight;
1474
- availableSize -= visiblePartCount * this.options.headerSize;
1475
- }
1476
- availableSize -= (visiblePartCount - 1) * this.spacing;
1477
- if (availableSize < 0) {
1478
- return 0;
1479
- }
1480
- return availableSize;
1481
- }
1482
-
1483
- /**
1484
- * Update a view container part that has been collapsed or expanded. The transition
1485
- * to the new state is animated.
1486
- */
1487
- updateCollapsed(part: ViewContainerPart, enableAnimation: boolean): void {
1488
- const index = this.items.findIndex(item => item.widget === part);
1489
- if (index < 0 || !this.parent || part.isHidden) {
1490
- return;
1491
- }
1492
- // Do not store the height of the "stretched item". Otherwise, we mess up the "hint height".
1493
- // Store the height only if there are other expanded items.
1494
- const currentSize = this.orientation === 'horizontal' ? part.node.offsetWidth : part.node.offsetHeight;
1495
- if (part.collapsed && this.items.some(item => !item.widget.collapsed && !item.widget.isHidden)) {
1496
- part.uncollapsedSize = currentSize;
1497
- }
1498
-
1499
- if (!enableAnimation || this.options.animationDuration <= 0) {
1500
- MessageLoop.postMessage(this.parent, Widget.Msg.FitRequest);
1501
- return;
1502
- }
1503
- let startTime: number | undefined = undefined;
1504
- const duration = this.options.animationDuration;
1505
- const direction = part.collapsed ? 'collapse' : 'expand';
1506
- let fullSize: number;
1507
- if (direction === 'collapse') {
1508
- fullSize = currentSize - this.options.headerSize;
1509
- } else {
1510
- fullSize = Math.max((part.uncollapsedSize || 0) - this.options.headerSize, part.minSize);
1511
- if (this.items.filter(item => !item.widget.collapsed && !item.widget.isHidden).length === 1) {
1512
- // Expand to full available size
1513
- fullSize = Math.max(fullSize, this.getAvailableSize());
1514
- }
1515
- }
1516
-
1517
- // The update function is called on every animation frame until the predefined duration has elapsed.
1518
- const updateFunc = (time: number) => {
1519
- if (!this.parent) {
1520
- part.animatedSize = undefined;
1521
- return;
1522
- }
1523
- if (startTime === undefined) {
1524
- startTime = time;
1525
- }
1526
- if (time - startTime < duration) {
1527
- // Render an intermediate state for the animation
1528
- const t = this.tween((time - startTime) / duration);
1529
- if (direction === 'collapse') {
1530
- part.animatedSize = (1 - t) * fullSize;
1531
- } else {
1532
- part.animatedSize = t * fullSize;
1533
- }
1534
- requestAnimationFrame(updateFunc);
1535
- } else {
1536
- // The animation is finished
1537
- if (direction === 'collapse') {
1538
- part.animatedSize = undefined;
1539
- } else {
1540
- part.animatedSize = fullSize;
1541
- // Request another frame to reset the part to variable size
1542
- requestAnimationFrame(() => {
1543
- part.animatedSize = undefined;
1544
- if (this.parent) {
1545
- MessageLoop.sendMessage(this.parent, Widget.Msg.FitRequest);
1546
- }
1547
- });
1548
- }
1549
- }
1550
- MessageLoop.sendMessage(this.parent, Widget.Msg.FitRequest);
1551
- };
1552
- requestAnimationFrame(updateFunc);
1553
- }
1554
-
1555
- updateSashes(): void {
1556
- const { widgets, handles } = this;
1557
- if (widgets.length !== handles.length) {
1558
- console.warn('Unexpected mismatch between number of widgets and number of handles.');
1559
- return;
1560
- }
1561
- const firstUncollapsed = this.getFirstUncollapsedWidgetIndex();
1562
- const lastUncollapsed = firstUncollapsed === undefined ? undefined : this.getLastUncollapsedWidgetIndex();
1563
- const allHidden = firstUncollapsed === lastUncollapsed;
1564
- for (const [index, handle] of this.handles.entries()) {
1565
- // The or clauses are added for type checking. If they're true, allHidden will also have been true.
1566
- if (allHidden || firstUncollapsed === undefined || lastUncollapsed === undefined) {
1567
- handle.classList.add('sash-hidden');
1568
- } else if (index < lastUncollapsed && index >= firstUncollapsed) {
1569
- handle.classList.remove('sash-hidden');
1570
- } else {
1571
- handle.classList.add('sash-hidden');
1572
- }
1573
- }
1574
- }
1575
-
1576
- protected getFirstUncollapsedWidgetIndex(): number | undefined {
1577
- const index = this.widgets.findIndex(widget => !widget.collapsed && !widget.isHidden);
1578
- return index === -1 ? undefined : index;
1579
- }
1580
-
1581
- protected getLastUncollapsedWidgetIndex(): number | undefined {
1582
- for (let i = this.widgets.length - 1; i >= 0; i--) {
1583
- if (!this.widgets[i].collapsed && !this.widgets[i].isHidden) {
1584
- return i;
1585
- }
1586
- }
1587
- }
1588
-
1589
- protected override onFitRequest(msg: Message): void {
1590
- for (const part of this.widgets) {
1591
- const style = part.node.style;
1592
- if (part.animatedSize !== undefined) {
1593
- // The part size has been fixed for animating the transition to collapsed / expanded state
1594
- const fixedSize = `${this.options.headerSize + part.animatedSize}px`;
1595
- style.minHeight = fixedSize;
1596
- style.maxHeight = fixedSize;
1597
- } else if (part.collapsed) {
1598
- // The part size is fixed to the header size
1599
- const fixedSize = `${this.options.headerSize}px`;
1600
- style.minHeight = fixedSize;
1601
- style.maxHeight = fixedSize;
1602
- } else {
1603
- const minSize = `${this.options.headerSize + part.minSize}px`;
1604
- style.minHeight = minSize;
1605
- style.maxHeight = '';
1606
- }
1607
- }
1608
- super.onFitRequest(msg);
1609
- }
1610
-
1611
- /**
1612
- * Sinusoidal tween function for smooth animation.
1613
- */
1614
- protected tween(t: number): number {
1615
- return 0.5 * (1 - Math.cos(Math.PI * t));
1616
- }
1617
-
1618
- setHandlePosition(index: number, position: number): Promise<void> {
1619
- const options: SplitPositionOptions = {
1620
- referenceWidget: this.widgets[index],
1621
- duration: 0
1622
- };
1623
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1624
- return this.splitPositionHandler.setSplitHandlePosition(this.parent as SplitPanel, index, position, options) as Promise<any>;
1625
- }
1626
-
1627
- }
1628
-
1629
- export namespace ViewContainerLayout {
1630
-
1631
- export interface Options extends SplitLayout.IOptions {
1632
- headerSize: number;
1633
- animationDuration: number;
1634
- }
1635
-
1636
- export interface Item {
1637
- readonly widget: ViewContainerPart;
1638
- }
1639
-
1640
- }
1
+ // *****************************************************************************
2
+ // Copyright (C) 2018-2019 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 { interfaces, injectable, inject, postConstruct } from 'inversify';
18
+ import { IIterator, toArray, find, some, every, map, ArrayExt } from '@phosphor/algorithm';
19
+ import {
20
+ Widget, EXPANSION_TOGGLE_CLASS, COLLAPSED_CLASS, CODICON_TREE_ITEM_CLASSES, MessageLoop, Message, SplitPanel,
21
+ BaseWidget, addEventListener, SplitLayout, LayoutItem, PanelLayout, addKeyListener, waitForRevealed, UnsafeWidgetUtilities, DockPanel, PINNED_CLASS
22
+ } from './widgets';
23
+ import { Event as CommonEvent, Emitter } from '../common/event';
24
+ import { Disposable, DisposableCollection } from '../common/disposable';
25
+ import { CommandRegistry } from '../common/command';
26
+ import { MenuModelRegistry, MenuPath, MenuAction } from '../common/menu';
27
+ import { ApplicationShell, StatefulWidget, SplitPositionHandler, SplitPositionOptions, SIDE_PANEL_TOOLBAR_CONTEXT_MENU } from './shell';
28
+ import { MAIN_AREA_ID, BOTTOM_AREA_ID } from './shell/theia-dock-panel';
29
+ import { FrontendApplicationStateService } from './frontend-application-state';
30
+ import { ContextMenuRenderer, Anchor } from './context-menu-renderer';
31
+ import { parseCssMagnitude } from './browser';
32
+ import { TabBarToolbarRegistry, TabBarToolbarFactory, TabBarToolbar, TabBarDelegator, TabBarToolbarItem } from './shell/tab-bar-toolbar';
33
+ import { isEmpty, isObject, nls } from '../common';
34
+ import { WidgetManager } from './widget-manager';
35
+ import { Key } from './keys';
36
+ import { ProgressBarFactory } from './progress-bar-factory';
37
+ import { Drag, IDragEvent } from '@phosphor/dragdrop';
38
+ import { MimeData } from '@phosphor/coreutils';
39
+ import { ElementExt } from '@phosphor/domutils';
40
+ import { TabBarDecoratorService } from './shell/tab-bar-decorator';
41
+
42
+ export interface ViewContainerTitleOptions {
43
+ label: string;
44
+ caption?: string;
45
+ iconClass?: string;
46
+ closeable?: boolean;
47
+ }
48
+
49
+ @injectable()
50
+ export class ViewContainerIdentifier {
51
+ id: string;
52
+ progressLocationId?: string;
53
+ }
54
+
55
+ export interface DescriptionWidget {
56
+ description: string;
57
+ onDidChangeDescription: CommonEvent<void>;
58
+ }
59
+
60
+ export interface BadgeWidget {
61
+ badge?: number;
62
+ badgeTooltip?: string;
63
+ onDidChangeBadge: CommonEvent<void>;
64
+ onDidChangeBadgeTooltip: CommonEvent<void>;
65
+ }
66
+
67
+ export namespace DescriptionWidget {
68
+ export function is(arg: unknown): arg is DescriptionWidget {
69
+ return isObject(arg) && 'onDidChangeDescription' in arg;
70
+ }
71
+ }
72
+
73
+ export namespace BadgeWidget {
74
+ export function is(arg: unknown): arg is BadgeWidget {
75
+ return isObject(arg) && 'onDidChangeBadge' in arg && 'onDidChangeBadgeTooltip' in arg;
76
+ }
77
+ }
78
+
79
+ /**
80
+ * A widget that may change it's internal structure dynamically.
81
+ * Current use is to update the toolbar when a contributed view is constructed "lazily".
82
+ */
83
+ export interface DynamicToolbarWidget {
84
+ onDidChangeToolbarItems: CommonEvent<void>;
85
+ }
86
+
87
+ export namespace DynamicToolbarWidget {
88
+ export function is(arg: unknown): arg is DynamicToolbarWidget {
89
+ return isObject(arg) && 'onDidChangeToolbarItems' in arg;
90
+ }
91
+ }
92
+
93
+ /**
94
+ * A view container holds an arbitrary number of widgets inside a split panel.
95
+ * Each widget is wrapped in a _part_ that displays the widget title and toolbar
96
+ * and allows to collapse / expand the widget content.
97
+ */
98
+ @injectable()
99
+ export class ViewContainer extends BaseWidget implements StatefulWidget, ApplicationShell.TrackableWidgetProvider, TabBarDelegator {
100
+
101
+ protected panel: SplitPanel;
102
+
103
+ protected currentPart: ViewContainerPart | undefined;
104
+
105
+ /**
106
+ * Disable dragging parts from/to this view container.
107
+ */
108
+ disableDNDBetweenContainers = false;
109
+
110
+ @inject(FrontendApplicationStateService)
111
+ protected readonly applicationStateService: FrontendApplicationStateService;
112
+
113
+ @inject(ContextMenuRenderer)
114
+ protected readonly contextMenuRenderer: ContextMenuRenderer;
115
+
116
+ @inject(CommandRegistry)
117
+ protected readonly commandRegistry: CommandRegistry;
118
+
119
+ @inject(MenuModelRegistry)
120
+ protected readonly menuRegistry: MenuModelRegistry;
121
+
122
+ @inject(WidgetManager)
123
+ protected readonly widgetManager: WidgetManager;
124
+
125
+ @inject(SplitPositionHandler)
126
+ protected readonly splitPositionHandler: SplitPositionHandler;
127
+
128
+ @inject(ViewContainerIdentifier)
129
+ readonly options: ViewContainerIdentifier;
130
+
131
+ @inject(TabBarToolbarRegistry)
132
+ protected readonly toolbarRegistry: TabBarToolbarRegistry;
133
+
134
+ @inject(TabBarToolbarFactory)
135
+ protected readonly toolbarFactory: TabBarToolbarFactory;
136
+
137
+ protected readonly onDidChangeTrackableWidgetsEmitter = new Emitter<Widget[]>();
138
+ readonly onDidChangeTrackableWidgets = this.onDidChangeTrackableWidgetsEmitter.event;
139
+
140
+ @inject(ProgressBarFactory)
141
+ protected readonly progressBarFactory: ProgressBarFactory;
142
+
143
+ @inject(ApplicationShell)
144
+ protected readonly shell: ApplicationShell;
145
+
146
+ @inject(TabBarDecoratorService)
147
+ protected readonly decoratorService: TabBarDecoratorService;
148
+
149
+ @postConstruct()
150
+ protected init(): void {
151
+ this.id = this.options.id;
152
+ this.addClass('theia-view-container');
153
+ const layout = new PanelLayout();
154
+ this.layout = layout;
155
+ this.panel = new SplitPanel({
156
+ layout: new ViewContainerLayout({
157
+ renderer: SplitPanel.defaultRenderer,
158
+ orientation: this.orientation,
159
+ spacing: 2,
160
+ headerSize: ViewContainerPart.HEADER_HEIGHT,
161
+ animationDuration: 200
162
+ }, this.splitPositionHandler)
163
+ });
164
+ this.panel.node.tabIndex = -1;
165
+ this.configureLayout(layout);
166
+
167
+ const { commandRegistry, menuRegistry, contextMenuRenderer } = this;
168
+ this.toDispose.pushAll([
169
+ addEventListener(this.node, 'contextmenu', event => {
170
+ if (event.button === 2 && every(this.containerLayout.iter(), part => !!part.isHidden)) {
171
+ event.stopPropagation();
172
+ event.preventDefault();
173
+ contextMenuRenderer.render({ menuPath: this.contextMenuPath, anchor: event });
174
+ }
175
+ }),
176
+ commandRegistry.registerCommand({ id: this.globalHideCommandId }, {
177
+ execute: (anchor: Anchor) => {
178
+ const toHide = this.findPartForAnchor(anchor);
179
+ if (toHide && toHide.canHide) {
180
+ toHide.hide();
181
+ }
182
+ },
183
+ isVisible: (anchor: Anchor) => {
184
+ const toHide = this.findPartForAnchor(anchor);
185
+ if (toHide) {
186
+ return toHide.canHide && !toHide.isHidden;
187
+ } else {
188
+ return some(this.containerLayout.iter(), part => !part.isHidden);
189
+ }
190
+ }
191
+ }),
192
+ menuRegistry.registerMenuAction([...this.contextMenuPath, '0_global'], {
193
+ commandId: this.globalHideCommandId,
194
+ label: nls.localizeByDefault('Hide')
195
+ }),
196
+ this.onDidChangeTrackableWidgetsEmitter,
197
+ this.onDidChangeTrackableWidgets(() => this.decoratorService.fireDidChangeDecorations())
198
+ ]);
199
+ if (this.options.progressLocationId) {
200
+ this.toDispose.push(this.progressBarFactory({ container: this.node, insertMode: 'prepend', locationId: this.options.progressLocationId }));
201
+ }
202
+ }
203
+
204
+ protected configureLayout(layout: PanelLayout): void {
205
+ layout.addWidget(this.panel);
206
+ }
207
+
208
+ protected readonly toDisposeOnCurrentPart = new DisposableCollection();
209
+
210
+ protected updateCurrentPart(part?: ViewContainerPart): void {
211
+ if (part && this.getParts().indexOf(part) !== -1) {
212
+ this.currentPart = part;
213
+ }
214
+ if (this.currentPart && !this.currentPart.isDisposed) {
215
+ return;
216
+ }
217
+ const visibleParts = this.getParts().filter(p => !p.isHidden);
218
+ const expandedParts = visibleParts.filter(p => !p.collapsed);
219
+ this.currentPart = expandedParts[0] || visibleParts[0];
220
+ }
221
+
222
+ protected updateSplitterVisibility(): void {
223
+ const className = 'p-first-visible';
224
+ let firstFound = false;
225
+ for (const part of this.getParts()) {
226
+ if (!part.isHidden && !firstFound) {
227
+ part.addClass(className);
228
+ firstFound = true;
229
+ } else {
230
+ part.removeClass(className);
231
+ }
232
+ }
233
+ }
234
+
235
+ protected titleOptions: ViewContainerTitleOptions | undefined;
236
+
237
+ setTitleOptions(titleOptions: ViewContainerTitleOptions | undefined): void {
238
+ this.titleOptions = titleOptions;
239
+ this.updateTitle();
240
+ }
241
+
242
+ protected readonly toDisposeOnUpdateTitle = new DisposableCollection();
243
+
244
+ protected _tabBarDelegate: Widget = this;
245
+ updateTabBarDelegate(): void {
246
+ const visibleParts = this.getParts().filter(part => !part.isHidden);
247
+ if (visibleParts.length === 1) {
248
+ this._tabBarDelegate = visibleParts[0].wrapped;
249
+ } else {
250
+ this._tabBarDelegate = this;
251
+ }
252
+ }
253
+
254
+ getTabBarDelegate(): Widget | undefined {
255
+ return this._tabBarDelegate;
256
+ }
257
+
258
+ protected updateTitle(): void {
259
+ this.toDisposeOnUpdateTitle.dispose();
260
+ this.toDispose.push(this.toDisposeOnUpdateTitle);
261
+ this.updateTabBarDelegate();
262
+ let title = Object.assign({}, this.titleOptions);
263
+ if (isEmpty(title)) {
264
+ return;
265
+ }
266
+ const allParts = this.getParts();
267
+ const visibleParts = allParts.filter(part => !part.isHidden);
268
+ this.title.label = title.label;
269
+ // If there's only one visible part - inline it's title into the container title except in case the part
270
+ // isn't originally belongs to this container but there are other **original** hidden parts.
271
+ if (visibleParts.length === 1 && (visibleParts[0].originalContainerId === this.id || !this.findOriginalPart())) {
272
+ const part = visibleParts[0];
273
+ this.toDisposeOnUpdateTitle.push(part.onTitleChanged(() => this.updateTitle()));
274
+ const partLabel = part.wrapped.title.label;
275
+ // Change the container title if it contains only one part that originally belongs to another container.
276
+ if (allParts.length === 1 && part.originalContainerId !== this.id && !this.isCurrentTitle(part.originalContainerTitle)) {
277
+ title = Object.assign({}, part.originalContainerTitle);
278
+ this.setTitleOptions(title);
279
+ return;
280
+ }
281
+ if (partLabel) {
282
+ if (this.title.label && this.title.label !== partLabel) {
283
+ this.title.label += ': ' + partLabel;
284
+ } else {
285
+ this.title.label = partLabel;
286
+ }
287
+ }
288
+ part.collapsed = false;
289
+ part.hideTitle();
290
+ } else {
291
+ visibleParts.forEach(part => part.showTitle());
292
+ // If at least one part originally belongs to this container the title should return to its original value.
293
+ const originalPart = this.findOriginalPart();
294
+ if (originalPart && !this.isCurrentTitle(originalPart.originalContainerTitle)) {
295
+ title = Object.assign({}, originalPart.originalContainerTitle);
296
+ this.setTitleOptions(title);
297
+ return;
298
+ }
299
+ }
300
+ this.updateToolbarItems(allParts);
301
+ this.title.caption = title?.caption || title?.label;
302
+ if (title.iconClass) {
303
+ this.title.iconClass = title.iconClass;
304
+ }
305
+ if (this.title.className.includes(PINNED_CLASS)) {
306
+ this.title.closable &&= false;
307
+ } else if (title.closeable !== undefined) {
308
+ this.title.closable = title.closeable;
309
+ }
310
+ }
311
+
312
+ protected updateToolbarItems(allParts: ViewContainerPart[]): void {
313
+ if (allParts.length > 1) {
314
+ const group = this.getToggleVisibilityGroupLabel();
315
+ for (const part of allParts) {
316
+ const existingId = this.toggleVisibilityCommandId(part);
317
+ const { caption, label, dataset: { visibilityCommandLabel } } = part.wrapped.title;
318
+ this.registerToolbarItem(existingId, { tooltip: visibilityCommandLabel || caption || label, group });
319
+ }
320
+ }
321
+ }
322
+
323
+ protected getToggleVisibilityGroupLabel(): string {
324
+ return 'view';
325
+ }
326
+
327
+ protected registerToolbarItem(commandId: string, options?: Partial<Omit<TabBarToolbarItem, 'id' | 'command'>>): void {
328
+ const newId = `${this.id}-tabbar-toolbar-${commandId}`;
329
+ const existingHandler = this.commandRegistry.getAllHandlers(commandId)[0];
330
+ const existingCommand = this.commandRegistry.getCommand(commandId);
331
+ if (existingHandler && existingCommand) {
332
+ this.toDisposeOnUpdateTitle.push(this.commandRegistry.registerCommand({ ...existingCommand, id: newId }, {
333
+ execute: (_widget, ...args) => this.commandRegistry.executeCommand(commandId, ...args),
334
+ isToggled: (_widget, ...args) => this.commandRegistry.isToggled(commandId, ...args),
335
+ isEnabled: (_widget, ...args) => this.commandRegistry.isEnabled(commandId, ...args),
336
+ isVisible: (widget, ...args) => widget === this.getTabBarDelegate() && this.commandRegistry.isVisible(commandId, ...args),
337
+ }));
338
+ this.toDisposeOnUpdateTitle.push(this.toolbarRegistry.registerItem({
339
+ ...options,
340
+ id: newId,
341
+ command: newId,
342
+ }));
343
+ }
344
+ }
345
+
346
+ protected findOriginalPart(): ViewContainerPart | undefined {
347
+ return this.getParts().find(part => part.originalContainerId === this.id);
348
+ }
349
+
350
+ protected isCurrentTitle(titleOptions: ViewContainerTitleOptions | undefined): boolean {
351
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
352
+ return (!!titleOptions && !!this.titleOptions && Object.keys(titleOptions).every(key => (titleOptions as any)[key] === (this.titleOptions as any)[key]))
353
+ || (!titleOptions && !this.titleOptions);
354
+ }
355
+
356
+ protected findPartForAnchor(anchor: Anchor): ViewContainerPart | undefined {
357
+ const element = document.elementFromPoint(anchor.x, anchor.y);
358
+ if (element instanceof Element) {
359
+ const closestPart = ViewContainerPart.closestPart(element);
360
+ if (closestPart && closestPart.id) {
361
+ return find(this.containerLayout.iter(), part => part.id === closestPart.id);
362
+ }
363
+ }
364
+ return undefined;
365
+ }
366
+
367
+ protected readonly toRemoveWidgets = new Map<string, DisposableCollection>();
368
+
369
+ protected createPartId(widget: Widget): string {
370
+ const description = this.widgetManager.getDescription(widget);
371
+ return widget.id || JSON.stringify(description);
372
+ }
373
+
374
+ addWidget(widget: Widget, options?: ViewContainer.Factory.WidgetOptions, originalContainerId?: string, originalContainerTitle?: ViewContainerTitleOptions): Disposable {
375
+ const existing = this.toRemoveWidgets.get(widget.id);
376
+ if (existing) {
377
+ return existing;
378
+ }
379
+ const partId = this.createPartId(widget);
380
+ const newPart = this.createPart(widget, partId, originalContainerId || this.id, originalContainerTitle || this.titleOptions, options);
381
+ return this.attachNewPart(newPart);
382
+ }
383
+
384
+ protected attachNewPart(newPart: ViewContainerPart, insertIndex?: number): Disposable {
385
+ const toRemoveWidget = new DisposableCollection();
386
+ this.toDispose.push(toRemoveWidget);
387
+ this.toRemoveWidgets.set(newPart.wrapped.id, toRemoveWidget);
388
+ toRemoveWidget.push(Disposable.create(() => this.toRemoveWidgets.delete(newPart.wrapped.id)));
389
+ this.registerPart(newPart);
390
+ if (insertIndex !== undefined || (newPart.options && newPart.options.order !== undefined)) {
391
+ const index = insertIndex ?? this.getParts().findIndex(part => part.options.order === undefined || part.options.order > newPart.options.order!);
392
+ if (index >= 0) {
393
+ this.containerLayout.insertWidget(index, newPart);
394
+ } else {
395
+ this.containerLayout.addWidget(newPart);
396
+ }
397
+ } else {
398
+ this.containerLayout.addWidget(newPart);
399
+ }
400
+ this.refreshMenu(newPart);
401
+ this.updateTitle();
402
+ this.updateCurrentPart();
403
+ this.updateSplitterVisibility();
404
+ this.update();
405
+ this.fireDidChangeTrackableWidgets();
406
+ toRemoveWidget.pushAll([
407
+ Disposable.create(() => {
408
+ if (newPart.currentViewContainerId === this.id) {
409
+ newPart.dispose();
410
+ }
411
+ this.unregisterPart(newPart);
412
+ if (!newPart.isDisposed && this.getPartIndex(newPart.id) > -1) {
413
+ this.containerLayout.removeWidget(newPart);
414
+ }
415
+ if (!this.isDisposed) {
416
+ this.update();
417
+ this.updateTitle();
418
+ this.updateCurrentPart();
419
+ this.updateSplitterVisibility();
420
+ this.fireDidChangeTrackableWidgets();
421
+ }
422
+ }),
423
+ this.registerDND(newPart),
424
+ newPart.onDidChangeVisibility(() => {
425
+ this.updateTitle();
426
+ this.updateCurrentPart();
427
+ this.updateSplitterVisibility();
428
+ this.containerLayout.updateSashes();
429
+ }),
430
+ newPart.onCollapsed(() => {
431
+ this.containerLayout.updateCollapsed(newPart, this.enableAnimation);
432
+ this.containerLayout.updateSashes();
433
+ this.updateCurrentPart();
434
+ }),
435
+ newPart.onContextMenu(event => {
436
+ if (event.button === 2) {
437
+ event.preventDefault();
438
+ event.stopPropagation();
439
+ this.contextMenuRenderer.render({ menuPath: this.contextMenuPath, anchor: event });
440
+ }
441
+ }),
442
+ newPart.onTitleChanged(() => this.refreshMenu(newPart)),
443
+ newPart.onDidFocus(() => this.updateCurrentPart(newPart))
444
+ ]);
445
+
446
+ newPart.disposed.connect(() => toRemoveWidget.dispose());
447
+ return toRemoveWidget;
448
+ }
449
+
450
+ protected createPart(widget: Widget, partId: string, originalContainerId: string, originalContainerTitle?: ViewContainerTitleOptions,
451
+ options?: ViewContainer.Factory.WidgetOptions): ViewContainerPart {
452
+
453
+ return new ViewContainerPart(widget, partId, this.id, originalContainerId, originalContainerTitle, this.toolbarRegistry, this.toolbarFactory, options);
454
+ }
455
+
456
+ removeWidget(widget: Widget): boolean {
457
+ const disposable = this.toRemoveWidgets.get(widget.id);
458
+ if (disposable) {
459
+ disposable.dispose();
460
+ return true;
461
+ }
462
+ return false;
463
+ }
464
+
465
+ getParts(): ViewContainerPart[] {
466
+ return this.containerLayout.widgets;
467
+ }
468
+
469
+ protected getPartIndex(partId: string | undefined): number {
470
+ if (partId) {
471
+ return this.getParts().findIndex(part => part.id === partId);
472
+ }
473
+ return -1;
474
+ }
475
+
476
+ getPartFor(widget: Widget): ViewContainerPart | undefined {
477
+ return this.getParts().find(p => p.wrapped.id === widget.id);
478
+ }
479
+
480
+ get containerLayout(): ViewContainerLayout {
481
+ const layout = this.panel.layout;
482
+ if (layout instanceof ViewContainerLayout) {
483
+ return layout;
484
+ }
485
+ throw new Error('view container is disposed');
486
+ }
487
+
488
+ protected get orientation(): SplitLayout.Orientation {
489
+ return ViewContainer.getOrientation(this.node);
490
+ }
491
+
492
+ protected get enableAnimation(): boolean {
493
+ return this.applicationStateService.state === 'ready';
494
+ }
495
+
496
+ protected lastVisibleState: ViewContainer.State | undefined;
497
+
498
+ storeState(): ViewContainer.State {
499
+ if (!this.isVisible && this.lastVisibleState) {
500
+ return this.lastVisibleState;
501
+ }
502
+ return this.doStoreState();
503
+ }
504
+ protected doStoreState(): ViewContainer.State {
505
+ const parts = this.getParts();
506
+ const availableSize = this.containerLayout.getAvailableSize();
507
+ const orientation = this.orientation;
508
+ const partStates = parts.map(part => {
509
+ let size = this.containerLayout.getPartSize(part);
510
+ if (size && size > ViewContainerPart.HEADER_HEIGHT && orientation === 'vertical') {
511
+ size -= ViewContainerPart.HEADER_HEIGHT;
512
+ }
513
+ return <ViewContainerPart.State>{
514
+ widget: part.wrapped,
515
+ partId: part.partId,
516
+ collapsed: part.collapsed,
517
+ hidden: part.isHidden,
518
+ relativeSize: size && availableSize ? size / availableSize : undefined,
519
+ originalContainerId: part.originalContainerId,
520
+ originalContainerTitle: part.originalContainerTitle
521
+ };
522
+ });
523
+ return { parts: partStates, title: this.titleOptions };
524
+ }
525
+
526
+ restoreState(state: ViewContainer.State): void {
527
+ this.lastVisibleState = state;
528
+ this.doRestoreState(state);
529
+ }
530
+ protected doRestoreState(state: ViewContainer.State): void {
531
+ this.setTitleOptions(state.title);
532
+ // restore widgets
533
+ for (const part of state.parts) {
534
+ if (part.widget) {
535
+ this.addWidget(part.widget, undefined, part.originalContainerId, part.originalContainerTitle || {} as ViewContainerTitleOptions);
536
+ }
537
+ }
538
+ const partStates = state.parts.filter(partState => some(this.containerLayout.iter(), p => p.partId === partState.partId));
539
+
540
+ // Reorder the parts according to the stored state
541
+ for (let index = 0; index < partStates.length; index++) {
542
+ const partState = partStates[index];
543
+ const widget = this.getParts().find(part => part.partId === partState.partId);
544
+ if (widget) {
545
+ this.containerLayout.insertWidget(index, widget);
546
+ }
547
+ }
548
+
549
+ // Restore visibility and collapsed state
550
+ const parts = this.getParts();
551
+ for (let index = 0; index < parts.length; index++) {
552
+ const part = parts[index];
553
+ const partState = partStates.find(s => part.partId === s.partId);
554
+ if (partState) {
555
+ part.setHidden(partState.hidden);
556
+ part.collapsed = partState.collapsed || !partState.relativeSize;
557
+ } else if (part.canHide) {
558
+ part.hide();
559
+ }
560
+ this.refreshMenu(part);
561
+ }
562
+
563
+ // Restore part sizes
564
+ waitForRevealed(this).then(() => {
565
+ this.containerLayout.setPartSizes(partStates.map(partState => partState.relativeSize));
566
+ this.updateSplitterVisibility();
567
+ });
568
+ }
569
+
570
+ /**
571
+ * Register a command to toggle the visibility of the new part.
572
+ */
573
+ protected registerPart(toRegister: ViewContainerPart): void {
574
+ const commandId = this.toggleVisibilityCommandId(toRegister);
575
+ this.commandRegistry.registerCommand({ id: commandId }, {
576
+ execute: () => {
577
+ const toHide = find(this.containerLayout.iter(), part => part.id === toRegister.id);
578
+ if (toHide) {
579
+ toHide.setHidden(!toHide.isHidden);
580
+ }
581
+ },
582
+ isToggled: () => {
583
+ if (!toRegister.canHide) {
584
+ return true;
585
+ }
586
+ const widgetToToggle = find(this.containerLayout.iter(), part => part.id === toRegister.id);
587
+ if (widgetToToggle) {
588
+ return !widgetToToggle.isHidden;
589
+ }
590
+ return false;
591
+ },
592
+ isEnabled: arg => toRegister.canHide && (!this.titleOptions || !(arg instanceof Widget) || (arg instanceof ViewContainer && arg.id === this.id)),
593
+ isVisible: arg => !this.titleOptions || !(arg instanceof Widget) || (arg instanceof ViewContainer && arg.id === this.id)
594
+ });
595
+ }
596
+
597
+ /**
598
+ * Register a menu action to toggle the visibility of the new part.
599
+ * The menu action is unregistered first to enable refreshing the order of menu actions.
600
+ */
601
+ protected refreshMenu(part: ViewContainerPart): void {
602
+ const commandId = this.toggleVisibilityCommandId(part);
603
+ this.menuRegistry.unregisterMenuAction(commandId);
604
+ if (!part.wrapped.title.label) {
605
+ return;
606
+ }
607
+ const { dataset: { visibilityCommandLabel }, caption, label } = part.wrapped.title;
608
+ const action: MenuAction = {
609
+ commandId: commandId,
610
+ label: visibilityCommandLabel || caption || label,
611
+ order: this.getParts().indexOf(part).toString()
612
+ };
613
+ this.menuRegistry.registerMenuAction([...this.contextMenuPath, '1_widgets'], action);
614
+ if (this.titleOptions) {
615
+ this.menuRegistry.registerMenuAction([...SIDE_PANEL_TOOLBAR_CONTEXT_MENU, 'navigation'], action);
616
+ }
617
+ }
618
+
619
+ protected unregisterPart(part: ViewContainerPart): void {
620
+ const commandId = this.toggleVisibilityCommandId(part);
621
+ this.commandRegistry.unregisterCommand(commandId);
622
+ this.menuRegistry.unregisterMenuAction(commandId);
623
+ }
624
+
625
+ protected get contextMenuPath(): MenuPath {
626
+ return [`${this.id}-context-menu`];
627
+ }
628
+
629
+ protected toggleVisibilityCommandId(part: ViewContainerPart): string {
630
+ return `${this.id}:toggle-visibility-${part.id}`;
631
+ }
632
+
633
+ protected get globalHideCommandId(): string {
634
+ return `${this.id}:toggle-visibility`;
635
+ }
636
+
637
+ protected moveBefore(toMovedId: string, moveBeforeThisId: string): void {
638
+ const parts = this.getParts();
639
+ const indexToMove = parts.findIndex(part => part.id === toMovedId);
640
+ const targetIndex = parts.findIndex(part => part.id === moveBeforeThisId);
641
+ if (indexToMove >= 0 && targetIndex >= 0) {
642
+ this.containerLayout.insertWidget(targetIndex, parts[indexToMove]);
643
+ for (let index = Math.min(indexToMove, targetIndex); index < parts.length; index++) {
644
+ this.refreshMenu(parts[index]);
645
+ this.activate();
646
+ }
647
+ }
648
+ this.updateSplitterVisibility();
649
+ }
650
+
651
+ getTrackableWidgets(): Widget[] {
652
+ return this.getParts().map(w => w.wrapped);
653
+ }
654
+
655
+ protected fireDidChangeTrackableWidgets(): void {
656
+ this.onDidChangeTrackableWidgetsEmitter.fire(this.getTrackableWidgets());
657
+ }
658
+
659
+ activateWidget(id: string): Widget | undefined {
660
+ const part = this.revealPart(id);
661
+ if (!part) {
662
+ return undefined;
663
+ }
664
+ this.updateCurrentPart(part);
665
+ part.collapsed = false;
666
+ return part.wrapped;
667
+ }
668
+
669
+ revealWidget(id: string): Widget | undefined {
670
+ const part = this.revealPart(id);
671
+ return part && part.wrapped;
672
+ }
673
+
674
+ protected revealPart(id: string): ViewContainerPart | undefined {
675
+ const part = this.getParts().find(p => p.wrapped.id === id);
676
+ if (!part) {
677
+ return undefined;
678
+ }
679
+ part.setHidden(false);
680
+ return part;
681
+ }
682
+
683
+ protected override onActivateRequest(msg: Message): void {
684
+ super.onActivateRequest(msg);
685
+ if (this.currentPart) {
686
+ this.currentPart.activate();
687
+ } else {
688
+ this.panel.node.focus({ preventScroll: true });
689
+ }
690
+ }
691
+
692
+ protected override onAfterAttach(msg: Message): void {
693
+ const orientation = this.orientation;
694
+ this.containerLayout.orientation = orientation;
695
+ if (orientation === 'horizontal') {
696
+ for (const part of this.getParts()) {
697
+ part.collapsed = false;
698
+ }
699
+ }
700
+ super.onAfterAttach(msg);
701
+ }
702
+
703
+ protected override onBeforeHide(msg: Message): void {
704
+ super.onBeforeHide(msg);
705
+ this.lastVisibleState = this.storeState();
706
+ }
707
+
708
+ protected override onAfterShow(msg: Message): void {
709
+ super.onAfterShow(msg);
710
+ this.updateTitle();
711
+ this.lastVisibleState = undefined;
712
+ }
713
+
714
+ protected override onBeforeAttach(msg: Message): void {
715
+ super.onBeforeAttach(msg);
716
+ this.node.addEventListener('p-dragenter', this, true);
717
+ this.node.addEventListener('p-dragover', this, true);
718
+ this.node.addEventListener('p-dragleave', this, true);
719
+ this.node.addEventListener('p-drop', this, true);
720
+ }
721
+
722
+ protected override onAfterDetach(msg: Message): void {
723
+ super.onAfterDetach(msg);
724
+ this.node.removeEventListener('p-dragenter', this, true);
725
+ this.node.removeEventListener('p-dragover', this, true);
726
+ this.node.removeEventListener('p-dragleave', this, true);
727
+ this.node.removeEventListener('p-drop', this, true);
728
+ }
729
+
730
+ handleEvent(event: Event): void {
731
+ switch (event.type) {
732
+ case 'p-dragenter':
733
+ this.handleDragEnter(event as IDragEvent);
734
+ break;
735
+ case 'p-dragover':
736
+ this.handleDragOver(event as IDragEvent);
737
+ break;
738
+ case 'p-dragleave':
739
+ this.handleDragLeave(event as IDragEvent);
740
+ break;
741
+ case 'p-drop':
742
+ this.handleDrop(event as IDragEvent);
743
+ break;
744
+ }
745
+ }
746
+
747
+ handleDragEnter(event: IDragEvent): void {
748
+ if (event.mimeData.hasData('application/vnd.phosphor.view-container-factory')) {
749
+ event.preventDefault();
750
+ event.stopPropagation();
751
+ }
752
+ }
753
+
754
+ toDisposeOnDragEnd = new DisposableCollection();
755
+ handleDragOver(event: IDragEvent): void {
756
+ const factory = event.mimeData.getData('application/vnd.phosphor.view-container-factory');
757
+ const widget = factory && factory();
758
+ if (!(widget instanceof ViewContainerPart)) {
759
+ return;
760
+ }
761
+ event.preventDefault();
762
+ event.stopPropagation();
763
+
764
+ const sameContainers = this.id === widget.currentViewContainerId;
765
+ const targetPart = ArrayExt.findFirstValue(this.getParts(), (p => ElementExt.hitTest(p.node, event.clientX, event.clientY)));
766
+ if (!targetPart && sameContainers) {
767
+ event.dropAction = 'none';
768
+ return;
769
+ }
770
+ if (targetPart) {
771
+ // add overlay class style to the `targetPart` node.
772
+ targetPart.node.classList.add('drop-target');
773
+ this.toDisposeOnDragEnd.push(Disposable.create(() => targetPart.node.classList.remove('drop-target')));
774
+ } else {
775
+ // show panel overlay.
776
+ const dockPanel = this.getDockPanel();
777
+ if (dockPanel) {
778
+ dockPanel.overlay.show({ top: 0, bottom: 0, right: 0, left: 0 });
779
+ this.toDisposeOnDragEnd.push(Disposable.create(() => dockPanel.overlay.hide(100)));
780
+ }
781
+ }
782
+
783
+ const isDraggingOutsideDisabled = this.disableDNDBetweenContainers || widget.viewContainer?.disableDNDBetweenContainers
784
+ || widget.options.disableDraggingToOtherContainers;
785
+ if (isDraggingOutsideDisabled && !sameContainers) {
786
+ const { target } = event;
787
+ if (target instanceof HTMLElement) {
788
+ target.classList.add('theia-cursor-no-drop');
789
+ this.toDisposeOnDragEnd.push(Disposable.create(() => {
790
+ target.classList.remove('theia-cursor-no-drop');
791
+ }));
792
+ }
793
+ event.dropAction = 'none';
794
+ return;
795
+ };
796
+
797
+ event.dropAction = event.proposedAction;
798
+ };
799
+
800
+ handleDragLeave(event: IDragEvent): void {
801
+ this.toDisposeOnDragEnd.dispose();
802
+ if (event.mimeData.hasData('application/vnd.phosphor.view-container-factory')) {
803
+ event.preventDefault();
804
+ event.stopPropagation();
805
+ }
806
+ };
807
+
808
+ handleDrop(event: IDragEvent): void {
809
+ this.toDisposeOnDragEnd.dispose();
810
+ const factory = event.mimeData.getData('application/vnd.phosphor.view-container-factory');
811
+ const draggedPart = factory && factory();
812
+ if (!(draggedPart instanceof ViewContainerPart)) {
813
+ event.dropAction = 'none';
814
+ return;
815
+ }
816
+ event.preventDefault();
817
+ event.stopPropagation();
818
+ const parts = this.getParts();
819
+ const toIndex = ArrayExt.findFirstIndex(parts, part => ElementExt.hitTest(part.node, event.clientX, event.clientY));
820
+ if (draggedPart.currentViewContainerId !== this.id) {
821
+ this.attachNewPart(draggedPart, toIndex > -1 ? toIndex + 1 : toIndex);
822
+ draggedPart.onPartMoved(this);
823
+ } else {
824
+ this.moveBefore(draggedPart.id, parts[toIndex].id);
825
+ }
826
+ event.dropAction = event.proposedAction;
827
+ }
828
+
829
+ protected registerDND(part: ViewContainerPart): Disposable {
830
+ part.headerElement.draggable = true;
831
+
832
+ return new DisposableCollection(
833
+ addEventListener(part.headerElement, 'dragstart',
834
+ event => {
835
+ event.preventDefault();
836
+ const mimeData = new MimeData();
837
+ mimeData.setData('application/vnd.phosphor.view-container-factory', () => part);
838
+ const clonedHeader = part.headerElement.cloneNode(true) as HTMLElement;
839
+ clonedHeader.style.width = part.node.style.width;
840
+ clonedHeader.style.opacity = '0.6';
841
+ const drag = new Drag({
842
+ mimeData,
843
+ dragImage: clonedHeader,
844
+ proposedAction: 'move',
845
+ supportedActions: 'move'
846
+ });
847
+ part.node.classList.add('p-mod-hidden');
848
+ drag.start(event.clientX, event.clientY).then(dropAction => {
849
+ // The promise is resolved when the drag has ended
850
+ if (dropAction === 'move' && part.currentViewContainerId !== this.id) {
851
+ this.removeWidget(part.wrapped);
852
+ this.lastVisibleState = this.doStoreState();
853
+ }
854
+ });
855
+ setTimeout(() => { part.node.classList.remove('p-mod-hidden'); }, 0);
856
+ }, false));
857
+ }
858
+
859
+ protected getDockPanel(): DockPanel | undefined {
860
+ let panel: DockPanel | undefined;
861
+ let parent = this.parent;
862
+ while (!panel && parent) {
863
+ if (this.isSideDockPanel(parent)) {
864
+ panel = parent as DockPanel;
865
+ } else {
866
+ parent = parent.parent;
867
+ }
868
+ }
869
+ return panel;
870
+ }
871
+
872
+ protected isSideDockPanel(widget: Widget): boolean {
873
+ const { leftPanelHandler, rightPanelHandler } = this.shell;
874
+ if (widget instanceof DockPanel && (widget.id === rightPanelHandler.dockPanel.id || widget.id === leftPanelHandler.dockPanel.id)) {
875
+ return true;
876
+ }
877
+ return false;
878
+ }
879
+
880
+ }
881
+
882
+ export namespace ViewContainer {
883
+
884
+ export const Factory = Symbol('ViewContainerFactory');
885
+ export interface Factory {
886
+ (options: ViewContainerIdentifier): ViewContainer;
887
+ }
888
+
889
+ export namespace Factory {
890
+
891
+ export interface WidgetOptions {
892
+ readonly order?: number;
893
+ readonly weight?: number;
894
+ readonly initiallyCollapsed?: boolean;
895
+ readonly canHide?: boolean;
896
+ readonly initiallyHidden?: boolean;
897
+ /**
898
+ * Disable dragging this part from its original container to other containers,
899
+ * But allow dropping parts from other containers on it,
900
+ * This option only applies to the `ViewContainerPart` and has no effect on the ViewContainer.
901
+ */
902
+ readonly disableDraggingToOtherContainers?: boolean;
903
+ }
904
+
905
+ export interface WidgetDescriptor {
906
+ readonly widget: Widget | interfaces.ServiceIdentifier<Widget>;
907
+ readonly options?: WidgetOptions;
908
+ }
909
+
910
+ }
911
+
912
+ export interface State {
913
+ title?: ViewContainerTitleOptions;
914
+ parts: ViewContainerPart.State[]
915
+ }
916
+
917
+ export function getOrientation(node: HTMLElement): 'horizontal' | 'vertical' {
918
+ if (node.closest(`#${MAIN_AREA_ID}`) || node.closest(`#${BOTTOM_AREA_ID}`)) {
919
+ return 'horizontal';
920
+ }
921
+ return 'vertical';
922
+ }
923
+ }
924
+
925
+ /**
926
+ * Wrapper around a widget held by a view container. Adds a header to display the
927
+ * title, toolbar, and collapse / expand handle.
928
+ */
929
+ export class ViewContainerPart extends BaseWidget {
930
+
931
+ protected readonly header: HTMLElement;
932
+ protected readonly body: HTMLElement;
933
+ protected readonly collapsedEmitter = new Emitter<boolean>();
934
+ protected readonly contextMenuEmitter = new Emitter<MouseEvent>();
935
+
936
+ protected readonly onTitleChangedEmitter = new Emitter<void>();
937
+ readonly onTitleChanged = this.onTitleChangedEmitter.event;
938
+ protected readonly onDidFocusEmitter = new Emitter<this>();
939
+ readonly onDidFocus = this.onDidFocusEmitter.event;
940
+ protected readonly onPartMovedEmitter = new Emitter<ViewContainer>();
941
+ readonly onDidMove = this.onPartMovedEmitter.event;
942
+ protected readonly onDidChangeDescriptionEmitter = new Emitter<void>();
943
+ readonly onDidChangeDescription = this.onDidChangeDescriptionEmitter.event;
944
+ protected readonly onDidChangeBadgeEmitter = new Emitter<void>();
945
+ readonly onDidChangeBadge = this.onDidChangeBadgeEmitter.event;
946
+ protected readonly onDidChangeBadgeTooltipEmitter = new Emitter<void>();
947
+ readonly onDidChangeBadgeTooltip = this.onDidChangeBadgeTooltipEmitter.event;
948
+
949
+ protected readonly toolbar: TabBarToolbar;
950
+
951
+ protected _collapsed: boolean;
952
+
953
+ uncollapsedSize: number | undefined;
954
+ animatedSize: number | undefined;
955
+
956
+ protected readonly toNoDisposeWrapped: Disposable;
957
+
958
+ constructor(
959
+ readonly wrapped: Widget,
960
+ readonly partId: string,
961
+ protected currentContainerId: string,
962
+ readonly originalContainerId: string,
963
+ readonly originalContainerTitle: ViewContainerTitleOptions | undefined,
964
+ protected readonly toolbarRegistry: TabBarToolbarRegistry,
965
+ protected readonly toolbarFactory: TabBarToolbarFactory,
966
+ readonly options: ViewContainer.Factory.WidgetOptions = {}
967
+ ) {
968
+ super();
969
+ wrapped.parent = this;
970
+ wrapped.disposed.connect(() => this.dispose());
971
+ this.id = `${originalContainerId}--${wrapped.id}`;
972
+ this.addClass('part');
973
+
974
+ const fireTitleChanged = () => this.onTitleChangedEmitter.fire(undefined);
975
+ this.wrapped.title.changed.connect(fireTitleChanged);
976
+ this.toDispose.push(Disposable.create(() => this.wrapped.title.changed.disconnect(fireTitleChanged)));
977
+
978
+ if (DescriptionWidget.is(this.wrapped)) {
979
+ this.wrapped?.onDidChangeDescription(() => this.onDidChangeDescriptionEmitter.fire(), undefined, this.toDispose);
980
+ }
981
+
982
+ if (BadgeWidget.is(this.wrapped)) {
983
+ this.wrapped.onDidChangeBadge(() => this.onDidChangeBadgeEmitter.fire(), undefined, this.toDispose);
984
+ this.wrapped.onDidChangeBadgeTooltip(() => this.onDidChangeBadgeTooltipEmitter.fire(), undefined, this.toDispose);
985
+ }
986
+
987
+ if (DynamicToolbarWidget.is(this.wrapped)) {
988
+ this.wrapped.onDidChangeToolbarItems(() => {
989
+ this.toolbar.updateTarget(this.wrapped);
990
+ this.viewContainer?.update();
991
+ });
992
+ }
993
+
994
+ const { header, body, disposable } = this.createContent();
995
+ this.header = header;
996
+ this.body = body;
997
+
998
+ this.toNoDisposeWrapped = this.toDispose.push(wrapped);
999
+ this.toolbar = this.toolbarFactory();
1000
+ this.toolbar.addClass('theia-view-container-part-title');
1001
+
1002
+ this.toDispose.pushAll([
1003
+ disposable,
1004
+ this.toolbar,
1005
+ this.toolbarRegistry.onDidChange(() => this.toolbar.updateTarget(this.wrapped)),
1006
+ this.collapsedEmitter,
1007
+ this.contextMenuEmitter,
1008
+ this.onTitleChangedEmitter,
1009
+ this.onDidChangeDescriptionEmitter,
1010
+ this.onDidChangeBadgeEmitter,
1011
+ this.onDidChangeBadgeTooltipEmitter,
1012
+ this.registerContextMenu(),
1013
+ this.onDidFocusEmitter,
1014
+ // focus event does not bubble, capture it
1015
+ addEventListener(this.node, 'focus', () => this.onDidFocusEmitter.fire(this), true)
1016
+ ]);
1017
+ this.scrollOptions = {
1018
+ suppressScrollX: true,
1019
+ minScrollbarLength: 35
1020
+ };
1021
+ this.collapsed = !!options.initiallyCollapsed;
1022
+ if (options.initiallyHidden && this.canHide) {
1023
+ this.hide();
1024
+ }
1025
+ }
1026
+
1027
+ get viewContainer(): ViewContainer | undefined {
1028
+ return this.parent ? this.parent.parent as ViewContainer : undefined;
1029
+ }
1030
+
1031
+ get currentViewContainerId(): string {
1032
+ return this.currentContainerId;
1033
+ }
1034
+
1035
+ get headerElement(): HTMLElement {
1036
+ return this.header;
1037
+ }
1038
+
1039
+ get collapsed(): boolean {
1040
+ return this._collapsed;
1041
+ }
1042
+
1043
+ set collapsed(collapsed: boolean) {
1044
+ // Cannot collapse/expand if the orientation of the container is `horizontal`.
1045
+ const orientation = ViewContainer.getOrientation(this.node);
1046
+ if (this._collapsed === collapsed || (orientation === 'horizontal' && collapsed)) {
1047
+ return;
1048
+ }
1049
+ this._collapsed = collapsed;
1050
+ this.node.classList.toggle('collapsed', collapsed);
1051
+
1052
+ if (collapsed && this.wrapped.node.contains(document.activeElement)) {
1053
+ this.header.focus();
1054
+ }
1055
+ this.wrapped.setHidden(collapsed);
1056
+ const toggleIcon = this.header.querySelector(`span.${EXPANSION_TOGGLE_CLASS}`);
1057
+ if (toggleIcon) {
1058
+ if (collapsed) {
1059
+ toggleIcon.classList.add(COLLAPSED_CLASS);
1060
+ } else {
1061
+ toggleIcon.classList.remove(COLLAPSED_CLASS);
1062
+ }
1063
+ }
1064
+ this.update();
1065
+ this.collapsedEmitter.fire(collapsed);
1066
+ }
1067
+
1068
+ onPartMoved(newContainer: ViewContainer): void {
1069
+ this.currentContainerId = newContainer.id;
1070
+ this.onPartMovedEmitter.fire(newContainer);
1071
+ }
1072
+
1073
+ override setHidden(hidden: boolean): void {
1074
+ if (!this.canHide) {
1075
+ return;
1076
+ }
1077
+ super.setHidden(hidden);
1078
+ }
1079
+
1080
+ get canHide(): boolean {
1081
+ return this.options.canHide === undefined || this.options.canHide;
1082
+ }
1083
+
1084
+ get onCollapsed(): CommonEvent<boolean> {
1085
+ return this.collapsedEmitter.event;
1086
+ }
1087
+
1088
+ get onContextMenu(): CommonEvent<MouseEvent> {
1089
+ return this.contextMenuEmitter.event;
1090
+ }
1091
+
1092
+ get minSize(): number {
1093
+ const style = getComputedStyle(this.body);
1094
+ if (ViewContainer.getOrientation(this.node) === 'horizontal') {
1095
+ return parseCssMagnitude(style.minWidth, 0);
1096
+ } else {
1097
+ return parseCssMagnitude(style.minHeight, 0);
1098
+ }
1099
+ }
1100
+
1101
+ protected readonly toShowHeader = new DisposableCollection();
1102
+ showTitle(): void {
1103
+ this.toShowHeader.dispose();
1104
+ }
1105
+
1106
+ hideTitle(): void {
1107
+ if (this.titleHidden) {
1108
+ return;
1109
+ }
1110
+ const display = this.header.style.display;
1111
+ const height = this.body.style.height;
1112
+ this.body.style.height = '100%';
1113
+ this.header.style.display = 'none';
1114
+ this.toShowHeader.push(Disposable.create(() => {
1115
+ this.header.style.display = display;
1116
+ this.body.style.height = height;
1117
+ }));
1118
+ }
1119
+
1120
+ get titleHidden(): boolean {
1121
+ return !this.toShowHeader.disposed || this.collapsed;
1122
+ }
1123
+
1124
+ protected override getScrollContainer(): HTMLElement {
1125
+ return this.body;
1126
+ }
1127
+
1128
+ protected registerContextMenu(): Disposable {
1129
+ return new DisposableCollection(
1130
+ addEventListener(this.header, 'contextmenu', event => {
1131
+ this.contextMenuEmitter.fire(event);
1132
+ })
1133
+ );
1134
+ }
1135
+
1136
+ protected createContent(): { header: HTMLElement, body: HTMLElement, disposable: Disposable } {
1137
+ const disposable = new DisposableCollection();
1138
+ const { header, disposable: headerDisposable } = this.createHeader();
1139
+ const body = document.createElement('div');
1140
+ body.classList.add('body');
1141
+ this.node.appendChild(header);
1142
+ this.node.appendChild(body);
1143
+ disposable.push(headerDisposable);
1144
+ return {
1145
+ header,
1146
+ body,
1147
+ disposable,
1148
+ };
1149
+ }
1150
+
1151
+ protected createHeader(): { header: HTMLElement, disposable: Disposable } {
1152
+ const disposable = new DisposableCollection();
1153
+ const header = document.createElement('div');
1154
+ header.tabIndex = 0;
1155
+ header.classList.add('theia-header', 'header', 'theia-view-container-part-header');
1156
+ disposable.push(addEventListener(header, 'click', event => {
1157
+ if (this.toolbar && this.toolbar.shouldHandleMouseEvent(event)) {
1158
+ return;
1159
+ }
1160
+ this.collapsed = !this.collapsed;
1161
+ }));
1162
+ disposable.push(addKeyListener(header, Key.ARROW_LEFT, () => this.collapsed = true));
1163
+ disposable.push(addKeyListener(header, Key.ARROW_RIGHT, () => this.collapsed = false));
1164
+ disposable.push(addKeyListener(header, Key.ENTER, () => this.collapsed = !this.collapsed));
1165
+
1166
+ const toggleIcon = document.createElement('span');
1167
+ toggleIcon.classList.add(EXPANSION_TOGGLE_CLASS, ...CODICON_TREE_ITEM_CLASSES);
1168
+ if (this.collapsed) {
1169
+ toggleIcon.classList.add(COLLAPSED_CLASS);
1170
+ }
1171
+ header.appendChild(toggleIcon);
1172
+
1173
+ const title = document.createElement('span');
1174
+ title.classList.add('label', 'noselect');
1175
+
1176
+ const description = document.createElement('span');
1177
+ description.classList.add('description');
1178
+
1179
+ const badgeSpan = document.createElement('span');
1180
+ badgeSpan.classList.add('notification-count');
1181
+
1182
+ const badgeContainer = document.createElement('div');
1183
+ badgeContainer.classList.add('notification-count-container');
1184
+ badgeContainer.appendChild(badgeSpan);
1185
+ const badgeContainerDisplay = badgeContainer.style.display;
1186
+
1187
+ const updateTitle = () => {
1188
+ if (this.currentContainerId !== this.originalContainerId && this.originalContainerTitle?.label) {
1189
+ // Creating a title in format: <original_container_title>: <part_title>.
1190
+ title.innerText = this.originalContainerTitle.label + ': ' + this.wrapped.title.label;
1191
+ } else {
1192
+ title.innerText = this.wrapped.title.label;
1193
+ }
1194
+ };
1195
+ const updateCaption = () => title.title = this.wrapped.title.caption || this.wrapped.title.label;
1196
+ const updateDescription = () => {
1197
+ description.innerText = DescriptionWidget.is(this.wrapped) && !this.collapsed && this.wrapped.description || '';
1198
+ };
1199
+ const updateBadge = () => {
1200
+ if (BadgeWidget.is(this.wrapped)) {
1201
+ const visibleToolBarItems = this.toolbarRegistry.visibleItems(this.wrapped).length > 0;
1202
+ const badge = this.wrapped.badge;
1203
+ if (badge && !visibleToolBarItems) {
1204
+ badgeSpan.innerText = badge.toString();
1205
+ badgeSpan.title = this.wrapped.badgeTooltip || '';
1206
+ badgeContainer.style.display = badgeContainerDisplay;
1207
+ return;
1208
+ }
1209
+ }
1210
+ badgeContainer.style.display = 'none';
1211
+ };
1212
+
1213
+ updateTitle();
1214
+ updateCaption();
1215
+ updateDescription();
1216
+ updateBadge();
1217
+
1218
+ disposable.pushAll([
1219
+ this.onTitleChanged(updateTitle),
1220
+ this.onTitleChanged(updateCaption),
1221
+ this.onDidMove(updateTitle),
1222
+ this.onDidChangeDescription(updateDescription),
1223
+ this.onDidChangeBadge(updateBadge),
1224
+ this.onDidChangeBadgeTooltip(updateBadge),
1225
+ this.onCollapsed(updateDescription)
1226
+ ]);
1227
+ header.appendChild(title);
1228
+ header.appendChild(description);
1229
+ header.appendChild(badgeContainer);
1230
+
1231
+ return {
1232
+ header,
1233
+ disposable
1234
+ };
1235
+ }
1236
+
1237
+ protected handleResize(): void {
1238
+ const handleMouseEnter = () => {
1239
+ this.node?.classList.add('no-pointer-events');
1240
+ setTimeout(() => {
1241
+ this.node?.classList.remove('no-pointer-events');
1242
+ this.node?.removeEventListener('mouseenter', handleMouseEnter);
1243
+ }, 100);
1244
+ };
1245
+ this.node?.addEventListener('mouseenter', handleMouseEnter);
1246
+ }
1247
+
1248
+ protected override onResize(msg: Widget.ResizeMessage): void {
1249
+ this.handleResize();
1250
+ if (this.wrapped.isAttached && !this.collapsed) {
1251
+ MessageLoop.sendMessage(this.wrapped, Widget.ResizeMessage.UnknownSize);
1252
+ }
1253
+ super.onResize(msg);
1254
+ }
1255
+
1256
+ protected override onUpdateRequest(msg: Message): void {
1257
+ if (this.wrapped.isAttached && !this.collapsed) {
1258
+ MessageLoop.sendMessage(this.wrapped, msg);
1259
+ }
1260
+ super.onUpdateRequest(msg);
1261
+ }
1262
+
1263
+ protected override onAfterAttach(msg: Message): void {
1264
+ if (!this.wrapped.isAttached) {
1265
+ UnsafeWidgetUtilities.attach(this.wrapped, this.body);
1266
+ }
1267
+ UnsafeWidgetUtilities.attach(this.toolbar, this.header);
1268
+ super.onAfterAttach(msg);
1269
+ }
1270
+
1271
+ protected override onBeforeDetach(msg: Message): void {
1272
+ super.onBeforeDetach(msg);
1273
+ if (this.toolbar.isAttached) {
1274
+ Widget.detach(this.toolbar);
1275
+ }
1276
+ if (this.wrapped.isAttached) {
1277
+ UnsafeWidgetUtilities.detach(this.wrapped);
1278
+ }
1279
+ }
1280
+
1281
+ protected override onBeforeShow(msg: Message): void {
1282
+ if (this.wrapped.isAttached && !this.collapsed) {
1283
+ MessageLoop.sendMessage(this.wrapped, msg);
1284
+ }
1285
+ super.onBeforeShow(msg);
1286
+ }
1287
+
1288
+ protected override onAfterShow(msg: Message): void {
1289
+ super.onAfterShow(msg);
1290
+ if (this.wrapped.isAttached && !this.collapsed) {
1291
+ MessageLoop.sendMessage(this.wrapped, msg);
1292
+ }
1293
+ }
1294
+
1295
+ protected override onBeforeHide(msg: Message): void {
1296
+ if (this.wrapped.isAttached && !this.collapsed) {
1297
+ MessageLoop.sendMessage(this.wrapped, msg);
1298
+ }
1299
+ super.onBeforeShow(msg);
1300
+ }
1301
+
1302
+ protected override onAfterHide(msg: Message): void {
1303
+ super.onAfterHide(msg);
1304
+ if (this.wrapped.isAttached && !this.collapsed) {
1305
+ MessageLoop.sendMessage(this.wrapped, msg);
1306
+ }
1307
+ }
1308
+
1309
+ protected override onChildRemoved(msg: Widget.ChildMessage): void {
1310
+ super.onChildRemoved(msg);
1311
+ // if wrapped is not disposed, but detached then we should not dispose it, but only get rid of this part
1312
+ this.toNoDisposeWrapped.dispose();
1313
+ this.dispose();
1314
+ }
1315
+
1316
+ protected override onActivateRequest(msg: Message): void {
1317
+ super.onActivateRequest(msg);
1318
+ if (this.collapsed) {
1319
+ this.header.focus();
1320
+ } else {
1321
+ this.wrapped.activate();
1322
+ }
1323
+ }
1324
+ }
1325
+
1326
+ export namespace ViewContainerPart {
1327
+
1328
+ /**
1329
+ * Make sure to adjust the `line-height` of the `.theia-view-container .part > .header` CSS class when modifying this, and vice versa.
1330
+ */
1331
+ export const HEADER_HEIGHT = 22;
1332
+
1333
+ export interface State {
1334
+ widget?: Widget
1335
+ partId: string;
1336
+ collapsed: boolean;
1337
+ hidden: boolean;
1338
+ relativeSize?: number;
1339
+ description?: string;
1340
+ /** The original container to which this part belongs */
1341
+ originalContainerId: string;
1342
+ originalContainerTitle?: ViewContainerTitleOptions;
1343
+ }
1344
+
1345
+ export function closestPart(element: Element | EventTarget | null, selector: string = 'div.part'): Element | undefined {
1346
+ if (element instanceof Element) {
1347
+ const part = element.closest(selector);
1348
+ if (part instanceof Element) {
1349
+ return part;
1350
+ }
1351
+ }
1352
+ return undefined;
1353
+ }
1354
+ }
1355
+
1356
+ export class ViewContainerLayout extends SplitLayout {
1357
+
1358
+ constructor(protected options: ViewContainerLayout.Options, protected readonly splitPositionHandler: SplitPositionHandler) {
1359
+ super(options);
1360
+ }
1361
+
1362
+ protected get items(): ReadonlyArray<LayoutItem & ViewContainerLayout.Item> {
1363
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1364
+ return (this as any)._items as Array<LayoutItem & ViewContainerLayout.Item>;
1365
+ }
1366
+
1367
+ override iter(): IIterator<ViewContainerPart> {
1368
+ return map(this.items, item => item.widget);
1369
+ }
1370
+
1371
+ // @ts-expect-error TS2611 `SplitLayout.widgets` is declared as `readonly widgets` but is implemented as a getter.
1372
+ get widgets(): ViewContainerPart[] {
1373
+ return toArray(this.iter());
1374
+ }
1375
+
1376
+ override attachWidget(index: number, widget: ViewContainerPart): void {
1377
+ super.attachWidget(index, widget);
1378
+ if (index > -1 && this.parent && this.parent.node.contains(this.widgets[index + 1]?.node)) {
1379
+ // Set the correct attach index to the DOM elements.
1380
+ const ref = this.widgets[index + 1].node;
1381
+ this.parent.node.insertBefore(widget.node, ref);
1382
+ this.parent.node.insertBefore(this.handles[index], ref);
1383
+ this.parent.fit();
1384
+ }
1385
+ }
1386
+
1387
+ getPartSize(part: ViewContainerPart): number | undefined {
1388
+ if (part.collapsed || part.isHidden) {
1389
+ return part.uncollapsedSize;
1390
+ }
1391
+ if (this.orientation === 'horizontal') {
1392
+ return part.node.offsetWidth;
1393
+ } else {
1394
+ return part.node.offsetHeight;
1395
+ }
1396
+ }
1397
+
1398
+ /**
1399
+ * Set the sizes of the view container parts according to the given weights
1400
+ * by moving the split handles. This is similar to `setRelativeSizes` defined
1401
+ * in `SplitLayout`, but here we properly consider the collapsed / expanded state.
1402
+ */
1403
+ setPartSizes(weights: (number | undefined)[]): void {
1404
+ const parts = this.widgets;
1405
+ const availableSize = this.getAvailableSize();
1406
+
1407
+ // Sum up the weights of visible parts
1408
+ let totalWeight = 0;
1409
+ let weightCount = 0;
1410
+ for (let index = 0; index < weights.length && index < parts.length; index++) {
1411
+ const part = parts[index];
1412
+ const weight = weights[index];
1413
+ if (weight && !part.isHidden && !part.collapsed) {
1414
+ totalWeight += weight;
1415
+ weightCount++;
1416
+ }
1417
+ }
1418
+ if (weightCount === 0 || availableSize === 0) {
1419
+ return;
1420
+ }
1421
+
1422
+ // Add the average weight for visible parts without weight
1423
+ const averageWeight = totalWeight / weightCount;
1424
+ for (let index = 0; index < weights.length && index < parts.length; index++) {
1425
+ const part = parts[index];
1426
+ const weight = weights[index];
1427
+ if (!weight && !part.isHidden && !part.collapsed) {
1428
+ totalWeight += averageWeight;
1429
+ }
1430
+ }
1431
+
1432
+ // Apply the weights to compute actual sizes
1433
+ let position = 0;
1434
+ for (let index = 0; index < weights.length && index < parts.length - 1; index++) {
1435
+ const part = parts[index];
1436
+ if (!part.isHidden) {
1437
+ if (this.orientation === 'vertical') {
1438
+ position += this.options.headerSize;
1439
+ }
1440
+ const weight = weights[index];
1441
+ if (part.collapsed) {
1442
+ if (weight) {
1443
+ part.uncollapsedSize = weight / totalWeight * availableSize;
1444
+ }
1445
+ } else {
1446
+ let contentSize = (weight || averageWeight) / totalWeight * availableSize;
1447
+ const minSize = part.minSize;
1448
+ if (contentSize < minSize) {
1449
+ contentSize = minSize;
1450
+ }
1451
+ position += contentSize;
1452
+ }
1453
+ this.setHandlePosition(index, position);
1454
+ position += this.spacing;
1455
+ }
1456
+ }
1457
+ }
1458
+
1459
+ /**
1460
+ * Determine the size of the split panel area that is available for widget content,
1461
+ * i.e. excluding part headers and split handles.
1462
+ */
1463
+ getAvailableSize(): number {
1464
+ if (!this.parent || !this.parent.isAttached) {
1465
+ return 0;
1466
+ }
1467
+ const parts = this.widgets;
1468
+ const visiblePartCount = parts.filter(part => !part.isHidden).length;
1469
+ let availableSize: number;
1470
+ if (this.orientation === 'horizontal') {
1471
+ availableSize = this.parent.node.offsetWidth;
1472
+ } else {
1473
+ availableSize = this.parent.node.offsetHeight;
1474
+ availableSize -= visiblePartCount * this.options.headerSize;
1475
+ }
1476
+ availableSize -= (visiblePartCount - 1) * this.spacing;
1477
+ if (availableSize < 0) {
1478
+ return 0;
1479
+ }
1480
+ return availableSize;
1481
+ }
1482
+
1483
+ /**
1484
+ * Update a view container part that has been collapsed or expanded. The transition
1485
+ * to the new state is animated.
1486
+ */
1487
+ updateCollapsed(part: ViewContainerPart, enableAnimation: boolean): void {
1488
+ const index = this.items.findIndex(item => item.widget === part);
1489
+ if (index < 0 || !this.parent || part.isHidden) {
1490
+ return;
1491
+ }
1492
+ // Do not store the height of the "stretched item". Otherwise, we mess up the "hint height".
1493
+ // Store the height only if there are other expanded items.
1494
+ const currentSize = this.orientation === 'horizontal' ? part.node.offsetWidth : part.node.offsetHeight;
1495
+ if (part.collapsed && this.items.some(item => !item.widget.collapsed && !item.widget.isHidden)) {
1496
+ part.uncollapsedSize = currentSize;
1497
+ }
1498
+
1499
+ if (!enableAnimation || this.options.animationDuration <= 0) {
1500
+ MessageLoop.postMessage(this.parent, Widget.Msg.FitRequest);
1501
+ return;
1502
+ }
1503
+ let startTime: number | undefined = undefined;
1504
+ const duration = this.options.animationDuration;
1505
+ const direction = part.collapsed ? 'collapse' : 'expand';
1506
+ let fullSize: number;
1507
+ if (direction === 'collapse') {
1508
+ fullSize = currentSize - this.options.headerSize;
1509
+ } else {
1510
+ fullSize = Math.max((part.uncollapsedSize || 0) - this.options.headerSize, part.minSize);
1511
+ if (this.items.filter(item => !item.widget.collapsed && !item.widget.isHidden).length === 1) {
1512
+ // Expand to full available size
1513
+ fullSize = Math.max(fullSize, this.getAvailableSize());
1514
+ }
1515
+ }
1516
+
1517
+ // The update function is called on every animation frame until the predefined duration has elapsed.
1518
+ const updateFunc = (time: number) => {
1519
+ if (!this.parent) {
1520
+ part.animatedSize = undefined;
1521
+ return;
1522
+ }
1523
+ if (startTime === undefined) {
1524
+ startTime = time;
1525
+ }
1526
+ if (time - startTime < duration) {
1527
+ // Render an intermediate state for the animation
1528
+ const t = this.tween((time - startTime) / duration);
1529
+ if (direction === 'collapse') {
1530
+ part.animatedSize = (1 - t) * fullSize;
1531
+ } else {
1532
+ part.animatedSize = t * fullSize;
1533
+ }
1534
+ requestAnimationFrame(updateFunc);
1535
+ } else {
1536
+ // The animation is finished
1537
+ if (direction === 'collapse') {
1538
+ part.animatedSize = undefined;
1539
+ } else {
1540
+ part.animatedSize = fullSize;
1541
+ // Request another frame to reset the part to variable size
1542
+ requestAnimationFrame(() => {
1543
+ part.animatedSize = undefined;
1544
+ if (this.parent) {
1545
+ MessageLoop.sendMessage(this.parent, Widget.Msg.FitRequest);
1546
+ }
1547
+ });
1548
+ }
1549
+ }
1550
+ MessageLoop.sendMessage(this.parent, Widget.Msg.FitRequest);
1551
+ };
1552
+ requestAnimationFrame(updateFunc);
1553
+ }
1554
+
1555
+ updateSashes(): void {
1556
+ const { widgets, handles } = this;
1557
+ if (widgets.length !== handles.length) {
1558
+ console.warn('Unexpected mismatch between number of widgets and number of handles.');
1559
+ return;
1560
+ }
1561
+ const firstUncollapsed = this.getFirstUncollapsedWidgetIndex();
1562
+ const lastUncollapsed = firstUncollapsed === undefined ? undefined : this.getLastUncollapsedWidgetIndex();
1563
+ const allHidden = firstUncollapsed === lastUncollapsed;
1564
+ for (const [index, handle] of this.handles.entries()) {
1565
+ // The or clauses are added for type checking. If they're true, allHidden will also have been true.
1566
+ if (allHidden || firstUncollapsed === undefined || lastUncollapsed === undefined) {
1567
+ handle.classList.add('sash-hidden');
1568
+ } else if (index < lastUncollapsed && index >= firstUncollapsed) {
1569
+ handle.classList.remove('sash-hidden');
1570
+ } else {
1571
+ handle.classList.add('sash-hidden');
1572
+ }
1573
+ }
1574
+ }
1575
+
1576
+ protected getFirstUncollapsedWidgetIndex(): number | undefined {
1577
+ const index = this.widgets.findIndex(widget => !widget.collapsed && !widget.isHidden);
1578
+ return index === -1 ? undefined : index;
1579
+ }
1580
+
1581
+ protected getLastUncollapsedWidgetIndex(): number | undefined {
1582
+ for (let i = this.widgets.length - 1; i >= 0; i--) {
1583
+ if (!this.widgets[i].collapsed && !this.widgets[i].isHidden) {
1584
+ return i;
1585
+ }
1586
+ }
1587
+ }
1588
+
1589
+ protected override onFitRequest(msg: Message): void {
1590
+ for (const part of this.widgets) {
1591
+ const style = part.node.style;
1592
+ if (part.animatedSize !== undefined) {
1593
+ // The part size has been fixed for animating the transition to collapsed / expanded state
1594
+ const fixedSize = `${this.options.headerSize + part.animatedSize}px`;
1595
+ style.minHeight = fixedSize;
1596
+ style.maxHeight = fixedSize;
1597
+ } else if (part.collapsed) {
1598
+ // The part size is fixed to the header size
1599
+ const fixedSize = `${this.options.headerSize}px`;
1600
+ style.minHeight = fixedSize;
1601
+ style.maxHeight = fixedSize;
1602
+ } else {
1603
+ const minSize = `${this.options.headerSize + part.minSize}px`;
1604
+ style.minHeight = minSize;
1605
+ style.maxHeight = '';
1606
+ }
1607
+ }
1608
+ super.onFitRequest(msg);
1609
+ }
1610
+
1611
+ /**
1612
+ * Sinusoidal tween function for smooth animation.
1613
+ */
1614
+ protected tween(t: number): number {
1615
+ return 0.5 * (1 - Math.cos(Math.PI * t));
1616
+ }
1617
+
1618
+ setHandlePosition(index: number, position: number): Promise<void> {
1619
+ const options: SplitPositionOptions = {
1620
+ referenceWidget: this.widgets[index],
1621
+ duration: 0
1622
+ };
1623
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1624
+ return this.splitPositionHandler.setSplitHandlePosition(this.parent as SplitPanel, index, position, options) as Promise<any>;
1625
+ }
1626
+
1627
+ }
1628
+
1629
+ export namespace ViewContainerLayout {
1630
+
1631
+ export interface Options extends SplitLayout.IOptions {
1632
+ headerSize: number;
1633
+ animationDuration: number;
1634
+ }
1635
+
1636
+ export interface Item {
1637
+ readonly widget: ViewContainerPart;
1638
+ }
1639
+
1640
+ }