@opensumi/ide-core-browser 2.21.13 → 2.22.0

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 (560) hide show
  1. package/lib/application/application-state-service.d.ts +1 -1
  2. package/lib/application/application-state-service.d.ts.map +1 -1
  3. package/lib/application/application-state-service.js.map +1 -1
  4. package/lib/application/application.service.js.map +1 -1
  5. package/lib/authentication/authentication.contribution.js.map +1 -1
  6. package/lib/authentication/authentication.service.js.map +1 -1
  7. package/lib/bootstrap/app.d.ts +2 -35
  8. package/lib/bootstrap/app.d.ts.map +1 -1
  9. package/lib/bootstrap/app.interface.d.ts +39 -0
  10. package/lib/bootstrap/app.interface.d.ts.map +1 -0
  11. package/lib/bootstrap/app.interface.js +3 -0
  12. package/lib/bootstrap/app.interface.js.map +1 -0
  13. package/lib/bootstrap/app.js +8 -8
  14. package/lib/bootstrap/app.js.map +1 -1
  15. package/lib/bootstrap/app.view.d.ts +1 -1
  16. package/lib/bootstrap/app.view.d.ts.map +1 -1
  17. package/lib/bootstrap/connection.d.ts +1 -1
  18. package/lib/bootstrap/connection.d.ts.map +1 -1
  19. package/lib/bootstrap/connection.js +4 -4
  20. package/lib/bootstrap/connection.js.map +1 -1
  21. package/lib/bootstrap/index.d.ts +1 -1
  22. package/lib/bootstrap/index.d.ts.map +1 -1
  23. package/lib/bootstrap/index.js +1 -1
  24. package/lib/bootstrap/index.js.map +1 -1
  25. package/lib/bootstrap/inner-providers.js +1 -1
  26. package/lib/bootstrap/inner-providers.js.map +1 -1
  27. package/lib/bootstrap/lifecycle.service.js.map +1 -1
  28. package/lib/browser-module.js.map +1 -1
  29. package/lib/common/common.command.d.ts +24 -1
  30. package/lib/common/common.command.d.ts.map +1 -1
  31. package/lib/common/common.command.js +42 -6
  32. package/lib/common/common.command.js.map +1 -1
  33. package/lib/common/common.contribution.js.map +1 -1
  34. package/lib/common/common.module.js.map +1 -1
  35. package/lib/common/common.storage.js.map +1 -1
  36. package/lib/components/actions/index.d.ts +2 -2
  37. package/lib/components/actions/index.d.ts.map +1 -1
  38. package/lib/components/actions/index.js +2 -22
  39. package/lib/components/actions/index.js.map +1 -1
  40. package/lib/components/index.d.ts +0 -4
  41. package/lib/components/index.d.ts.map +1 -1
  42. package/lib/components/index.js +0 -4
  43. package/lib/components/index.js.map +1 -1
  44. package/lib/components/layout/box-panel.d.ts +1 -1
  45. package/lib/components/layout/box-panel.d.ts.map +1 -1
  46. package/lib/components/layout/split-panel.d.ts +17 -1
  47. package/lib/components/layout/split-panel.d.ts.map +1 -1
  48. package/lib/components/layout/split-panel.js +16 -16
  49. package/lib/components/layout/split-panel.js.map +1 -1
  50. package/lib/components/layout/split-panel.service.js.map +1 -1
  51. package/lib/components/progressbar/index.d.ts +2 -2
  52. package/lib/components/progressbar/index.d.ts.map +1 -1
  53. package/lib/components/progressbar/index.js +2 -10
  54. package/lib/components/progressbar/index.js.map +1 -1
  55. package/lib/contextkey/resource.d.ts +1 -1
  56. package/lib/contextkey/resource.d.ts.map +1 -1
  57. package/lib/contextkey/search.d.ts +24 -0
  58. package/lib/contextkey/search.d.ts.map +1 -0
  59. package/lib/contextkey/search.js +29 -0
  60. package/lib/contextkey/search.js.map +1 -0
  61. package/lib/contextkey/testing.d.ts +1 -0
  62. package/lib/contextkey/testing.d.ts.map +1 -1
  63. package/lib/contextkey/testing.js +2 -1
  64. package/lib/contextkey/testing.js.map +1 -1
  65. package/lib/core-preferences.d.ts +4 -3
  66. package/lib/core-preferences.d.ts.map +1 -1
  67. package/lib/core-preferences.js +2 -2
  68. package/lib/core-preferences.js.map +1 -1
  69. package/lib/dom/index.d.ts +1 -1
  70. package/lib/dom/index.d.ts.map +1 -1
  71. package/lib/encoding-registry.js.map +1 -1
  72. package/lib/extensions/extensions-point.service.js.map +1 -1
  73. package/lib/file-decoration.d.ts +10 -0
  74. package/lib/file-decoration.d.ts.map +1 -0
  75. package/lib/file-decoration.js +3 -0
  76. package/lib/file-decoration.js.map +1 -0
  77. package/lib/hash-calculate/hash-calculate.contribution.js.map +1 -1
  78. package/lib/index.d.ts +1 -1
  79. package/lib/index.d.ts.map +1 -1
  80. package/lib/index.js +1 -1
  81. package/lib/index.js.map +1 -1
  82. package/lib/keybinding/keybinding.js.map +1 -1
  83. package/lib/keyboard/keyboard-layout-provider.d.ts +2 -2
  84. package/lib/keyboard/keyboard-layout-provider.d.ts.map +1 -1
  85. package/lib/keyboard/keyboard-layout-provider.js +13 -13
  86. package/lib/keyboard/keyboard-layout-provider.js.map +1 -1
  87. package/lib/keyboard/keyboard-layout-service.js.map +1 -1
  88. package/lib/keyboard/keys.d.ts +2 -2
  89. package/lib/keyboard/keys.d.ts.map +1 -1
  90. package/lib/keyboard/layouts/_.contribution.js +3 -3
  91. package/lib/keyboard/layouts/_.contribution.js.map +1 -1
  92. package/lib/layout/accordion/tab-bar-toolbar.js.map +1 -1
  93. package/lib/layout/accordion/view-context-key.registry.js.map +1 -1
  94. package/lib/layout/layout-hooks.d.ts +1 -1
  95. package/lib/layout/layout-hooks.d.ts.map +1 -1
  96. package/lib/layout/layout-state.js.map +1 -1
  97. package/lib/layout/layout.interface.d.ts +1 -1
  98. package/lib/layout/layout.interface.d.ts.map +1 -1
  99. package/lib/layout/layout.js.map +1 -1
  100. package/lib/logger/browser-logger.js.map +1 -1
  101. package/lib/markdown/index.d.ts +1 -1
  102. package/lib/markdown/index.d.ts.map +1 -1
  103. package/lib/markdown/index.js +4 -31
  104. package/lib/markdown/index.js.map +1 -1
  105. package/lib/menu/next/base.d.ts +4 -4
  106. package/lib/menu/next/base.d.ts.map +1 -1
  107. package/lib/menu/next/base.js.map +1 -1
  108. package/lib/menu/next/ctxmenu-service.js +10 -10
  109. package/lib/menu/next/ctxmenu-service.js.map +1 -1
  110. package/lib/menu/next/menu-service.js +6 -6
  111. package/lib/menu/next/menu-service.js.map +1 -1
  112. package/lib/menu/next/menu.contrib.interface.d.ts +16 -15
  113. package/lib/menu/next/menu.contrib.interface.d.ts.map +1 -1
  114. package/lib/menu/next/menu.contrib.interface.js.map +1 -1
  115. package/lib/menu/next/menu.interface.d.ts +2 -2
  116. package/lib/menu/next/menu.interface.d.ts.map +1 -1
  117. package/lib/menu/next/menu.interface.js.map +1 -1
  118. package/lib/menu/next/menubar-service.js +10 -10
  119. package/lib/menu/next/menubar-service.js.map +1 -1
  120. package/lib/menu/next/renderer/ctxmenu/browser.js.map +1 -1
  121. package/lib/menu/next/renderer/ctxmenu/electron.js.map +1 -1
  122. package/lib/menu/next/toolbar-action.service.d.ts +1 -1
  123. package/lib/menu/next/toolbar-action.service.d.ts.map +1 -1
  124. package/lib/menu/next/toolbar-action.service.js.map +1 -1
  125. package/lib/monaco/index.d.ts +7 -3
  126. package/lib/monaco/index.d.ts.map +1 -1
  127. package/lib/monaco/index.js.map +1 -1
  128. package/lib/monaco/merge-editor-widget.d.ts +53 -0
  129. package/lib/monaco/merge-editor-widget.d.ts.map +1 -0
  130. package/lib/monaco/merge-editor-widget.js +107 -0
  131. package/lib/monaco/merge-editor-widget.js.map +1 -0
  132. package/lib/opener/command-opener.js.map +1 -1
  133. package/lib/opener/default-opener.js.map +1 -1
  134. package/lib/opener/http-opener.js.map +1 -1
  135. package/lib/opener/opener.contribution.js.map +1 -1
  136. package/lib/opener/opener.service.js.map +1 -1
  137. package/lib/preferences/early-preferences.js +4 -4
  138. package/lib/preferences/early-preferences.js.map +1 -1
  139. package/lib/preferences/preference-configurations.js +1 -1
  140. package/lib/preferences/preference-configurations.js.map +1 -1
  141. package/lib/preferences/preference-contribution.d.ts +1 -2
  142. package/lib/preferences/preference-contribution.d.ts.map +1 -1
  143. package/lib/preferences/preference-contribution.js +26 -22
  144. package/lib/preferences/preference-contribution.js.map +1 -1
  145. package/lib/preferences/preference-provider.js.map +1 -1
  146. package/lib/preferences/preference-proxy.d.ts +2 -3
  147. package/lib/preferences/preference-proxy.d.ts.map +1 -1
  148. package/lib/preferences/preference-proxy.js.map +1 -1
  149. package/lib/preferences/preference-service.d.ts +1 -0
  150. package/lib/preferences/preference-service.d.ts.map +1 -1
  151. package/lib/preferences/preference-service.js +48 -3
  152. package/lib/preferences/preference-service.js.map +1 -1
  153. package/lib/preferences/settings.d.ts +44 -5
  154. package/lib/preferences/settings.d.ts.map +1 -1
  155. package/lib/preferences/settings.js.map +1 -1
  156. package/lib/preferences/types.d.ts +8 -1
  157. package/lib/preferences/types.d.ts.map +1 -1
  158. package/lib/preferences/types.js.map +1 -1
  159. package/lib/progress/progress-bar.d.ts +4 -1
  160. package/lib/progress/progress-bar.d.ts.map +1 -1
  161. package/lib/progress/progress-bar.js +11 -4
  162. package/lib/progress/progress-bar.js.map +1 -1
  163. package/lib/progress/progress-indicator.js.map +1 -1
  164. package/lib/progress/progress.service.js +6 -6
  165. package/lib/progress/progress.service.js.map +1 -1
  166. package/lib/quick-open/index.d.ts +1 -1
  167. package/lib/quick-open/index.d.ts.map +1 -1
  168. package/lib/quick-open/index.js.map +1 -1
  169. package/lib/quick-open/recent-files.js.map +1 -1
  170. package/lib/raw-context-key.d.ts +1 -1
  171. package/lib/raw-context-key.d.ts.map +1 -1
  172. package/lib/raw-context-key.js +4 -4
  173. package/lib/raw-context-key.js.map +1 -1
  174. package/lib/react-hooks/useThrottleFn/index.d.ts +13 -0
  175. package/lib/react-hooks/useThrottleFn/index.d.ts.map +1 -0
  176. package/lib/react-hooks/useThrottleFn/index.js +20 -0
  177. package/lib/react-hooks/useThrottleFn/index.js.map +1 -0
  178. package/lib/react-providers/config-provider.d.ts +6 -0
  179. package/lib/react-providers/config-provider.d.ts.map +1 -1
  180. package/lib/react-providers/config-provider.js.map +1 -1
  181. package/lib/react-providers/slot.d.ts +2 -2
  182. package/lib/react-providers/slot.d.ts.map +1 -1
  183. package/lib/services/clipboard.service.d.ts +1 -0
  184. package/lib/services/clipboard.service.d.ts.map +1 -1
  185. package/lib/services/clipboard.service.js +17 -30
  186. package/lib/services/clipboard.service.js.map +1 -1
  187. package/lib/services/credentials-service.js.map +1 -1
  188. package/lib/services/crypto-service.js.map +1 -1
  189. package/lib/services/external-uri.service.js.map +1 -1
  190. package/lib/services/label-service.js.map +1 -1
  191. package/lib/services/storage-service.d.ts +1 -0
  192. package/lib/services/storage-service.d.ts.map +1 -1
  193. package/lib/services/storage-service.js +13 -2
  194. package/lib/services/storage-service.js.map +1 -1
  195. package/lib/style/icon/icon.d.ts +3 -2
  196. package/lib/style/icon/icon.d.ts.map +1 -1
  197. package/lib/style/icon/icon.js +5 -1
  198. package/lib/style/icon/icon.js.map +1 -1
  199. package/lib/style/icon/ide-iconfont.d.ts +1 -1
  200. package/lib/style/icon/ide-iconfont.d.ts.map +1 -1
  201. package/lib/style/icon/ide-iconfont.js +1 -1
  202. package/lib/style/icon/ide-iconfont.js.map +1 -1
  203. package/lib/style/icon/index.less +13 -0
  204. package/lib/toolbar/components/button.js +12 -12
  205. package/lib/toolbar/components/button.js.map +1 -1
  206. package/lib/toolbar/toolbar.popover.registry.js.map +1 -1
  207. package/lib/toolbar/toolbar.registry.d.ts +1 -1
  208. package/lib/toolbar/toolbar.registry.d.ts.map +1 -1
  209. package/lib/toolbar/toolbar.registry.js.map +1 -1
  210. package/lib/toolbar/types.d.ts +1 -1
  211. package/lib/toolbar/types.d.ts.map +1 -1
  212. package/lib/utils/json.d.ts +5 -5
  213. package/lib/utils/json.d.ts.map +1 -1
  214. package/lib/utils/label.d.ts.map +1 -1
  215. package/lib/utils/label.js +16 -9
  216. package/lib/utils/label.js.map +1 -1
  217. package/lib/utils/parse.d.ts +2 -1
  218. package/lib/utils/parse.d.ts.map +1 -1
  219. package/lib/utils/parse.js +10 -1
  220. package/lib/utils/parse.js.map +1 -1
  221. package/lib/variable/variable.d.ts +1 -1
  222. package/lib/variable/variable.d.ts.map +1 -1
  223. package/lib/variable/variable.js.map +1 -1
  224. package/lib/window/window.service.js.map +1 -1
  225. package/package.json +9 -11
  226. package/src/application/application-state-service.ts +54 -0
  227. package/src/application/application.service.ts +51 -0
  228. package/src/application/index.ts +2 -0
  229. package/src/authentication/authentication.contribution.ts +35 -0
  230. package/src/authentication/authentication.service.ts +517 -0
  231. package/src/bootstrap/app.interface.ts +46 -0
  232. package/src/bootstrap/app.ts +710 -0
  233. package/src/bootstrap/app.view.tsx +88 -0
  234. package/src/bootstrap/connection.ts +116 -0
  235. package/src/bootstrap/index.ts +3 -0
  236. package/src/bootstrap/inner-providers.ts +297 -0
  237. package/src/bootstrap/lifecycle.service.ts +19 -0
  238. package/src/browser-module.ts +24 -0
  239. package/src/common/common.command.ts +1018 -0
  240. package/src/common/common.contribution.ts +343 -0
  241. package/src/common/common.define.ts +55 -0
  242. package/src/common/common.module.ts +33 -0
  243. package/src/common/common.storage.ts +22 -0
  244. package/src/common/container-id.ts +12 -0
  245. package/src/common/index.ts +4 -0
  246. package/src/components/actions/index.tsx +486 -0
  247. package/src/components/actions/placements.ts +47 -0
  248. package/src/components/actions/styles.module.less +144 -0
  249. package/src/components/badge/index.tsx +1 -0
  250. package/src/components/index.ts +22 -0
  251. package/src/components/layout/box-panel.tsx +88 -0
  252. package/src/components/layout/default-layout.tsx +61 -0
  253. package/src/components/layout/index.ts +4 -0
  254. package/src/components/layout/layout.ts +80 -0
  255. package/src/components/layout/split-panel.service.ts +56 -0
  256. package/src/components/layout/split-panel.tsx +315 -0
  257. package/src/components/layout/styles.module.less +21 -0
  258. package/src/components/loading/index.ts +1 -0
  259. package/src/components/loading/loading.less +14 -0
  260. package/src/components/loading/loading.view.tsx +7 -0
  261. package/src/components/loading/media/loading-dark.svg +52 -0
  262. package/src/components/loading/media/loading-hc.svg +52 -0
  263. package/src/components/loading/media/loading.svg +52 -0
  264. package/src/components/popover/styles.module.less +81 -0
  265. package/src/components/portal/index.tsx +13 -0
  266. package/src/components/progressbar/index.tsx +3 -0
  267. package/src/components/resize/resize.module.less +78 -0
  268. package/src/components/resize/resize.tsx +663 -0
  269. package/src/components/select/index.tsx +12 -0
  270. package/src/components/select/styles.less +6 -0
  271. package/src/context-key.ts +48 -0
  272. package/src/contextkey/dialog.ts +3 -0
  273. package/src/contextkey/explorer.ts +26 -0
  274. package/src/contextkey/index.ts +6 -0
  275. package/src/contextkey/outline.ts +4 -0
  276. package/src/contextkey/resource.ts +61 -0
  277. package/src/contextkey/search.ts +30 -0
  278. package/src/contextkey/terminal.ts +7 -0
  279. package/src/contextkey/testing.ts +9 -0
  280. package/src/contextkey/workspace.ts +7 -0
  281. package/src/core-preferences.ts +318 -0
  282. package/src/dom/index.ts +176 -0
  283. package/src/encoding-registry.ts +83 -0
  284. package/src/extensions/extensions-point.service.ts +78 -0
  285. package/src/extensions/index.ts +3 -0
  286. package/src/extensions/schema/browserViews.ts +96 -0
  287. package/src/extensions/schema/menu.ts +245 -0
  288. package/src/extensions/schema/opensumiExtensionPackageSchema.ts +12 -0
  289. package/src/extensions/schema/toolbar.ts +338 -0
  290. package/src/extensions/schema/vscodeExtensionPackageSchema.ts +330 -0
  291. package/src/file-decoration.ts +10 -0
  292. package/src/fs/index.ts +12 -0
  293. package/src/hash-calculate/hash-calculate.contribution.ts +19 -0
  294. package/src/index.ts +42 -0
  295. package/src/keybinding/index.ts +1 -0
  296. package/src/keybinding/keybinding.ts +908 -0
  297. package/src/keyboard/index.ts +3 -0
  298. package/src/keyboard/keyboard-layout-provider.ts +412 -0
  299. package/src/keyboard/keyboard-layout-service.ts +449 -0
  300. package/src/keyboard/keys.ts +748 -0
  301. package/src/keyboard/layouts/_.contribution.ts +24 -0
  302. package/src/keyboard/layouts/cz.win.ts +168 -0
  303. package/src/keyboard/layouts/de-swiss.win.ts +168 -0
  304. package/src/keyboard/layouts/de.darwin.ts +131 -0
  305. package/src/keyboard/layouts/de.linux.ts +186 -0
  306. package/src/keyboard/layouts/de.win.ts +168 -0
  307. package/src/keyboard/layouts/dk.win.ts +168 -0
  308. package/src/keyboard/layouts/dvorak.darwin.ts +131 -0
  309. package/src/keyboard/layouts/en-belgian.win.ts +168 -0
  310. package/src/keyboard/layouts/en-ext.darwin.ts +131 -0
  311. package/src/keyboard/layouts/en-in.win.ts +168 -0
  312. package/src/keyboard/layouts/en-intl.darwin.ts +131 -0
  313. package/src/keyboard/layouts/en-intl.win.ts +168 -0
  314. package/src/keyboard/layouts/en-uk.darwin.ts +131 -0
  315. package/src/keyboard/layouts/en-uk.win.ts +168 -0
  316. package/src/keyboard/layouts/en.darwin.ts +139 -0
  317. package/src/keyboard/layouts/en.linux.ts +186 -0
  318. package/src/keyboard/layouts/en.win.ts +173 -0
  319. package/src/keyboard/layouts/es-latin.win.ts +168 -0
  320. package/src/keyboard/layouts/es.darwin.ts +131 -0
  321. package/src/keyboard/layouts/es.linux.ts +186 -0
  322. package/src/keyboard/layouts/es.win.ts +168 -0
  323. package/src/keyboard/layouts/fr.darwin.ts +131 -0
  324. package/src/keyboard/layouts/fr.linux.ts +186 -0
  325. package/src/keyboard/layouts/fr.win.ts +168 -0
  326. package/src/keyboard/layouts/hu.win.ts +168 -0
  327. package/src/keyboard/layouts/it.darwin.ts +131 -0
  328. package/src/keyboard/layouts/it.win.ts +168 -0
  329. package/src/keyboard/layouts/jp-roman.darwin.ts +131 -0
  330. package/src/keyboard/layouts/jp.darwin.ts +131 -0
  331. package/src/keyboard/layouts/ko.darwin.ts +131 -0
  332. package/src/keyboard/layouts/layout.contribution.darwin.ts +23 -0
  333. package/src/keyboard/layouts/layout.contribution.linux.ts +12 -0
  334. package/src/keyboard/layouts/layout.contribution.ts +9 -0
  335. package/src/keyboard/layouts/layout.contribution.win.ts +29 -0
  336. package/src/keyboard/layouts/no.win.ts +168 -0
  337. package/src/keyboard/layouts/pl.darwin.ts +131 -0
  338. package/src/keyboard/layouts/pl.win.ts +168 -0
  339. package/src/keyboard/layouts/pt-br.win.ts +169 -0
  340. package/src/keyboard/layouts/pt.darwin.ts +131 -0
  341. package/src/keyboard/layouts/pt.win.ts +168 -0
  342. package/src/keyboard/layouts/ru.darwin.ts +131 -0
  343. package/src/keyboard/layouts/ru.linux.ts +186 -0
  344. package/src/keyboard/layouts/ru.win.ts +168 -0
  345. package/src/keyboard/layouts/sv.darwin.ts +131 -0
  346. package/src/keyboard/layouts/sv.win.ts +168 -0
  347. package/src/keyboard/layouts/thai.win.ts +168 -0
  348. package/src/keyboard/layouts/tr.win.ts +168 -0
  349. package/src/keyboard/layouts/zh-hans.darwin.ts +131 -0
  350. package/src/layout/accordion/tab-bar-toolbar.tsx +59 -0
  351. package/src/layout/accordion/view-context-key.registry.ts +34 -0
  352. package/src/layout/constants.ts +7 -0
  353. package/src/layout/index.ts +5 -0
  354. package/src/layout/layout-hooks.ts +70 -0
  355. package/src/layout/layout-state.ts +107 -0
  356. package/src/layout/layout.interface.ts +101 -0
  357. package/src/layout/layout.ts +80 -0
  358. package/src/layout/view-id.ts +18 -0
  359. package/src/logger/browser-logger.ts +51 -0
  360. package/src/logger/index.ts +1 -0
  361. package/src/markdown/index.tsx +30 -0
  362. package/src/menu/next/base.ts +513 -0
  363. package/src/menu/next/ctxmenu-service.ts +188 -0
  364. package/src/menu/next/index.ts +10 -0
  365. package/src/menu/next/menu-id.ts +86 -0
  366. package/src/menu/next/menu-service.ts +252 -0
  367. package/src/menu/next/menu-util.ts +77 -0
  368. package/src/menu/next/menu.contrib.interface.ts +79 -0
  369. package/src/menu/next/menu.interface.ts +253 -0
  370. package/src/menu/next/menubar-service.ts +211 -0
  371. package/src/menu/next/renderer/ctxmenu/base.ts +18 -0
  372. package/src/menu/next/renderer/ctxmenu/browser.ts +45 -0
  373. package/src/menu/next/renderer/ctxmenu/electron.ts +207 -0
  374. package/src/menu/next/toolbar-action.service.ts +132 -0
  375. package/src/monaco/index.ts +136 -0
  376. package/src/monaco/merge-editor-widget.ts +159 -0
  377. package/src/opener/command-opener.ts +42 -0
  378. package/src/opener/default-opener.ts +31 -0
  379. package/src/opener/http-opener.ts +25 -0
  380. package/src/opener/index.ts +19 -0
  381. package/src/opener/opener.contribution.ts +57 -0
  382. package/src/opener/opener.service.ts +66 -0
  383. package/src/preferences/early-preferences.ts +117 -0
  384. package/src/preferences/index.ts +9 -0
  385. package/src/preferences/preference-configurations.ts +77 -0
  386. package/src/preferences/preference-contribution.ts +397 -0
  387. package/src/preferences/preference-provider.ts +414 -0
  388. package/src/preferences/preference-proxy.ts +291 -0
  389. package/src/preferences/preference-scope.ts +3 -0
  390. package/src/preferences/preference-service.ts +621 -0
  391. package/src/preferences/settings.ts +90 -0
  392. package/src/preferences/types.ts +119 -0
  393. package/src/progress/index.ts +58 -0
  394. package/src/progress/progress-bar.tsx +34 -0
  395. package/src/progress/progress-indicator.ts +90 -0
  396. package/src/progress/progress.module.less +46 -0
  397. package/src/progress/progress.service.tsx +429 -0
  398. package/src/quick-open/index.ts +655 -0
  399. package/src/quick-open/recent-files.ts +68 -0
  400. package/src/raw-context-key.ts +116 -0
  401. package/src/react-hooks/event.tsx +80 -0
  402. package/src/react-hooks/hot-key.tsx +58 -0
  403. package/src/react-hooks/index.ts +3 -0
  404. package/src/react-hooks/injectable-hooks.tsx +35 -0
  405. package/src/react-hooks/portal-hooks.tsx +38 -0
  406. package/src/react-hooks/useThrottleFn/index.ts +34 -0
  407. package/src/react-providers/config-provider.tsx +269 -0
  408. package/src/react-providers/index.tsx +2 -0
  409. package/src/react-providers/slot.module.less +19 -0
  410. package/src/react-providers/slot.tsx +242 -0
  411. package/src/services/clipboard.service.ts +92 -0
  412. package/src/services/credentials-service.ts +91 -0
  413. package/src/services/crypto-service.ts +23 -0
  414. package/src/services/external-uri.service.ts +68 -0
  415. package/src/services/index.ts +7 -0
  416. package/src/services/label-service.ts +386 -0
  417. package/src/services/status-bar-service.ts +108 -0
  418. package/src/services/storage-service.ts +201 -0
  419. package/src/style/codicons/README.md +22 -0
  420. package/src/style/codicons/codicon-animations.css +15 -0
  421. package/src/style/codicons/generator.js +15 -0
  422. package/src/style/entry.less +25 -0
  423. package/src/style/icon/fileicons/file-default.svg +1 -0
  424. package/src/style/icon/fileicons/folder-default.svg +1 -0
  425. package/src/style/icon/fileicons.less +20 -0
  426. package/src/style/icon/icon.ts +547 -0
  427. package/src/style/icon/ide-iconfont.ts +13 -0
  428. package/src/style/icon/index.less +67 -0
  429. package/src/style/icon/seti.woff +0 -0
  430. package/src/style/icon/symbol-icons/boolean-dark.svg +3 -0
  431. package/src/style/icon/symbol-icons/boolean-light.svg +3 -0
  432. package/src/style/icon/symbol-icons/class-dark.svg +3 -0
  433. package/src/style/icon/symbol-icons/class-light.svg +3 -0
  434. package/src/style/icon/symbol-icons/constant-dark.svg +4 -0
  435. package/src/style/icon/symbol-icons/constant-light.svg +4 -0
  436. package/src/style/icon/symbol-icons/enumerator-dark.svg +3 -0
  437. package/src/style/icon/symbol-icons/enumerator-item-dark.svg +3 -0
  438. package/src/style/icon/symbol-icons/enumerator-item-light.svg +3 -0
  439. package/src/style/icon/symbol-icons/enumerator-light.svg +3 -0
  440. package/src/style/icon/symbol-icons/event-dark.svg +3 -0
  441. package/src/style/icon/symbol-icons/event-light.svg +3 -0
  442. package/src/style/icon/symbol-icons/field-dark.svg +3 -0
  443. package/src/style/icon/symbol-icons/field-light.svg +3 -0
  444. package/src/style/icon/symbol-icons/file-dark.svg +3 -0
  445. package/src/style/icon/symbol-icons/file-light.svg +3 -0
  446. package/src/style/icon/symbol-icons/indexer-dark.svg +3 -0
  447. package/src/style/icon/symbol-icons/indexer-light.svg +3 -0
  448. package/src/style/icon/symbol-icons/interface-dark.svg +3 -0
  449. package/src/style/icon/symbol-icons/interface-light.svg +3 -0
  450. package/src/style/icon/symbol-icons/keyword-dark.svg +3 -0
  451. package/src/style/icon/symbol-icons/keyword-light.svg +3 -0
  452. package/src/style/icon/symbol-icons/method-dark.svg +3 -0
  453. package/src/style/icon/symbol-icons/method-light.svg +3 -0
  454. package/src/style/icon/symbol-icons/namespace-dark.svg +3 -0
  455. package/src/style/icon/symbol-icons/namespace-light.svg +3 -0
  456. package/src/style/icon/symbol-icons/numeric-dark.svg +3 -0
  457. package/src/style/icon/symbol-icons/numeric-light.svg +3 -0
  458. package/src/style/icon/symbol-icons/operator-dark.svg +3 -0
  459. package/src/style/icon/symbol-icons/operator-light.svg +3 -0
  460. package/src/style/icon/symbol-icons/property-dark.svg +3 -0
  461. package/src/style/icon/symbol-icons/property-light.svg +3 -0
  462. package/src/style/icon/symbol-icons/snippet-dark.svg +3 -0
  463. package/src/style/icon/symbol-icons/snippet-light.svg +3 -0
  464. package/src/style/icon/symbol-icons/string-dark.svg +3 -0
  465. package/src/style/icon/symbol-icons/string-light.svg +3 -0
  466. package/src/style/icon/symbol-icons/structure-dark.svg +3 -0
  467. package/src/style/icon/symbol-icons/structure-light.svg +3 -0
  468. package/src/style/icon/symbol-icons/symbol-icons.css +284 -0
  469. package/src/style/icon/symbol-icons/template-dark.svg +3 -0
  470. package/src/style/icon/symbol-icons/template-light.svg +3 -0
  471. package/src/style/icon/symbol-icons/variable-dark.svg +3 -0
  472. package/src/style/icon/symbol-icons/variable-light.svg +3 -0
  473. package/src/style/icon.less +8 -0
  474. package/src/style/index.less +14 -0
  475. package/src/style/monaco-override.less +116 -0
  476. package/src/style/normalize.less +92 -0
  477. package/src/style/octicons/octicons-cdn.css +720 -0
  478. package/src/style/octicons/octicons.css +714 -0
  479. package/src/style/octicons/octicons.html +1882 -0
  480. package/src/style/octicons/octicons.svg +582 -0
  481. package/src/style/octicons/octicons.ttf +0 -0
  482. package/src/style/override.less +97 -0
  483. package/src/style/toolbar.less +199 -0
  484. package/src/style/utilities.less +8 -0
  485. package/src/style/variable.less +8 -0
  486. package/src/terminal/index.ts +7 -0
  487. package/src/toolbar/components/auto-complete.tsx +0 -0
  488. package/src/toolbar/components/button.tsx +440 -0
  489. package/src/toolbar/components/index.ts +2 -0
  490. package/src/toolbar/components/select.tsx +189 -0
  491. package/src/toolbar/index.ts +3 -0
  492. package/src/toolbar/toolbar.popover.registry.ts +32 -0
  493. package/src/toolbar/toolbar.registry.ts +352 -0
  494. package/src/toolbar/toolbar.tsx +710 -0
  495. package/src/toolbar/types.ts +383 -0
  496. package/src/utils/create-overlay.tsx +53 -0
  497. package/src/utils/electron.ts +92 -0
  498. package/src/utils/env.ts +26 -0
  499. package/src/utils/icon.ts +13 -0
  500. package/src/utils/index.ts +7 -0
  501. package/src/utils/json.ts +251 -0
  502. package/src/utils/label.tsx +36 -0
  503. package/src/utils/parse.ts +82 -0
  504. package/src/utils/react-hooks.ts +118 -0
  505. package/src/variable/index.ts +1 -0
  506. package/src/variable/variable.ts +84 -0
  507. package/src/window/index.ts +34 -0
  508. package/src/window/window.service.ts +100 -0
  509. package/lib/components/progressbar/styles.module.less +0 -31
  510. package/lib/components/recycle-tree/index.d.ts +0 -2
  511. package/lib/components/recycle-tree/index.d.ts.map +0 -1
  512. package/lib/components/recycle-tree/index.js +0 -5
  513. package/lib/components/recycle-tree/index.js.map +0 -1
  514. package/lib/components/recycle-tree/recycle-tree.view.d.ts +0 -82
  515. package/lib/components/recycle-tree/recycle-tree.view.d.ts.map +0 -1
  516. package/lib/components/recycle-tree/recycle-tree.view.js +0 -188
  517. package/lib/components/recycle-tree/recycle-tree.view.js.map +0 -1
  518. package/lib/components/scroll/index.d.ts +0 -68
  519. package/lib/components/scroll/index.d.ts.map +0 -1
  520. package/lib/components/scroll/index.js +0 -279
  521. package/lib/components/scroll/index.js.map +0 -1
  522. package/lib/components/scroll/scroll.module.less +0 -108
  523. package/lib/components/scrollbar/index.d.ts +0 -2
  524. package/lib/components/scrollbar/index.d.ts.map +0 -1
  525. package/lib/components/scrollbar/index.js +0 -5
  526. package/lib/components/scrollbar/index.js.map +0 -1
  527. package/lib/components/scrollbar/scrollbar.less +0 -36
  528. package/lib/components/scrollbar/scrollbar.view.d.ts +0 -7
  529. package/lib/components/scrollbar/scrollbar.view.d.ts.map +0 -1
  530. package/lib/components/scrollbar/scrollbar.view.js +0 -11
  531. package/lib/components/scrollbar/scrollbar.view.js.map +0 -1
  532. package/lib/components/tree/index.d.ts +0 -4
  533. package/lib/components/tree/index.d.ts.map +0 -1
  534. package/lib/components/tree/index.js +0 -7
  535. package/lib/components/tree/index.js.map +0 -1
  536. package/lib/components/tree/tree-node.view.d.ts +0 -26
  537. package/lib/components/tree/tree-node.view.d.ts.map +0 -1
  538. package/lib/components/tree/tree-node.view.js +0 -350
  539. package/lib/components/tree/tree-node.view.js.map +0 -1
  540. package/lib/components/tree/tree.module.less +0 -296
  541. package/lib/components/tree/tree.view.d.ts +0 -132
  542. package/lib/components/tree/tree.view.d.ts.map +0 -1
  543. package/lib/components/tree/tree.view.js +0 -238
  544. package/lib/components/tree/tree.view.js.map +0 -1
  545. package/lib/tree/index.d.ts +0 -4
  546. package/lib/tree/index.d.ts.map +0 -1
  547. package/lib/tree/index.js +0 -7
  548. package/lib/tree/index.js.map +0 -1
  549. package/lib/tree/tree-expansion.d.ts +0 -16
  550. package/lib/tree/tree-expansion.d.ts.map +0 -1
  551. package/lib/tree/tree-expansion.js +0 -20
  552. package/lib/tree/tree-expansion.js.map +0 -1
  553. package/lib/tree/tree-selection.d.ts +0 -48
  554. package/lib/tree/tree-selection.d.ts.map +0 -1
  555. package/lib/tree/tree-selection.js +0 -64
  556. package/lib/tree/tree-selection.js.map +0 -1
  557. package/lib/tree/tree.d.ts +0 -195
  558. package/lib/tree/tree.d.ts.map +0 -1
  559. package/lib/tree/tree.js +0 -108
  560. package/lib/tree/tree.js.map +0 -1
@@ -0,0 +1,908 @@
1
+ import { Injectable, Autowired } from '@opensumi/di';
2
+ import {
3
+ ILogger,
4
+ isOSX,
5
+ Emitter,
6
+ Event,
7
+ CommandRegistry,
8
+ ContributionProvider,
9
+ IDisposable,
10
+ Disposable,
11
+ formatLocalize,
12
+ CommandService,
13
+ isUndefined,
14
+ } from '@opensumi/ide-core-common';
15
+ import { ContextKeyExpression } from '@opensumi/monaco-editor-core/esm/vs/platform/contextkey/common/contextkey';
16
+
17
+ import { IContextKeyService } from '../context-key';
18
+ import { KeyboardLayoutService } from '../keyboard/keyboard-layout-service';
19
+ import { KeyCode, KeySequence, Key, SpecialCases } from '../keyboard/keys';
20
+ import { StatusBarAlignment, IStatusBarService } from '../services';
21
+
22
+ export enum KeybindingScope {
23
+ DEFAULT,
24
+ USER,
25
+ WORKSPACE,
26
+ END,
27
+ }
28
+
29
+ // ref: https://github.com/Microsoft/vscode/blob/97fc588e65bedcb1113baeddd2f67237e52c8c63/src/vs/platform/keybinding/common/keybindingsRegistry.ts#L56
30
+ // 快捷键第一优先级,在开天中将对该值 * 100 作为快捷键的优先级参数 priority
31
+ export enum KeybindingWeight {
32
+ Default = 0, // 不传入 priority 则默认为 0
33
+ EditorCore = 1,
34
+ EditorContrib = 100,
35
+ WorkbenchContrib = 200,
36
+ BuiltinExtension = 300,
37
+ ExternalExtension = 400,
38
+ }
39
+
40
+ export namespace KeybindingScope {
41
+ export const length = KeybindingScope.END - KeybindingScope.DEFAULT;
42
+ }
43
+
44
+ export namespace Keybinding {
45
+ /**
46
+ * 返回带有绑定的字符串表达式
47
+ * 仅序列化关键的快捷键及command
48
+ * 在快捷时被使用
49
+ *
50
+ * @param binding 按键绑定的字符串表达式.
51
+ */
52
+ export function stringify(binding: Keybinding): string {
53
+ const copy: Keybinding = {
54
+ command: binding.command,
55
+ keybinding: binding.keybinding,
56
+ };
57
+ return JSON.stringify(copy);
58
+ }
59
+
60
+ // 判断一个对象是否为Keybinding对象
61
+ export function is(arg: Keybinding | any): arg is Keybinding {
62
+ return !!arg && arg === Object(arg) && 'command' in arg && 'keybinding' in arg;
63
+ }
64
+ }
65
+
66
+ export namespace KeybindingsResultCollection {
67
+ export class KeybindingsResult {
68
+ public full: Keybinding[] = [];
69
+ public partial: Keybinding[] = [];
70
+ public shadow: Keybinding[] = [];
71
+
72
+ /**
73
+ * 合并KeybindingsResult至this
74
+ *
75
+ * @param other
76
+ * @return this
77
+ */
78
+ public merge(other: KeybindingsResult): KeybindingsResult {
79
+ this.full.push(...other.full);
80
+ this.partial.push(...other.partial);
81
+ this.shadow.push(...other.shadow);
82
+ return this;
83
+ }
84
+
85
+ /**
86
+ * 返回一个新的过滤后的 KeybindingsResult
87
+ *
88
+ * @param fn 过滤函数
89
+ * @return KeybindingsResult
90
+ */
91
+ public filter(fn: (binding: Keybinding) => boolean): KeybindingsResult {
92
+ const result = new KeybindingsResult();
93
+ result.full = this.full.filter(fn);
94
+ result.partial = this.partial.filter(fn);
95
+ result.shadow = this.shadow.filter(fn);
96
+ return result;
97
+ }
98
+ }
99
+ }
100
+
101
+ export interface Keybinding {
102
+ // 命令ID
103
+ command: string;
104
+
105
+ // 快捷键字符串
106
+ keybinding: string;
107
+
108
+ /**
109
+ * https://code.visualstudio.com/docs/getstarted/keybindings#_when-clause-contexts
110
+ */
111
+ when?: string | ContextKeyExpression;
112
+
113
+ // Command执行参数
114
+ args?: any;
115
+
116
+ // 快捷键匹配的优先级
117
+ priority?: number;
118
+ }
119
+
120
+ export interface ResolvedKeybinding extends Keybinding {
121
+ /**
122
+ * KeyboardLayoutService会根据用户的键盘布局来转换keybinding得到最终在UI中使用的值
123
+ * 如果尚未调用KeyboardLayoutService来解析键绑定,则该值为unfedined。
124
+ */
125
+ resolved?: KeySequence;
126
+ }
127
+
128
+ export interface ScopedKeybinding extends ResolvedKeybinding {
129
+ scope?: KeybindingScope;
130
+ }
131
+
132
+ export const KeybindingContribution = Symbol('KeybindingContribution');
133
+
134
+ export interface KeybindingContribution {
135
+ registerKeybindings(keybindings: KeybindingRegistry): void;
136
+ }
137
+
138
+ export const KeybindingRegistry = Symbol('KeybindingRegistry');
139
+ export interface KeybindingRegistry {
140
+ initialize(): Promise<any>;
141
+ registerKeybinding(binding: Keybinding, scope?: KeybindingScope): IDisposable;
142
+ registerKeybindings(bindings: Keybinding[], scope?: KeybindingScope): IDisposable;
143
+ unregisterKeybinding(keyOrBinding: Keybinding | string, scope?: KeybindingScope): void;
144
+ resolveKeybinding(binding: ResolvedKeybinding): KeyCode[];
145
+ containsKeybinding(bindings: Keybinding[], binding: Keybinding): boolean;
146
+ containsKeybindingInScope(binding: Keybinding, scope?: KeybindingScope): boolean;
147
+ validateKeybinding(bindings: Keybinding[], binding: Keybinding): string;
148
+ validateKeybindingInScope(binding: Keybinding, scope?: KeybindingScope): string;
149
+ acceleratorFor(keybinding: Keybinding, separator: string): string[];
150
+ acceleratorForSequence(keySequence: KeySequence, separator: string): string[];
151
+ acceleratorForKeyCode(keyCode: KeyCode, separator: string): string;
152
+ acceleratorForKey(key: Key): string;
153
+ acceleratorForKeyString(keyString: string, separator?: string): string;
154
+ getKeybindingsForKeySequence(
155
+ keySequence: KeySequence,
156
+ event?: KeyboardEvent,
157
+ ): KeybindingsResultCollection.KeybindingsResult;
158
+ getKeybindingsForCommand(commandId: string): ScopedKeybinding[];
159
+ getScopedKeybindingsForCommand(scope: KeybindingScope, commandId: string): Keybinding[];
160
+ isEnabled(binding: Keybinding, event: KeyboardEvent): boolean;
161
+ isPseudoCommand(commandId: string): boolean;
162
+ resetKeybindings(): void;
163
+ onKeybindingsChanged: Event<{ affectsCommands: string[] }>;
164
+ }
165
+
166
+ export const keybindingServicePath = '/services/keybindings';
167
+ export const KeybindingService = Symbol('KeybindingService');
168
+
169
+ export interface KeybindingService {
170
+ /**
171
+ * 根据传入的键盘事件执行对应的 Command
172
+ */
173
+ run(event: KeyboardEvent): void;
174
+ /**
175
+ * 根据传入的键盘事件处理对应的快捷键修饰符
176
+ */
177
+ resolveModifierKey(event: KeyboardEvent): void;
178
+ /**
179
+ * 根据传入的键盘事件返回对应的快捷键文本
180
+ */
181
+ convert(event: KeyboardEvent, separator?: string): string;
182
+
183
+ /**
184
+ * 清空键盘事件队列
185
+ */
186
+ clearConvert(): void;
187
+ /**
188
+ * 转化monaco传入的when为可识别的字符串
189
+ * @param when
190
+ */
191
+ convertMonacoWhen(when: any): string;
192
+ }
193
+
194
+ @Injectable()
195
+ export class KeybindingRegistryImpl implements KeybindingRegistry, KeybindingService {
196
+ // 该伪命令用于让事件冒泡,使事件不被Keybinding消费掉
197
+ public static readonly PASSTHROUGH_PSEUDO_COMMAND = 'passthrough';
198
+ protected readonly keymaps: Keybinding[][] = [...Array(KeybindingScope.length)].map(() => []);
199
+
200
+ protected keySequence: KeySequence = [];
201
+ private keySequenceTimer;
202
+
203
+ protected convertKeySequence: KeySequence = [];
204
+
205
+ protected modifierKeySequence: KeySequence = [];
206
+ private modifierKeySequenceTimer;
207
+
208
+ public static KEYSEQUENCE_TIMEOUT = 5000;
209
+ public static MODIFIER_KEYSEQUENCE_TIMEOUT = 300;
210
+
211
+ @Autowired(KeyboardLayoutService)
212
+ protected readonly keyboardLayoutService: KeyboardLayoutService;
213
+
214
+ @Autowired(KeybindingContribution)
215
+ private readonly keybindingContributionProvider: ContributionProvider<KeybindingContribution>;
216
+
217
+ @Autowired(CommandRegistry)
218
+ protected readonly commandRegistry: CommandRegistry;
219
+
220
+ @Autowired(CommandService)
221
+ protected readonly commandService: CommandService;
222
+
223
+ @Autowired(ILogger)
224
+ protected readonly logger: ILogger;
225
+
226
+ @Autowired(IContextKeyService)
227
+ protected readonly whenContextService: IContextKeyService;
228
+
229
+ @Autowired(IStatusBarService)
230
+ protected readonly statusBar: IStatusBarService;
231
+
232
+ public async initialize(): Promise<void> {
233
+ await this.keyboardLayoutService.initialize();
234
+ this.keyboardLayoutService.onKeyboardLayoutChanged(() => {
235
+ this.clearResolvedKeybindings();
236
+ });
237
+ // 从模块中获取的KeybindingContribution
238
+ for (const contribution of this.keybindingContributionProvider.getContributions()) {
239
+ contribution.registerKeybindings(this);
240
+ }
241
+ }
242
+
243
+ protected keybindingsChanged = new Emitter<{ affectsCommands: string[] }>();
244
+
245
+ /**
246
+ * 由于不同的键盘布局发生更改时触发的事件。
247
+ */
248
+ get onKeybindingsChanged() {
249
+ return this.keybindingsChanged.event;
250
+ }
251
+
252
+ /**
253
+ * 注册默认 Keybinding, 支持指定作用域
254
+ * @param binding
255
+ */
256
+ public registerKeybinding(binding: Keybinding, scope: KeybindingScope = KeybindingScope.DEFAULT): IDisposable {
257
+ return this.doRegisterKeybinding(binding, scope);
258
+ }
259
+
260
+ /**
261
+ * 注册默认 Keybindings, 支持指定作用域
262
+ * @param bindings
263
+ */
264
+ public registerKeybindings(bindings: Keybinding[], scope: KeybindingScope = KeybindingScope.DEFAULT): IDisposable {
265
+ return this.doRegisterKeybindings(bindings, scope);
266
+ }
267
+
268
+ /**
269
+ * 用于转换monaco内置的RawContextKey
270
+ * @param when
271
+ */
272
+ public convertMonacoWhen(when: string | ContextKeyExpression | undefined) {
273
+ if (!when) {
274
+ return '';
275
+ }
276
+ if (typeof when === 'string') {
277
+ return when;
278
+ }
279
+ return when.serialize();
280
+ }
281
+
282
+ /**
283
+ * 注销 Keybinding
284
+ * @param binding
285
+ */
286
+ public unregisterKeybinding(binding: Keybinding, scope?: KeybindingScope): void;
287
+ // eslint-disable-next-line @typescript-eslint/unified-signatures
288
+ public unregisterKeybinding(key: string, scope?: KeybindingScope): void;
289
+ public unregisterKeybinding(
290
+ keyOrBinding: Keybinding | string,
291
+ scope: KeybindingScope = KeybindingScope.DEFAULT,
292
+ ): void {
293
+ const key = Keybinding.is(keyOrBinding) ? keyOrBinding.keybinding : keyOrBinding;
294
+ const keymap = this.keymaps[scope];
295
+ let bindings;
296
+ // 当传入的keybinding存在when条件时,严格匹配
297
+ if (Keybinding.is(keyOrBinding) && !!keyOrBinding.when) {
298
+ bindings = keymap.filter(
299
+ (el) =>
300
+ this.isKeybindingEqual(el.keybinding, keyOrBinding.keybinding) &&
301
+ this.isKeybindingWhenEqual(el.when, keyOrBinding.when),
302
+ );
303
+ } else {
304
+ bindings = keymap.filter((el) => this.isKeybindingEqual(el.keybinding, key));
305
+ }
306
+ bindings.forEach((binding) => {
307
+ const idx = keymap.indexOf(binding);
308
+ if (idx >= 0) {
309
+ keymap.splice(idx, 1);
310
+ }
311
+ });
312
+ }
313
+
314
+ // 判断两个when是否相等
315
+ private isKeybindingWhenEqual(when1?: string | ContextKeyExpression, when2?: string | ContextKeyExpression) {
316
+ return this.convertMonacoWhen(when1) === this.convertMonacoWhen(when2);
317
+ }
318
+
319
+ // 判断两个快捷键是否相等
320
+ // 如 ⌘ 默认等价于 cmd, ctrlcmd
321
+ private isKeybindingEqual(preKeybinding: string, nextKeybinding: string) {
322
+ return this.acceleratorForSequenceKeyString(preKeybinding) === this.acceleratorForSequenceKeyString(nextKeybinding);
323
+ }
324
+
325
+ // 解析快捷键字符串为统一的结果
326
+ private acceleratorForSequenceKeyString(key: string) {
327
+ const keyCodeStrings = key.split(' ');
328
+ const keySequence: KeySequence = keyCodeStrings.map((key) => KeyCode.parse(key));
329
+ return this.acceleratorForSequence(keySequence, '+').join(' ');
330
+ }
331
+
332
+ /**
333
+ * 执行注册多个Keybinding
334
+ * @param bindings
335
+ * @param scope
336
+ */
337
+ protected doRegisterKeybindings(bindings: Keybinding[], scope: KeybindingScope = KeybindingScope.DEFAULT) {
338
+ const toDispose = new Disposable();
339
+ for (const binding of bindings) {
340
+ toDispose.addDispose(this.doRegisterKeybinding(binding, scope));
341
+ }
342
+ return toDispose;
343
+ }
344
+
345
+ /**
346
+ * 执行注册单个Keybinding
347
+ * @param binding
348
+ * @param scope
349
+ */
350
+ protected doRegisterKeybinding(binding: Keybinding, scope: KeybindingScope = KeybindingScope.DEFAULT): IDisposable {
351
+ try {
352
+ this.resolveKeybinding(binding, true);
353
+ this.keymaps[scope].unshift(binding);
354
+ } catch (error) {
355
+ this.logger.warn(`Could not register keybinding:\n ${Keybinding.stringify(binding)}\n${error}`);
356
+ }
357
+
358
+ this.keybindingsChanged.fire({ affectsCommands: [binding.command] });
359
+
360
+ return {
361
+ dispose: () => {
362
+ this.unregisterKeybinding(binding, scope);
363
+ },
364
+ };
365
+ }
366
+
367
+ /**
368
+ * 通过调用KeyboardLayoutService来设置给定的ResolvedKeybinding中的`resolved`属性。
369
+ * @param binding
370
+ */
371
+ public resolveKeybinding(binding: ResolvedKeybinding, disableCache?: boolean): KeyCode[] {
372
+ if (!binding.resolved || disableCache) {
373
+ const sequence = KeySequence.parse(binding.keybinding);
374
+ binding.resolved = sequence.map((code) => this.keyboardLayoutService.resolveKeyCode(code));
375
+ }
376
+ return binding.resolved;
377
+ }
378
+
379
+ /**
380
+ * 清除已注册的Keybinding中所有`resolved`属性,以便调用KeyboardLayoutService再次为他们赋值
381
+ * 当用户的键盘布局发生变化时,执行该方法
382
+ */
383
+ protected clearResolvedKeybindings(): void {
384
+ for (let i = KeybindingScope.DEFAULT; i < KeybindingScope.END; i++) {
385
+ const bindings = this.keymaps[i];
386
+ for (const binding of bindings) {
387
+ const bd: ResolvedKeybinding = binding;
388
+ bd.resolved = undefined;
389
+ }
390
+ }
391
+ }
392
+
393
+ /**
394
+ * 检查Keybindings列表中的keySequence冲突
395
+ * @param bindings
396
+ * @param binding
397
+ */
398
+ public containsKeybinding(bindings: Keybinding[], binding: Keybinding): boolean {
399
+ const bindingKeySequence = this.resolveKeybinding(binding);
400
+ const collisions = this.getKeySequenceCollisions(bindings, bindingKeySequence).filter(
401
+ (b) => b.when === binding.when,
402
+ );
403
+
404
+ if (collisions.full.length > 0) {
405
+ this.logger.warn(
406
+ 'Collided keybinding is ignored; ',
407
+ Keybinding.stringify(binding),
408
+ ' collided with ',
409
+ collisions.full.map((b) => Keybinding.stringify(b)).join(', '),
410
+ );
411
+ return true;
412
+ }
413
+ if (collisions.partial.length > 0) {
414
+ this.logger.warn(
415
+ 'Shadowing keybinding is ignored; ',
416
+ Keybinding.stringify(binding),
417
+ ' shadows ',
418
+ collisions.partial.map((b) => Keybinding.stringify(b)).join(', '),
419
+ );
420
+ return true;
421
+ }
422
+ if (collisions.shadow.length > 0) {
423
+ this.logger.warn(
424
+ 'Shadowed keybinding is ignored; ',
425
+ Keybinding.stringify(binding),
426
+ ' would be shadowed by ',
427
+ collisions.shadow.map((b) => Keybinding.stringify(b)).join(', '),
428
+ );
429
+ return true;
430
+ }
431
+ return false;
432
+ }
433
+
434
+ /**
435
+ * 检查Keybindings列表中的keySequence冲突
436
+ * 直接返回错误信息,无错误则返回空字符串
437
+ * @param bindings
438
+ * @param binding
439
+ */
440
+ public validateKeybinding(bindings: Keybinding[], binding: Keybinding): string {
441
+ const bindingKeySequence = this.resolveKeybinding(binding);
442
+ const collisions = this.getKeySequenceCollisions(bindings, bindingKeySequence).filter(
443
+ (b) => b.when === binding.when,
444
+ );
445
+
446
+ if (collisions.full.length > 0) {
447
+ const collision = collisions.full[0];
448
+ const command = this.commandRegistry.getCommand(collision.command);
449
+ return formatLocalize(
450
+ 'keymaps.keybinding.full.collide',
451
+ `${command ? command?.label || command.id : collision.command}${
452
+ collision.when ? `{${collision.when}}` : collision.when
453
+ }`,
454
+ );
455
+ }
456
+ if (collisions.partial.length > 0) {
457
+ const collision = collisions.partial[0];
458
+ const command = this.commandRegistry.getCommand(collision.command);
459
+ return formatLocalize(
460
+ 'keymaps.keybinding.partial.collide',
461
+ `${command ? command?.label || command.id : collision.command}${
462
+ collision.when ? `{${collision.when}}` : collision.when
463
+ }`,
464
+ );
465
+ }
466
+ if (collisions.shadow.length > 0) {
467
+ const collision = collisions.shadow[0];
468
+ const command = this.commandRegistry.getCommand(collision.command);
469
+ return formatLocalize(
470
+ 'keymaps.keybinding.shadow.collide',
471
+ `${command ? command?.label || command.id : collision.command}${
472
+ collision.when ? `{${collision.when}}` : collision.when
473
+ }`,
474
+ );
475
+ }
476
+ return '';
477
+ }
478
+
479
+ /**
480
+ * 检查在特定Scope下是否包含该Keybinding
481
+ *
482
+ * @param binding
483
+ * @param scope
484
+ */
485
+ public containsKeybindingInScope(binding: Keybinding, scope: KeybindingScope = KeybindingScope.USER): boolean {
486
+ return this.containsKeybinding(this.keymaps[scope], binding);
487
+ }
488
+
489
+ /**
490
+ * 检查在特定Scope下是否包含该Keybinding
491
+ * 返回冲突信息
492
+ * 无冲突返回空字符串
493
+ * @param binding
494
+ * @param scope
495
+ */
496
+ public validateKeybindingInScope(binding: Keybinding, scope: KeybindingScope = KeybindingScope.USER): string {
497
+ return this.validateKeybinding(this.keymaps[scope], binding);
498
+ }
499
+
500
+ /**
501
+ * 返回用户可见的Keybinding数据
502
+ * @param keybinding
503
+ * @param separator
504
+ */
505
+ public acceleratorFor(keybinding: Keybinding, separator = ' '): string[] {
506
+ const bindingKeySequence = this.resolveKeybinding(keybinding);
507
+ return this.acceleratorForSequence(bindingKeySequence, separator);
508
+ }
509
+
510
+ /**
511
+ * 从KeySequence中返回用户可见的Keybinding
512
+ * @param keySequence
513
+ * @param separator
514
+ */
515
+ public acceleratorForSequence(keySequence: KeySequence, separator = ' '): string[] {
516
+ return keySequence.map((keyCode) => this.acceleratorForKeyCode(keyCode, separator));
517
+ }
518
+
519
+ public acceleratorForKeyString(keyString: string, separator = ' '): string {
520
+ const keyCode = KeyCode.parse(keyString);
521
+ return this.acceleratorForKeyCode(keyCode, separator);
522
+ }
523
+
524
+ /**
525
+ * 将字符串转化为首字母大写
526
+ * @param str 字符串
527
+ */
528
+ private capitalizeFirstLetter(str: string) {
529
+ return str.replace(/^\S/, function (s) {
530
+ return s.toUpperCase();
531
+ });
532
+ }
533
+
534
+ /**
535
+ * 返回用户可读的组合按键指令文本 (带修饰符)
536
+ * @param keyCode
537
+ * @param separator
538
+ */
539
+ public acceleratorForKeyCode(keyCode: KeyCode, separator = ' '): string {
540
+ const keyCodeResult: string[] = [];
541
+ if (keyCode.ctrl) {
542
+ keyCodeResult.push(this.capitalizeFirstLetter(SpecialCases.CTRL));
543
+ }
544
+ if (keyCode.alt) {
545
+ keyCodeResult.push(this.capitalizeFirstLetter(SpecialCases.ALT));
546
+ }
547
+ if (keyCode.shift) {
548
+ keyCodeResult.push(this.capitalizeFirstLetter(SpecialCases.SHIFT));
549
+ }
550
+ if (keyCode.meta) {
551
+ if (isOSX) {
552
+ keyCodeResult.push(SpecialCases.MACMETA);
553
+ } else {
554
+ keyCodeResult.push(this.capitalizeFirstLetter(SpecialCases.META));
555
+ }
556
+ }
557
+ if (keyCode.key) {
558
+ keyCodeResult.push(this.acceleratorForKey(keyCode.key));
559
+ }
560
+ return keyCodeResult.join(separator);
561
+ }
562
+
563
+ /**
564
+ * 根据Key返回可读文本
565
+ * @param key
566
+ */
567
+ public acceleratorForKey(key: Key): string {
568
+ if (isOSX) {
569
+ if (key === Key.ARROW_LEFT) {
570
+ return SpecialCases.ARROW_LEFT;
571
+ }
572
+ if (key === Key.ARROW_RIGHT) {
573
+ return SpecialCases.ARROW_RIGHT;
574
+ }
575
+ if (key === Key.ARROW_UP) {
576
+ return SpecialCases.ARROW_UP;
577
+ }
578
+ if (key === Key.ARROW_DOWN) {
579
+ return SpecialCases.ARROW_DOWN;
580
+ }
581
+ if (key === Key.BACKSPACE) {
582
+ return SpecialCases.BACKSPACE;
583
+ }
584
+ if (key === Key.ENTER) {
585
+ return SpecialCases.ENTER;
586
+ }
587
+ }
588
+ const keyString = this.keyboardLayoutService.getKeyboardCharacter(key);
589
+ if (
590
+ (key.keyCode >= Key.KEY_A.keyCode && key.keyCode <= Key.KEY_Z.keyCode) ||
591
+ (key.keyCode >= Key.F1.keyCode && key.keyCode <= Key.F24.keyCode)
592
+ ) {
593
+ return keyString.toUpperCase();
594
+ } else if (keyString.length > 1) {
595
+ return keyString.charAt(0).toUpperCase() + keyString.slice(1);
596
+ } else if (keyString === ' ') {
597
+ // 空格需要额外使用特殊字符进行展示,否则直接输出 `' '` 会比较疑惑
598
+ return SpecialCases.SPACE.charAt(0).toUpperCase() + SpecialCases.SPACE.slice(1);
599
+ } else {
600
+ return keyString;
601
+ }
602
+ }
603
+
604
+ /**
605
+ * 查找绑定列表中的键序列的冲突(无错误,是否冲突都会返回结果)
606
+ * @param bindings
607
+ * @param candidate
608
+ */
609
+ protected getKeySequenceCollisions(
610
+ bindings: Keybinding[],
611
+ candidate: KeySequence,
612
+ ): KeybindingsResultCollection.KeybindingsResult {
613
+ const result = new KeybindingsResultCollection.KeybindingsResult();
614
+ for (const binding of bindings) {
615
+ try {
616
+ const bindingKeySequence = this.resolveKeybinding(binding);
617
+ const compareResult = KeySequence.compare(candidate, bindingKeySequence);
618
+ switch (compareResult) {
619
+ case KeySequence.CompareResult.FULL: {
620
+ result.full.push(binding);
621
+ break;
622
+ }
623
+ case KeySequence.CompareResult.PARTIAL: {
624
+ result.partial.push(binding);
625
+ break;
626
+ }
627
+ case KeySequence.CompareResult.SHADOW: {
628
+ result.shadow.push(binding);
629
+ break;
630
+ }
631
+ }
632
+ } catch (error) {
633
+ this.logger.warn(error);
634
+ }
635
+ }
636
+ return result;
637
+ }
638
+
639
+ /**
640
+ * 获取与KeySequence完全匹配或部分匹配的键绑定列表
641
+ * 列表按优先级排序 (见sortKeybindingsByPriority方法)
642
+ * @param keySequence
643
+ */
644
+ public getKeybindingsForKeySequence(
645
+ keySequence: KeySequence,
646
+ event?: KeyboardEvent,
647
+ ): KeybindingsResultCollection.KeybindingsResult {
648
+ const result = new KeybindingsResultCollection.KeybindingsResult();
649
+
650
+ for (let scope = KeybindingScope.END; --scope >= KeybindingScope.DEFAULT; ) {
651
+ const matches = this.getKeySequenceCollisions(this.keymaps[scope], keySequence);
652
+
653
+ matches.full = matches.full.sort(this.sortKeybindingsByPriority);
654
+ matches.partial = matches.partial.sort(this.sortKeybindingsByPriority);
655
+
656
+ result.merge(matches);
657
+ }
658
+
659
+ // 如果组合键不可用,去掉组合键的功能
660
+ const partial = result.partial.filter((binding) => this.isEnabled(binding, event));
661
+ result.partial = partial;
662
+ return result;
663
+ }
664
+
665
+ /**
666
+ * 获取与commandId相关联的键绑定
667
+ * @param commandId
668
+ */
669
+ public getKeybindingsForCommand(commandId: string): ScopedKeybinding[] {
670
+ const result: ScopedKeybinding[] = [];
671
+
672
+ for (let scope = KeybindingScope.END - 1; scope >= KeybindingScope.DEFAULT; scope--) {
673
+ this.keymaps[scope].forEach((binding) => {
674
+ const command = this.commandRegistry.getCommand(binding.command);
675
+ if (command) {
676
+ if (command.id === commandId) {
677
+ result.push({ ...binding, scope });
678
+ }
679
+ }
680
+ });
681
+
682
+ if (result.length > 0) {
683
+ return result;
684
+ }
685
+ }
686
+ return result;
687
+ }
688
+
689
+ /**
690
+ * 返回在特定Scope下与commandId关联的键值对列表
691
+ * @param scope
692
+ * @param commandId
693
+ */
694
+ public getScopedKeybindingsForCommand(scope: KeybindingScope, commandId: string): Keybinding[] {
695
+ const result: Keybinding[] = [];
696
+
697
+ if (scope >= KeybindingScope.END) {
698
+ return [];
699
+ }
700
+
701
+ this.keymaps[scope].forEach((binding) => {
702
+ const command = this.commandRegistry.getCommand(binding.command);
703
+ if (command && command.id === commandId) {
704
+ result.push(binding);
705
+ }
706
+ });
707
+ return result;
708
+ }
709
+
710
+ /**
711
+ * 按优先级顺序对键值绑定进行排序
712
+ *
713
+ * 具有When判定的键绑定比没有的优先级更高
714
+ * 当均具备 when 时,采用 priority 进行优先级判断
715
+ * @param keybindings
716
+ */
717
+ private sortKeybindingsByPriority(a: Keybinding, b: Keybinding) {
718
+ if (a.when && !b.when) {
719
+ return -1;
720
+ }
721
+ if (!a.when && b.when) {
722
+ return 1;
723
+ }
724
+ const compA = isUndefined(a.priority) ? KeybindingWeight.Default : a.priority;
725
+ const compB = isUndefined(b.priority) ? KeybindingWeight.Default : b.priority;
726
+ return compB - compA;
727
+ }
728
+
729
+ protected isActive(binding: Keybinding): boolean {
730
+ // passthrough命令始终处于活动状态 (无法在命令注册表中找到))
731
+ if (this.isPseudoCommand(binding.command)) {
732
+ return true;
733
+ }
734
+
735
+ const command = this.commandRegistry.getCommand(binding.command);
736
+ return !!command && !!this.commandRegistry.getActiveHandler(command.id);
737
+ }
738
+
739
+ /**
740
+ * 只有在没有上下文(全局上下文)或者我们处于该上下文中时才执行
741
+ * @param binding
742
+ * @param event
743
+ */
744
+ public isEnabled(binding: Keybinding, event?: KeyboardEvent): boolean {
745
+ if (binding.when && !this.whenContextService.match(binding.when, event && (event.target as HTMLElement))) {
746
+ return false;
747
+ }
748
+ return true;
749
+ }
750
+
751
+ /**
752
+ * 判断是否为PASSTHROUGH_PSEUDO_COMMAND
753
+ * @param commandId
754
+ */
755
+ public isPseudoCommand(commandId: string): boolean {
756
+ return commandId === KeybindingRegistryImpl.PASSTHROUGH_PSEUDO_COMMAND;
757
+ }
758
+
759
+ /**
760
+ * 重置所有Scope下的键绑定(仅保留映射的默认键绑定)
761
+ */
762
+ public resetKeybindings(): void {
763
+ for (let i = KeybindingScope.DEFAULT + 1; i < KeybindingScope.END; i++) {
764
+ this.keymaps[i] = [];
765
+ }
766
+ }
767
+
768
+ /**
769
+ * 用于处理诸如 Shift + Shift, Ctrl + Ctrl, Alt + Alt 等快捷键
770
+ * 参考: https://github.com/microsoft/vscode/pull/115190
771
+ *
772
+ * @param event 键盘事件
773
+ */
774
+ public resolveModifierKey(event: KeyboardEvent): void {
775
+ if (event.defaultPrevented) {
776
+ return;
777
+ }
778
+ if (this.modifierKeySequenceTimer) {
779
+ clearTimeout(this.modifierKeySequenceTimer);
780
+ }
781
+ const keyCode = KeyCode.createKeyCode(event);
782
+ // 当传入的 KeyCode 不是修饰符时,不处理
783
+ if (!keyCode.isModifierOnly()) {
784
+ return;
785
+ }
786
+ this.modifierKeySequence.push(keyCode);
787
+ const bindings = this.getKeybindingsForKeySequence(this.modifierKeySequence, event);
788
+ if (this.tryKeybindingExecution(bindings.full, event)) {
789
+ this.modifierKeySequence = [];
790
+ } else if (bindings.partial.length > 0) {
791
+ // 堆积 modifierKeySequence, 用于实现组合键
792
+ event.preventDefault();
793
+ event.stopPropagation();
794
+ this.modifierKeySequenceTimer = setTimeout(() => {
795
+ this.modifierKeySequence = [];
796
+ }, KeybindingRegistryImpl.MODIFIER_KEYSEQUENCE_TIMEOUT);
797
+ } else {
798
+ this.modifierKeySequence = [];
799
+ }
800
+ }
801
+
802
+ /**
803
+ * 执行匹配键盘事件的命令
804
+ *
805
+ * @param event 键盘事件
806
+ */
807
+ public run(event: KeyboardEvent): void {
808
+ if (event.defaultPrevented) {
809
+ return;
810
+ }
811
+ if (this.keySequenceTimer) {
812
+ clearTimeout(this.keySequenceTimer);
813
+ }
814
+ const keyCode = KeyCode.createKeyCode(event);
815
+ // 当传入的 KeyCode 仅为修饰符,忽略,等待下次输入
816
+ if (keyCode.isModifierOnly()) {
817
+ return;
818
+ }
819
+ this.keyboardLayoutService.validateKeyCode(keyCode);
820
+ this.keySequence.push(keyCode);
821
+ const bindings = this.getKeybindingsForKeySequence(this.keySequence, event);
822
+
823
+ if (this.tryKeybindingExecution(bindings.full, event)) {
824
+ this.keySequence = [];
825
+ this.statusBar.removeElement('keybinding-status');
826
+ } else if (bindings.partial.length > 0) {
827
+ // 堆积keySequence, 用于实现组合键
828
+ event.preventDefault();
829
+ event.stopPropagation();
830
+
831
+ this.statusBar.addElement('keybinding-status', {
832
+ text: formatLocalize('keybinding.combination.tip', this.acceleratorForSequence(this.keySequence, '+')),
833
+ alignment: StatusBarAlignment.LEFT,
834
+ priority: 2,
835
+ });
836
+ this.keySequenceTimer = setTimeout(() => {
837
+ this.keySequence = [];
838
+ this.statusBar.removeElement('keybinding-status');
839
+ }, KeybindingRegistryImpl.KEYSEQUENCE_TIMEOUT);
840
+ } else {
841
+ this.keySequence = [];
842
+ this.statusBar.removeElement('keybinding-status');
843
+ }
844
+ }
845
+
846
+ /**
847
+ * 返回快捷键文本
848
+ *
849
+ * @param event 键盘事件
850
+ */
851
+ public convert(event: KeyboardEvent, separator = ' '): string {
852
+ const keyCode = KeyCode.createKeyCode(event);
853
+
854
+ // 当传入的Keycode仅为修饰符,返回上次输出结果
855
+ if (keyCode.isModifierOnly()) {
856
+ return this.acceleratorForSequence(this.convertKeySequence, '+').join(separator);
857
+ }
858
+ this.keyboardLayoutService.validateKeyCode(keyCode);
859
+ if (this.convertKeySequence.length <= 1) {
860
+ this.convertKeySequence.push(keyCode);
861
+ } else {
862
+ this.convertKeySequence = [keyCode];
863
+ }
864
+ return this.acceleratorForSequence(this.convertKeySequence, '+').join(separator);
865
+ }
866
+
867
+ /**
868
+ * 清空键盘事件队列
869
+ */
870
+ public clearConvert() {
871
+ this.convertKeySequence = [];
872
+ }
873
+
874
+ /**
875
+ * 尝试执行Keybinding
876
+ * @param bindings
877
+ * @param event
878
+ * @return 命令执行成功时返回true,否则为false
879
+ */
880
+ protected tryKeybindingExecution(bindings: Keybinding[], event: KeyboardEvent): boolean {
881
+ if (bindings.length === 0) {
882
+ return false;
883
+ }
884
+ for (const binding of bindings) {
885
+ if (this.isEnabled(binding, event)) {
886
+ if (this.isPseudoCommand(binding.command)) {
887
+ // 让事件冒泡
888
+ return true;
889
+ } else {
890
+ const command = this.commandRegistry.getCommand(binding.command);
891
+ if (command) {
892
+ this.commandService
893
+ .executeCommand(command.id, binding.args)
894
+ .catch((err) => this.logger.error('Failed to execute command:', err, binding.command));
895
+ /* 如果键绑定在上下文中但命令是可用状态下我们仍然在这里停止处理 */
896
+ event.preventDefault();
897
+ event.stopPropagation();
898
+ return true;
899
+ }
900
+ }
901
+ return false;
902
+ }
903
+ }
904
+ return false;
905
+ }
906
+ }
907
+
908
+ export const NO_KEYBINDING_NAME = 'no_keybinding';