blob: 70dec55cf67e3b1370652c1b012e4dfa7af78152 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import * as vscode from "vscode";
import * as utils from "./utils";
import { ThemeIcon } from "vscode";
const KARAVAN_PANELS: Map<string, vscode.WebviewPanel> = new Map<string, vscode.WebviewPanel>();
export class HelpView implements vscode.TreeDataProvider<HelpItem> {
constructor(private context: vscode.ExtensionContext, private webviewContent: string) {
}
private _onDidChangeTreeData: vscode.EventEmitter<HelpItem | undefined | void> = new vscode.EventEmitter<HelpItem | undefined | void>();
readonly onDidChangeTreeData: vscode.Event<HelpItem | undefined | void> = this._onDidChangeTreeData.event;
getTreeItem(element: HelpItem): vscode.TreeItem | Thenable<vscode.TreeItem> {
return element;
}
getChildren(element?: HelpItem): vscode.ProviderResult<HelpItem[]> {
const helpItems: HelpItem[] = [];
helpItems.push(new HelpItem("Enterprise Integration Patterns", "Enterprise Integration Patterns", "eip", 'combine', { command: 'karavan.openEip', title: '' }));
helpItems.push(new HelpItem("Kamelet catalog", "Kamelet Catalog", "kamelets", 'extensions', { command: 'karavan.openKamelets', title: '' }));
helpItems.push(new HelpItem("Component catalog", "Component Catalog", "component", 'extensions', { command: 'karavan.openComponents', title: '' }));
helpItems.push(new HelpItem("Report issue", "Report Issue", "issue", 'comment', { command: 'karavan.reportIssue', title: '' }));
return Promise.resolve(helpItems);
}
refresh(): void {
this._onDidChangeTreeData.fire();
}
openKaravanWebView(page: string) {
if (!KARAVAN_PANELS.has(page)) {
// Karavan webview
const panel = vscode.window.createWebviewPanel(
"karavan",
page.toUpperCase(),
vscode.ViewColumn.One,
{
enableScripts: true,
retainContextWhenHidden: true,
localResourceRoots: [
vscode.Uri.joinPath(this.context.extensionUri, "dist"),
],
}
);
panel.webview.html = this.webviewContent;
panel.iconPath = vscode.Uri.joinPath(
this.context.extensionUri,
"icons/karavan.svg"
);
// Handle messages from the webview
panel.webview.onDidReceiveMessage(
message => {
switch (message.command) {
case 'getData':
this.sendData(panel, page);
break;
}
},
undefined,
this.context.subscriptions
);
// Handle close event
panel.onDidDispose(() => {
KARAVAN_PANELS.delete(page);
}, null, this.context.subscriptions);
// Handle reopen
panel.onDidChangeViewState((e: vscode.WebviewPanelOnDidChangeViewStateEvent) => {
if (e.webviewPanel.active) {
e.webviewPanel.webview.postMessage({ command: 'reread' })
}
});
KARAVAN_PANELS.set(page, panel);
} else {
KARAVAN_PANELS.get(page)?.reveal(undefined, true);
}
}
sendData(panel: vscode.WebviewPanel, page: string) {
// Read and send Kamelets
utils.readKamelets(this.context).then(kamelets => {
if (page === 'kamelets') panel.webview.postMessage({ command: 'kamelets', kamelets: kamelets });
}).finally(() => {
utils.readComponents(this.context).then(components => {
// Read and send Components
if (page === 'components') panel.webview.postMessage({ command: 'components', components: components });
}).finally(() => {
// Send integration
panel.webview.postMessage({ command: 'open', page: page });
})
})
}
}
export class HelpItem extends vscode.TreeItem {
constructor(
public readonly title: string,
public readonly tooltip: string,
public readonly page: string,
public readonly icon: string,
public readonly command?: vscode.Command
) {
super(title, vscode.TreeItemCollapsibleState.None);
this.tooltip = this.tooltip;
}
iconPath = new ThemeIcon(this.icon);
contextValue = 'help';
}