1- import * as vscode from "vscode" ;
2- import { Uri , WebviewViewProvider } from "vscode" ;
3- import { getHtmlForWebview } from "../../common/vscode/webview-html" ;
4- import { FromMethodModelingMessage } from "../../common/interface-types" ;
1+ import {
2+ FromMethodModelingMessage ,
3+ ToMethodModelingMessage ,
4+ } from "../../common/interface-types" ;
55import { telemetryListener } from "../../common/vscode/telemetry" ;
66import { showAndLogExceptionWithTelemetry } from "../../common/logging/notifications" ;
77import { extLogger } from "../../common/logging/vscode/loggers" ;
88import { App } from "../../common/app" ;
99import { redactableError } from "../../common/errors" ;
1010import { Method } from "../method" ;
11- import { DisposableObject } from "../../common/disposable-object" ;
1211import { ModelingStore } from "../modeling-store" ;
12+ import { AbstractWebviewViewProvider } from "../../common/vscode/abstract-webview-view-provider" ;
1313
14- export class MethodModelingViewProvider
15- extends DisposableObject
16- implements WebviewViewProvider
17- {
14+ export class MethodModelingViewProvider extends AbstractWebviewViewProvider <
15+ ToMethodModelingMessage ,
16+ FromMethodModelingMessage
17+ > {
1818 public static readonly viewType = "codeQLMethodModeling" ;
1919
20- private webviewView : vscode . WebviewView | undefined = undefined ;
21-
2220 private method : Method | undefined = undefined ;
2321
2422 constructor (
25- private readonly app : App ,
23+ app : App ,
2624 private readonly modelingStore : ModelingStore ,
2725 ) {
28- super ( ) ;
26+ super ( app , "method-modeling" ) ;
2927 }
3028
31- /**
32- * This is called when a view first becomes visible. This may happen when the view is
33- * first loaded or when the user hides and then shows a view again.
34- */
35- public resolveWebviewView (
36- webviewView : vscode . WebviewView ,
37- _context : vscode . WebviewViewResolveContext ,
38- _token : vscode . CancellationToken ,
39- ) {
40- webviewView . webview . options = {
41- enableScripts : true ,
42- localResourceRoots : [ Uri . file ( this . app . extensionPath ) ] ,
43- } ;
44-
45- const html = getHtmlForWebview (
46- this . app ,
47- webviewView . webview ,
48- "method-modeling" ,
49- {
50- allowInlineStyles : true ,
51- allowWasmEval : false ,
52- } ,
53- ) ;
54-
55- webviewView . webview . html = html ;
56-
57- webviewView . webview . onDidReceiveMessage ( async ( msg ) => this . onMessage ( msg ) ) ;
58-
59- this . webviewView = webviewView ;
60-
61- this . setInitialState ( webviewView ) ;
29+ protected override onWebViewLoaded ( ) : void {
30+ this . setInitialState ( ) ;
6231 this . registerToModelingStoreEvents ( ) ;
6332 }
6433
6534 public async setMethod ( method : Method ) : Promise < void > {
6635 this . method = method ;
6736
68- if ( this . webviewView ) {
69- await this . webviewView . webview . postMessage ( {
37+ if ( this . isShowingView ) {
38+ await this . postMessage ( {
7039 t : "setMethod" ,
7140 method,
7241 } ) ;
7342 }
7443 }
7544
76- private setInitialState ( webviewView : vscode . WebviewView ) : void {
45+ private setInitialState ( ) : void {
7746 const selectedMethod = this . modelingStore . getSelectedMethodDetails ( ) ;
7847 if ( selectedMethod ) {
79- void webviewView . webview . postMessage ( {
48+ void this . postMessage ( {
8049 t : "setSelectedMethod" ,
8150 method : selectedMethod . method ,
8251 modeledMethod : selectedMethod . modeledMethod ,
@@ -85,24 +54,18 @@ export class MethodModelingViewProvider
8554 }
8655 }
8756
88- private async onMessage ( msg : FromMethodModelingMessage ) : Promise < void > {
57+ protected override async onMessage (
58+ msg : FromMethodModelingMessage ,
59+ ) : Promise < void > {
8960 switch ( msg . t ) {
90- case "setModeledMethod" : {
91- const activeState = this . modelingStore . getStateForActiveDb ( ) ;
92- if ( ! activeState ) {
93- throw new Error ( "No active state found in modeling store" ) ;
94- }
95- this . modelingStore . updateModeledMethod (
96- activeState . databaseItem ,
97- msg . method ,
98- ) ;
61+ case "viewLoaded" :
62+ this . onWebViewLoaded ( ) ;
9963 break ;
100- }
10164
102- case "telemetry" : {
65+ case "telemetry" :
10366 telemetryListener ?. sendUIInteraction ( msg . action ) ;
10467 break ;
105- }
68+
10669 case "unhandledError" :
10770 void showAndLogExceptionWithTelemetry (
10871 extLogger ,
@@ -112,6 +75,18 @@ export class MethodModelingViewProvider
11275 ) `Unhandled error in method modeling view: ${ msg . error . message } ` ,
11376 ) ;
11477 break ;
78+
79+ case "setModeledMethod" : {
80+ const activeState = this . modelingStore . getStateForActiveDb ( ) ;
81+ if ( ! activeState ) {
82+ throw new Error ( "No active state found in modeling store" ) ;
83+ }
84+ this . modelingStore . updateModeledMethod (
85+ activeState . databaseItem ,
86+ msg . method ,
87+ ) ;
88+ break ;
89+ }
11590 }
11691 }
11792
0 commit comments