Skip to content

Commit f1bd98d

Browse files
add custom table editor provider (#12)
clean up and document other table view extension parts
1 parent 7bacaf9 commit f1bd98d

File tree

5 files changed

+99
-13
lines changed

5 files changed

+99
-13
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
],
4242
"activationEvents": [
4343
"onCommand:tabular.data.viewTable",
44+
"onCustomEditor:tabular.data.tableEditor",
4445
"onWebviewPanel:tabular.data.tableView"
4546
],
4647
"main": "./dist/extension.js",
@@ -125,7 +126,7 @@
125126
},
126127
"customEditors": [
127128
{
128-
"viewType": "tabular.data.tableView",
129+
"viewType": "tabular.data.tableEditor",
129130
"displayName": "Table View",
130131
"priority": "default",
131132
"selector": [

src/extension.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,40 @@
11
import {
22
commands,
33
window,
4-
workspace,
54
ExtensionContext,
65
Disposable,
76
Uri
87
} from 'vscode';
98

9+
import { TableEditor } from './views/tableEditor';
1010
import { TableView } from './views/tableView';
1111
import { TableViewSerializer } from './views/tableViewSerializer';
1212
import { ViewTypes } from './views/viewTypes';
1313

1414
/**
1515
* Activates this extension per rules set in package.json.
1616
*
17-
* @param context vscode extension context.
18-
* @see https://code.visualstudio.com/api/references/activation-events for more info.
17+
* @param context Extension context.
18+
*
19+
* @see https://code.visualstudio.com/api/references/vscode-api#extensions
20+
* @see https://code.visualstudio.com/api/references/activation-events
1921
*/
2022
export function activate(context: ExtensionContext) {
2123

2224
console.log('tabular.data.viewer:activate(): activated!');
2325

2426
// register view table command
25-
let viewTableCommand: Disposable =
27+
const viewTableCommand: Disposable =
2628
commands.registerCommand('tabular.data.viewTable', (documentUri: Uri) => {
2729
TableView.render(context.extensionUri, documentUri);
2830
});
29-
3031
context.subscriptions.push(viewTableCommand);
3132

32-
// register table view serializer for restore on vscode restart
33-
window.registerWebviewPanelSerializer(ViewTypes.TableView,
34-
new TableViewSerializer(context.extensionUri));
33+
// register table view serializer for restore on vscode reload
34+
context.subscriptions.push(TableViewSerializer.register(context));
35+
36+
// register table editor
37+
context.subscriptions.push(TableEditor.register(context));
3538
}
3639

3740
/**

src/views/tableEditor.ts

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import {
2+
window,
3+
CancellationToken,
4+
CustomTextEditorProvider,
5+
Disposable,
6+
ExtensionContext,
7+
TextDocument,
8+
WebviewPanel
9+
} from 'vscode';
10+
11+
import { TableView } from './tableView';
12+
import { ViewTypes } from './viewTypes';
13+
14+
/**
15+
* Defines custom tabular data text editor provider.
16+
*
17+
* @see https://code.visualstudio.com/api/references/vscode-api#CustomTextEditorProvider
18+
*/
19+
export class TableEditor implements CustomTextEditorProvider {
20+
21+
/**
22+
* Registers custom Table editor.
23+
*
24+
* @see https://code.visualstudio.com/api/references/vscode-api#window.registerCustomEditorProvider
25+
*
26+
* @param context Extension context.
27+
* @returns Disposable object for this editor.
28+
*/
29+
public static register(context: ExtensionContext): Disposable {
30+
return window.registerCustomEditorProvider(
31+
ViewTypes.TableEditor, new TableEditor(context), {
32+
webviewOptions: {
33+
enableFindWidget: true,
34+
retainContextWhenHidden: true
35+
}
36+
});
37+
}
38+
39+
/**
40+
* Creates new Table editor instance.
41+
*
42+
* @param context Extension context.
43+
*/
44+
constructor(private readonly context: ExtensionContext) {
45+
}
46+
47+
/**
48+
* Resolves a custom text eidtor for a given tabular data text document source,
49+
* and creates new TableView for that table data display.
50+
*
51+
* @param document Text document for the tabular data source to resolve.
52+
* @param webviewPanel Webview panel used to display the editor UI for this resource.
53+
* @param token A cancellation token that indicates the result is no longer needed.
54+
*/
55+
public async resolveCustomTextEditor(
56+
document: TextDocument,
57+
webviewPanel: WebviewPanel,
58+
token: CancellationToken
59+
): Promise<void> {
60+
// create new table view for the given tabular text data document and render it
61+
TableView.render(this.context.extensionUri, document.uri, webviewPanel);
62+
}
63+
}

src/views/tableView.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export class TableView {
3131
private _disposables: Disposable[] = [];
3232

3333
/**
34-
* Creates new TableView instance for the initial table data rendering.
34+
* Creates new TableView instance for tabular data rendering.
3535
*
3636
* @param webviewPanel Reference to the webview panel.
3737
* @param extensionUri Extension directory Uri.
@@ -103,7 +103,9 @@ export class TableView {
103103
},
104104
{ // weview panel options
105105
enableScripts: true, // enable JavaScript in webview
106-
enableCommandUris: true // ???
106+
enableCommandUris: true,
107+
enableFindWidget: true,
108+
retainContextWhenHidden: true
107109
}
108110
);
109111
}
@@ -113,6 +115,7 @@ export class TableView {
113115
*/
114116
public dispose() {
115117
TableView.currentView = undefined;
118+
TableView._views.delete(this._viewUri.toString());
116119
this._webviewPanel.dispose();
117120
while (this._disposables.length) {
118121
const disposable: Disposable | undefined = this._disposables.pop();

src/views/tableViewSerializer.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,34 @@
11
import {
2+
window,
3+
Disposable,
4+
ExtensionContext,
25
WebviewPanel,
36
WebviewPanelSerializer,
4-
Uri,
7+
Uri
58
} from 'vscode';
69

710
import { TableView } from './tableView';
11+
import { ViewTypes } from './viewTypes';
812

913
/**
1014
* Table webview panel serializer for restoring table views on vscode reload.
1115
*/
1216
export class TableViewSerializer implements WebviewPanelSerializer {
1317

1418
/**
15-
* Creates new webview serializer.
19+
* Registers table view serializer.
20+
*
21+
* @param context Extension context.
22+
* @returns Disposable object for this webview panel serializer.
23+
*/
24+
public static register(context: ExtensionContext): Disposable {
25+
return window.registerWebviewPanelSerializer(ViewTypes.TableView,
26+
new TableViewSerializer(context.extensionUri));
27+
}
28+
29+
/**
30+
* Creates new Table webview serializer.
31+
*
1632
* @param extensionUri Extension directory Uri.
1733
*/
1834
constructor(private extensionUri: Uri) {

0 commit comments

Comments
 (0)