@opensumi/ide-editor 3.2.5 → 3.2.6-next-1724824955.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 (97) hide show
  1. package/lib/browser/doc-model/editor-document-model-service.d.ts +2 -1
  2. package/lib/browser/doc-model/editor-document-model-service.d.ts.map +1 -1
  3. package/lib/browser/doc-model/editor-document-model-service.js +22 -0
  4. package/lib/browser/doc-model/editor-document-model-service.js.map +1 -1
  5. package/lib/browser/doc-model/editor-document-model.d.ts +1 -0
  6. package/lib/browser/doc-model/editor-document-model.d.ts.map +1 -1
  7. package/lib/browser/doc-model/editor-document-model.js +14 -0
  8. package/lib/browser/doc-model/editor-document-model.js.map +1 -1
  9. package/lib/browser/doc-model/saveParticipants.d.ts.map +1 -1
  10. package/lib/browser/doc-model/saveParticipants.js +1 -0
  11. package/lib/browser/doc-model/saveParticipants.js.map +1 -1
  12. package/lib/browser/doc-model/types.d.ts +3 -1
  13. package/lib/browser/doc-model/types.d.ts.map +1 -1
  14. package/lib/browser/doc-model/types.js.map +1 -1
  15. package/lib/browser/editor-scrollbar/index.d.ts +69 -0
  16. package/lib/browser/editor-scrollbar/index.d.ts.map +1 -0
  17. package/lib/browser/editor-scrollbar/index.js +289 -0
  18. package/lib/browser/editor-scrollbar/index.js.map +1 -0
  19. package/lib/browser/editor-scrollbar/index.module.less +106 -0
  20. package/lib/browser/editor.contribution.d.ts.map +1 -1
  21. package/lib/browser/editor.contribution.js +7 -4
  22. package/lib/browser/editor.contribution.js.map +1 -1
  23. package/lib/browser/editor.module.less +9 -17
  24. package/lib/browser/editor.view.d.ts.map +1 -1
  25. package/lib/browser/editor.view.js +2 -12
  26. package/lib/browser/editor.view.js.map +1 -1
  27. package/lib/browser/format/formatter-selector.d.ts.map +1 -1
  28. package/lib/browser/format/formatter-selector.js +6 -8
  29. package/lib/browser/format/formatter-selector.js.map +1 -1
  30. package/lib/browser/fs-resource/fs-resource.d.ts.map +1 -1
  31. package/lib/browser/fs-resource/fs-resource.js +5 -7
  32. package/lib/browser/fs-resource/fs-resource.js.map +1 -1
  33. package/lib/browser/grid/grid.service.d.ts +1 -0
  34. package/lib/browser/grid/grid.service.d.ts.map +1 -1
  35. package/lib/browser/grid/grid.service.js +6 -4
  36. package/lib/browser/grid/grid.service.js.map +1 -1
  37. package/lib/browser/hooks/useEditor.d.ts +2 -2
  38. package/lib/browser/hooks/useEditor.d.ts.map +1 -1
  39. package/lib/browser/hooks/useEditor.js +10 -11
  40. package/lib/browser/hooks/useEditor.js.map +1 -1
  41. package/lib/browser/merge-conflict/merge-conflict.model.d.ts.map +1 -1
  42. package/lib/browser/merge-conflict/merge-conflict.model.js +3 -4
  43. package/lib/browser/merge-conflict/merge-conflict.model.js.map +1 -1
  44. package/lib/browser/monaco-contrib/callHierarchy/callHierarchy.service.d.ts.map +1 -1
  45. package/lib/browser/monaco-contrib/callHierarchy/callHierarchy.service.js +3 -3
  46. package/lib/browser/monaco-contrib/callHierarchy/callHierarchy.service.js.map +1 -1
  47. package/lib/browser/monaco-contrib/typeHierarchy/typeHierarchy.service.d.ts.map +1 -1
  48. package/lib/browser/monaco-contrib/typeHierarchy/typeHierarchy.service.js +3 -3
  49. package/lib/browser/monaco-contrib/typeHierarchy/typeHierarchy.service.js.map +1 -1
  50. package/lib/browser/navigation.module.less +3 -2
  51. package/lib/browser/navigation.view.js +1 -1
  52. package/lib/browser/navigation.view.js.map +1 -1
  53. package/lib/browser/tab.view.d.ts.map +1 -1
  54. package/lib/browser/tab.view.js +21 -6
  55. package/lib/browser/tab.view.js.map +1 -1
  56. package/lib/browser/untitled-resource.d.ts.map +1 -1
  57. package/lib/browser/untitled-resource.js +5 -7
  58. package/lib/browser/untitled-resource.js.map +1 -1
  59. package/lib/browser/workbench-editor.service.d.ts.map +1 -1
  60. package/lib/browser/workbench-editor.service.js +15 -22
  61. package/lib/browser/workbench-editor.service.js.map +1 -1
  62. package/lib/common/components.d.ts +3 -0
  63. package/lib/common/components.d.ts.map +1 -0
  64. package/lib/common/components.js +6 -0
  65. package/lib/common/components.js.map +1 -0
  66. package/lib/common/editor.d.ts +47 -0
  67. package/lib/common/editor.d.ts.map +1 -1
  68. package/lib/common/editor.js.map +1 -1
  69. package/lib/common/index.d.ts +1 -0
  70. package/lib/common/index.d.ts.map +1 -1
  71. package/lib/common/index.js +1 -0
  72. package/lib/common/index.js.map +1 -1
  73. package/package.json +14 -14
  74. package/src/browser/doc-model/editor-document-model-service.ts +25 -1
  75. package/src/browser/doc-model/editor-document-model.ts +18 -0
  76. package/src/browser/doc-model/saveParticipants.ts +1 -0
  77. package/src/browser/doc-model/types.ts +3 -1
  78. package/src/browser/editor-scrollbar/index.module.less +106 -0
  79. package/src/browser/editor-scrollbar/index.tsx +399 -0
  80. package/src/browser/editor.contribution.ts +8 -3
  81. package/src/browser/editor.module.less +9 -17
  82. package/src/browser/editor.view.tsx +4 -21
  83. package/src/browser/format/formatter-selector.ts +6 -8
  84. package/src/browser/fs-resource/fs-resource.ts +5 -7
  85. package/src/browser/grid/grid.service.ts +13 -7
  86. package/src/browser/hooks/useEditor.ts +13 -12
  87. package/src/browser/merge-conflict/merge-conflict.model.ts +4 -5
  88. package/src/browser/monaco-contrib/callHierarchy/callHierarchy.service.ts +4 -2
  89. package/src/browser/monaco-contrib/typeHierarchy/typeHierarchy.service.ts +5 -2
  90. package/src/browser/navigation.module.less +3 -2
  91. package/src/browser/navigation.view.tsx +1 -1
  92. package/src/browser/tab.view.tsx +40 -8
  93. package/src/browser/untitled-resource.ts +5 -7
  94. package/src/browser/workbench-editor.service.ts +20 -25
  95. package/src/common/components.ts +2 -0
  96. package/src/common/editor.ts +59 -1
  97. package/src/common/index.ts +1 -0
@@ -0,0 +1,399 @@
1
+ import cls from 'classnames';
2
+ import React, { MouseEvent, UIEvent } from 'react';
3
+
4
+ import styles from './index.module.less';
5
+
6
+ export interface ScrollAreaProps {
7
+ className?: string;
8
+ onScroll?: (position: ScrollPosition) => any;
9
+ atTopClassName?: string;
10
+ style?: any;
11
+ containerStyle?: any;
12
+ delegate?: (delegate: IScrollDelegate) => void;
13
+
14
+ forwardedRef: (ref: HTMLDivElement) => void;
15
+
16
+ children: any;
17
+ }
18
+
19
+ export interface IScrollDelegate {
20
+ scrollTo(position: ScrollPosition): void;
21
+ }
22
+
23
+ export interface ScrollPosition {
24
+ top: number;
25
+ left: number;
26
+ }
27
+
28
+ export interface ScrollSizes {
29
+ scrollHeight: number;
30
+ offsetHeight: number;
31
+ offsetWidth: number;
32
+ scrollWidth: number;
33
+ }
34
+
35
+ export class Scroll extends React.Component<ScrollAreaProps, any> {
36
+ public ref: HTMLDivElement;
37
+
38
+ public container: HTMLDivElement;
39
+
40
+ private thumbV!: HTMLDivElement;
41
+
42
+ private trackV!: HTMLDivElement;
43
+
44
+ private thumbH!: HTMLDivElement;
45
+
46
+ private trackH!: HTMLDivElement;
47
+
48
+ private decorationL: HTMLDivElement;
49
+ private decorationR: HTMLDivElement;
50
+
51
+ private size: ScrollSizes;
52
+
53
+ private position: ScrollPosition = {
54
+ top: 0,
55
+ left: 0,
56
+ };
57
+
58
+ private dragging = false;
59
+
60
+ private draggingStart = 0;
61
+
62
+ private draggingStartPos = 0;
63
+
64
+ private requestFrame: any;
65
+
66
+ private shouldHideThumb = true;
67
+
68
+ private isAtTop = true;
69
+
70
+ onScroll(e: UIEvent<HTMLDivElement>) {
71
+ this.position = {
72
+ top: this.ref.scrollTop,
73
+ left: this.ref.scrollLeft,
74
+ };
75
+ if (this.props.onScroll) {
76
+ this.props.onScroll(this.position);
77
+ }
78
+ this.update(() => {
79
+ const contentWidth = this.ref.scrollWidth;
80
+ const width = this.ref.offsetWidth;
81
+ const contentHeight = this.ref.scrollHeight;
82
+ const height = this.ref.offsetHeight;
83
+ this.thumbH.style.left = (this.position.left * width) / contentWidth + 'px';
84
+ this.thumbV.style.top = (this.position.top * height) / contentHeight + 'px';
85
+ });
86
+ if (!this.isAtTop && this.ref.scrollTop === 0) {
87
+ this.isAtTop = true;
88
+ this.setCss();
89
+ } else if (this.isAtTop && this.ref.scrollTop !== 0) {
90
+ this.isAtTop = false;
91
+ this.setCss();
92
+ }
93
+
94
+ if (this.ref.scrollLeft > 0) {
95
+ this.decorationL.style.opacity = String(1);
96
+ this.decorationR.style.opacity = String(1);
97
+ } else {
98
+ this.decorationL.style.opacity = String(0);
99
+ }
100
+
101
+ if (
102
+ this.ref.scrollWidth === this.ref.offsetWidth ||
103
+ this.ref.scrollLeft === this.ref.scrollWidth - this.ref.offsetWidth
104
+ ) {
105
+ this.decorationR.style.opacity = String(0);
106
+ }
107
+ }
108
+
109
+ scrollTo(position: ScrollPosition) {
110
+ this.ref.scrollLeft = position.left;
111
+ this.ref.scrollTop = position.top;
112
+ }
113
+
114
+ onMouseDownHorizontal(e: MouseEvent<HTMLDivElement>) {
115
+ this.dragging = true;
116
+ if (e.target === this.trackH) {
117
+ this.onMouseDownOnTrack(e);
118
+ }
119
+ this.draggingStart = e.pageX;
120
+ this.draggingStartPos = this.ref.scrollLeft;
121
+ document.addEventListener('mousemove', this.onMouseMoveHorizontal);
122
+ document.addEventListener('mouseup', this.onMouseUpHorizontal);
123
+ }
124
+
125
+ onMouseMoveHorizontal = (e) => {
126
+ if (!this.dragging) {
127
+ return;
128
+ }
129
+ const move = e.pageX - this.draggingStart;
130
+ this.ref.scrollLeft = this.draggingStartPos + this.calculateXToLeft(move);
131
+ };
132
+
133
+ onMouseUpHorizontal = (e) => {
134
+ this.dragging = false;
135
+ document.removeEventListener('mousemove', this.onMouseMoveHorizontal);
136
+ document.removeEventListener('mouseup', this.onMouseUpHorizontal);
137
+ if (this.shouldHideThumb) {
138
+ this.hideThumb();
139
+ }
140
+ };
141
+
142
+ onMouseDownOnTrack(e: MouseEvent<HTMLDivElement>) {
143
+ const track = e.target as HTMLDivElement;
144
+ const x = e.clientX - track.getBoundingClientRect().left;
145
+ const contentWidth = this.ref.scrollWidth;
146
+ const width = this.ref.offsetWidth;
147
+ const left = (x * contentWidth) / width - 0.5 * width;
148
+ this.scrollTo({
149
+ left,
150
+ top: this.position.top,
151
+ });
152
+ }
153
+
154
+ calculateXToLeft(x) {
155
+ const contentWidth = this.ref.scrollWidth;
156
+ const width = this.ref.offsetWidth;
157
+ return (x * contentWidth) / width;
158
+ }
159
+
160
+ onMouseDownVertical(e: MouseEvent<HTMLDivElement>) {
161
+ this.dragging = true;
162
+ if (e.target === this.trackV) {
163
+ this.onMouseDownOnTrackVertical(e);
164
+ }
165
+ this.draggingStart = e.pageY;
166
+ this.draggingStartPos = this.ref.scrollTop;
167
+ document.addEventListener('mousemove', this.onMouseMoveVertical);
168
+ document.addEventListener('mouseup', this.onMouseUpVertical);
169
+ }
170
+
171
+ onMouseMoveVertical = (e) => {
172
+ if (!this.dragging) {
173
+ return;
174
+ }
175
+ const move = e.pageY - this.draggingStart;
176
+ this.ref.scrollTop = this.draggingStartPos + this.calculateYToTop(move);
177
+ };
178
+
179
+ onMouseUpVertical = (e) => {
180
+ this.dragging = false;
181
+ document.removeEventListener('mousemove', this.onMouseMoveVertical);
182
+ document.removeEventListener('mouseup', this.onMouseUpVertical);
183
+ if (this.shouldHideThumb) {
184
+ this.hideThumb();
185
+ }
186
+ };
187
+
188
+ onMouseDownOnTrackVertical(e: MouseEvent<HTMLDivElement>) {
189
+ const track = e.target as HTMLDivElement;
190
+ const x = e.clientY - track.getBoundingClientRect().top;
191
+ const contentHeight = this.ref.scrollHeight;
192
+ const height = this.ref.offsetHeight;
193
+ const top = (x * contentHeight) / height - 0.5 * height;
194
+ this.scrollTo({
195
+ left: this.position.left,
196
+ top,
197
+ });
198
+ }
199
+
200
+ onMousewheel = (e: WheelEvent) => {
201
+ // 鼠标滚动滚轮只在有横向滚动条的情况下
202
+ // 页面有缩放的时候,scrollHeight 可能会小于 clientHeight / offsetHeight
203
+ if (this.ref.clientHeight >= this.ref.scrollHeight) {
204
+ if (e.deltaY !== 0) {
205
+ // scrollLeft 内部有边界判断
206
+ this.ref.scrollLeft += e.deltaY;
207
+ }
208
+ if (e.deltaX !== 0) {
209
+ this.ref.scrollLeft += e.deltaX;
210
+ }
211
+ }
212
+ };
213
+
214
+ calculateYToTop(y) {
215
+ const contentHeight = this.ref.scrollHeight;
216
+ const height = this.ref.offsetHeight;
217
+ return (y * contentHeight) / height;
218
+ }
219
+
220
+ componentDidUpdate() {
221
+ this.update();
222
+ if (this.props.delegate) {
223
+ this.props.delegate({
224
+ scrollTo: this.scrollTo.bind(this),
225
+ });
226
+ }
227
+ }
228
+
229
+ componentDidMount() {
230
+ this.update();
231
+ window.addEventListener('resize', this.handleWindowResize);
232
+ if (this.props.delegate) {
233
+ this.props.delegate({
234
+ scrollTo: this.scrollTo.bind(this),
235
+ });
236
+ }
237
+ if (this.ref) {
238
+ this.ref.addEventListener('mouseenter', this.onMouseEnter);
239
+ this.ref.addEventListener('wheel', this.onMousewheel);
240
+ }
241
+ }
242
+
243
+ onMouseEnter = () => {
244
+ this.update();
245
+ };
246
+
247
+ componentWillUnmount() {
248
+ if (this.ref) {
249
+ this.ref.removeEventListener('mouseenter', this.onMouseEnter);
250
+ this.ref.removeEventListener('wheel', this.onMousewheel);
251
+ }
252
+ window.removeEventListener('resize', this.handleWindowResize);
253
+ if (this.requestFrame) {
254
+ window.cancelAnimationFrame(this.requestFrame);
255
+ }
256
+ }
257
+
258
+ handleWindowResize = () => {
259
+ this.update();
260
+ };
261
+
262
+ sizeEqual(size1: ScrollSizes, size2: ScrollSizes): boolean {
263
+ return (
264
+ size1 &&
265
+ size2 &&
266
+ size1.offsetHeight === size2.offsetHeight &&
267
+ size1.scrollHeight === size2.scrollHeight &&
268
+ size1.offsetWidth === size2.offsetWidth &&
269
+ size1.scrollWidth === size2.scrollWidth
270
+ );
271
+ }
272
+
273
+ update = (callback?) => {
274
+ if (this.requestFrame) {
275
+ window.cancelAnimationFrame(this.requestFrame);
276
+ }
277
+ this.requestFrame = window.requestAnimationFrame(() => {
278
+ this._update();
279
+ if (callback) {
280
+ callback();
281
+ }
282
+ });
283
+ };
284
+
285
+ _update() {
286
+ if (this.ref) {
287
+ if (!this.sizeEqual(this.size, this.ref)) {
288
+ this.size = {
289
+ offsetHeight: this.ref.offsetHeight,
290
+ offsetWidth: this.ref.offsetWidth,
291
+ scrollWidth: this.ref.scrollWidth,
292
+ scrollHeight: this.ref.scrollHeight,
293
+ };
294
+ this.updateScrollBar();
295
+ }
296
+ }
297
+ }
298
+
299
+ updateScrollBar() {
300
+ const contentWidth = this.ref.scrollWidth;
301
+ const width = this.ref.offsetWidth;
302
+ if (width < contentWidth) {
303
+ const thumbHWidth = (width * width) / contentWidth;
304
+ this.thumbH.style.width = thumbHWidth + 'px';
305
+ this.trackH.parentElement!.style.display = 'block';
306
+ } else {
307
+ this.trackH.parentElement!.style.display = 'none';
308
+ }
309
+ const contentHeight = this.ref.scrollHeight;
310
+ const height = this.ref.offsetHeight;
311
+ if (height < contentHeight) {
312
+ this.thumbV.style.height = (height * height) / contentHeight + 'px';
313
+ this.trackV.parentElement!.style.display = 'block';
314
+ } else {
315
+ this.trackV.parentElement!.style.display = 'none';
316
+ }
317
+ }
318
+
319
+ hideThumb() {
320
+ this.shouldHideThumb = true;
321
+ if (!this.dragging) {
322
+ this.setCss();
323
+ }
324
+ }
325
+
326
+ showThumb() {
327
+ this.shouldHideThumb = false;
328
+ this.setCss();
329
+ }
330
+
331
+ setCss() {
332
+ this.container.className = cls({
333
+ [styles.scroll]: true,
334
+ [styles['hide-thumb']]: this.shouldHideThumb && !this.dragging,
335
+ });
336
+ const clses = {};
337
+ if (this.props.atTopClassName) {
338
+ clses[this.props.atTopClassName] = this.isAtTop;
339
+ }
340
+ if (this.props.className) {
341
+ clses[this.props.className] = true;
342
+ }
343
+ this.ref.className = cls(clses);
344
+ }
345
+
346
+ render() {
347
+ return (
348
+ <div
349
+ className={cls(styles.scroll, styles['hide-thumb'])}
350
+ ref={(e) => {
351
+ if (e) {
352
+ this.container = e;
353
+ this.props.forwardedRef(e);
354
+ }
355
+ }}
356
+ onMouseMove={() => this.showThumb()}
357
+ onMouseLeave={() => this.hideThumb()}
358
+ style={this.props.containerStyle}
359
+ >
360
+ <div
361
+ style={this.props.style}
362
+ className={cls(this.props.className)}
363
+ onScroll={this.onScroll.bind(this)}
364
+ ref={(e) => e && (this.ref = e)}
365
+ onMouseDown={() => this.update()}
366
+ onMouseUp={() => this.update()}
367
+ >
368
+ {this.props.children}
369
+ </div>
370
+ <div className={styles['scrollbar-decoration-vertical-l']} ref={(e) => e && (this.decorationL = e)} />
371
+ <div className={styles['scrollbar-decoration-vertical-r']} ref={(e) => e && (this.decorationR = e)} />
372
+ <div className={styles['scroll-horizontal']}>
373
+ <div
374
+ className={styles['track-horizontal']}
375
+ ref={(e) => e && (this.trackH = e)}
376
+ onMouseDown={this.onMouseDownHorizontal.bind(this)}
377
+ />
378
+ <div
379
+ className={'kt-editor-scrollbar-thumb-horizontal'}
380
+ onMouseDown={this.onMouseDownHorizontal.bind(this)}
381
+ ref={(e) => e && (this.thumbH = e)}
382
+ />
383
+ </div>
384
+ <div className={styles['scroll-vertical']}>
385
+ <div
386
+ className={styles['track-vertical']}
387
+ ref={(e) => e && (this.trackV = e)}
388
+ onMouseDown={this.onMouseDownVertical.bind(this)}
389
+ />
390
+ <div
391
+ className={'kt-editor-scrollbar-thumb-vertical'}
392
+ onMouseDown={this.onMouseDownVertical.bind(this)}
393
+ ref={(e) => e && (this.thumbV = e)}
394
+ />
395
+ </div>
396
+ </div>
397
+ );
398
+ }
399
+ }
@@ -808,7 +808,12 @@ export class EditorContribution
808
808
  return;
809
809
  }
810
810
 
811
- return this.editorDocumentModelService.getModelReference(uri)?.instance.encoding;
811
+ const ref = this.editorDocumentModelService.getModelDescription(uri);
812
+ if (!ref) {
813
+ return;
814
+ }
815
+
816
+ return ref.encoding;
812
817
  },
813
818
  });
814
819
 
@@ -832,8 +837,8 @@ export class EditorContribution
832
837
 
833
838
  const provider = await this.contentRegistry.getProvider(uri);
834
839
  const guessedEncoding = await provider?.guessEncoding?.(uri);
835
- const ref = this.editorDocumentModelService.getModelReference(uri);
836
- const currentEncoding = documentModel?.encoding ?? ref?.instance.encoding;
840
+ const ref = this.editorDocumentModelService.getModelDescription(uri);
841
+ const currentEncoding = documentModel?.encoding ?? ref?.encoding;
837
842
 
838
843
  let matchIndex: number | undefined;
839
844
  const encodingItems: QuickPickItem<string>[] = Object.keys(SUPPORTED_ENCODINGS)
@@ -48,6 +48,7 @@
48
48
  position: absolute;
49
49
  width: 100%;
50
50
  height: 100%;
51
+ pointer-events: none;
51
52
  }
52
53
  .kt_editor_tabs {
53
54
  display: flex;
@@ -73,7 +74,7 @@
73
74
  left: 0;
74
75
  position: absolute;
75
76
  display: block;
76
- z-index: 0;
77
+ z-index: var(--stacking-level-background, 0);
77
78
  }
78
79
  &::after {
79
80
  content: '';
@@ -84,7 +85,7 @@
84
85
  left: 0;
85
86
  position: absolute;
86
87
  display: block;
87
- z-index: 0;
88
+ z-index: var(--stacking-level-background, 0);
88
89
  }
89
90
  .editor_action_wrapper {
90
91
  margin-left: 8px;
@@ -132,12 +133,6 @@
132
133
  }
133
134
  }
134
135
 
135
- .kt_editor_tabs_scroll_wrapper {
136
- flex-grow: 1;
137
- width: 100%;
138
- position: relative;
139
- }
140
-
141
136
  .kt_editor_tabs_scroll {
142
137
  overflow-y: hidden;
143
138
  :global(.loading_indicator) {
@@ -175,7 +170,7 @@
175
170
  left: 0;
176
171
  position: absolute;
177
172
  display: block;
178
- z-index: 0;
173
+ z-index: var(--stacking-level-background, 0);
179
174
  }
180
175
  }
181
176
  }
@@ -184,7 +179,7 @@
184
179
  }
185
180
  .kt_editor_tabs_content {
186
181
  overflow-y: hidden;
187
- display: inline-flex;
182
+ display: flex;
188
183
  position: relative;
189
184
  height: 100%;
190
185
  &.kt_on_drag_over {
@@ -197,8 +192,6 @@
197
192
  display: flex;
198
193
  position: relative;
199
194
  align-items: center;
200
- flex-shrink: 1;
201
- flex-grow: 1;
202
195
  padding: 0 12px;
203
196
  border-right: 1px solid var(--tab-border);
204
197
  height: 100%;
@@ -209,7 +202,6 @@
209
202
  color: var(--tab-inactiveForeground);
210
203
  background: var(--tab-inactiveBackground);
211
204
  border-top: 1px solid transparent;
212
- box-sizing: border-box;
213
205
  z-index: 1;
214
206
  word-break: keep-all;
215
207
  white-space: nowrap;
@@ -304,7 +296,7 @@
304
296
  position: relative;
305
297
  background: var(--tab-activeBackground);
306
298
  color: var(--tab-activeForeground);
307
- z-index: 11;
299
+ z-index: var(--stacking-level-editor-tabbar-current, 11);
308
300
  &::before {
309
301
  position: absolute;
310
302
  content: '';
@@ -312,7 +304,7 @@
312
304
  width: 100%;
313
305
  top: -1px;
314
306
  left: 0;
315
- z-index: 999;
307
+ z-index: var(--stacking-level-overlay, 800);
316
308
  background-color: var(--tab-activeBorderTop);
317
309
  }
318
310
  .dirty {
@@ -348,7 +340,7 @@
348
340
  }
349
341
 
350
342
  .editorGroupHeader {
351
- z-index: 0;
343
+ z-index: var(--stacking-level-workbench, 1);
352
344
  position: relative;
353
345
  }
354
346
 
@@ -489,7 +481,7 @@
489
481
  .overlay-shadow();
490
482
  border-radius: 2px;
491
483
  padding: 5px 10px;
492
- z-index: 10001;
484
+ z-index: var(--stacking-level-overlay-top, 1000);
493
485
  white-space: nowrap;
494
486
  .editor_action_tip_close {
495
487
  cursor: pointer;
@@ -17,8 +17,10 @@ import {
17
17
  PreferenceService,
18
18
  URI,
19
19
  View,
20
+ renderView,
20
21
  useDesignStyles,
21
22
  useDisposable,
23
+ usePreference,
22
24
  } from '@opensumi/ide-core-browser';
23
25
  import {
24
26
  IResizeHandleDelegate,
@@ -241,7 +243,6 @@ const EditorEmptyComponent: React.FC<{
241
243
  export const EditorGroupView = observer(({ group }: { group: EditorGroup }) => {
242
244
  const groupWrapperRef = React.useRef<HTMLElement | null>();
243
245
 
244
- const preferenceService = useInjectable(PreferenceService) as PreferenceService;
245
246
  const [isEmpty, setIsEmpty] = React.useState(group.resources.length === 0);
246
247
  const styles_kt_editor_group = useDesignStyles(styles.kt_editor_group, 'kt_editor_group');
247
248
 
@@ -263,20 +264,7 @@ export const EditorGroupView = observer(({ group }: { group: EditorGroup }) => {
263
264
  };
264
265
  }, []);
265
266
 
266
- const [showActionWhenGroupEmpty, setShowActionWhenGroupEmpty] = React.useState(
267
- () => !!preferenceService.get<boolean>('editor.showActionWhenGroupEmpty'),
268
- );
269
-
270
- useDisposable(
271
- () => [
272
- preferenceService.onPreferenceChanged((change) => {
273
- if (change.preferenceName === 'editor.showActionWhenGroupEmpty') {
274
- setShowActionWhenGroupEmpty(!!change.newValue);
275
- }
276
- }),
277
- ],
278
- [],
279
- );
267
+ const showActionWhenGroupEmpty = usePreference('editor.showActionWhenGroupEmpty', false);
280
268
 
281
269
  const componentRegistry = useInjectable<ComponentRegistry>(ComponentRegistry);
282
270
 
@@ -314,12 +302,7 @@ export const EditorGroupView = observer(({ group }: { group: EditorGroup }) => {
314
302
  backgroundImage: !EmptyEditorViewConfig && editorBackgroundImage ? `url(${editorBackgroundImage})` : 'none',
315
303
  }}
316
304
  >
317
- {EmptyEditorViewConfig && ReactIs.isValidElementType(EmptyEditorViewConfig.component) ? (
318
- <ErrorBoundary>
319
- {EmptyEditorViewConfig.component &&
320
- React.createElement(EmptyEditorViewConfig.component, EmptyEditorViewConfig.initialProps)}
321
- </ErrorBoundary>
322
- ) : null}
305
+ {renderView(EmptyEditorViewConfig)}
323
306
  </div>
324
307
  )}
325
308
  </div>
@@ -47,12 +47,11 @@ export class FormattingSelector implements IFormattingSelector {
47
47
  mode: FormattingMode,
48
48
  _kind: FormattingKind,
49
49
  ): Promise<T | undefined> {
50
- const docRef = this.modelService.getModelReference(URI.from(document.uri.toJSON()));
51
- if (!docRef) {
50
+ const docDesc = this.modelService.getModelDescription(URI.from(document.uri.toJSON()));
51
+ if (!docDesc) {
52
52
  return;
53
53
  }
54
- const languageId = docRef.instance.languageId;
55
- docRef.dispose();
54
+ const languageId = docDesc.languageId;
56
55
  const preferred = this.getPreferedFormatter(languageId);
57
56
 
58
57
  const elements: { [key: string]: T } = {};
@@ -120,12 +119,11 @@ export class FormattingSelector implements IFormattingSelector {
120
119
  formatters: T[],
121
120
  document: ITextModel,
122
121
  ): Promise<T | undefined> {
123
- const docRef = this.modelService.getModelReference(URI.from(document.uri.toJSON()));
124
- if (!docRef) {
122
+ const docDesc = this.modelService.getModelDescription(URI.from(document.uri.toJSON()));
123
+ if (!docDesc) {
125
124
  return;
126
125
  }
127
- const languageId = docRef.instance.languageId;
128
- docRef.dispose();
126
+ const languageId = docDesc.languageId;
129
127
 
130
128
  const elements: { [key: string]: T } = {};
131
129
  formatters.forEach((provider: T) => {
@@ -181,8 +181,8 @@ export class FileSystemResourceProvider extends WithEventBus implements IResourc
181
181
  this.cachedFileStat.delete(resource.uri.toString());
182
182
  }
183
183
  async shouldCloseResourceWithoutConfirm(resource: IResource) {
184
- const documentModelRef = this.documentModelService.getModelReference(resource.uri, 'close-resource-check');
185
- if (documentModelRef && documentModelRef.instance.dirty) {
184
+ const documentModelRef = this.documentModelService.getModelDescription(resource.uri, 'close-resource-check');
185
+ if (documentModelRef && documentModelRef.dirty) {
186
186
  return true;
187
187
  }
188
188
  return false;
@@ -204,6 +204,7 @@ export class FileSystemResourceProvider extends WithEventBus implements IResourc
204
204
  documentModelRef.dispose();
205
205
  return false;
206
206
  } else {
207
+ documentModelRef.dispose();
207
208
  return true;
208
209
  }
209
210
  }
@@ -222,11 +223,8 @@ export class FileSystemResourceProvider extends WithEventBus implements IResourc
222
223
  }
223
224
  }
224
225
  }
225
- const documentModelRef = this.documentModelService.getModelReference(resource.uri, 'close-resource-check');
226
- if (!documentModelRef || !documentModelRef.instance.dirty) {
227
- if (documentModelRef) {
228
- documentModelRef.dispose();
229
- }
226
+ const documentModelRef = this.documentModelService.getModelDescription(resource.uri, 'close-resource-check');
227
+ if (!documentModelRef || !documentModelRef.dirty) {
230
228
  return true;
231
229
  }
232
230
 
@@ -1,5 +1,5 @@
1
1
  import { Emitter, IDisposable, IEventBus, MaybeNull } from '@opensumi/ide-core-browser';
2
- import { makeRandomHexString } from '@opensumi/ide-core-common';
2
+ import { DisposableStore, makeRandomHexString } from '@opensumi/ide-core-common';
3
3
 
4
4
  import { Direction, IEditorGroup, IEditorGroupState } from '../../common';
5
5
  import { GridResizeEvent } from '../types';
@@ -7,17 +7,19 @@ import { GridResizeEvent } from '../types';
7
7
  export const editorGridUid = new Set();
8
8
 
9
9
  export class EditorGrid implements IDisposable {
10
+ private _disposables = new DisposableStore();
11
+
10
12
  public editorGroup: IGridEditorGroup | null = null;
11
13
 
12
14
  public children: EditorGrid[] = [];
13
15
 
14
16
  public splitDirection: SplitDirection | undefined;
15
17
 
16
- protected readonly _onDidGridStateChange = new Emitter<void>();
18
+ protected readonly _onDidGridStateChange = this._disposables.add(new Emitter<void>());
17
19
 
18
20
  public readonly onDidGridStateChange = this._onDidGridStateChange.event;
19
21
 
20
- protected readonly _onDidGridAndDesendantStateChange = new Emitter<void>();
22
+ protected readonly _onDidGridAndDesendantStateChange = this._disposables.add(new Emitter<void>());
21
23
 
22
24
  public readonly onDidGridAndDesendantStateChange = this._onDidGridAndDesendantStateChange.event;
23
25
 
@@ -30,10 +32,12 @@ export class EditorGrid implements IDisposable {
30
32
  }
31
33
  this.uid = uid;
32
34
  editorGridUid.add(uid);
33
- this.onDidGridStateChange(() => {
34
- this._onDidGridAndDesendantStateChange.fire();
35
- this.parent?._onDidGridAndDesendantStateChange.fire();
36
- });
35
+ this._disposables.add(
36
+ this.onDidGridStateChange(() => {
37
+ this._onDidGridAndDesendantStateChange.fire();
38
+ this.parent?._onDidGridAndDesendantStateChange.fire();
39
+ }),
40
+ );
37
41
  }
38
42
 
39
43
  setEditorGroup(editorGroup: IGridEditorGroup) {
@@ -106,6 +110,8 @@ export class EditorGrid implements IDisposable {
106
110
  } else {
107
111
  // 应该不会落入这里
108
112
  }
113
+
114
+ this._disposables.dispose();
109
115
  }
110
116
 
111
117
  public replaceBy(target: EditorGrid) {