import * as vscode from 'vscode'; import { Folder, TiaProjectServerFetchApi } from './TiaProjectServerFetchApi.js'; import { ItemType } from './ItemType.js'; export class TiaProjectTreeView implements vscode.TreeDataProvider, vscode.TreeDragAndDropController { private _onDidChangeTreeData: vscode.EventEmitter = new vscode.EventEmitter(); public onDidChangeTreeData: vscode.Event = this._onDidChangeTreeData.event; projectTree: ProjectTreeItem[] = []; constructor(context: vscode.ExtensionContext) { const view = vscode.window.createTreeView('tiaProjectTreeView', { treeDataProvider: this, showCollapseAll: true, canSelectMany: false, dragAndDropController: this }); context.subscriptions.push(view); vscode.commands.registerCommand('tiaProjectTreeView.openFile', (resource) => this.showTreeItem(resource)); } getTreeItem(element: vscode.TreeItem): vscode.TreeItem | Thenable { if (true) { //element.type === vscode.FileType.File) { element.command = { command: 'tiaProjectTreeView.openFile', title: "Open File", arguments: [element], }; element.contextValue = 'file'; } if (element instanceof ProjectTreeItem) { element.contextValue = 'project'; } return element; } async showTreeItem(element: vscode.TreeItem) { if (element instanceof FolderTreeItem) { const itemResult = await TiaProjectServerFetchApi.getItem(element.projectTreeItem.file, element.folder.id); switch (itemResult.itemType) { case ItemType.PNG: { let img = vscode.Uri.parse('data:image/png;base64,' + itemResult.data); await vscode.commands.executeCommand('vscode.openWith', img, 'imagePreview.previewEditor'); break; } case ItemType.BMP: { let img = vscode.Uri.parse('data:image/bmp;base64,' + itemResult.data); await vscode.commands.executeCommand('vscode.openWith', img, 'imagePreview.previewEditor'); break; } case ItemType.SVG: { let img = vscode.Uri.parse('data:image/svg+xml;base64,' + itemResult.data); await vscode.commands.executeCommand('vscode.openWith', img, 'imagePreview.previewEditor'); break; } } /* let setting: vscode.Uri = vscode.Uri.parse("untitled:" + itemResult.name); vscode.workspace.openTextDocument(setting).then((a: vscode.TextDocument) => { vscode.window.showTextDocument(a, 1, false).then(e => { e.edit(edit => { edit.insert(new vscode.Position(0, 0), itemResult.stringData ?? itemResult.data); }); }); }, (error: any) => { console.error(error); debugger; });*/ } } async getChildren(element?: ChildrenTreeItem | undefined): Promise { if (element === undefined) { return this.projectTree; } return element.children; } dropMimeTypes = ['text/url-list', 'text/uri-list', 'files']; dragMimeTypes = []; handleDrag(source: readonly FolderTreeItem[], dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): void | Thenable { } async handleDrop(target: FolderTreeItem | undefined, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): Promise { const uriList = dataTransfer.get('text/uri-list'); //@ts-ignore await this.openTiaProject(await uriList?.asString()); } async openTiaProject(uri: string) { try { const fileUri = decodeURIComponent(uri).replace("file:///", ""); const folderResult = await TiaProjectServerFetchApi.getFolders(fileUri); let prj = new ProjectTreeItem(fileUri, fileUri); prj.children = folderResult.folders.map(x => new FolderTreeItem(x, prj)); this.projectTree.push(prj); this._onDidChangeTreeData.fire(null); } catch (err) { vscode.window.showErrorMessage('Error: ' + (err)?.cause?.toString()); } } closeProject(item: ProjectTreeItem) { TiaProjectServerFetchApi.closeProject(item.file); this.projectTree.splice(this.projectTree.indexOf(item), 1); this._onDidChangeTreeData.fire(null); } } abstract class ChildrenTreeItem extends vscode.TreeItem { readonly abstract children: vscode.TreeItem[]; } class ProjectTreeItem extends ChildrenTreeItem { name: string; file: string; //@ts-ignore children: FolderTreeItem[]; constructor(name: string, file: string) { super( name, vscode.TreeItemCollapsibleState.Expanded); this.name = name; this.file = file; } } class FolderTreeItem extends ChildrenTreeItem { folder: Folder; projectTreeItem: ProjectTreeItem; constructor(folder: Folder, projectTreeItem: ProjectTreeItem) { super( folder.name, folder.children != null ? vscode.TreeItemCollapsibleState.Collapsed : vscode.TreeItemCollapsibleState.None); this.folder = folder; this.projectTreeItem = projectTreeItem; } get children() { return this.folder.children.map(x => new FolderTreeItem(x, this.projectTreeItem)); } }