|
| 1 | +import { Disposable, Webview, WebviewPanel, window, Uri, ViewColumn } from "vscode"; |
| 2 | +import { getUri } from "../utilities/getUri"; |
| 3 | + |
| 4 | +export class CCVizzuPanel { |
| 5 | + public static currentPanel: CCVizzuPanel | undefined; |
| 6 | + private readonly _panel: WebviewPanel; |
| 7 | + private _disposables: Disposable[] = []; |
| 8 | + |
| 9 | + private constructor(panel: WebviewPanel, extensionUri: Uri) { |
| 10 | + this._panel = panel; |
| 11 | + this._panel.onDidDispose(this.dispose, null, this._disposables); |
| 12 | + this._panel.webview.html = this._getWebviewContent(this._panel.webview, extensionUri); |
| 13 | + this._setWebviewMessageListener(this._panel.webview); |
| 14 | + } |
| 15 | + |
| 16 | + public static render(extensionUri: Uri) { |
| 17 | + if (CCVizzuPanel.currentPanel) { |
| 18 | + CCVizzuPanel.currentPanel._panel.reveal(ViewColumn.One); |
| 19 | + } else { |
| 20 | + const panel = window.createWebviewPanel( |
| 21 | + "showHelloWorld", |
| 22 | + "Hello World", |
| 23 | + ViewColumn.One, |
| 24 | + { |
| 25 | + enableScripts: true, |
| 26 | + } |
| 27 | + ); |
| 28 | + CCVizzuPanel.currentPanel = new CCVizzuPanel(panel, extensionUri); |
| 29 | + } |
| 30 | + } |
| 31 | + |
| 32 | + public dispose() { |
| 33 | + CCVizzuPanel.currentPanel = undefined; |
| 34 | + this._panel.dispose(); |
| 35 | + while (this._disposables.length) { |
| 36 | + const disposable = this._disposables.pop(); |
| 37 | + if (disposable) { |
| 38 | + disposable.dispose(); |
| 39 | + } |
| 40 | + } |
| 41 | + } |
| 42 | + |
| 43 | + private _getWebviewContent(webview: Webview, extensionUri: Uri) { |
| 44 | + const toolkitUri = getUri(webview, extensionUri, [ |
| 45 | + "node_modules", |
| 46 | + "@vscode", |
| 47 | + "webview-ui-toolkit", |
| 48 | + "dist", |
| 49 | + "toolkit.js", |
| 50 | + ]); |
| 51 | + const mainUri = getUri(webview, extensionUri, ["media", "main.js"]); |
| 52 | + |
| 53 | + return /*html*/ ` |
| 54 | + <!DOCTYPE html> |
| 55 | + <html lang="en"> |
| 56 | + <head> |
| 57 | + <meta charset="UTF-8"> |
| 58 | + <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| 59 | + <script type="module" src="${toolkitUri}"></script> |
| 60 | + <script type="module" src="${mainUri}"></script> |
| 61 | + <title>Hello World</title> |
| 62 | + </head> |
| 63 | + <body> |
| 64 | + <h1>Hello World!</h1> |
| 65 | + <vscode-button id="howdy">Howdy!</vscode-button> |
| 66 | + </body> |
| 67 | + </html> |
| 68 | + `; |
| 69 | + } |
| 70 | + |
| 71 | + private _setWebviewMessageListener(webview: Webview) { |
| 72 | + webview.onDidReceiveMessage( |
| 73 | + (message: any) => { |
| 74 | + const command = message.command; |
| 75 | + const text = message.text; |
| 76 | + |
| 77 | + switch (command) { |
| 78 | + case "hello": |
| 79 | + window.showInformationMessage(text); |
| 80 | + return; |
| 81 | + } |
| 82 | + }, |
| 83 | + undefined, |
| 84 | + this._disposables |
| 85 | + ); |
| 86 | + } |
| 87 | +} |
0 commit comments