forked from arduino/arduino-ide
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmonaco-editor-provider.ts
99 lines (93 loc) · 3.31 KB
/
monaco-editor-provider.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import { inject, injectable } from 'inversify';
import URI from '@theia/core/lib/common/uri';
import {
Disposable,
DisposableCollection,
} from '@theia/core/lib/common/disposable';
import { EditorServiceOverrides, MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor';
import { MonacoEditorProvider as TheiaMonacoEditorProvider } from '@theia/monaco/lib/browser/monaco-editor-provider';
import { SketchesServiceClientImpl } from '../../../common/protocol/sketches-service-client-impl';
import * as monaco from '@theia/monaco-editor-core';
import type { ReferencesModel } from '@theia/monaco-editor-core/esm/vs/editor/contrib/gotoSymbol/browser/referencesModel';
type CancelablePromise = Promise<ReferencesModel> & {
cancel: () => void;
};
interface EditorFactory {
(
override: EditorServiceOverrides,
toDispose: DisposableCollection
): Promise<MonacoEditor>;
}
@injectable()
export class MonacoEditorProvider extends TheiaMonacoEditorProvider {
@inject(SketchesServiceClientImpl)
protected readonly sketchesServiceClient: SketchesServiceClientImpl;
protected async doCreateEditor(
uri: URI,
factory: EditorFactory
): Promise<MonacoEditor> {
const editor = await super.doCreateEditor(uri, factory);
const toDispose = new DisposableCollection();
toDispose.push(this.installCustomReferencesController(editor));
toDispose.push(editor.onDispose(() => toDispose.dispose()));
return editor;
}
private installCustomReferencesController(editor: MonacoEditor): Disposable {
const control = editor.getControl();
const referencesController: any = control.getContribution('editor.contrib.referencesController');
const originalToggleWidget = referencesController.toggleWidget;
const toDispose = new DisposableCollection();
const toDisposeBeforeToggleWidget = new DisposableCollection();
referencesController.toggleWidget = (
range: monaco.Range,
modelPromise: CancelablePromise,
peekMode: boolean
) => {
toDisposeBeforeToggleWidget.dispose();
originalToggleWidget.bind(referencesController)(
range,
modelPromise,
peekMode
);
if (referencesController._widget) {
if ('onDidClose' in referencesController._widget) {
toDisposeBeforeToggleWidget.push(
(referencesController._widget as any).onDidClose(() =>
toDisposeBeforeToggleWidget.dispose()
)
);
}
const preview = (referencesController._widget as any)
._preview as monaco.editor.ICodeEditor;
if (preview) {
toDisposeBeforeToggleWidget.push(
preview.onDidChangeModel(() => this.updateReadOnlyState(preview))
);
this.updateReadOnlyState(preview);
}
}
};
toDispose.push(
Disposable.create(() => toDisposeBeforeToggleWidget.dispose())
);
toDispose.push(
Disposable.create(
() => (referencesController.toggleWidget = originalToggleWidget)
)
);
return toDispose;
}
private updateReadOnlyState(
editor: monaco.editor.ICodeEditor | undefined
): void {
if (!editor) {
return;
}
const model = editor.getModel();
if (!model) {
return;
}
const readOnly = this.sketchesServiceClient.isReadOnly(model.uri);
editor.updateOptions({ readOnly });
}
}