@opensumi/ide-editor 2.27.3-rc-1714116491.0 → 2.27.3-rc-1714982362.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.
- package/lib/browser/doc-model/editor-document-model-service.d.ts +3 -1
- package/lib/browser/doc-model/editor-document-model-service.d.ts.map +1 -1
- package/lib/browser/doc-model/editor-document-model-service.js +6 -1
- package/lib/browser/doc-model/editor-document-model-service.js.map +1 -1
- package/lib/browser/doc-model/types.d.ts +1 -0
- package/lib/browser/doc-model/types.d.ts.map +1 -1
- package/lib/browser/doc-model/types.js.map +1 -1
- package/lib/browser/editor-collection.service.d.ts +6 -6
- package/lib/browser/editor-collection.service.d.ts.map +1 -1
- package/lib/browser/editor-collection.service.js.map +1 -1
- package/lib/browser/editor-electron.contribution.d.ts +2 -2
- package/lib/browser/editor-electron.contribution.d.ts.map +1 -1
- package/lib/browser/editor-electron.contribution.js +1 -1
- package/lib/browser/editor-electron.contribution.js.map +1 -1
- package/lib/browser/editor.context.d.ts +7 -0
- package/lib/browser/editor.context.d.ts.map +1 -0
- package/lib/browser/editor.context.js +10 -0
- package/lib/browser/editor.context.js.map +1 -0
- package/lib/browser/editor.contribution.d.ts.map +1 -1
- package/lib/browser/editor.contribution.js +0 -5
- package/lib/browser/editor.contribution.js.map +1 -1
- package/lib/browser/editor.decoration.service.d.ts +12 -1
- package/lib/browser/editor.decoration.service.d.ts.map +1 -1
- package/lib/browser/editor.decoration.service.js +59 -30
- package/lib/browser/editor.decoration.service.js.map +1 -1
- package/lib/browser/editor.module.less +0 -54
- package/lib/browser/editor.view.d.ts.map +1 -1
- package/lib/browser/editor.view.js +70 -51
- package/lib/browser/editor.view.js.map +1 -1
- package/lib/browser/hooks/useEditor.d.ts +4 -0
- package/lib/browser/hooks/useEditor.d.ts.map +1 -0
- package/lib/browser/hooks/useEditor.js +31 -0
- package/lib/browser/hooks/useEditor.js.map +1 -0
- package/lib/browser/hooks/useInMergeChanges.d.ts +3 -0
- package/lib/browser/hooks/useInMergeChanges.d.ts.map +1 -0
- package/lib/browser/hooks/useInMergeChanges.js +27 -0
- package/lib/browser/hooks/useInMergeChanges.js.map +1 -0
- package/lib/browser/merge-conflict/conflict-parser.d.ts +46 -0
- package/lib/browser/merge-conflict/conflict-parser.d.ts.map +1 -0
- package/lib/browser/merge-conflict/conflict-parser.js +209 -0
- package/lib/browser/merge-conflict/conflict-parser.js.map +1 -0
- package/lib/browser/merge-conflict/index.d.ts +3 -0
- package/lib/browser/merge-conflict/index.d.ts.map +1 -0
- package/lib/browser/merge-conflict/index.js +6 -0
- package/lib/browser/merge-conflict/index.js.map +1 -0
- package/lib/browser/merge-conflict/types.d.ts +60 -0
- package/lib/browser/merge-conflict/types.d.ts.map +1 -0
- package/lib/browser/merge-conflict/types.js +15 -0
- package/lib/browser/merge-conflict/types.js.map +1 -0
- package/lib/browser/merge-editor/MergeEditorFloatComponents.d.ts.map +1 -1
- package/lib/browser/merge-editor/MergeEditorFloatComponents.js +73 -49
- package/lib/browser/merge-editor/MergeEditorFloatComponents.js.map +1 -1
- package/lib/browser/merge-editor/merge-editor.module.less +71 -0
- package/lib/browser/merge-editor/merge-editor.provider.d.ts.map +1 -1
- package/lib/browser/merge-editor/merge-editor.provider.js +3 -0
- package/lib/browser/merge-editor/merge-editor.provider.js.map +1 -1
- package/lib/browser/tab.view.d.ts.map +1 -1
- package/lib/browser/tab.view.js +6 -5
- package/lib/browser/tab.view.js.map +1 -1
- package/lib/browser/types.d.ts +6 -0
- package/lib/browser/types.d.ts.map +1 -1
- package/lib/browser/types.js.map +1 -1
- package/lib/browser/workbench-editor.service.d.ts +1 -1
- package/lib/browser/workbench-editor.service.js +1 -1
- package/lib/common/editor.d.ts +3 -1
- package/lib/common/editor.d.ts.map +1 -1
- package/lib/common/editor.js.map +1 -1
- package/package.json +14 -14
- package/src/browser/doc-model/editor-document-model-service.ts +11 -1
- package/src/browser/doc-model/types.ts +4 -0
- package/src/browser/editor-collection.service.ts +7 -7
- package/src/browser/editor-electron.contribution.ts +1 -2
- package/src/browser/editor.context.ts +11 -0
- package/src/browser/editor.contribution.ts +0 -6
- package/src/browser/editor.decoration.service.ts +75 -34
- package/src/browser/editor.module.less +0 -54
- package/src/browser/editor.view.tsx +102 -77
- package/src/browser/hooks/useEditor.ts +34 -0
- package/src/browser/hooks/useInMergeChanges.ts +30 -0
- package/src/browser/merge-conflict/conflict-parser.ts +323 -0
- package/src/browser/merge-conflict/index.ts +2 -0
- package/src/browser/merge-conflict/types.ts +73 -0
- package/src/browser/merge-editor/MergeEditorFloatComponents.tsx +111 -73
- package/src/browser/merge-editor/merge-editor.module.less +71 -0
- package/src/browser/merge-editor/merge-editor.provider.ts +3 -0
- package/src/browser/tab.view.tsx +7 -6
- package/src/browser/types.ts +8 -0
- package/src/browser/workbench-editor.service.ts +1 -1
- package/src/common/editor.ts +3 -1
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import * as monaco from '@opensumi/ide-monaco';
|
|
2
|
+
|
|
3
|
+
export interface IMergeRegion {
|
|
4
|
+
name: string;
|
|
5
|
+
header: monaco.Range;
|
|
6
|
+
content: monaco.Range;
|
|
7
|
+
decoratorContent?: monaco.Range;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const enum CommitType {
|
|
11
|
+
Current,
|
|
12
|
+
Incoming,
|
|
13
|
+
Both,
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface IExtensionConfiguration {
|
|
17
|
+
enableCodeLens: boolean;
|
|
18
|
+
enableDecorations: boolean;
|
|
19
|
+
enableEditorOverview: boolean;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface IDocumentMergeConflict extends IDocumentMergeConflictDescriptor {
|
|
23
|
+
commitEdit(type: CommitType, editor: monaco.editor.ITextModel): Thenable<boolean>;
|
|
24
|
+
applyEdit(
|
|
25
|
+
type: CommitType,
|
|
26
|
+
document: monaco.editor.ITextModel,
|
|
27
|
+
edit: { replace(range: monaco.Range, newText: string): void },
|
|
28
|
+
): void;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface IDocumentMergeConflictDescriptor {
|
|
32
|
+
[x: string]: any;
|
|
33
|
+
range: monaco.Range;
|
|
34
|
+
current: IMergeRegion;
|
|
35
|
+
incoming: IMergeRegion;
|
|
36
|
+
commonAncestors: IMergeRegion[];
|
|
37
|
+
splitter: monaco.Range;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// 存储初始化内容
|
|
41
|
+
export interface ICacheDocumentMergeConflict extends IDocumentMergeConflictDescriptor {
|
|
42
|
+
incomingContent: string;
|
|
43
|
+
currentContent: string;
|
|
44
|
+
bothContent: string;
|
|
45
|
+
aiContent?: string;
|
|
46
|
+
defaultContent: string;
|
|
47
|
+
}
|
|
48
|
+
export interface IDocumentMergeConflictTracker {
|
|
49
|
+
getConflicts(document: monaco.editor.ITextModel): PromiseLike<IDocumentMergeConflict[]>;
|
|
50
|
+
isPending(document: monaco.editor.ITextModel): boolean;
|
|
51
|
+
forget(document: monaco.editor.ITextModel): void;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface IDocumentMergeConflictTrackerService {
|
|
55
|
+
createTracker(origin: string): IDocumentMergeConflictTracker;
|
|
56
|
+
forget(document: monaco.editor.ITextModel): void;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface IDocumentMergeConflictNavigationResults {
|
|
60
|
+
canNavigate: boolean;
|
|
61
|
+
conflict?: IDocumentMergeConflict;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export enum NavigationDirection {
|
|
65
|
+
Forwards,
|
|
66
|
+
Backwards,
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export namespace AI_COMMAND {
|
|
70
|
+
const MERGE_CONFLICT = 'merge-conflict';
|
|
71
|
+
export const ACCEPT = `${MERGE_CONFLICT}.ai.accept`;
|
|
72
|
+
export const REVERT = `${MERGE_CONFLICT}.ai.revert`;
|
|
73
|
+
}
|
|
@@ -5,43 +5,65 @@ import {
|
|
|
5
5
|
AINativeConfigService,
|
|
6
6
|
CommandRegistry,
|
|
7
7
|
CommandService,
|
|
8
|
-
|
|
8
|
+
DisposableStore,
|
|
9
|
+
MERGE_CONFLICT_COMMANDS,
|
|
9
10
|
SCM_COMMANDS,
|
|
10
11
|
URI,
|
|
11
|
-
Uri,
|
|
12
12
|
localize,
|
|
13
13
|
useInjectable,
|
|
14
14
|
} from '@opensumi/ide-core-browser';
|
|
15
|
+
import { formatLocalize } from '@opensumi/ide-core-common';
|
|
16
|
+
import { MergeConflictCommands } from '@opensumi/ide-core-common/lib/commands/git';
|
|
15
17
|
|
|
16
|
-
import
|
|
18
|
+
import { useEditorDocumentModelRef } from '../hooks/useEditor';
|
|
19
|
+
import { useInMergeChanges } from '../hooks/useInMergeChanges';
|
|
20
|
+
import { DocumentMergeConflict, MergeConflictParser } from '../merge-conflict';
|
|
17
21
|
import { ReactEditorComponent } from '../types';
|
|
18
22
|
|
|
23
|
+
import styles from './merge-editor.module.less';
|
|
24
|
+
|
|
19
25
|
export const MergeEditorFloatComponents: ReactEditorComponent<{ uri: URI }> = ({ resource }) => {
|
|
20
26
|
const aiNativeConfigService = useInjectable<AINativeConfigService>(AINativeConfigService);
|
|
21
27
|
const commandService = useInjectable<CommandService>(CommandService);
|
|
22
28
|
const commandRegistry = useInjectable<CommandRegistry>(CommandRegistry);
|
|
23
|
-
const
|
|
29
|
+
const mergeConflictParser: MergeConflictParser = useInjectable(MergeConflictParser);
|
|
30
|
+
|
|
31
|
+
const editorModel = useEditorDocumentModelRef(resource.uri);
|
|
24
32
|
|
|
25
33
|
const [isVisiable, setIsVisiable] = useState(false);
|
|
34
|
+
const [conflicts, setConflicts] = useState<DocumentMergeConflict[]>([]);
|
|
26
35
|
|
|
27
|
-
const
|
|
36
|
+
const inMergeChanges = useInMergeChanges(resource.uri.toString());
|
|
28
37
|
|
|
29
38
|
useEffect(() => {
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
const disposables = new DisposableStore();
|
|
40
|
+
|
|
41
|
+
if (editorModel) {
|
|
42
|
+
const { instance } = editorModel;
|
|
43
|
+
const run = () => {
|
|
44
|
+
const conflicts = mergeConflictParser.scanDocument(instance.getMonacoModel());
|
|
45
|
+
if (conflicts.length > 0) {
|
|
46
|
+
setIsVisiable(true);
|
|
47
|
+
setConflicts(conflicts);
|
|
48
|
+
} else {
|
|
49
|
+
setIsVisiable(false);
|
|
50
|
+
setConflicts([]);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
disposables.add(
|
|
55
|
+
editorModel.instance.getMonacoModel().onDidChangeContent(() => {
|
|
56
|
+
run();
|
|
57
|
+
}),
|
|
58
|
+
);
|
|
59
|
+
run();
|
|
60
|
+
return () => {
|
|
61
|
+
disposables.dispose();
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}, [editorModel]);
|
|
43
65
|
|
|
44
|
-
const [
|
|
66
|
+
const [isAIResolving, setIsAIResolving] = useState(false);
|
|
45
67
|
const handleOpenMergeEditor = useCallback(async () => {
|
|
46
68
|
const { uri } = resource;
|
|
47
69
|
|
|
@@ -52,31 +74,35 @@ export const MergeEditorFloatComponents: ReactEditorComponent<{ uri: URI }> = ({
|
|
|
52
74
|
});
|
|
53
75
|
}, [resource]);
|
|
54
76
|
|
|
55
|
-
const
|
|
77
|
+
const isSupportAIResolve = useCallback(
|
|
56
78
|
() => aiNativeConfigService.capabilities.supportsConflictResolve,
|
|
57
79
|
[aiNativeConfigService],
|
|
58
80
|
);
|
|
59
81
|
|
|
60
|
-
const handlePrev = () => {
|
|
61
|
-
commandService.tryExecuteCommand(
|
|
62
|
-
|
|
82
|
+
const handlePrev = useCallback(() => {
|
|
83
|
+
commandService.tryExecuteCommand(MergeConflictCommands.Previous).then(() => {
|
|
84
|
+
// TODO: 编辑器向上滚动一行
|
|
85
|
+
});
|
|
86
|
+
}, []);
|
|
63
87
|
|
|
64
|
-
const handleNext = () => {
|
|
65
|
-
commandService.tryExecuteCommand(
|
|
66
|
-
|
|
88
|
+
const handleNext = useCallback(() => {
|
|
89
|
+
commandService.tryExecuteCommand(MergeConflictCommands.Next).then(() => {
|
|
90
|
+
// TODO: 编辑器向上滚动一行
|
|
91
|
+
});
|
|
92
|
+
}, []);
|
|
67
93
|
|
|
68
94
|
const handleAIResolve = useCallback(async () => {
|
|
69
|
-
|
|
70
|
-
if (
|
|
71
|
-
await commandService.executeCommand(
|
|
95
|
+
setIsAIResolving(true);
|
|
96
|
+
if (isAIResolving) {
|
|
97
|
+
await commandService.executeCommand(MERGE_CONFLICT_COMMANDS.AI_ALL_ACCEPT_STOP.id, resource.uri);
|
|
72
98
|
} else {
|
|
73
|
-
await commandService.executeCommand(
|
|
99
|
+
await commandService.executeCommand(MERGE_CONFLICT_COMMANDS.AI_ALL_ACCEPT.id, resource.uri);
|
|
74
100
|
}
|
|
75
|
-
|
|
76
|
-
}, [resource,
|
|
101
|
+
setIsAIResolving(false);
|
|
102
|
+
}, [resource, isAIResolving]);
|
|
77
103
|
|
|
78
104
|
const handleReset = useCallback(() => {
|
|
79
|
-
commandService.executeCommand(
|
|
105
|
+
commandService.executeCommand(MERGE_CONFLICT_COMMANDS.ALL_RESET.id, resource.uri);
|
|
80
106
|
}, [resource]);
|
|
81
107
|
|
|
82
108
|
if (!isVisiable) {
|
|
@@ -85,50 +111,62 @@ export const MergeEditorFloatComponents: ReactEditorComponent<{ uri: URI }> = ({
|
|
|
85
111
|
|
|
86
112
|
return (
|
|
87
113
|
<div className={styles.merge_editor_float_container}>
|
|
88
|
-
<div
|
|
89
|
-
|
|
90
|
-
<Icon icon={'left'} />
|
|
91
|
-
<span>{localize('mergeEditor.conflict.prev')}</span>
|
|
92
|
-
</Button>
|
|
93
|
-
<Button className={styles.merge_conflict_bottom_btn} size='large' onClick={handleNext}>
|
|
94
|
-
<span>{localize('mergeEditor.conflict.next')}</span>
|
|
95
|
-
<Icon icon={'right'} />
|
|
96
|
-
</Button>
|
|
114
|
+
<div className={styles.merge_editor_float_container_info}>
|
|
115
|
+
{formatLocalize('merge-conflicts.merge.conflict.remain', conflicts.length)}
|
|
97
116
|
</div>
|
|
98
|
-
<
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
<
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
117
|
+
<div className={styles.merge_editor_float_container_operation_bar}>
|
|
118
|
+
<div id='merge.editor.action.button.nav'>
|
|
119
|
+
<Button className={styles.merge_conflict_bottom_btn} size='default' onClick={handlePrev}>
|
|
120
|
+
<Icon icon={'left'} />
|
|
121
|
+
<span>{localize('mergeEditor.conflict.prev')}</span>
|
|
122
|
+
</Button>
|
|
123
|
+
<Button className={styles.merge_conflict_bottom_btn} size='default' onClick={handleNext}>
|
|
124
|
+
<span>{localize('mergeEditor.conflict.next')}</span>
|
|
125
|
+
<Icon icon={'right'} />
|
|
126
|
+
</Button>
|
|
127
|
+
</div>
|
|
128
|
+
<span className={styles.line_vertical}></span>
|
|
129
|
+
{inMergeChanges && (
|
|
130
|
+
<Button
|
|
131
|
+
id='merge.editor.open.tradition'
|
|
132
|
+
className={styles.merge_conflict_bottom_btn}
|
|
133
|
+
size='default'
|
|
134
|
+
onClick={handleOpenMergeEditor}
|
|
135
|
+
>
|
|
136
|
+
<Icon icon={'swap'} />
|
|
137
|
+
<span>{localize('mergeEditor.open.3way')}</span>
|
|
138
|
+
</Button>
|
|
139
|
+
)}
|
|
113
140
|
<Button
|
|
114
|
-
id='merge.editor.
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
onClick={
|
|
141
|
+
id='merge.editor.rest'
|
|
142
|
+
className={styles.merge_conflict_bottom_btn}
|
|
143
|
+
size='default'
|
|
144
|
+
onClick={handleReset}
|
|
118
145
|
>
|
|
119
|
-
{
|
|
120
|
-
|
|
121
|
-
<Icon icon={'circle-pause'} />
|
|
122
|
-
<span>{localize('mergeEditor.conflict.resolve.all.stop')}</span>
|
|
123
|
-
</>
|
|
124
|
-
) : (
|
|
125
|
-
<>
|
|
126
|
-
<Icon icon={'magic-wand'} />
|
|
127
|
-
<span>{localize('mergeEditor.conflict.resolve.all')}</span>
|
|
128
|
-
</>
|
|
129
|
-
)}
|
|
146
|
+
<Icon icon={'discard'} />
|
|
147
|
+
<span>{localize('mergeEditor.reset')}</span>
|
|
130
148
|
</Button>
|
|
131
|
-
|
|
149
|
+
{isSupportAIResolve() && (
|
|
150
|
+
<Button
|
|
151
|
+
id='merge.editor.conflict.resolve.all'
|
|
152
|
+
size='default'
|
|
153
|
+
className={`${styles.merge_conflict_bottom_btn} ${styles.magic_btn}`}
|
|
154
|
+
onClick={handleAIResolve}
|
|
155
|
+
>
|
|
156
|
+
{isAIResolving ? (
|
|
157
|
+
<>
|
|
158
|
+
<Icon icon={'circle-pause'} />
|
|
159
|
+
<span>{localize('mergeEditor.conflict.ai.resolve.all.stop')}</span>
|
|
160
|
+
</>
|
|
161
|
+
) : (
|
|
162
|
+
<>
|
|
163
|
+
<Icon icon={'magic-wand'} />
|
|
164
|
+
<span>{localize('mergeEditor.conflict.ai.resolve.all')}</span>
|
|
165
|
+
</>
|
|
166
|
+
)}
|
|
167
|
+
</Button>
|
|
168
|
+
)}
|
|
169
|
+
</div>
|
|
132
170
|
</div>
|
|
133
171
|
);
|
|
134
172
|
};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
.merge_editor_float_container {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: column;
|
|
4
|
+
background: var(--kt-panelTab-activeBackground);
|
|
5
|
+
box-shadow: inset 1px 1px 3px 0px var(--kt-panelTab-border);
|
|
6
|
+
justify-content: space-between;
|
|
7
|
+
white-space: nowrap;
|
|
8
|
+
// minimap's z-index is 5
|
|
9
|
+
z-index: 6;
|
|
10
|
+
padding: 10px;
|
|
11
|
+
|
|
12
|
+
.merge_editor_float_container_info {
|
|
13
|
+
width: 100%;
|
|
14
|
+
display: flex;
|
|
15
|
+
padding-left: 20px;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.merge_editor_float_container_operation_bar {
|
|
19
|
+
width: 100%;
|
|
20
|
+
display: flex;
|
|
21
|
+
justify-content: flex-end;
|
|
22
|
+
white-space: nowrap;
|
|
23
|
+
padding-top: 4px;
|
|
24
|
+
padding-right: 20px;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.merge_conflict_bottom_btn {
|
|
28
|
+
border: 1px solid var(--kt-button-disableForeground);
|
|
29
|
+
border-radius: 8px;
|
|
30
|
+
padding: 5px 16px;
|
|
31
|
+
background: var(--editor-background);
|
|
32
|
+
color: var(--editor-foreground);
|
|
33
|
+
margin: 0 4px;
|
|
34
|
+
line-height: 22px;
|
|
35
|
+
justify-content: end;
|
|
36
|
+
white-space: nowrap;
|
|
37
|
+
cursor: pointer;
|
|
38
|
+
:global {
|
|
39
|
+
.kt-icon {
|
|
40
|
+
font-size: 12px;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
:first-child {
|
|
44
|
+
margin-right: 8px;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.magic_btn {
|
|
49
|
+
background-image: radial-gradient(circle at -21% -22%, #19cfff, #8429ff);
|
|
50
|
+
border: none;
|
|
51
|
+
font-weight: 500;
|
|
52
|
+
span {
|
|
53
|
+
color: #fff;
|
|
54
|
+
}
|
|
55
|
+
:global {
|
|
56
|
+
.kt-icon {
|
|
57
|
+
color: #fff;
|
|
58
|
+
font-size: 12px;
|
|
59
|
+
margin-right: 8px;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.line_vertical {
|
|
65
|
+
background-color: var(--design-borderColor-common);
|
|
66
|
+
width: 1px;
|
|
67
|
+
min-width: 1px;
|
|
68
|
+
height: 24px;
|
|
69
|
+
margin: 4px;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -22,6 +22,9 @@ export class MergeEditorResourceProvider extends WithEventBus implements IResour
|
|
|
22
22
|
const resultEditorUri = new URI(output);
|
|
23
23
|
const icon = this.labelService.getIcon(resultEditorUri);
|
|
24
24
|
return {
|
|
25
|
+
// 如果设置为 true,再打开时没有找到对应的 provider 会报错
|
|
26
|
+
// TODO: 需要增加一个标记,说明这个资源要在某个插件加载后才能 revive
|
|
27
|
+
supportsRevive: false,
|
|
25
28
|
name,
|
|
26
29
|
icon,
|
|
27
30
|
uri,
|
package/src/browser/tab.view.tsx
CHANGED
|
@@ -15,7 +15,6 @@ import React, {
|
|
|
15
15
|
|
|
16
16
|
import { Scrollbars } from '@opensumi/ide-components';
|
|
17
17
|
import {
|
|
18
|
-
AppConfig,
|
|
19
18
|
ConfigContext,
|
|
20
19
|
Disposable,
|
|
21
20
|
DisposableCollection,
|
|
@@ -32,6 +31,7 @@ import {
|
|
|
32
31
|
useDesignStyles,
|
|
33
32
|
} from '@opensumi/ide-core-browser';
|
|
34
33
|
import { InlineMenuBar } from '@opensumi/ide-core-browser/lib/components/actions';
|
|
34
|
+
import { LayoutViewSizeConfig } from '@opensumi/ide-core-browser/lib/layout/constants';
|
|
35
35
|
import { VIEW_CONTAINERS } from '@opensumi/ide-core-browser/lib/layout/view-id';
|
|
36
36
|
import { IMenuRegistry, MenuId } from '@opensumi/ide-core-browser/lib/menu/next';
|
|
37
37
|
import { useInjectable, useUpdateOnEventBusEvent } from '@opensumi/ide-core-browser/lib/react-hooks';
|
|
@@ -70,7 +70,7 @@ export const Tabs = ({ group }: ITabsProps) => {
|
|
|
70
70
|
const preferenceService = useInjectable<PreferenceService>(PreferenceService);
|
|
71
71
|
const menuRegistry = useInjectable<IMenuRegistry>(IMenuRegistry);
|
|
72
72
|
const editorTabService = useInjectable<IEditorTabService>(IEditorTabService);
|
|
73
|
-
const
|
|
73
|
+
const layoutViewSize = useInjectable<LayoutViewSizeConfig>(LayoutViewSizeConfig);
|
|
74
74
|
|
|
75
75
|
const styles_tab_right = useDesignStyles(styles.tab_right, 'tab_right');
|
|
76
76
|
const styles_close_tab = useDesignStyles(styles.close_tab, 'close_tab');
|
|
@@ -415,8 +415,8 @@ export const Tabs = ({ group }: ITabsProps) => {
|
|
|
415
415
|
})}
|
|
416
416
|
style={
|
|
417
417
|
wrapMode && i === group.resources.length - 1
|
|
418
|
-
? { marginRight: lastMarginRight, height:
|
|
419
|
-
: { height:
|
|
418
|
+
? { marginRight: lastMarginRight, height: layoutViewSize.editorTabsHeight }
|
|
419
|
+
: { height: layoutViewSize.editorTabsHeight }
|
|
420
420
|
}
|
|
421
421
|
onContextMenu={(event) => {
|
|
422
422
|
tabTitleMenuService.show(event.nativeEvent.x, event.nativeEvent.y, resource && resource.uri, group);
|
|
@@ -529,7 +529,8 @@ export const EditorActions = forwardRef<HTMLDivElement, IEditorActionsProps>(
|
|
|
529
529
|
|
|
530
530
|
const editorActionRegistry = useInjectable<IEditorActionRegistry>(IEditorActionRegistry);
|
|
531
531
|
const editorService: WorkbenchEditorServiceImpl = useInjectable(WorkbenchEditorService);
|
|
532
|
-
const
|
|
532
|
+
const layoutViewSize = useInjectable<LayoutViewSizeConfig>(LayoutViewSizeConfig);
|
|
533
|
+
|
|
533
534
|
const menu = editorActionRegistry.getMenu(group);
|
|
534
535
|
const [hasFocus, setHasFocus] = useState<boolean>(editorService.currentEditorGroup === group);
|
|
535
536
|
const [args, setArgs] = useState<[URI, IEditorGroup, MaybeNull<URI>] | undefined>(acquireArgs());
|
|
@@ -561,7 +562,7 @@ export const EditorActions = forwardRef<HTMLDivElement, IEditorActionsProps>(
|
|
|
561
562
|
<div
|
|
562
563
|
ref={ref}
|
|
563
564
|
className={cls(styles_editor_actions, className)}
|
|
564
|
-
style={{ height:
|
|
565
|
+
style={{ height: layoutViewSize.editorTabsHeight }}
|
|
565
566
|
>
|
|
566
567
|
<InlineMenuBar<URI, IEditorGroup, MaybeNull<URI>>
|
|
567
568
|
menus={menu}
|
package/src/browser/types.ts
CHANGED
|
@@ -275,6 +275,14 @@ export interface IThemedCssStyle extends IDisposable {
|
|
|
275
275
|
overviewRulerColor?: string | IThemeColor;
|
|
276
276
|
}
|
|
277
277
|
|
|
278
|
+
export interface IThemedCssStyleCollection {
|
|
279
|
+
default: IThemedCssStyle;
|
|
280
|
+
light: IThemedCssStyle | null;
|
|
281
|
+
dark: IThemedCssStyle | null;
|
|
282
|
+
|
|
283
|
+
dispose(): void;
|
|
284
|
+
}
|
|
285
|
+
|
|
278
286
|
export const IEditorDecorationCollectionService = Symbol('IEditorDecorationCollectionService');
|
|
279
287
|
|
|
280
288
|
export class EditorSelectionChangeEvent extends BasicEvent<IEditorSelectionChangeEventPayload> {}
|
package/src/common/editor.ts
CHANGED
|
@@ -149,7 +149,7 @@ export enum EditorType {
|
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
/**
|
|
152
|
-
* 一个IEditor代表了一个最小的编辑器单元,可以是CodeEditor中的一个,也可以是DiffEditor中的两个
|
|
152
|
+
* 一个IEditor代表了一个最小的编辑器单元,可以是 CodeEditor 中的一个,也可以是 DiffEditor 中的两个
|
|
153
153
|
*/
|
|
154
154
|
export interface IEditor {
|
|
155
155
|
/**
|
|
@@ -567,6 +567,8 @@ export interface IResourceOpenOptions {
|
|
|
567
567
|
|
|
568
568
|
/**
|
|
569
569
|
* @deprecated use focus instead
|
|
570
|
+
*
|
|
571
|
+
* An optional flag that when `true` will stop the editor from taking focus.
|
|
570
572
|
*/
|
|
571
573
|
preserveFocus?: boolean;
|
|
572
574
|
|