6
6
import * as vscode from 'vscode' ;
7
7
import * as nls from 'vscode-nls' ;
8
8
import { BinarySizeStatusBarEntry } from '../binarySizeStatusBarEntry' ;
9
- import { Disposable } from '../util/dispose ' ;
9
+ import { MediaPreview , PreviewState , reopenAsText } from '../mediaPreview ' ;
10
10
import { escapeAttribute , getNonce } from '../util/dom' ;
11
11
import { SizeStatusBarEntry } from './sizeStatusBarEntry' ;
12
12
import { Scale , ZoomStatusBarEntry } from './zoomStatusBarEntry' ;
@@ -17,8 +17,8 @@ export class PreviewManager implements vscode.CustomReadonlyEditorProvider {
17
17
18
18
public static readonly viewType = 'imagePreview.previewEditor' ;
19
19
20
- private readonly _previews = new Set < Preview > ( ) ;
21
- private _activePreview : Preview | undefined ;
20
+ private readonly _previews = new Set < ImagePreview > ( ) ;
21
+ private _activePreview : ImagePreview | undefined ;
22
22
23
23
constructor (
24
24
private readonly extensionRoot : vscode . Uri ,
@@ -35,7 +35,7 @@ export class PreviewManager implements vscode.CustomReadonlyEditorProvider {
35
35
document : vscode . CustomDocument ,
36
36
webviewEditor : vscode . WebviewPanel ,
37
37
) : Promise < void > {
38
- const preview = new Preview ( this . extensionRoot , document . uri , webviewEditor , this . sizeStatusBarEntry , this . binarySizeStatusBarEntry , this . zoomStatusBarEntry ) ;
38
+ const preview = new ImagePreview ( this . extensionRoot , document . uri , webviewEditor , this . sizeStatusBarEntry , this . binarySizeStatusBarEntry , this . zoomStatusBarEntry ) ;
39
39
this . _previews . add ( preview ) ;
40
40
this . setActivePreview ( preview ) ;
41
41
@@ -52,154 +52,102 @@ export class PreviewManager implements vscode.CustomReadonlyEditorProvider {
52
52
53
53
public get activePreview ( ) { return this . _activePreview ; }
54
54
55
- private setActivePreview ( value : Preview | undefined ) : void {
55
+ private setActivePreview ( value : ImagePreview | undefined ) : void {
56
56
this . _activePreview = value ;
57
57
}
58
58
}
59
59
60
- const enum PreviewState {
61
- Disposed ,
62
- Visible ,
63
- Active ,
64
- }
65
-
66
- class Preview extends Disposable {
67
60
68
- private readonly id : string = ` ${ Date . now ( ) } - ${ Math . random ( ) . toString ( ) } ` ;
61
+ class ImagePreview extends MediaPreview {
69
62
70
- private _previewState = PreviewState . Visible ;
71
63
private _imageSize : string | undefined ;
72
- private _imageBinarySize : number | undefined ;
73
64
private _imageZoom : Scale | undefined ;
74
65
75
66
private readonly emptyPngDataUri = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAEElEQVR42gEFAPr/AP///wAI/AL+Sr4t6gAAAABJRU5ErkJggg==' ;
76
67
77
68
constructor (
78
69
private readonly extensionRoot : vscode . Uri ,
79
- private readonly resource : vscode . Uri ,
80
- private readonly webviewEditor : vscode . WebviewPanel ,
70
+ resource : vscode . Uri ,
71
+ webviewEditor : vscode . WebviewPanel ,
81
72
private readonly sizeStatusBarEntry : SizeStatusBarEntry ,
82
- private readonly binarySizeStatusBarEntry : BinarySizeStatusBarEntry ,
73
+ binarySizeStatusBarEntry : BinarySizeStatusBarEntry ,
83
74
private readonly zoomStatusBarEntry : ZoomStatusBarEntry ,
84
75
) {
85
- super ( ) ;
86
- const resourceRoot = resource . with ( {
87
- path : resource . path . replace ( / \/ [ ^ \/ ] + ?\. \w + $ / , '/' ) ,
88
- } ) ;
89
-
90
- webviewEditor . webview . options = {
91
- enableScripts : true ,
92
- enableForms : false ,
93
- localResourceRoots : [
94
- resourceRoot ,
95
- extensionRoot ,
96
- ]
97
- } ;
76
+ super ( extensionRoot , resource , webviewEditor , binarySizeStatusBarEntry ) ;
98
77
99
78
this . _register ( webviewEditor . webview . onDidReceiveMessage ( message => {
100
79
switch ( message . type ) {
101
- case 'size' :
102
- {
103
- this . _imageSize = message . value ;
104
- this . update ( ) ;
105
- break ;
106
- }
107
- case 'zoom' :
108
- {
109
- this . _imageZoom = message . value ;
110
- this . update ( ) ;
111
- break ;
112
- }
113
-
114
- case 'reopen-as-text' :
115
- {
116
- vscode . commands . executeCommand ( 'vscode.openWith' , resource , 'default' , webviewEditor . viewColumn ) ;
117
- break ;
118
- }
80
+ case 'size' : {
81
+ this . _imageSize = message . value ;
82
+ this . updateState ( ) ;
83
+ break ;
84
+ }
85
+ case 'zoom' : {
86
+ this . _imageZoom = message . value ;
87
+ this . updateState ( ) ;
88
+ break ;
89
+ }
90
+ case 'reopen-as-text' : {
91
+ reopenAsText ( resource , webviewEditor . viewColumn ) ;
92
+ break ;
93
+ }
119
94
}
120
95
} ) ) ;
121
96
122
97
this . _register ( zoomStatusBarEntry . onDidChangeScale ( e => {
123
- if ( this . _previewState === PreviewState . Active ) {
98
+ if ( this . previewState === PreviewState . Active ) {
124
99
this . webviewEditor . webview . postMessage ( { type : 'setScale' , scale : e . scale } ) ;
125
100
}
126
101
} ) ) ;
127
102
128
103
this . _register ( webviewEditor . onDidChangeViewState ( ( ) => {
129
- this . update ( ) ;
130
104
this . webviewEditor . webview . postMessage ( { type : 'setActive' , value : this . webviewEditor . active } ) ;
131
105
} ) ) ;
132
106
133
107
this . _register ( webviewEditor . onDidDispose ( ( ) => {
134
- if ( this . _previewState === PreviewState . Active ) {
135
- this . sizeStatusBarEntry . hide ( this . id ) ;
136
- this . binarySizeStatusBarEntry . hide ( this . id ) ;
137
- this . zoomStatusBarEntry . hide ( this . id ) ;
138
- }
139
- this . _previewState = PreviewState . Disposed ;
140
- } ) ) ;
141
-
142
- const watcher = this . _register ( vscode . workspace . createFileSystemWatcher ( new vscode . RelativePattern ( resource , '*' ) ) ) ;
143
- this . _register ( watcher . onDidChange ( e => {
144
- if ( e . toString ( ) === this . resource . toString ( ) ) {
145
- this . render ( ) ;
146
- }
147
- } ) ) ;
148
- this . _register ( watcher . onDidDelete ( e => {
149
- if ( e . toString ( ) === this . resource . toString ( ) ) {
150
- this . webviewEditor . dispose ( ) ;
108
+ if ( this . previewState === PreviewState . Active ) {
109
+ this . sizeStatusBarEntry . hide ( this ) ;
110
+ this . zoomStatusBarEntry . hide ( this ) ;
151
111
}
112
+ this . previewState = PreviewState . Disposed ;
152
113
} ) ) ;
153
114
154
- vscode . workspace . fs . stat ( resource ) . then ( ( { size } ) => {
155
- this . _imageBinarySize = size ;
156
- this . update ( ) ;
157
- } ) ;
158
-
115
+ this . updateBinarySize ( ) ;
159
116
this . render ( ) ;
160
- this . update ( ) ;
117
+ this . updateState ( ) ;
118
+
161
119
this . webviewEditor . webview . postMessage ( { type : 'setActive' , value : this . webviewEditor . active } ) ;
162
120
}
163
121
164
122
public zoomIn ( ) {
165
- if ( this . _previewState === PreviewState . Active ) {
123
+ if ( this . previewState === PreviewState . Active ) {
166
124
this . webviewEditor . webview . postMessage ( { type : 'zoomIn' } ) ;
167
125
}
168
126
}
169
127
170
128
public zoomOut ( ) {
171
- if ( this . _previewState === PreviewState . Active ) {
129
+ if ( this . previewState === PreviewState . Active ) {
172
130
this . webviewEditor . webview . postMessage ( { type : 'zoomOut' } ) ;
173
131
}
174
132
}
175
133
176
- private async render ( ) {
177
- if ( this . _previewState !== PreviewState . Disposed ) {
178
- this . webviewEditor . webview . html = await this . getWebviewContents ( ) ;
179
- }
180
- }
134
+ protected override updateState ( ) {
135
+ super . updateState ( ) ;
181
136
182
- private update ( ) {
183
- if ( this . _previewState === PreviewState . Disposed ) {
137
+ if ( this . previewState === PreviewState . Disposed ) {
184
138
return ;
185
139
}
186
140
187
141
if ( this . webviewEditor . active ) {
188
- this . _previewState = PreviewState . Active ;
189
- this . sizeStatusBarEntry . show ( this . id , this . _imageSize || '' ) ;
190
- this . binarySizeStatusBarEntry . show ( this . id , this . _imageBinarySize ) ;
191
- this . zoomStatusBarEntry . show ( this . id , this . _imageZoom || 'fit' ) ;
142
+ this . sizeStatusBarEntry . show ( this , this . _imageSize || '' ) ;
143
+ this . zoomStatusBarEntry . show ( this , this . _imageZoom || 'fit' ) ;
192
144
} else {
193
- if ( this . _previewState === PreviewState . Active ) {
194
- this . sizeStatusBarEntry . hide ( this . id ) ;
195
- this . binarySizeStatusBarEntry . hide ( this . id ) ;
196
- this . zoomStatusBarEntry . hide ( this . id ) ;
197
- }
198
- this . _previewState = PreviewState . Visible ;
145
+ this . sizeStatusBarEntry . hide ( this ) ;
146
+ this . zoomStatusBarEntry . hide ( this ) ;
199
147
}
200
148
}
201
149
202
- private async getWebviewContents ( ) : Promise < string > {
150
+ protected override async getWebviewContents ( ) : Promise < string > {
203
151
const version = Date . now ( ) . toString ( ) ;
204
152
const settings = {
205
153
src : await this . getResourcePath ( this . webviewEditor , this . resource , version ) ,
0 commit comments