@opensumi/ide-editor 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 (238) hide show
  1. package/lib/browser/breadcrumb/default.js.map +1 -1
  2. package/lib/browser/breadcrumb/document-symbol.js.map +1 -1
  3. package/lib/browser/breadcrumb/index.js.map +1 -1
  4. package/lib/browser/component.js.map +1 -1
  5. package/lib/browser/decoration-applier.js.map +1 -1
  6. package/lib/browser/diff/compare.js.map +1 -1
  7. package/lib/browser/diff/index.d.ts.map +1 -1
  8. package/lib/browser/diff/index.js +1 -1
  9. package/lib/browser/diff/index.js.map +1 -1
  10. package/lib/browser/doc-cache/empty-doc-cache.js.map +1 -1
  11. package/lib/browser/doc-cache/local-storage-cache.js.map +1 -1
  12. package/lib/browser/doc-model/editor-document-model-service.js +3 -3
  13. package/lib/browser/doc-model/editor-document-model-service.js.map +1 -1
  14. package/lib/browser/doc-model/editor-document-model.d.ts +8 -0
  15. package/lib/browser/doc-model/editor-document-model.d.ts.map +1 -1
  16. package/lib/browser/doc-model/editor-document-model.js +61 -11
  17. package/lib/browser/doc-model/editor-document-model.js.map +1 -1
  18. package/lib/browser/doc-model/editor-document-registry.js.map +1 -1
  19. package/lib/browser/doc-model/override.js.map +1 -1
  20. package/lib/browser/doc-model/save-task.js +1 -1
  21. package/lib/browser/doc-model/save-task.js.map +1 -1
  22. package/lib/browser/doc-model/saveParticipants.d.ts +7 -7
  23. package/lib/browser/doc-model/saveParticipants.d.ts.map +1 -1
  24. package/lib/browser/doc-model/saveParticipants.js +69 -38
  25. package/lib/browser/doc-model/saveParticipants.js.map +1 -1
  26. package/lib/browser/doc-model/types.d.ts +1 -1
  27. package/lib/browser/doc-model/types.d.ts.map +1 -1
  28. package/lib/browser/editor-collection.service.d.ts +8 -3
  29. package/lib/browser/editor-collection.service.d.ts.map +1 -1
  30. package/lib/browser/editor-collection.service.js +75 -66
  31. package/lib/browser/editor-collection.service.js.map +1 -1
  32. package/lib/browser/editor-opener.js.map +1 -1
  33. package/lib/browser/editor.contribution.d.ts.map +1 -1
  34. package/lib/browser/editor.contribution.js +31 -3
  35. package/lib/browser/editor.contribution.js.map +1 -1
  36. package/lib/browser/editor.decoration.service.d.ts +5 -6
  37. package/lib/browser/editor.decoration.service.d.ts.map +1 -1
  38. package/lib/browser/editor.decoration.service.js +9 -1
  39. package/lib/browser/editor.decoration.service.js.map +1 -1
  40. package/lib/browser/editor.override.js +2 -2
  41. package/lib/browser/editor.override.js.map +1 -1
  42. package/lib/browser/editor.status-bar.service.js.map +1 -1
  43. package/lib/browser/editor.view.d.ts.map +1 -1
  44. package/lib/browser/editor.view.js +20 -23
  45. package/lib/browser/editor.view.js.map +1 -1
  46. package/lib/browser/error.d.ts +1 -1
  47. package/lib/browser/error.d.ts.map +1 -1
  48. package/lib/browser/feature.js.map +1 -1
  49. package/lib/browser/format/format.service.js.map +1 -1
  50. package/lib/browser/format/formatterSelect.js.map +1 -1
  51. package/lib/browser/fs-resource/file-tree-set.js +6 -6
  52. package/lib/browser/fs-resource/file-tree-set.js.map +1 -1
  53. package/lib/browser/fs-resource/fs-editor-doc.js +1 -1
  54. package/lib/browser/fs-resource/fs-editor-doc.js.map +1 -1
  55. package/lib/browser/fs-resource/fs-resource.js.map +1 -1
  56. package/lib/browser/fs-resource/index.js.map +1 -1
  57. package/lib/browser/history/index.d.ts.map +1 -1
  58. package/lib/browser/history/index.js +2 -1
  59. package/lib/browser/history/index.js.map +1 -1
  60. package/lib/browser/index.d.ts.map +1 -1
  61. package/lib/browser/index.js +2 -0
  62. package/lib/browser/index.js.map +1 -1
  63. package/lib/browser/language/diagnostic-collection.d.ts +5 -5
  64. package/lib/browser/language/diagnostic-collection.d.ts.map +1 -1
  65. package/lib/browser/language/diagnostic-collection.js +1 -1
  66. package/lib/browser/language/diagnostic-collection.js.map +1 -1
  67. package/lib/browser/language/language-status.contribution.js.map +1 -1
  68. package/lib/browser/language/language-status.service.js.map +1 -1
  69. package/lib/browser/language/language.service.d.ts +4 -3
  70. package/lib/browser/language/language.service.d.ts.map +1 -1
  71. package/lib/browser/language/language.service.js +8 -2
  72. package/lib/browser/language/language.service.js.map +1 -1
  73. package/lib/browser/menu/editor.context.js +3 -3
  74. package/lib/browser/menu/editor.context.js.map +1 -1
  75. package/lib/browser/menu/editor.menu.d.ts +2 -2
  76. package/lib/browser/menu/editor.menu.d.ts.map +1 -1
  77. package/lib/browser/menu/editor.menu.js +6 -8
  78. package/lib/browser/menu/editor.menu.js.map +1 -1
  79. package/lib/browser/menu/open-type-menu.contribution.js +9 -9
  80. package/lib/browser/menu/open-type-menu.contribution.js.map +1 -1
  81. package/lib/browser/menu/title-context.menu.js.map +1 -1
  82. package/lib/browser/merge-editor/merge-editor.contribution.d.ts +8 -0
  83. package/lib/browser/merge-editor/merge-editor.contribution.d.ts.map +1 -0
  84. package/lib/browser/merge-editor/merge-editor.contribution.js +29 -0
  85. package/lib/browser/merge-editor/merge-editor.contribution.js.map +1 -0
  86. package/lib/browser/merge-editor/merge-editor.provider.d.ts +8 -0
  87. package/lib/browser/merge-editor/merge-editor.provider.d.ts.map +1 -0
  88. package/lib/browser/merge-editor/merge-editor.provider.js +44 -0
  89. package/lib/browser/merge-editor/merge-editor.provider.js.map +1 -0
  90. package/lib/browser/monaco-contrib/callHierarchy/callHierarchy.contribution.js.map +1 -1
  91. package/lib/browser/monaco-contrib/callHierarchy/callHierarchy.service.js +7 -7
  92. package/lib/browser/monaco-contrib/callHierarchy/callHierarchy.service.js.map +1 -1
  93. package/lib/browser/monaco-contrib/command/command.service.d.ts +1 -1
  94. package/lib/browser/monaco-contrib/command/command.service.d.ts.map +1 -1
  95. package/lib/browser/monaco-contrib/command/command.service.js.map +1 -1
  96. package/lib/browser/monaco-contrib/tokenizer/textmate-registry.js.map +1 -1
  97. package/lib/browser/monaco-contrib/tokenizer/textmate.service.d.ts +2 -1
  98. package/lib/browser/monaco-contrib/tokenizer/textmate.service.d.ts.map +1 -1
  99. package/lib/browser/monaco-contrib/tokenizer/textmate.service.js +5 -2
  100. package/lib/browser/monaco-contrib/tokenizer/textmate.service.js.map +1 -1
  101. package/lib/browser/monaco-contrib/typeHierarchy/typeHierarchy.contribution.js.map +1 -1
  102. package/lib/browser/monaco-contrib/typeHierarchy/typeHierarchy.service.js +7 -7
  103. package/lib/browser/monaco-contrib/typeHierarchy/typeHierarchy.service.js.map +1 -1
  104. package/lib/browser/navigation.module.less +1 -1
  105. package/lib/browser/navigation.view.d.ts.map +1 -1
  106. package/lib/browser/navigation.view.js +26 -15
  107. package/lib/browser/navigation.view.js.map +1 -1
  108. package/lib/browser/preference/contribution.js.map +1 -1
  109. package/lib/browser/preference/converter.d.ts +3 -3
  110. package/lib/browser/preference/converter.d.ts.map +1 -1
  111. package/lib/browser/preference/schema.d.ts +1 -1
  112. package/lib/browser/preference/schema.d.ts.map +1 -1
  113. package/lib/browser/preference/schema.js +8 -8
  114. package/lib/browser/preference/schema.js.map +1 -1
  115. package/lib/browser/quick-open/go-to-line.js.map +1 -1
  116. package/lib/browser/quick-open/workspace-symbol-quickopen.d.ts.map +1 -1
  117. package/lib/browser/quick-open/workspace-symbol-quickopen.js +2 -2
  118. package/lib/browser/quick-open/workspace-symbol-quickopen.js.map +1 -1
  119. package/lib/browser/resource.service.js.map +1 -1
  120. package/lib/browser/tab.view.d.ts +1 -1
  121. package/lib/browser/tab.view.d.ts.map +1 -1
  122. package/lib/browser/tab.view.js +2 -2
  123. package/lib/browser/tab.view.js.map +1 -1
  124. package/lib/browser/types.d.ts +5 -5
  125. package/lib/browser/types.d.ts.map +1 -1
  126. package/lib/browser/untitled-resource.js +1 -1
  127. package/lib/browser/untitled-resource.js.map +1 -1
  128. package/lib/browser/view/suggest-widget.js.map +1 -1
  129. package/lib/browser/workbench-editor.service.d.ts +17 -0
  130. package/lib/browser/workbench-editor.service.d.ts.map +1 -1
  131. package/lib/browser/workbench-editor.service.js +259 -176
  132. package/lib/browser/workbench-editor.service.js.map +1 -1
  133. package/lib/common/doc-cache.d.ts +2 -2
  134. package/lib/common/doc-cache.d.ts.map +1 -1
  135. package/lib/common/editor.d.ts +20 -6
  136. package/lib/common/editor.d.ts.map +1 -1
  137. package/lib/common/editor.js +12 -1
  138. package/lib/common/editor.js.map +1 -1
  139. package/lib/common/language.d.ts +18 -7
  140. package/lib/common/language.d.ts.map +1 -1
  141. package/lib/common/language.js +15 -7
  142. package/lib/common/language.js.map +1 -1
  143. package/lib/common/mocks/workbench-editor.service.js.map +1 -1
  144. package/lib/common/resource.d.ts +8 -2
  145. package/lib/common/resource.d.ts.map +1 -1
  146. package/lib/common/resource.js +1 -0
  147. package/lib/common/resource.js.map +1 -1
  148. package/package.json +17 -16
  149. package/src/browser/breadcrumb/default.ts +299 -0
  150. package/src/browser/breadcrumb/document-symbol.ts +187 -0
  151. package/src/browser/breadcrumb/index.ts +96 -0
  152. package/src/browser/component.ts +204 -0
  153. package/src/browser/decoration-applier.ts +256 -0
  154. package/src/browser/diff/compare.ts +99 -0
  155. package/src/browser/diff/index.ts +81 -0
  156. package/src/browser/doc-cache/empty-doc-cache.ts +26 -0
  157. package/src/browser/doc-cache/index.ts +2 -0
  158. package/src/browser/doc-cache/local-storage-cache.ts +67 -0
  159. package/src/browser/doc-model/editor-document-error.ts +10 -0
  160. package/src/browser/doc-model/editor-document-model-service.ts +346 -0
  161. package/src/browser/doc-model/editor-document-model.ts +690 -0
  162. package/src/browser/doc-model/editor-document-registry.ts +119 -0
  163. package/src/browser/doc-model/editor-is-fn.ts +9 -0
  164. package/src/browser/doc-model/main.ts +4 -0
  165. package/src/browser/doc-model/override.ts +49 -0
  166. package/src/browser/doc-model/save-task.ts +88 -0
  167. package/src/browser/doc-model/saveParticipants.ts +227 -0
  168. package/src/browser/doc-model/types.ts +350 -0
  169. package/src/browser/editor-collection.service.ts +790 -0
  170. package/src/browser/editor-opener.ts +44 -0
  171. package/src/browser/editor.contribution.ts +1438 -0
  172. package/src/browser/editor.decoration.service.ts +247 -0
  173. package/src/browser/editor.less +4 -0
  174. package/src/browser/editor.module.less +548 -0
  175. package/src/browser/editor.override.ts +133 -0
  176. package/src/browser/editor.status-bar.service.ts +116 -0
  177. package/src/browser/editor.view.tsx +623 -0
  178. package/src/browser/error.ts +21 -0
  179. package/src/browser/feature.ts +63 -0
  180. package/src/browser/format/format.service.ts +95 -0
  181. package/src/browser/format/formatterSelect.ts +82 -0
  182. package/src/browser/fs-resource/file-tree-set.ts +126 -0
  183. package/src/browser/fs-resource/fs-editor-doc.ts +213 -0
  184. package/src/browser/fs-resource/fs-resource.ts +247 -0
  185. package/src/browser/fs-resource/index.ts +27 -0
  186. package/src/browser/grid/grid.service.ts +288 -0
  187. package/src/browser/history/index.ts +228 -0
  188. package/src/browser/index.ts +236 -0
  189. package/src/browser/language/diagnostic-collection.ts +83 -0
  190. package/src/browser/language/language-status.contribution.ts +81 -0
  191. package/src/browser/language/language-status.service.ts +32 -0
  192. package/src/browser/language/language.service.ts +185 -0
  193. package/src/browser/menu/editor.context.ts +186 -0
  194. package/src/browser/menu/editor.menu.ts +45 -0
  195. package/src/browser/menu/open-type-menu.contribution.ts +90 -0
  196. package/src/browser/menu/title-context.menu.ts +54 -0
  197. package/src/browser/merge-editor/merge-editor.contribution.ts +25 -0
  198. package/src/browser/merge-editor/merge-editor.provider.ts +36 -0
  199. package/src/browser/monaco-contrib/callHierarchy/callHierarchy.contribution.ts +78 -0
  200. package/src/browser/monaco-contrib/callHierarchy/callHierarchy.service.ts +160 -0
  201. package/src/browser/monaco-contrib/command/command.service.ts +438 -0
  202. package/src/browser/monaco-contrib/index.ts +4 -0
  203. package/src/browser/monaco-contrib/tokenizer/textmate-registry.ts +107 -0
  204. package/src/browser/monaco-contrib/tokenizer/textmate-tokenizer.ts +104 -0
  205. package/src/browser/monaco-contrib/tokenizer/textmate.service.ts +925 -0
  206. package/src/browser/monaco-contrib/typeHierarchy/typeHierarchy.contribution.ts +78 -0
  207. package/src/browser/monaco-contrib/typeHierarchy/typeHierarchy.service.ts +154 -0
  208. package/src/browser/navigation.module.less +96 -0
  209. package/src/browser/navigation.view.tsx +254 -0
  210. package/src/browser/preference/contribution.ts +8 -0
  211. package/src/browser/preference/converter.ts +793 -0
  212. package/src/browser/preference/schema.ts +1896 -0
  213. package/src/browser/preference/util.ts +14 -0
  214. package/src/browser/quick-open/go-to-line.ts +164 -0
  215. package/src/browser/quick-open/workspace-symbol-quickopen.ts +276 -0
  216. package/src/browser/resource.service.ts +263 -0
  217. package/src/browser/tab.view.tsx +514 -0
  218. package/src/browser/types.ts +467 -0
  219. package/src/browser/untitled-resource.ts +223 -0
  220. package/src/browser/view/editor.react.tsx +82 -0
  221. package/src/browser/view/react-hook.tsx +7 -0
  222. package/src/browser/view/suggest-widget.ts +77 -0
  223. package/src/browser/view/topPadding.ts +18 -0
  224. package/src/browser/workbench-editor.service.ts +2291 -0
  225. package/src/common/doc-cache.ts +117 -0
  226. package/src/common/editor.ts +799 -0
  227. package/src/common/index.ts +6 -0
  228. package/src/common/language-status.ts +33 -0
  229. package/src/common/language.ts +206 -0
  230. package/src/common/mocks/workbench-editor.service.ts +52 -0
  231. package/src/common/resource.ts +147 -0
  232. package/src/common/utils.ts +10 -0
  233. package/src/index.ts +1 -0
  234. package/lib/browser/component/scroll/scroll.d.ts +0 -2
  235. package/lib/browser/component/scroll/scroll.d.ts.map +0 -1
  236. package/lib/browser/component/scroll/scroll.js +0 -5
  237. package/lib/browser/component/scroll/scroll.js.map +0 -1
  238. package/lib/browser/component/scroll/scroll.module.less +0 -86
@@ -0,0 +1,467 @@
1
+ import {
2
+ MaybePromise,
3
+ IDisposable,
4
+ BasicEvent,
5
+ IRange,
6
+ MaybeNull,
7
+ ISelection,
8
+ URI,
9
+ Event,
10
+ } from '@opensumi/ide-core-browser';
11
+ import { IContextMenu } from '@opensumi/ide-core-browser/lib/menu/next';
12
+ import { IThemeColor } from '@opensumi/ide-core-common';
13
+ import { editor } from '@opensumi/monaco-editor-core/esm/vs/editor/editor.api';
14
+
15
+ import {
16
+ IResource,
17
+ ResourceService,
18
+ IEditorGroup,
19
+ IDecorationRenderOptions,
20
+ ITextEditorDecorationType,
21
+ TrackedRangeStickiness,
22
+ OverviewRulerLane,
23
+ IEditorOpenType,
24
+ IEditor,
25
+ DragOverPosition,
26
+ } from '../common';
27
+
28
+ import { IEditorDocumentModelContentRegistry } from './doc-model/types';
29
+
30
+ export * from '../common';
31
+
32
+ export type ReactEditorComponent<MetaData = any> = React.ComponentType<{ resource: IResource<MetaData> }>;
33
+
34
+ export interface IEditorComponent<MetaData = any> {
35
+ // 唯一id
36
+ uid: string;
37
+
38
+ // component 对象
39
+ component: ReactEditorComponent<MetaData>;
40
+
41
+ // 要被handle的scheme
42
+ // @deprecated
43
+ scheme?: string;
44
+
45
+ // 渲染模式 默认为 ONE_PER_GROUP
46
+ renderMode?: EditorComponentRenderMode;
47
+ }
48
+
49
+ export type EditorSide = 'bottom';
50
+
51
+ export interface IEditorSideWidget<MetaData = any> {
52
+ /**
53
+ * id, 需要唯一,会作为react组件的key
54
+ */
55
+ id: string;
56
+
57
+ /**
58
+ * TODO: 当前仅支持bottom
59
+ */
60
+ side?: EditorSide;
61
+
62
+ /**
63
+ * 组件元素
64
+ */
65
+ component: ReactEditorComponent<MetaData>;
66
+
67
+ /**
68
+ * 排序因子, 默认10
69
+ */
70
+ weight?: number;
71
+
72
+ /**
73
+ * 是否要在某个resource显示
74
+ */
75
+ displaysOnResource: (resource: IResource<any>) => boolean;
76
+
77
+ /**
78
+ * editorSide view 组件传入的props
79
+ */
80
+ initialProps?: unknown;
81
+ }
82
+
83
+ export enum EditorComponentRenderMode {
84
+ ONE_PER_RESOURCE = 1, // 每个resource渲染一个新的
85
+ ONE_PER_GROUP = 2, // 每个Group最多存在一个新的
86
+ ONE_PER_WORKBENCH = 3, // 整个IDE只有一个, 视图会被重用
87
+ }
88
+
89
+ /**
90
+ * 注册编辑器组件 Resolver 时触发
91
+ */
92
+ export class RegisterEditorComponentResolverEvent extends BasicEvent<string> {}
93
+
94
+ /**
95
+ * 注册编辑器组件时触发
96
+ */
97
+ export class RegisterEditorComponentEvent extends BasicEvent<string> {}
98
+
99
+ export abstract class EditorComponentRegistry {
100
+ abstract registerEditorComponent<T>(component: IEditorComponent<T>, initialProps?: any): IDisposable;
101
+
102
+ // 等同于 handlesScheme => 10
103
+ abstract registerEditorComponentResolver<T>(scheme: string, resolver: IEditorComponentResolver<T>): IDisposable;
104
+
105
+ // handlesScheme 返回权重, 小于 0 表示不处理
106
+ abstract registerEditorComponentResolver<T>(
107
+ // eslint-disable-next-line @typescript-eslint/unified-signatures
108
+ handlesScheme: (scheme: string) => number,
109
+ resolver: IEditorComponentResolver<T>,
110
+ ): IDisposable;
111
+
112
+ abstract resolveEditorComponent(resource: IResource): Promise<IEditorOpenType[]>;
113
+
114
+ abstract getEditorComponent(id: string): IEditorComponent | null;
115
+
116
+ abstract getEditorInitialProps(id: string): any;
117
+
118
+ abstract clearPerWorkbenchComponentCache(componentId: string): void;
119
+
120
+ /**
121
+ * 注册一个编辑器的边缘组件(目前只开放了bottom)
122
+ * @param widget
123
+ */
124
+ abstract registerEditorSideWidget(widget: IEditorSideWidget): IDisposable;
125
+
126
+ abstract getSideWidgets(side: EditorSide, resource: IResource): IEditorSideWidget<any>[];
127
+ }
128
+
129
+ /**
130
+ * 打开资源的处理委派函数
131
+ * @param resource 要打开的资源
132
+ * @param results 在执行此责任委派函数前,已经支持的打开方式
133
+ * @param resolve 调用这个函数,传入结果可结束责任链直接返回支持的打开方式
134
+ */
135
+ export type IEditorComponentResolver<MetaData = any> = (
136
+ resource: IResource<MetaData>,
137
+ results: IEditorOpenType[],
138
+ resolve: (results: IEditorOpenType[]) => void,
139
+ ) => MaybePromise<void>;
140
+
141
+ export const BrowserEditorContribution = Symbol('BrowserEditorContribution');
142
+
143
+ export interface BrowserEditorContribution {
144
+ /**
145
+ * 用来在合适的时机向 `ResourceService` 注册可以在编辑器内打开的资源。
146
+ *
147
+ * 为了让一个 uri 能够在编辑器中被打开,首先需要向 `ResourceService` 注册一个用于解析 uri 至一个编辑器资源(`IResource`) 的 `IResourceProvider`。
148
+ * 它的主要职责是在这个 uri 在编辑器标签 Tab 上显示时提供它的名称、图标、是否被编辑等状态,以及相应这个 tab 被关闭时的回调等等。
149
+ *
150
+ * @param resourceService
151
+ */
152
+ registerResource?(resourceService: ResourceService): void;
153
+
154
+ /**
155
+ * 用来在合适的时机向 `EditorComponentRegistry` 注册编辑器组件、打开方式等功能。
156
+ *
157
+ * 一个 uri 对应的编辑器资源 (`IResource`) 需要能够在编辑器中展示,还需要为它注册对应的一个或者多个打开方式,以及对应打开方式使用的 React 组件。
158
+ * @param editorComponentRegistry
159
+ */
160
+ registerEditorComponent?(editorComponentRegistry: EditorComponentRegistry): void;
161
+
162
+ registerEditorDocumentModelContentProvider?(registry: IEditorDocumentModelContentRegistry): void;
163
+
164
+ /**
165
+ * @deprecated
166
+ * @param editorActionRegistry
167
+ */
168
+ registerEditorActions?(editorActionRegistry: IEditorActionRegistry): void;
169
+
170
+ /**
171
+ * 当进入 IDE 时,编辑器会尝试恢复上一次打开的编辑器组和组内打开的文件
172
+ * 完成后会执行 onDidRestoreState 这个 hook
173
+ */
174
+ onDidRestoreState?(): void;
175
+
176
+ registerEditorFeature?(registry: IEditorFeatureRegistry);
177
+ }
178
+
179
+ export interface IGridResizeEventPayload {
180
+ gridId: string;
181
+ }
182
+
183
+ export class GridResizeEvent extends BasicEvent<IGridResizeEventPayload> {}
184
+
185
+ export class EditorGroupOpenEvent extends BasicEvent<{ group: IEditorGroup; resource: IResource }> {}
186
+ export class EditorGroupCloseEvent extends BasicEvent<{ group: IEditorGroup; resource: IResource }> {}
187
+ export class EditorGroupDisposeEvent extends BasicEvent<{ group: IEditorGroup }> {}
188
+
189
+ export class EditorGroupChangeEvent extends BasicEvent<IEditorGroupChangePayload> {}
190
+
191
+ export class EditorActiveResourceStateChangedEvent extends BasicEvent<{
192
+ resource: MaybeNull<IResource>;
193
+ openType: MaybeNull<IEditorOpenType>;
194
+ // 如果是编辑器,当前编辑器的 uri
195
+ editorUri?: MaybeNull<URI>;
196
+ }> {}
197
+
198
+ export interface IEditorGroupChangePayload {
199
+ group: IEditorGroup;
200
+
201
+ oldResource: MaybeNull<IResource>;
202
+
203
+ newResource: MaybeNull<IResource>;
204
+
205
+ oldOpenType: MaybeNull<IEditorOpenType>;
206
+
207
+ newOpenType: MaybeNull<IEditorOpenType>;
208
+ }
209
+
210
+ export class EditorGroupFileDropEvent extends BasicEvent<IEditorGroupFileDropPayload> {}
211
+
212
+ export interface IEditorGroupFileDropPayload {
213
+ files: FileList;
214
+
215
+ group: IEditorGroup;
216
+
217
+ /**
218
+ * 如果目标在tab上, drop目标tab的位置
219
+ * -1表示在tab的空位置
220
+ */
221
+ tabIndex?: number;
222
+
223
+ /**
224
+ * 如果扔在编辑器主体,扔的位置
225
+ */
226
+ position?: DragOverPosition;
227
+ }
228
+
229
+ export interface IEditorDecorationCollectionService {
230
+ createTextEditorDecorationType(options: IDecorationRenderOptions, key?: string): IBrowserTextEditorDecorationType;
231
+ getTextEditorDecorationType(key): IBrowserTextEditorDecorationType | undefined;
232
+ registerDecorationProvider(provider: IEditorDecorationProvider): IDisposable;
233
+ getDecorationFromProvider(uri: URI, key?: string): Promise<{ [key: string]: editor.IModelDeltaDecoration[] }>;
234
+ }
235
+
236
+ export interface IBrowserTextEditorDecorationType extends ITextEditorDecorationType {
237
+ property: IDynamicModelDecorationProperty;
238
+ }
239
+
240
+ export interface IDynamicModelDecorationProperty extends IDisposable {
241
+ default: IThemedCssStyle;
242
+
243
+ light: IThemedCssStyle | null;
244
+
245
+ dark: IThemedCssStyle | null;
246
+
247
+ rangeBehavior?: TrackedRangeStickiness;
248
+
249
+ overviewRulerLane?: OverviewRulerLane;
250
+
251
+ isWholeLine: boolean;
252
+ }
253
+
254
+ export interface IThemedCssStyle extends IDisposable {
255
+ glyphMarginClassName?: string;
256
+ className?: string;
257
+ inlineClassName?: string;
258
+ afterContentClassName?: string;
259
+ beforeContentClassName?: string;
260
+ overviewRulerColor?: string | IThemeColor;
261
+ }
262
+
263
+ export const IEditorDecorationCollectionService = Symbol('IEditorDecorationCollectionService');
264
+
265
+ export class EditorSelectionChangeEvent extends BasicEvent<IEditorSelectionChangeEventPayload> {}
266
+
267
+ export interface IEditorSelectionChangeEventPayload {
268
+ group: IEditorGroup;
269
+
270
+ resource: IResource;
271
+
272
+ selections: ISelection[];
273
+
274
+ source: string | undefined;
275
+
276
+ editorUri: URI;
277
+
278
+ side?: 'original' | 'modified';
279
+ }
280
+
281
+ export class EditorVisibleChangeEvent extends BasicEvent<IEditorVisibleChangeEventPayload> {}
282
+
283
+ export interface IEditorVisibleChangeEventPayload {
284
+ group: IEditorGroup;
285
+
286
+ resource: IResource;
287
+
288
+ visibleRanges: IRange[];
289
+
290
+ editorUri: URI;
291
+ }
292
+
293
+ export class EditorConfigurationChangedEvent extends BasicEvent<IEditorConfigurationChangedEventPayload> {}
294
+
295
+ export interface IEditorConfigurationChangedEventPayload {
296
+ group: IEditorGroup;
297
+
298
+ resource: IResource;
299
+
300
+ editorUri: URI;
301
+ }
302
+
303
+ export class EditorGroupIndexChangedEvent extends BasicEvent<IEditorGroupIndexChangeEventPayload> {}
304
+
305
+ export interface IEditorGroupIndexChangeEventPayload {
306
+ group: IEditorGroup;
307
+
308
+ index: number;
309
+ }
310
+
311
+ export class EditorGroupsResetSizeEvent extends BasicEvent<void> {}
312
+
313
+ export class RegisterEditorSideComponentEvent extends BasicEvent<void> {}
314
+
315
+ export interface IEditorDecorationProvider {
316
+ // 装饰要命中的uri scheme, 不传会命中所有scheme
317
+ schemes?: string[];
318
+
319
+ // 同一个key的decoration会覆盖
320
+ key: string;
321
+
322
+ // 提供decoration
323
+ provideEditorDecoration(uri: URI): MaybePromise<editor.IModelDeltaDecoration[] | undefined>;
324
+
325
+ // decorationChange事件
326
+ onDidDecorationChange: Event<URI>;
327
+ }
328
+
329
+ export class EditorDecorationProviderRegistrationEvent extends BasicEvent<IEditorDecorationProvider> {}
330
+
331
+ export class EditorDecorationChangeEvent extends BasicEvent<{ uri: URI; key: string }> {}
332
+
333
+ export class EditorDecorationTypeRemovedEvent extends BasicEvent<string> {}
334
+
335
+ export interface IEditorActionRegistry {
336
+ /**
337
+ * 请不要再使用,暂时除了tip相关和isVisible仍然兼容
338
+ * @deprecated
339
+ * @param
340
+ */
341
+ registerEditorAction(action: IEditorActionItem): IDisposable;
342
+
343
+ getMenu(group: IEditorGroup): IContextMenu;
344
+ }
345
+
346
+ export interface IEditorActionItem {
347
+ title: string;
348
+ iconClass: string;
349
+ tip?: string;
350
+ tipWhen?: string;
351
+ tipClass?: string;
352
+ /**
353
+ * @deprecated 现在无效
354
+ */
355
+ isVisible?: (resource: MaybeNull<IResource>, editorGroup: IEditorGroup) => boolean;
356
+ /**
357
+ * @deprecated 现在会自动转为临时command
358
+ */
359
+ onClick: (resource: MaybeNull<IResource>, editorGroup: IEditorGroup) => void;
360
+ when?: string; // 使用contextkey
361
+ }
362
+
363
+ export interface IVisibleAction {
364
+ item: IEditorActionItem;
365
+ tipVisible: boolean;
366
+ closeTip(): void;
367
+ }
368
+
369
+ export const IEditorActionRegistry = Symbol('IEditorActionRegistry');
370
+
371
+ export interface ICompareService {
372
+ /**
373
+ * 在编辑器中compare两个文件
374
+ */
375
+ compare(original: URI, modified: URI, name: string): Promise<CompareResult>;
376
+ }
377
+
378
+ export const ICompareService = Symbol('ICompareService');
379
+
380
+ export enum CompareResult {
381
+ revert = 'revert', // original -> modified
382
+ accept = 'accept', // modified -> original
383
+ cancel = 'cancel',
384
+ }
385
+
386
+ export interface IBreadCrumbService {
387
+ registerBreadCrumbProvider(provider: IBreadCrumbProvider): IDisposable;
388
+
389
+ getBreadCrumbs(uri: URI, editor?: MaybeNull<IEditor>): IBreadCrumbPart[] | undefined;
390
+
391
+ disposeCrumb(uri: URI): void;
392
+
393
+ onDidUpdateBreadCrumbResults: Event<{ editor: MaybeNull<IEditor>; uri: URI }>;
394
+ }
395
+
396
+ export const IBreadCrumbService = Symbol('IBreadScrumbService');
397
+
398
+ export interface IBreadCrumbProvider {
399
+ handlesUri(URI: URI): boolean;
400
+
401
+ provideBreadCrumbForUri(uri: URI, editor?: MaybeNull<IEditor>): IBreadCrumbPart[];
402
+
403
+ onDidUpdateBreadCrumb: Event<URI>;
404
+ }
405
+
406
+ export interface IBreadCrumbPart {
407
+ name: string;
408
+
409
+ icon?: string;
410
+
411
+ getSiblings?(): MaybePromise<{ parts: IBreadCrumbPart[]; currentIndex: number }>;
412
+
413
+ // getChildren和onClick只能存在一个,如果同时存在,getChildren生效
414
+ getChildren?(): MaybePromise<IBreadCrumbPart[]>;
415
+
416
+ onClick?(): void;
417
+ }
418
+
419
+ export const IEditorFeatureRegistry = Symbol('IEditorFeatureRegistry');
420
+
421
+ export interface IEditorFeatureRegistry {
422
+ /**
423
+ * 注册一个用来加强编辑器能力的Contribution
424
+ * @param contribution
425
+ */
426
+ registerEditorFeatureContribution(contribution: IEditorFeatureContribution): IDisposable;
427
+
428
+ /**
429
+ * 运行 contrbute
430
+ */
431
+ runContributions(editor: IEditor): void;
432
+
433
+ /**
434
+ * 运行 provideEditorOptionsForUri
435
+ */
436
+ runProvideEditorOptionsForUri(uri: URI): MaybePromise<editor.IEditorOptions>;
437
+ }
438
+
439
+ export interface IConvertedMonacoOptions {
440
+ editorOptions: Partial<editor.IEditorOptions>;
441
+ modelOptions: Partial<editor.ITextModelUpdateOptions>;
442
+ diffOptions: Partial<editor.IDiffEditorOptions>;
443
+ }
444
+
445
+ export interface IEditorFeatureContribution {
446
+ /**
447
+ * 当一个编辑器被创建时,会调用这个API,返回的Disposable会在编辑器被销毁时执行
448
+ * @param editor
449
+ */
450
+ contribute(editor: IEditor): IDisposable;
451
+
452
+ /**
453
+ * 用来对 uri 进行 options 的修改
454
+ * @param editor
455
+ */
456
+ provideEditorOptionsForUri?(uri: URI): MaybePromise<Partial<editor.IEditorOptions>>;
457
+ }
458
+
459
+ export class ResourceOpenTypeChangedEvent extends BasicEvent<URI> {}
460
+
461
+ export class EditorComponentDisposeEvent extends BasicEvent<IEditorComponent> {}
462
+
463
+ export class CodeEditorDidVisibleEvent extends BasicEvent<{
464
+ type: 'code' | 'diff';
465
+ groupName: string;
466
+ editorId: string;
467
+ }> {}
@@ -0,0 +1,223 @@
1
+ import { Injectable, Autowired } from '@opensumi/di';
2
+ import {
3
+ URI,
4
+ Emitter,
5
+ Event,
6
+ Schemes,
7
+ WithEventBus,
8
+ IEditorDocumentChange,
9
+ IEditorDocumentModelSaveResult,
10
+ AppConfig,
11
+ CommandService,
12
+ OperatingSystem,
13
+ IApplicationService,
14
+ PreferenceService,
15
+ getLanguageIdFromMonaco,
16
+ localize,
17
+ formatLocalize,
18
+ MessageType,
19
+ path,
20
+ isWindows,
21
+ SaveTaskResponseState,
22
+ } from '@opensumi/ide-core-browser';
23
+ import { EOL } from '@opensumi/ide-monaco/lib/browser/monaco-api/types';
24
+ import { IDialogService } from '@opensumi/ide-overlay';
25
+
26
+ import { AskSaveResult, IResource, IResourceProvider, WorkbenchEditorService } from '../common';
27
+
28
+ import { IEditorDocumentModelService, IEditorDocumentModelContentProvider } from './doc-model/types';
29
+
30
+ @Injectable()
31
+ export class UntitledDocumentIdCounter {
32
+ private _id = 1;
33
+
34
+ get id() {
35
+ return this._id++;
36
+ }
37
+ }
38
+
39
+ @Injectable()
40
+ export class UntitledSchemeDocumentProvider implements IEditorDocumentModelContentProvider {
41
+ @Autowired(IEditorDocumentModelService)
42
+ editorDocumentModelService: IEditorDocumentModelService;
43
+
44
+ @Autowired(WorkbenchEditorService)
45
+ workbenchEditorService: WorkbenchEditorService;
46
+
47
+ @Autowired(CommandService)
48
+ private readonly commandService: CommandService;
49
+
50
+ @Autowired(AppConfig)
51
+ protected readonly appConfig: AppConfig;
52
+
53
+ @Autowired(IApplicationService)
54
+ protected readonly applicationService: IApplicationService;
55
+
56
+ private _onDidChangeContent: Emitter<URI> = new Emitter();
57
+
58
+ public onDidChangeContent: Event<URI> = this._onDidChangeContent.event;
59
+
60
+ @Autowired(PreferenceService)
61
+ protected readonly preferenceService: PreferenceService;
62
+
63
+ handlesScheme(scheme: string): boolean {
64
+ return scheme === Schemes.untitled;
65
+ }
66
+
67
+ async provideEncoding(uri: URI) {
68
+ const encoding = this.preferenceService.get<string>(
69
+ 'files.encoding',
70
+ undefined,
71
+ uri.toString(),
72
+ getLanguageIdFromMonaco(uri)!,
73
+ );
74
+ return encoding || 'utf8';
75
+ }
76
+
77
+ async provideEOL(uri: URI) {
78
+ const backendOS = await this.applicationService.getBackendOS();
79
+ const eol = this.preferenceService.get<EOL | 'auto'>(
80
+ 'files.eol',
81
+ 'auto',
82
+ uri.toString(),
83
+ getLanguageIdFromMonaco(uri)!,
84
+ )!;
85
+
86
+ if (eol !== 'auto') {
87
+ return eol;
88
+ }
89
+ return backendOS === OperatingSystem.Windows ? EOL.CRLF : EOL.LF;
90
+ }
91
+
92
+ async provideEditorDocumentModelContent(uri: URI, encoding?: string | undefined): Promise<string> {
93
+ return '';
94
+ }
95
+
96
+ isReadonly(uri: URI): boolean {
97
+ return false;
98
+ }
99
+
100
+ isAlwaysDirty(uri: URI): boolean {
101
+ // untitled 文件允许新建后就可以保存
102
+ return true;
103
+ }
104
+
105
+ disposeEvenDirty(uri: URI): boolean {
106
+ // untitled 即便是 dirty 状态下,在关闭后也要被 dispose
107
+ return true;
108
+ }
109
+
110
+ closeAutoSave(uri: URI): boolean {
111
+ return true;
112
+ }
113
+
114
+ async saveDocumentModel(
115
+ uri: URI,
116
+ content: string,
117
+ baseContent: string,
118
+ changes: IEditorDocumentChange[],
119
+ encoding: string,
120
+ ignoreDiff = false,
121
+ ): Promise<IEditorDocumentModelSaveResult> {
122
+ const { name } = uri.getParsedQuery();
123
+ const defaultPath = uri.path.toString() !== '/' ? path.dirname(uri.path.toString()) : this.appConfig.workspaceDir;
124
+ const saveUri = await this.commandService.tryExecuteCommand<URI>('file.save', {
125
+ showNameInput: true,
126
+ defaultFileName: name || uri.displayName,
127
+ defaultUri: URI.file(isWindows ? defaultPath.replaceAll('\\', '/') : defaultPath),
128
+ });
129
+ if (saveUri) {
130
+ await this.editorDocumentModelService.saveEditorDocumentModel(
131
+ saveUri,
132
+ content,
133
+ baseContent,
134
+ changes,
135
+ encoding,
136
+ ignoreDiff,
137
+ );
138
+ // TODO: 不依赖 workspaceEditor,先关闭再打开,等 fileSystemProvider 迁移到前端再做改造
139
+ await this.workbenchEditorService.open(saveUri, {
140
+ preview: false,
141
+ focus: true,
142
+ replace: true,
143
+ forceClose: true,
144
+ });
145
+ }
146
+ return {
147
+ state: SaveTaskResponseState.SUCCESS,
148
+ };
149
+ }
150
+ onDidDisposeModel() {}
151
+ }
152
+
153
+ @Injectable()
154
+ export class UntitledSchemeResourceProvider extends WithEventBus implements IResourceProvider {
155
+ readonly scheme: string = Schemes.untitled;
156
+
157
+ @Autowired(IDialogService)
158
+ protected dialogService: IDialogService;
159
+
160
+ @Autowired(IEditorDocumentModelService)
161
+ protected documentModelService: IEditorDocumentModelService;
162
+
163
+ provideResource(uri: URI) {
164
+ const { name } = uri.getParsedQuery();
165
+ return {
166
+ name: name || uri.displayName,
167
+ uri,
168
+ icon: '',
169
+ metadata: null,
170
+ };
171
+ }
172
+
173
+ async shouldCloseResourceWithoutConfirm(resource: IResource) {
174
+ const documentModelRef = this.documentModelService.getModelReference(resource.uri, 'close-resource-check');
175
+ if (documentModelRef && documentModelRef.instance.dirty) {
176
+ return true;
177
+ }
178
+ return false;
179
+ }
180
+
181
+ async close(resource: IResource, saveAction?: AskSaveResult) {
182
+ const documentModelRef = this.documentModelService.getModelReference(resource.uri, 'close-resource-check');
183
+ if (!documentModelRef) {
184
+ return false;
185
+ }
186
+ if (saveAction === AskSaveResult.SAVE) {
187
+ const res = await documentModelRef.instance.save();
188
+ documentModelRef.dispose();
189
+ return res;
190
+ } else if (saveAction === AskSaveResult.REVERT) {
191
+ await documentModelRef.instance.revert();
192
+ documentModelRef.dispose();
193
+ return true;
194
+ } else if (!saveAction || saveAction === AskSaveResult.CANCEL) {
195
+ documentModelRef.dispose();
196
+ return false;
197
+ } else {
198
+ return true;
199
+ }
200
+ }
201
+
202
+ async shouldCloseResource(resource: IResource) {
203
+ const documentModelRef = this.documentModelService.getModelReference(resource.uri, 'close-resource-check');
204
+ if (!documentModelRef || !documentModelRef.instance.dirty) {
205
+ if (documentModelRef) {
206
+ documentModelRef.dispose();
207
+ }
208
+ return true;
209
+ }
210
+ // 询问用户是否保存
211
+ const buttons = {
212
+ [localize('file.prompt.dontSave', '不保存')]: AskSaveResult.REVERT,
213
+ [localize('file.prompt.save', '保存')]: AskSaveResult.SAVE,
214
+ [localize('file.prompt.cancel', '取消')]: AskSaveResult.CANCEL,
215
+ };
216
+ const selection = await this.dialogService.open(
217
+ formatLocalize('saveChangesMessage', resource.name),
218
+ MessageType.Info,
219
+ Object.keys(buttons),
220
+ );
221
+ return await this.close(resource, buttons[selection!]);
222
+ }
223
+ }