// Copyright (c) jdneo. All rights reserved. // Licensed under the MIT license. import * as os from "os"; import * as path from "path"; import * as vscode from "vscode"; import { IQuickItemEx } from "../shared"; import { getWorkspaceConfiguration, getWorkspaceFolder } from "./settingUtils"; import { showDirectorySelectDialog } from "./uiUtils"; import * as wsl from "./wslUtils"; export async function selectWorkspaceFolder(): Promise { let workspaceFolderSetting: string = getWorkspaceFolder(); if (workspaceFolderSetting.trim() === "") { workspaceFolderSetting = await determineLeetCodeFolder(); if (workspaceFolderSetting === "") { // User cancelled return workspaceFolderSetting; } } const workspaceFolders: vscode.WorkspaceFolder[] = vscode.workspace.workspaceFolders || []; let needAsk: boolean = true; for (const folder of workspaceFolders) { if (isSubFolder(folder.uri.fsPath, workspaceFolderSetting)) { needAsk = false; } } if (needAsk) { const choice: string | undefined = await vscode.window.showQuickPick( [ OpenOption.openInCurrentWindow, OpenOption.openInNewWindow, OpenOption.addToWorkspace, ], { placeHolder: "Select how you would like to open your workspace folder" }, ); switch (choice) { case OpenOption.openInCurrentWindow: await vscode.commands.executeCommand("vscode.openFolder", vscode.Uri.file(workspaceFolderSetting), false); return ""; case OpenOption.openInNewWindow: await vscode.commands.executeCommand("vscode.openFolder", vscode.Uri.file(workspaceFolderSetting), true); return ""; case OpenOption.addToWorkspace: vscode.workspace.updateWorkspaceFolders(workspaceFolders.length, 0, { uri: vscode.Uri.file(workspaceFolderSetting) }); break; default: return ""; } } return wsl.useWsl() ? wsl.toWslPath(workspaceFolderSetting) : workspaceFolderSetting; } export async function getActiveFilePath(uri?: vscode.Uri): Promise { let textEditor: vscode.TextEditor | undefined; if (uri) { textEditor = await vscode.window.showTextDocument(uri, { preview: false }); } else { textEditor = vscode.window.activeTextEditor; } if (!textEditor) { return undefined; } if (textEditor.document.isDirty && !await textEditor.document.save()) { vscode.window.showWarningMessage("Please save the solution file first."); return undefined; } return wsl.useWsl() ? wsl.toWslPath(textEditor.document.uri.fsPath) : textEditor.document.uri.fsPath; } function isSubFolder(from: string, to: string): boolean { const relative: string = path.relative(from, to); if (relative === "") { return true; } return !relative.startsWith("..") && !path.isAbsolute(relative); } async function determineLeetCodeFolder(): Promise { let result: string; const picks: Array> = []; picks.push( { label: `Default location`, detail: `${path.join(os.homedir(), ".leetcode")}`, value: `${path.join(os.homedir(), ".leetcode")}`, }, { label: "$(file-directory) Browse...", value: ":browse", }, ); const choice: IQuickItemEx | undefined = await vscode.window.showQuickPick( picks, { placeHolder: "Select where you would like to save your LeetCode files" }, ); if (!choice) { result = ""; } else if (choice.value === ":browse") { const directory: vscode.Uri[] | undefined = await showDirectorySelectDialog(); if (!directory || directory.length < 1) { result = ""; } else { result = directory[0].fsPath; } } else { result = choice.value; } getWorkspaceConfiguration().update("workspaceFolder", result, vscode.ConfigurationTarget.Global); return result; } enum OpenOption { openInCurrentWindow = "Open in current window", openInNewWindow = "Open in new window", addToWorkspace = "Add to workspace", }