forked from LeetCode-OpenSource/vscode-leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLeetCodeWebview.ts
82 lines (70 loc) · 3.11 KB
/
LeetCodeWebview.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
// Copyright (c) jdneo. All rights reserved.
// Licensed under the MIT license.
import { commands, ConfigurationChangeEvent, Disposable, ViewColumn, WebviewPanel, window, workspace } from "vscode";
import { openSettingsEditor, promptHintMessage } from "../utils/uiUtils";
import { markdownEngine } from "./markdownEngine";
export abstract class LeetCodeWebview implements Disposable {
protected readonly viewType: string = "leetcode.webview";
protected panel: WebviewPanel | undefined;
private listeners: Disposable[] = [];
public dispose(): void {
if (this.panel) {
this.panel.dispose();
}
}
protected showWebviewInternal(): void {
const { title, viewColumn, preserveFocus } = this.getWebviewOption();
if (!this.panel) {
this.panel = window.createWebviewPanel(this.viewType, title, { viewColumn, preserveFocus }, {
enableScripts: true,
enableCommandUris: true,
enableFindWidget: true,
retainContextWhenHidden: true,
localResourceRoots: markdownEngine.localResourceRoots,
});
this.panel.onDidDispose(this.onDidDisposeWebview, this, this.listeners);
this.panel.webview.onDidReceiveMessage(this.onDidReceiveMessage, this, this.listeners);
workspace.onDidChangeConfiguration(this.onDidChangeConfiguration, this, this.listeners);
} else {
this.panel.title = title;
if (viewColumn === ViewColumn.Two) {
// Make sure second group exists. See vscode#71608 issue
commands.executeCommand("workbench.action.focusSecondEditorGroup").then(() => {
this.panel!.reveal(viewColumn, preserveFocus);
});
} else {
this.panel.reveal(viewColumn, preserveFocus);
}
}
this.panel.webview.html = this.getWebviewContent();
this.showMarkdownConfigHint();
}
protected onDidDisposeWebview(): void {
this.panel = undefined;
for (const listener of this.listeners) {
listener.dispose();
}
this.listeners = [];
}
protected async onDidChangeConfiguration(event: ConfigurationChangeEvent): Promise<void> {
if (this.panel && event.affectsConfiguration("markdown")) {
this.panel.webview.html = this.getWebviewContent();
}
}
protected async onDidReceiveMessage(_message: any): Promise<void> { /* no special rule */ }
protected abstract getWebviewOption(): ILeetCodeWebviewOption;
protected abstract getWebviewContent(): string;
private async showMarkdownConfigHint(): Promise<void> {
await promptHintMessage(
"hint.configWebviewMarkdown",
'You can change the webview appearance ("fontSize", "lineWidth" & "fontFamily") in "markdown.preview" configuration.',
"Open settings",
(): Promise<any> => openSettingsEditor("markdown.preview"),
);
}
}
export interface ILeetCodeWebviewOption {
title: string;
viewColumn: ViewColumn;
preserveFocus?: boolean;
}