forked from LeetCode-OpenSource/vscode-leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathworkspaceUtils.ts
129 lines (117 loc) · 4.55 KB
/
workspaceUtils.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// Copyright (c) jdneo. All rights reserved.
// Licensed under the MIT license.
import * as fse from "fs-extra";
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<string> {
let workspaceFolderSetting: string = getWorkspaceFolder();
if (workspaceFolderSetting.trim() === "") {
workspaceFolderSetting = await determineLeetCodeFolder();
if (workspaceFolderSetting === "") {
// User cancelled
return workspaceFolderSetting;
}
}
let needAsk: boolean = true;
await fse.ensureDir(workspaceFolderSetting);
for (const folder of vscode.workspace.workspaceFolders || []) {
if (isSubFolder(folder.uri.fsPath, workspaceFolderSetting)) {
needAsk = false;
}
}
if (needAsk) {
const choice: string | undefined = await vscode.window.showQuickPick(
[
OpenOption.justOpenFile,
OpenOption.openInCurrentWindow,
OpenOption.openInNewWindow,
OpenOption.addToWorkspace,
],
{ placeHolder: "The LeetCode workspace folder is not opened in VS Code, would you like to open it?" },
);
// Todo: generate file first
switch (choice) {
case OpenOption.justOpenFile:
return workspaceFolderSetting;
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(vscode.workspace.workspaceFolders?.length ?? 0, 0, { uri: vscode.Uri.file(workspaceFolderSetting) });
break;
default:
return "";
}
}
return wsl.useWsl() ? wsl.toWslPath(workspaceFolderSetting) : workspaceFolderSetting;
}
export async function getActiveFilePath(uri?: vscode.Uri): Promise<string | undefined> {
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<string> {
let result: string;
const picks: Array<IQuickItemEx<string>> = [];
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<string> | 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 {
justOpenFile = "Just open the problem file",
openInCurrentWindow = "Open in current window",
openInNewWindow = "Open in new window",
addToWorkspace = "Add to workspace",
}