@opensumi/ide-monaco-enhance 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.
- package/lib/browser/folded-code-widget.js +21 -21
- package/lib/browser/folded-code-widget.js.map +1 -1
- package/lib/browser/module.js.map +1 -1
- package/lib/browser/peek-view.d.ts.map +1 -1
- package/lib/browser/peek-view.js.map +1 -1
- package/package.json +9 -8
- package/src/browser/folded-code-widget.ts +122 -0
- package/src/browser/index.ts +1 -0
- package/src/browser/module.ts +12 -0
- package/src/browser/peek-view.ts +131 -0
- package/src/browser/styles.module.less +3 -0
- package/src/browser/zone-widget.ts +399 -0
- package/src/common/index.ts +3 -0
- package/src/index.ts +1 -0
|
@@ -6,15 +6,15 @@ const orderBy_1 = tslib_1.__importDefault(require("lodash/orderBy"));
|
|
|
6
6
|
const ide_core_common_1 = require("@opensumi/ide-core-common");
|
|
7
7
|
const zone_widget_1 = require("./zone-widget");
|
|
8
8
|
class FoldedCodeWidget extends zone_widget_1.ZoneWidget {
|
|
9
|
+
_fillContainer(container) { }
|
|
10
|
+
applyClass() { }
|
|
11
|
+
applyStyle() { }
|
|
9
12
|
constructor(editor, index, provider) {
|
|
10
13
|
super(editor);
|
|
11
14
|
this.editor = editor;
|
|
12
15
|
this.index = index;
|
|
13
16
|
this.provider = provider;
|
|
14
17
|
}
|
|
15
|
-
_fillContainer(container) { }
|
|
16
|
-
applyClass() { }
|
|
17
|
-
applyStyle() { }
|
|
18
18
|
show(where) {
|
|
19
19
|
super.show({
|
|
20
20
|
startLineNumber: where.startLineNumber,
|
|
@@ -27,24 +27,6 @@ class FoldedCodeWidget extends zone_widget_1.ZoneWidget {
|
|
|
27
27
|
}
|
|
28
28
|
exports.FoldedCodeWidget = FoldedCodeWidget;
|
|
29
29
|
class FoldedCodeWidgetGroup extends ide_core_common_1.Disposable {
|
|
30
|
-
constructor(editor, provider) {
|
|
31
|
-
super();
|
|
32
|
-
this.editor = editor;
|
|
33
|
-
this.provider = provider;
|
|
34
|
-
this.widgets = [];
|
|
35
|
-
this.editor.updateOptions({
|
|
36
|
-
folding: false,
|
|
37
|
-
readOnly: true,
|
|
38
|
-
});
|
|
39
|
-
this.addDispose({
|
|
40
|
-
dispose: () => {
|
|
41
|
-
this.widgets.forEach((widget) => {
|
|
42
|
-
widget.hide();
|
|
43
|
-
widget.dispose();
|
|
44
|
-
});
|
|
45
|
-
},
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
30
|
_orderRanges(ranges) {
|
|
49
31
|
return (0, orderBy_1.default)(ranges, ['startLineNumber'], ['asc']);
|
|
50
32
|
}
|
|
@@ -72,6 +54,24 @@ class FoldedCodeWidgetGroup extends ide_core_common_1.Disposable {
|
|
|
72
54
|
}
|
|
73
55
|
return another;
|
|
74
56
|
}
|
|
57
|
+
constructor(editor, provider) {
|
|
58
|
+
super();
|
|
59
|
+
this.editor = editor;
|
|
60
|
+
this.provider = provider;
|
|
61
|
+
this.widgets = [];
|
|
62
|
+
this.editor.updateOptions({
|
|
63
|
+
folding: false,
|
|
64
|
+
readOnly: true,
|
|
65
|
+
});
|
|
66
|
+
this.addDispose({
|
|
67
|
+
dispose: () => {
|
|
68
|
+
this.widgets.forEach((widget) => {
|
|
69
|
+
widget.hide();
|
|
70
|
+
widget.dispose();
|
|
71
|
+
});
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
75
|
fold(showRanges) {
|
|
76
76
|
if (!this.editor.getModel()) {
|
|
77
77
|
throw new Error('Can not fold a editor without any text model');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folded-code-widget.js","sourceRoot":"","sources":["../../src/browser/folded-code-widget.ts"],"names":[],"mappings":";;;;AAAA,qEAAqC;AAErC,+DAAuD;AAMvD,+CAA2C;AAE3C,MAAa,gBAAiB,SAAQ,wBAAU;
|
|
1
|
+
{"version":3,"file":"folded-code-widget.js","sourceRoot":"","sources":["../../src/browser/folded-code-widget.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/browser/module.ts"],"names":[],"mappings":";;;;AAAA,qCAAoD;AACpD,iEAA0F;AAG1F,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IAC7B,UAAU,KAAI,CAAC;CAChB,CAAA;AAFK,yBAAyB;IAD9B,IAAA,yBAAM,EAAC,wCAAqB,CAAC;GACxB,yBAAyB,CAE9B;
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/browser/module.ts"],"names":[],"mappings":";;;;AAAA,qCAAoD;AACpD,iEAA0F;AAG1F,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IAC7B,UAAU,KAAI,CAAC;CAChB,CAAA;AAFK,yBAAyB;IAD9B,IAAA,yBAAM,EAAC,wCAAqB,CAAC;GACxB,yBAAyB,CAE9B;AAGM,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,gCAAa;IAA/C;;QACL,cAAS,GAAe,CAAC,yBAAyB,CAAC,CAAC;IACtD,CAAC;CAAA,CAAA;AAFY,mBAAmB;IAD/B,IAAA,eAAU,GAAE;GACA,mBAAmB,CAE/B;AAFY,kDAAmB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peek-view.d.ts","sourceRoot":"","sources":["../../src/browser/peek-view.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"peek-view.d.ts","sourceRoot":"","sources":["../../src/browser/peek-view.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mDAAmD,CAAC;AAErF,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,gBAAiB,SAAQ,QAAQ;IAChD,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,8BAAsB,cAAe,SAAQ,UAAU;IAazC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW;IAAE,QAAQ,CAAC,OAAO,EAAE,gBAAgB;IAZtF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAC7D,QAAQ,CAAC,UAAU,6DAA0B;IAE7C,OAAO,CAAC,UAAU,CAAC,CAAO;IAE1B,SAAS,CAAC,YAAY,CAAC,EAAE,cAAc,CAAC;IACxC,SAAS,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC;IACxC,SAAS,CAAC,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAC1C,SAAS,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC;IACrC,SAAS,CAAC,iBAAiB,CAAC,EAAE,cAAc,CAAC;IAC7C,SAAS,CAAC,YAAY,CAAC,EAAE,cAAc,CAAC;gBAET,MAAM,EAAE,WAAW,EAAW,OAAO,GAAE,gBAAqB;IAI3E,OAAO,IAAI,IAAI;IAQ/B,SAAS,CAAC,cAAc,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;cAgBtC,SAAS,CAAC,SAAS,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA4CzF,SAAS,CAAC,cAAc,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;IAEtD,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC,SAAS,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAE/E,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;IAE1D;;OAEG;IACH,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAEzC,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI;IAcjE,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAUzC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peek-view.js","sourceRoot":"","sources":["../../src/browser/peek-view.ts"],"names":[],"mappings":";;;AAAA,iEAA6D;
|
|
1
|
+
{"version":3,"file":"peek-view.js","sourceRoot":"","sources":["../../src/browser/peek-view.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opensumi/ide-monaco-enhance",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.22.0",
|
|
4
4
|
"files": [
|
|
5
|
-
"lib"
|
|
5
|
+
"lib",
|
|
6
|
+
"src"
|
|
6
7
|
],
|
|
7
8
|
"license": "MIT",
|
|
8
9
|
"main": "lib/index.js",
|
|
9
10
|
"typings": "lib/index.d.ts",
|
|
10
11
|
"scripts": {
|
|
11
|
-
"prepublishOnly": "
|
|
12
|
+
"prepublishOnly": "yarn run build",
|
|
12
13
|
"build": "tsc --build ../../configs/ts/references/tsconfig.monaco-enhance.json"
|
|
13
14
|
},
|
|
14
15
|
"repository": {
|
|
@@ -16,12 +17,12 @@
|
|
|
16
17
|
"url": "git@github.com:opensumi/core.git"
|
|
17
18
|
},
|
|
18
19
|
"dependencies": {
|
|
19
|
-
"@opensumi/ide-core-common": "2.
|
|
20
|
+
"@opensumi/ide-core-common": "2.22.0"
|
|
20
21
|
},
|
|
21
22
|
"devDependencies": {
|
|
22
|
-
"@opensumi/ide-core-browser": "2.
|
|
23
|
-
"@opensumi/ide-dev-tool": "
|
|
24
|
-
"@opensumi/ide-monaco": "2.
|
|
23
|
+
"@opensumi/ide-core-browser": "2.22.0",
|
|
24
|
+
"@opensumi/ide-dev-tool": "1.3.1",
|
|
25
|
+
"@opensumi/ide-monaco": "2.22.0"
|
|
25
26
|
},
|
|
26
|
-
"gitHead": "
|
|
27
|
+
"gitHead": "927717e1c60f9cf5f01622fd51085b318a175eeb"
|
|
27
28
|
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import orderBy from 'lodash/orderBy';
|
|
2
|
+
|
|
3
|
+
import { Disposable } from '@opensumi/ide-core-common';
|
|
4
|
+
import type { ICodeEditor as IMonacoCodeEditor } from '@opensumi/ide-monaco/lib/browser/monaco-api/types';
|
|
5
|
+
import * as monaco from '@opensumi/monaco-editor-core/esm/vs/editor/editor.api';
|
|
6
|
+
|
|
7
|
+
import { IFoldedCodeWidgetContentProvider } from '../common';
|
|
8
|
+
|
|
9
|
+
import { ZoneWidget } from './zone-widget';
|
|
10
|
+
|
|
11
|
+
export class FoldedCodeWidget extends ZoneWidget {
|
|
12
|
+
protected _fillContainer(container: HTMLElement): void {}
|
|
13
|
+
protected applyClass() {}
|
|
14
|
+
|
|
15
|
+
protected applyStyle() {}
|
|
16
|
+
|
|
17
|
+
constructor(
|
|
18
|
+
protected readonly editor: IMonacoCodeEditor,
|
|
19
|
+
protected readonly index: number,
|
|
20
|
+
protected provider: IFoldedCodeWidgetContentProvider,
|
|
21
|
+
) {
|
|
22
|
+
super(editor);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
show(where: monaco.IRange) {
|
|
26
|
+
super.show(
|
|
27
|
+
{
|
|
28
|
+
startLineNumber: where.startLineNumber,
|
|
29
|
+
endLineNumber: where.startLineNumber,
|
|
30
|
+
startColumn: where.startColumn,
|
|
31
|
+
endColumn: where.endColumn,
|
|
32
|
+
},
|
|
33
|
+
1,
|
|
34
|
+
);
|
|
35
|
+
this.provider.renderInforOverlay(this._container, this.index);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export class FoldedCodeWidgetGroup extends Disposable {
|
|
40
|
+
protected widgets: Array<FoldedCodeWidget> = [];
|
|
41
|
+
|
|
42
|
+
private _orderRanges(ranges: monaco.IRange[]) {
|
|
43
|
+
return orderBy(ranges, ['startLineNumber'], ['asc']);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
private _split(ranges: monaco.IRange[], end: number) {
|
|
47
|
+
const another: monaco.IRange[] = [];
|
|
48
|
+
let start = 1;
|
|
49
|
+
|
|
50
|
+
ranges.forEach(({ startLineNumber, endLineNumber }) => {
|
|
51
|
+
if (startLineNumber !== 1) {
|
|
52
|
+
another.push({
|
|
53
|
+
startLineNumber: start,
|
|
54
|
+
endLineNumber: startLineNumber - 1,
|
|
55
|
+
startColumn: 1,
|
|
56
|
+
endColumn: 1,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
start = endLineNumber + 1;
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
if (start < end) {
|
|
63
|
+
another.push({
|
|
64
|
+
startLineNumber: start,
|
|
65
|
+
endLineNumber: end,
|
|
66
|
+
startColumn: 1,
|
|
67
|
+
endColumn: 1,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return another;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
constructor(protected readonly editor: IMonacoCodeEditor, protected provider: IFoldedCodeWidgetContentProvider) {
|
|
75
|
+
super();
|
|
76
|
+
|
|
77
|
+
this.editor.updateOptions({
|
|
78
|
+
folding: false,
|
|
79
|
+
readOnly: true,
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
this.addDispose({
|
|
83
|
+
dispose: () => {
|
|
84
|
+
this.widgets.forEach((widget) => {
|
|
85
|
+
widget.hide();
|
|
86
|
+
widget.dispose();
|
|
87
|
+
});
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
fold(showRanges: monaco.IRange[]) {
|
|
93
|
+
if (!this.editor.getModel()) {
|
|
94
|
+
throw new Error('Can not fold a editor without any text model');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const ordered = this._orderRanges(showRanges);
|
|
98
|
+
const foldRanges = this._split(ordered, this.editor.getModel()!.getLineCount());
|
|
99
|
+
(this.editor as any)._modelData.viewModel.setHiddenAreas(foldRanges);
|
|
100
|
+
|
|
101
|
+
if (ordered[0].startLineNumber !== 1) {
|
|
102
|
+
const widget = new FoldedCodeWidget(this.editor, 0, this.provider);
|
|
103
|
+
widget.show({ startLineNumber: 0, endLineNumber: 0, startColumn: 1, endColumn: 1 });
|
|
104
|
+
this.widgets.push(widget);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
ordered.forEach((range) => {
|
|
108
|
+
const widget = new FoldedCodeWidget(this.editor, this.widgets.length, this.provider);
|
|
109
|
+
widget.show({ ...range, startLineNumber: range.endLineNumber });
|
|
110
|
+
this.widgets.push(widget);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
dispose() {
|
|
115
|
+
(this.editor as any)._modelData.viewModel.setHiddenAreas([]);
|
|
116
|
+
this.widgets.forEach((widget) => {
|
|
117
|
+
widget.hide();
|
|
118
|
+
widget.dispose();
|
|
119
|
+
});
|
|
120
|
+
this.widgets = [];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './zone-widget';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Provider, Injectable } from '@opensumi/di';
|
|
2
|
+
import { BrowserModule, Domain, ClientAppContribution } from '@opensumi/ide-core-browser';
|
|
3
|
+
|
|
4
|
+
@Domain(ClientAppContribution)
|
|
5
|
+
class MonacoEnhanceContribution implements ClientAppContribution {
|
|
6
|
+
onDidStart() {}
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
@Injectable()
|
|
10
|
+
export class MonacoEnhanceModule extends BrowserModule {
|
|
11
|
+
providers: Provider[] = [MonacoEnhanceContribution];
|
|
12
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { getExternalIcon } from '@opensumi/ide-core-browser';
|
|
2
|
+
import { Emitter, Disposable } from '@opensumi/ide-core-common';
|
|
3
|
+
import type { ICodeEditor } from '@opensumi/ide-monaco/lib/browser/monaco-api/types';
|
|
4
|
+
|
|
5
|
+
import { IOptions, ZoneWidget } from './zone-widget';
|
|
6
|
+
|
|
7
|
+
export interface IPeekViewOptions extends IOptions {
|
|
8
|
+
supportOnTitleClick?: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export abstract class PeekViewWidget extends ZoneWidget {
|
|
12
|
+
private readonly _onDidClose = new Emitter<PeekViewWidget>();
|
|
13
|
+
readonly onDidClose = this._onDidClose.event;
|
|
14
|
+
|
|
15
|
+
private isDisposed?: true;
|
|
16
|
+
|
|
17
|
+
protected _headElement?: HTMLDivElement;
|
|
18
|
+
protected _primaryHeading?: HTMLElement;
|
|
19
|
+
protected _secondaryHeading?: HTMLElement;
|
|
20
|
+
protected _metaHeading?: HTMLElement;
|
|
21
|
+
protected _actionbarElement?: HTMLDivElement;
|
|
22
|
+
protected _bodyElement?: HTMLDivElement;
|
|
23
|
+
|
|
24
|
+
constructor(protected readonly editor: ICodeEditor, readonly options: IPeekViewOptions = {}) {
|
|
25
|
+
super(editor);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public override dispose(): void {
|
|
29
|
+
if (!this.isDisposed) {
|
|
30
|
+
this.isDisposed = true;
|
|
31
|
+
super.dispose();
|
|
32
|
+
this._onDidClose.fire(this);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
protected _fillContainer(container: HTMLElement): void {
|
|
37
|
+
this.setCssClass('peekview-widget');
|
|
38
|
+
|
|
39
|
+
this._headElement = document.createElement('div');
|
|
40
|
+
this._headElement.classList.add('head');
|
|
41
|
+
|
|
42
|
+
this._bodyElement = document.createElement('div');
|
|
43
|
+
this._bodyElement.classList.add('body');
|
|
44
|
+
|
|
45
|
+
this._fillHead(this._headElement);
|
|
46
|
+
this._fillBody(this._bodyElement);
|
|
47
|
+
|
|
48
|
+
container.appendChild(this._headElement);
|
|
49
|
+
container.appendChild(this._bodyElement);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
protected async _fillHead(container: HTMLElement, noCloseAction?: boolean): Promise<void> {
|
|
53
|
+
const titleElement = document.createElement('div');
|
|
54
|
+
titleElement.classList.add('peekview-title');
|
|
55
|
+
|
|
56
|
+
if ((this.options as IPeekViewOptions).supportOnTitleClick) {
|
|
57
|
+
titleElement.classList.add('clickable');
|
|
58
|
+
// handle click event
|
|
59
|
+
}
|
|
60
|
+
this._headElement!.append(titleElement);
|
|
61
|
+
|
|
62
|
+
this._fillTitleIcon(titleElement);
|
|
63
|
+
|
|
64
|
+
this._primaryHeading = document.createElement('span');
|
|
65
|
+
this._primaryHeading.classList.add('filename');
|
|
66
|
+
|
|
67
|
+
this._secondaryHeading = document.createElement('span');
|
|
68
|
+
this._secondaryHeading.classList.add('dirname');
|
|
69
|
+
|
|
70
|
+
this._metaHeading = document.createElement('span');
|
|
71
|
+
this._metaHeading.classList.add('meta');
|
|
72
|
+
|
|
73
|
+
titleElement.append(this._primaryHeading, this._secondaryHeading, this._metaHeading);
|
|
74
|
+
|
|
75
|
+
this._actionbarElement = document.createElement('div');
|
|
76
|
+
this._actionbarElement.classList.add('peekview-actions');
|
|
77
|
+
|
|
78
|
+
await this._fillActionBarOptions(this._actionbarElement);
|
|
79
|
+
|
|
80
|
+
const closeIcon = document.createElement('span');
|
|
81
|
+
closeIcon.className = `action-item ${getExternalIcon('chrome-close')}`;
|
|
82
|
+
const listenCloseClick = () => this.dispose();
|
|
83
|
+
|
|
84
|
+
closeIcon.addEventListener('click', listenCloseClick);
|
|
85
|
+
this.addDispose(
|
|
86
|
+
Disposable.create(() => {
|
|
87
|
+
closeIcon.removeEventListener('click', listenCloseClick);
|
|
88
|
+
}),
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
this._actionbarElement.append(closeIcon);
|
|
92
|
+
|
|
93
|
+
this._headElement!.append(this._actionbarElement);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
protected _fillTitleIcon(container: HTMLElement): void {}
|
|
97
|
+
|
|
98
|
+
protected abstract _fillActionBarOptions(container: HTMLElement): Promise<void>;
|
|
99
|
+
|
|
100
|
+
protected abstract _fillBody(container: HTMLElement): void;
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* 如果 supportOnTitleClick 为 true,则需要覆写该方法
|
|
104
|
+
*/
|
|
105
|
+
protected _onTitleClick(event: MouseEvent): void {}
|
|
106
|
+
|
|
107
|
+
public setTitle(primaryHeading: string, secondaryHeading?: string): void {
|
|
108
|
+
if (this._primaryHeading && this._secondaryHeading) {
|
|
109
|
+
this._primaryHeading.innerText = primaryHeading;
|
|
110
|
+
this._primaryHeading.setAttribute('title', primaryHeading);
|
|
111
|
+
if (secondaryHeading) {
|
|
112
|
+
this._secondaryHeading.innerText = secondaryHeading;
|
|
113
|
+
} else {
|
|
114
|
+
while (this._secondaryHeading.firstChild) {
|
|
115
|
+
this._secondaryHeading.firstChild.remove();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
public setMetaTitle(value: string): void {
|
|
122
|
+
if (this._metaHeading) {
|
|
123
|
+
if (value) {
|
|
124
|
+
this._metaHeading.innerText = value;
|
|
125
|
+
this._metaHeading.style.display = '';
|
|
126
|
+
} else {
|
|
127
|
+
this._metaHeading.style.display = 'none';
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
import { DomListener, IRange } from '@opensumi/ide-core-browser';
|
|
2
|
+
import { Disposable, IDisposable, Event, Emitter, uuid } from '@opensumi/ide-core-browser';
|
|
3
|
+
import type { ICodeEditor as IMonacoCodeEditor } from '@opensumi/ide-monaco/lib/browser/monaco-api/types';
|
|
4
|
+
import {
|
|
5
|
+
Sash,
|
|
6
|
+
IHorizontalSashLayoutProvider,
|
|
7
|
+
Orientation,
|
|
8
|
+
SashState,
|
|
9
|
+
ISashEvent,
|
|
10
|
+
} from '@opensumi/monaco-editor-core/esm/vs/base/browser/ui/sash/sash';
|
|
11
|
+
import { EditorOption } from '@opensumi/monaco-editor-core/esm/vs/editor/common/config/editorOptions';
|
|
12
|
+
import * as monaco from '@opensumi/monaco-editor-core/esm/vs/editor/editor.api';
|
|
13
|
+
|
|
14
|
+
export class ViewZoneDelegate implements monaco.editor.IViewZone {
|
|
15
|
+
public domNode: HTMLElement;
|
|
16
|
+
public id: string = uuid(); // A valid zone id should be greater than 0
|
|
17
|
+
public afterLineNumber: number;
|
|
18
|
+
public afterColumn: number;
|
|
19
|
+
public heightInLines: number;
|
|
20
|
+
|
|
21
|
+
private readonly _onDomNodeTop: (top: number) => void;
|
|
22
|
+
private readonly _onComputedHeight: (height: number) => void;
|
|
23
|
+
|
|
24
|
+
constructor(
|
|
25
|
+
domNode: HTMLElement,
|
|
26
|
+
afterLineNumber: number,
|
|
27
|
+
afterColumn: number,
|
|
28
|
+
heightInLines: number,
|
|
29
|
+
onDomNodeTop: (top: number) => void,
|
|
30
|
+
onComputedHeight: (height: number) => void,
|
|
31
|
+
) {
|
|
32
|
+
this.domNode = domNode;
|
|
33
|
+
this.afterLineNumber = afterLineNumber;
|
|
34
|
+
this.afterColumn = afterColumn;
|
|
35
|
+
this.heightInLines = heightInLines;
|
|
36
|
+
this._onDomNodeTop = onDomNodeTop;
|
|
37
|
+
this._onComputedHeight = onComputedHeight;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public onDomNodeTop(top: number): void {
|
|
41
|
+
this._onDomNodeTop(top);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public onComputedHeight(height: number): void {
|
|
45
|
+
this._onComputedHeight(height);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export class OverlayWidgetDelegate extends Disposable implements monaco.editor.IOverlayWidget {
|
|
50
|
+
static id = 'monaco-enhance-overlay-widget';
|
|
51
|
+
|
|
52
|
+
constructor(readonly id: string, readonly dom: HTMLDivElement) {
|
|
53
|
+
super();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
getPosition() {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
getDomNode() {
|
|
61
|
+
return this.dom;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
getId() {
|
|
65
|
+
return this.id;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface IOptions {
|
|
70
|
+
isResizeable?: boolean;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* 构造函数负责 dom 结构,
|
|
75
|
+
* show 负责 class 注入,
|
|
76
|
+
* render 负责 style 动态注入,
|
|
77
|
+
* dispose 负责回收。
|
|
78
|
+
*/
|
|
79
|
+
export abstract class ZoneWidget extends Disposable implements IHorizontalSashLayoutProvider {
|
|
80
|
+
protected _container: HTMLDivElement;
|
|
81
|
+
// 宽度和左定位不需要继承下去,完全交给父容器控制
|
|
82
|
+
private width = 0;
|
|
83
|
+
private left = 0;
|
|
84
|
+
private _overlay: OverlayWidgetDelegate | null;
|
|
85
|
+
private _viewZone: ViewZoneDelegate | null;
|
|
86
|
+
private _current: monaco.IRange;
|
|
87
|
+
private _linesCount: number;
|
|
88
|
+
private _resizeSash: Sash | null = null;
|
|
89
|
+
|
|
90
|
+
private _onDomNodeTop = new Emitter<number>();
|
|
91
|
+
protected onDomNodeTop = this._onDomNodeTop.event;
|
|
92
|
+
|
|
93
|
+
constructor(protected readonly editor: IMonacoCodeEditor, readonly options?: IOptions) {
|
|
94
|
+
super();
|
|
95
|
+
this._container = document.createElement('div');
|
|
96
|
+
this._listenEvents();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
protected abstract applyClass(): void;
|
|
100
|
+
protected abstract applyStyle(): void;
|
|
101
|
+
protected abstract _fillContainer(container: HTMLElement): void;
|
|
102
|
+
|
|
103
|
+
private _showImpl(where: monaco.IRange, heightInLines: number) {
|
|
104
|
+
const { startLineNumber: lineNumber, startColumn: column } = where;
|
|
105
|
+
const viewZoneDomNode = document.createElement('div');
|
|
106
|
+
const layoutInfo = this.editor.getLayoutInfo();
|
|
107
|
+
viewZoneDomNode.style.overflow = 'hidden';
|
|
108
|
+
|
|
109
|
+
this.editor.changeViewZones((accessor) => {
|
|
110
|
+
if (this._viewZone) {
|
|
111
|
+
accessor.removeZone(this._viewZone.id);
|
|
112
|
+
this._viewZone = null;
|
|
113
|
+
}
|
|
114
|
+
if (this._overlay) {
|
|
115
|
+
this.editor.removeOverlayWidget(this._overlay);
|
|
116
|
+
this._overlay = null;
|
|
117
|
+
}
|
|
118
|
+
this._container.style.top = '-1000px';
|
|
119
|
+
this._viewZone = new ViewZoneDelegate(
|
|
120
|
+
viewZoneDomNode,
|
|
121
|
+
lineNumber,
|
|
122
|
+
column,
|
|
123
|
+
heightInLines,
|
|
124
|
+
(top: number) => this._onViewZoneTop(top),
|
|
125
|
+
(height: number) => this._onViewZoneHeight(height),
|
|
126
|
+
);
|
|
127
|
+
this._viewZone.id = accessor.addZone(this._viewZone);
|
|
128
|
+
this._overlay = new OverlayWidgetDelegate(OverlayWidgetDelegate.id + this._viewZone.id, this._container);
|
|
129
|
+
this.editor.addOverlayWidget(this._overlay);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
this.layout(layoutInfo);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
get currentRange() {
|
|
136
|
+
return this._current;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
get currentHeightInLines() {
|
|
140
|
+
return this._linesCount;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
show(where: monaco.IRange, heightInLines: number) {
|
|
144
|
+
this._current = where;
|
|
145
|
+
this._linesCount = heightInLines;
|
|
146
|
+
this.applyClass();
|
|
147
|
+
this._showImpl(where, heightInLines);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
hide() {}
|
|
151
|
+
|
|
152
|
+
create(): void {
|
|
153
|
+
this._fillContainer(this._container);
|
|
154
|
+
this._initSash();
|
|
155
|
+
this.applyStyle();
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
private _getLeft(info: monaco.editor.EditorLayoutInfo): number {
|
|
159
|
+
if (info.minimap && info.minimap.minimapWidth > 0 && info.minimap.minimapLeft === 0) {
|
|
160
|
+
return info.minimap.minimapWidth;
|
|
161
|
+
}
|
|
162
|
+
return 0;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
private _getWidth(info: monaco.editor.EditorLayoutInfo): number {
|
|
166
|
+
const minimapWidth = info.minimap ? info.minimap.minimapWidth : 0;
|
|
167
|
+
return info.width - minimapWidth - info.verticalScrollbarWidth;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
protected _onViewZoneTop(top: number): void {
|
|
171
|
+
this._container.style.top = `${top}px`;
|
|
172
|
+
this._onDomNodeTop.fire(top);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
protected _onViewZoneHeight(height: number): void {
|
|
176
|
+
this._container.style.height = `${height}px`;
|
|
177
|
+
|
|
178
|
+
if (this._resizeSash) {
|
|
179
|
+
this._resizeSash.layout();
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
protected setCssClass(className: string, classToReplace?: string): void {
|
|
184
|
+
if (!this._container) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if (classToReplace) {
|
|
189
|
+
this._container.classList.remove(classToReplace);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
this._container.classList.add(className);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
layout(layoutInfo: monaco.editor.EditorLayoutInfo) {
|
|
196
|
+
this.left = this._getLeft(layoutInfo);
|
|
197
|
+
this.width = this._getWidth(layoutInfo);
|
|
198
|
+
this.render();
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
render() {
|
|
202
|
+
this._container.style.width = `${this.width}px`;
|
|
203
|
+
this._container.style.left = `${this.left}px`;
|
|
204
|
+
|
|
205
|
+
this.applyStyle();
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
protected _relayout(newHeightInLines: number): void {
|
|
209
|
+
if (this._viewZone && this._viewZone.heightInLines !== newHeightInLines) {
|
|
210
|
+
this.editor.changeViewZones((accessor) => {
|
|
211
|
+
if (this._viewZone) {
|
|
212
|
+
this._viewZone.heightInLines = newHeightInLines;
|
|
213
|
+
accessor.layoutZone(this._viewZone.id);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
private _listenEvents() {
|
|
220
|
+
this.editor.onDidLayoutChange((event) => {
|
|
221
|
+
this.layout(event);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
private _initSash(): void {
|
|
226
|
+
if (this._resizeSash) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
this._resizeSash = new Sash(this._container, this, { orientation: Orientation.HORIZONTAL });
|
|
230
|
+
this.addDispose(this._resizeSash);
|
|
231
|
+
|
|
232
|
+
if (!this.options?.isResizeable) {
|
|
233
|
+
this._resizeSash.state = SashState.Disabled;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
let data: { startY: number; heightInLines: number } | undefined;
|
|
237
|
+
this.addDispose(
|
|
238
|
+
this._resizeSash.onDidStart((e: ISashEvent) => {
|
|
239
|
+
if (this._viewZone) {
|
|
240
|
+
data = {
|
|
241
|
+
startY: e.startY,
|
|
242
|
+
heightInLines: this._viewZone.heightInLines,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
}),
|
|
246
|
+
);
|
|
247
|
+
|
|
248
|
+
this.addDispose(
|
|
249
|
+
this._resizeSash.onDidEnd(() => {
|
|
250
|
+
data = undefined;
|
|
251
|
+
}),
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
this.addDispose(
|
|
255
|
+
this._resizeSash.onDidChange((evt: ISashEvent) => {
|
|
256
|
+
if (data) {
|
|
257
|
+
const lineDelta = (evt.currentY - data.startY) / this.editor.getOption(EditorOption.lineHeight);
|
|
258
|
+
const roundedLineDelta = lineDelta < 0 ? Math.ceil(lineDelta) : Math.floor(lineDelta);
|
|
259
|
+
const newHeightInLines = data.heightInLines + roundedLineDelta;
|
|
260
|
+
|
|
261
|
+
if (newHeightInLines > 5 && newHeightInLines < 35) {
|
|
262
|
+
this._relayout(newHeightInLines);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}),
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
getHorizontalSashLeft() {
|
|
270
|
+
return 0;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
getHorizontalSashTop(): number {
|
|
274
|
+
return this._container.style.height === null ? 0 : parseInt(this._container.style.height, 10);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
dispose() {
|
|
278
|
+
if (this._viewZone) {
|
|
279
|
+
this.editor.changeViewZones((accessor) => {
|
|
280
|
+
if (this._viewZone) {
|
|
281
|
+
accessor.removeZone(this._viewZone.id);
|
|
282
|
+
this._viewZone = null;
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
if (this._overlay) {
|
|
287
|
+
this.editor.removeOverlayWidget(this._overlay);
|
|
288
|
+
this._overlay = null;
|
|
289
|
+
}
|
|
290
|
+
this._container.remove();
|
|
291
|
+
super.dispose();
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* 可以自适应高度的 ZoneWidget
|
|
297
|
+
*/
|
|
298
|
+
export abstract class ResizeZoneWidget extends ZoneWidget {
|
|
299
|
+
private preWrapperHeight: number;
|
|
300
|
+
private heightInLines: number;
|
|
301
|
+
private lineHeight: number;
|
|
302
|
+
private wrap: HTMLDivElement;
|
|
303
|
+
protected readonly _onChangeZoneWidget = new Emitter<IRange>();
|
|
304
|
+
public readonly onChangeZoneWidget: Event<IRange> = this._onChangeZoneWidget.event;
|
|
305
|
+
public onFirstDisplay = Event.once(this.onDomNodeTop);
|
|
306
|
+
protected _isShow = false;
|
|
307
|
+
|
|
308
|
+
constructor(protected readonly editor: IMonacoCodeEditor, private range: monaco.IRange) {
|
|
309
|
+
super(editor);
|
|
310
|
+
this.lineHeight = this.editor.getOption(monaco.editor.EditorOption.lineHeight);
|
|
311
|
+
this.addDispose(
|
|
312
|
+
this.editor.onDidChangeConfiguration((e) => {
|
|
313
|
+
if (e.hasChanged(monaco.editor.EditorOption.lineHeight)) {
|
|
314
|
+
this.lineHeight = this.editor.getOption(monaco.editor.EditorOption.lineHeight);
|
|
315
|
+
if (this.wrap) {
|
|
316
|
+
this.resizeZoneWidget();
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}),
|
|
320
|
+
);
|
|
321
|
+
// 在第一次设置 container top 值的时候重置一下高度
|
|
322
|
+
Event.once(this.onDomNodeTop)(() => {
|
|
323
|
+
// 等待渲染帧以便获取到真实 warp 高度
|
|
324
|
+
window.requestAnimationFrame(() => {
|
|
325
|
+
this.resizeZoneWidget();
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
protected observeContainer(dom: HTMLDivElement): IDisposable {
|
|
331
|
+
this.wrap = dom;
|
|
332
|
+
const mutationObserver = new MutationObserver((mutations) => {
|
|
333
|
+
mutations.forEach((mutation) => {
|
|
334
|
+
if (mutation.type === 'childList') {
|
|
335
|
+
for (const child of Array.from(mutation.target.childNodes) as HTMLElement[]) {
|
|
336
|
+
// child 必须是 element 元素
|
|
337
|
+
if (child.nodeType === Node.ELEMENT_NODE && child.querySelectorAll) {
|
|
338
|
+
// 处理图片加载的情况
|
|
339
|
+
const images = child.querySelectorAll('img');
|
|
340
|
+
if (images.length) {
|
|
341
|
+
images.forEach((image) => {
|
|
342
|
+
const disposer = new DomListener(image, 'load', () => {
|
|
343
|
+
this.resizeZoneWidget();
|
|
344
|
+
disposer.dispose();
|
|
345
|
+
});
|
|
346
|
+
this.addDispose(disposer);
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
this.resizeZoneWidget();
|
|
354
|
+
});
|
|
355
|
+
mutationObserver.observe(this.wrap, { childList: true, subtree: true });
|
|
356
|
+
return {
|
|
357
|
+
dispose() {
|
|
358
|
+
mutationObserver.disconnect();
|
|
359
|
+
},
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
protected resizeZoneWidget() {
|
|
364
|
+
let wrapperHeight = this.wrap.offsetHeight;
|
|
365
|
+
// 可能在设置页设置的时候 editor 不可见,获取的高度为 0
|
|
366
|
+
if (!wrapperHeight && this.preWrapperHeight) {
|
|
367
|
+
wrapperHeight = this.preWrapperHeight;
|
|
368
|
+
}
|
|
369
|
+
if (wrapperHeight) {
|
|
370
|
+
const heightInLines = wrapperHeight / this.lineHeight;
|
|
371
|
+
if (this._isShow && this.heightInLines !== heightInLines) {
|
|
372
|
+
this.heightInLines = heightInLines;
|
|
373
|
+
this.show();
|
|
374
|
+
this.preWrapperHeight = wrapperHeight;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
public show() {
|
|
380
|
+
const needResize = !this.wrap.offsetHeight && !this.preWrapperHeight;
|
|
381
|
+
this.resize();
|
|
382
|
+
this.fireChangeEvent();
|
|
383
|
+
// 如果默认为隐藏,打开后是没有 this.heightInLines 的,需要显示后再计算一下
|
|
384
|
+
if (needResize) {
|
|
385
|
+
this.resizeZoneWidget();
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
private fireChangeEvent() {
|
|
390
|
+
this._onChangeZoneWidget.fire(this.range);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
public resize() {
|
|
394
|
+
const activeElement = document.activeElement as HTMLElement;
|
|
395
|
+
super.show(this.range, this.heightInLines);
|
|
396
|
+
// reset focus on the previously active element.
|
|
397
|
+
activeElement?.focus({ preventScroll: true });
|
|
398
|
+
}
|
|
399
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './browser';
|