Source: out/extension.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.selectNode = exports.setLegendData = exports.exportSVG = exports.returnToVisualization = exports.addNodeToRemoved = exports.createVizualization = exports.activate = void 0;
const vscode = require("vscode");
const Sidebar_1 = require("./view/Sidebar");
const fs_1 = require("fs");
const DotParser_1 = require("./parser/DotParser");
const VisualizationPanel_1 = require("./view/VisualizationPanel");
const RemovedTreeDataProvider_1 = require("./tree_providers/RemovedTreeDataProvider");
const constants_1 = require("./support/constants");
const helpers_1 = require("./support/helpers");
const ConnectionsTreeDataProvider_1 = require("./tree_providers/ConnectionsTreeDataProvider");
const Legend_1 = require("./view/Legend");
/**
 * Tree data provider for removed nodes TreeView
 */
var removedTreeDataProvider;
/**
 * Tree data provider for nodes that depend on the selected node TreeView
 */
var usedByTreeDataProvider;
/**
 * Tree data provider for nodes that the selected node depends on TreeView
 */
var requestedTreeDataProvider;
/**
 * Tree data provider for affected nodes TreeView
 */
var affectedTreeDataProvider;
/**
 * Sidebar menu
 */
var sidebar;
/**
 * Legend in the sidebar
 */
var legend;
/**
 * Main visualization panel
 */
var visualizationPanel;
/**
 * Activate the extension. Register commands and views.
 * @param context Extension context.
 */
function activate(context) {
    sidebar = new Sidebar_1.Sidebar(context.extensionUri);
    legend = new Legend_1.Legend(context.extensionUri);
    visualizationPanel = new VisualizationPanel_1.VisualizationPanel(context.extensionUri);
    removedTreeDataProvider = new RemovedTreeDataProvider_1.RemovedTreeDataProvider();
    usedByTreeDataProvider = new ConnectionsTreeDataProvider_1.ConnectionsTreeDataProvider();
    requestedTreeDataProvider = new ConnectionsTreeDataProvider_1.ConnectionsTreeDataProvider();
    affectedTreeDataProvider = new ConnectionsTreeDataProvider_1.ConnectionsTreeDataProvider();
    context.subscriptions.push(vscode.commands.registerCommand('yocto-project-dependency-visualizer.generateVisualization', () => {
        createVizualization(context.extensionUri, constants_1.DEFAULT_TYPE, constants_1.DEFAULT_DISTANCE, constants_1.DEFAULT_ITERATIONS, constants_1.DEFAULT_STRENGTH, constants_1.DEFAULT_MODE);
    }));
    context.subscriptions.push(vscode.commands.registerCommand('yocto-project-dependency-visualizer.returnNode', (item) => {
        var _a;
        if (((_a = item.label) === null || _a === void 0 ? void 0 : _a.toString()) !== undefined) {
            returnToVisualization(item.label.toString());
        }
    }));
    context.subscriptions.push(vscode.commands.registerCommand('yocto-project-dependency-visualizer.openRecipe', (item) => {
        var _a;
        if (((_a = item.getRecipe()) === null || _a === void 0 ? void 0 : _a.toString()) !== undefined) {
            var recipePath = (0, helpers_1.getRecipePath)(item.getRecipe());
            vscode.workspace.openTextDocument(recipePath).then(document => vscode.window.showTextDocument(document));
        }
    }));
    context.subscriptions.push(vscode.commands.registerCommand('yocto-project-dependency-visualizer.selectNodeFromList', (item) => {
        var _a;
        if (item.isRemoved() === 1) {
            vscode.window.showErrorMessage("Node is in the \"Removed nodes\" list so it cannot be selected!");
        }
        else if (((_a = item.label) === null || _a === void 0 ? void 0 : _a.toString()) !== undefined) {
            selectNodeFromList(item.label.toString());
        }
    }));
    context.subscriptions.push(vscode.window.registerWebviewViewProvider("visualization-sidebar", sidebar, {
        webviewOptions: {
            retainContextWhenHidden: true
        }
    }));
    context.subscriptions.push(vscode.window.registerWebviewViewProvider("visualization-legend", legend, {
        webviewOptions: {
            retainContextWhenHidden: true
        }
    }));
    context.subscriptions.push(vscode.window.registerTreeDataProvider("removed-list", removedTreeDataProvider));
    context.subscriptions.push(vscode.window.registerTreeDataProvider("used-by-list", usedByTreeDataProvider));
    context.subscriptions.push(vscode.window.registerTreeDataProvider("requested-list", requestedTreeDataProvider));
    context.subscriptions.push(vscode.window.registerTreeDataProvider("affected-list", affectedTreeDataProvider));
    vscode.commands.executeCommand('setContext', 'showAffected', false);
    vscode.commands.executeCommand('setContext', 'showLegend', false);
}
exports.activate = activate;
// Example how BitBake could be called
//function callBitbake(path: string) {
//	// use linux cd
//	cp.exec('pushd' + path + " && dir", (err: any, stdout: any, stderr: any) => {
//		console.log('stdout: ' + stdout);
//		console.log('stderr: ' + stderr);
//		if (err) {
//			console.log('error: ' + err);
//		}
//	});
//}
/**
 * Select node from the list of requested or used by nodes.
 * @param name Name of the node that will be selected.
 */
function selectNodeFromList(name) {
    visualizationPanel.selectNodeFromList(name);
}
/**
 * Create and show visualization.
 * @param extensionUri Extension URI.
 * @param type Type of the BitBake task.
 * @param distance Distance between the nodes (for the force directed algorithm).
 * @param iterations Number of iterations (for the force directed algorithm).
 * @param strength Strength of the force between nodes (for the force directed algorithm).
 * @param mode Mode of analysis.
 * @returns void
 */
function createVizualization(extensionUri, type, distance, iterations, strength, mode) {
    var graphString = "";
    if (vscode.workspace.workspaceFolders !== undefined) {
        const dotPath = vscode.workspace.workspaceFolders[0].uri.fsPath + "/build/task-depends.dot";
        if (!(0, fs_1.existsSync)(dotPath)) {
            //callBitbake(vscode.workspace.workspaceFolders[0].uri.fsPath);
            vscode.window.showErrorMessage(".dot file not found in first workspace folder! Make sure Yocto Project directory is in the first folder of the workspace!");
            return;
        }
        var dotParser = new DotParser_1.DotParser(dotPath);
        graphString = dotParser.parseDotFile(type, mode);
        (0, fs_1.writeFileSync)(vscode.workspace.workspaceFolders[0].uri.fsPath + "/build/graph.json", graphString);
    }
    if (graphString === "") {
        vscode.window.showErrorMessage("No graph data loaded!");
        return;
    }
    if (mode === "affected_nodes") {
        vscode.commands.executeCommand('setContext', 'showAffected', true);
    }
    else {
        vscode.commands.executeCommand('setContext', 'showAffected', false);
    }
    if (mode === "licenses") {
        vscode.commands.executeCommand('setContext', 'showLegend', true);
    }
    else {
        vscode.commands.executeCommand('setContext', 'showLegend', false);
    }
    visualizationPanel.updateData(graphString, mode, distance, iterations, strength);
    removedTreeDataProvider.clearAllNodes();
    removedTreeDataProvider.refresh();
    sidebar.clearSelectedNode();
    usedByTreeDataProvider.clearAllNodes();
    requestedTreeDataProvider.clearAllNodes();
    affectedTreeDataProvider.clearAllNodes();
    usedByTreeDataProvider.refresh();
    requestedTreeDataProvider.refresh();
    affectedTreeDataProvider.refresh();
    visualizationPanel.createOrShow(extensionUri);
}
exports.createVizualization = createVizualization;
/**
 * Add node to the removed nodes TreeView.
 * @param name Name of the node to be removed.
 * @param recipe Path to the recipe of the node to be removed.
 * @param id ID of the node to be removed.
 */
function addNodeToRemoved(name, recipe, id) {
    removedTreeDataProvider.addNode(name, recipe);
    removedTreeDataProvider.refresh();
    visualizationPanel.removeNode(id);
    usedByTreeDataProvider.clearAllNodes();
    requestedTreeDataProvider.clearAllNodes();
    affectedTreeDataProvider.clearAllNodes();
    usedByTreeDataProvider.refresh();
    requestedTreeDataProvider.refresh();
    affectedTreeDataProvider.refresh();
}
exports.addNodeToRemoved = addNodeToRemoved;
/**
 * Return node from the TreeView of removed nodes back to visualization.
 * @param name Name of the node to be removed.
 */
function returnToVisualization(name) {
    removedTreeDataProvider.removeNode(name);
    removedTreeDataProvider.refresh();
    sidebar.clearSelectedNode();
    usedByTreeDataProvider.clearAllNodes();
    requestedTreeDataProvider.clearAllNodes();
    affectedTreeDataProvider.clearAllNodes();
    usedByTreeDataProvider.refresh();
    requestedTreeDataProvider.refresh();
    affectedTreeDataProvider.refresh();
    visualizationPanel.returnNode(name);
}
exports.returnToVisualization = returnToVisualization;
/**
 * Export the visualization SVG.
 */
function exportSVG() {
    visualizationPanel.callExportSVG();
}
exports.exportSVG = exportSVG;
/**
 * Set data for the legend.
 * @param legendData Legend data to be set.
 */
function setLegendData(legendData) {
    legend.setLegendData(legendData);
    legend.showLegend();
}
exports.setLegendData = setLegendData;
/**
 * Select node from visualization.
 * @param node Node to be selected.
 * @param used_by List of nodes that request the selected node.
 * @param requested List of nodes that the selected node reauests.
 * @param affected List of node directly or inderectly depenedent on the selected node.
 */
function selectNode(node, used_by, requested, affected) {
    sidebar.selectNode(node);
    usedByTreeDataProvider.clearAllNodes();
    requestedTreeDataProvider.clearAllNodes();
    affectedTreeDataProvider.clearAllNodes();
    usedByTreeDataProvider.updateNodes(used_by);
    requestedTreeDataProvider.updateNodes(requested);
    affectedTreeDataProvider.updateNodes(affected);
    usedByTreeDataProvider.refresh();
    requestedTreeDataProvider.refresh();
    affectedTreeDataProvider.refresh();
}
exports.selectNode = selectNode;
//# sourceMappingURL=extension.js.map