From 30ab9442829bc8c9cb5a752b1a1e19190832d363 Mon Sep 17 00:00:00 2001 From: 0dinD Date: Mon, 4 Jan 2021 22:38:03 +0100 Subject: [PATCH 1/6] Fix 'addLibraries' dialog not working on Linux --- src/controllers/libraryController.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/controllers/libraryController.ts b/src/controllers/libraryController.ts index 358cb4f6..6cd2f323 100644 --- a/src/controllers/libraryController.ts +++ b/src/controllers/libraryController.ts @@ -4,6 +4,7 @@ import * as fse from "fs-extra"; import * as _ from "lodash"; import * as minimatch from "minimatch"; +import { platform } from "os"; import * as path from "path"; import { Disposable, ExtensionContext, Uri, window, workspace, WorkspaceFolder } from "vscode"; import { instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; @@ -35,13 +36,13 @@ export class LibraryController implements Disposable { if (!libraryGlobs) { libraryGlobs = []; const workspaceFolder: WorkspaceFolder | undefined = Utility.getDefaultWorkspaceFolder(); - const isWindows = process.platform.indexOf("win") === 0; + const isMac = platform() === "darwin"; const results: Uri[] | undefined = await window.showOpenDialog({ defaultUri: workspaceFolder && workspaceFolder.uri, canSelectFiles: true, - canSelectFolders: isWindows ? false : true, + canSelectFolders: isMac ? true : false, canSelectMany: true, - openLabel: isWindows ? "Select jar files" : "Select jar files or directories", + openLabel: isMac ? "Select jar files or directories" : "Select jar files", filters: { Library: ["jar"] }, }); if (!results) { From b2d3702a40079302578a744877b0fcd68beabce6 Mon Sep 17 00:00:00 2001 From: 0dinD Date: Mon, 4 Jan 2021 22:39:12 +0100 Subject: [PATCH 2/6] Add separate button for adding folders to 'Referenced Libraries' --- package.json | 19 +++++++++-- package.nls.json | 5 +-- package.nls.zh.json | 3 +- src/commands.ts | 2 ++ src/controllers/libraryController.ts | 49 +++++++++++++--------------- 5 files changed, 47 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index 158df578..234b48b4 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,13 @@ "command": "java.project.addLibraries", "title": "%contributes.commands.java.project.addLibraries%", "category": "Java", - "icon": "$(add)" + "icon": "$(new-file)" + }, + { + "command": "java.project.addLibraryFolders", + "title": "%contributes.commands.java.project.addLibraryFolders%", + "category": "Java", + "icon": "$(new-folder)" }, { "command": "java.project.removeLibrary", @@ -285,6 +291,10 @@ "command": "java.project.addLibraries", "when": "false" }, + { + "command": "java.project.addLibraryFolders", + "when": "false" + }, { "command": "java.project.removeLibrary", "when": "false" @@ -468,6 +478,11 @@ "when": "view == javaProjectExplorer && viewItem =~ /java:container(?=.*?\\b\\+referencedLibrary\\b)/", "group": "inline@0" }, + { + "command": "java.project.addLibraryFolders", + "when": "view == javaProjectExplorer && viewItem =~ /java:container(?=.*?\\b\\+referencedLibrary\\b)/", + "group": "inline@1" + }, { "command": "java.project.removeLibrary", "when": "view == javaProjectExplorer && viewItem =~ /java:jar(?=.*?\\b\\+referencedLibrary\\b)(?=.*?\\b\\+uri\\b)/", @@ -476,7 +491,7 @@ { "command": "java.project.refreshLibraries", "when": "view == javaProjectExplorer && viewItem =~ /java:container(?=.*?\\b\\+referencedLibrary\\b)/", - "group": "inline@1" + "group": "inline@2" }, { "command": "java.view.package.exportJar", diff --git a/package.nls.json b/package.nls.json index 8f347e43..4798ed58 100644 --- a/package.nls.json +++ b/package.nls.json @@ -1,8 +1,9 @@ { "description": "Manage Java projects in Visual Studio Code", "contributes.commands.java.project.create": "Create Java Project...", - "contributes.commands.java.project.addLibraries": "Add a jar file or a folder to project classpath", - "contributes.commands.java.project.removeLibrary": "Remove jar file from project classpath", + "contributes.commands.java.project.addLibraries": "Add Jar Libraries to Project Classpath...", + "contributes.commands.java.project.addLibraryFolders": "Add Library Folders to Project Classpath...", + "contributes.commands.java.project.removeLibrary": "Remove Library from Project Classpath", "contributes.commands.java.view.package.refresh": "Refresh", "contributes.commands.java.project.build.workspace": "Build Workspace", "contributes.commands.java.project.clean.workspace": "Clean Workspace", diff --git a/package.nls.zh.json b/package.nls.zh.json index 3ca4e1fe..c32fd810 100644 --- a/package.nls.zh.json +++ b/package.nls.zh.json @@ -1,7 +1,8 @@ { "description": "在 Visual Studio Code 中管理 Java 项目", "contributes.commands.java.project.create": "创建 Java 项目...", - "contributes.commands.java.project.addLibraries": "将一个 Jar 文件或一个目录添加到 Java 项目类路径中", + "contributes.commands.java.project.addLibraries": "TRANSLATION NEEDED...", + "contributes.commands.java.project.addLibraryFolders": "TRANSLATION NEEDED...", "contributes.commands.java.project.removeLibrary": "将该 Jar 文件从 Java 项目类路径中移除", "contributes.commands.java.view.package.refresh": "刷新", "contributes.commands.java.project.build.workspace": "构建工作空间", diff --git a/src/commands.ts b/src/commands.ts index 7cac8268..6f2c7fe4 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -46,6 +46,8 @@ export namespace Commands { export const JAVA_PROJECT_ADD_LIBRARIES = "java.project.addLibraries"; + export const JAVA_PROJECT_ADD_LIBRARY_FOLDERS = "java.project.addLibraryFolders"; + export const JAVA_PROJECT_REMOVE_LIBRARY = "java.project.removeLibrary"; export const JAVA_PROJECT_REFRESH_LIBRARIES = "java.project.refreshLibraries"; diff --git a/src/controllers/libraryController.ts b/src/controllers/libraryController.ts index 6cd2f323..8c6b3f91 100644 --- a/src/controllers/libraryController.ts +++ b/src/controllers/libraryController.ts @@ -1,10 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import * as fse from "fs-extra"; import * as _ from "lodash"; import * as minimatch from "minimatch"; -import { platform } from "os"; import * as path from "path"; import { Disposable, ExtensionContext, Uri, window, workspace, WorkspaceFolder } from "vscode"; import { instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; @@ -21,6 +19,7 @@ export class LibraryController implements Disposable { public constructor(public readonly context: ExtensionContext) { this.disposable = Disposable.from( instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_ADD_LIBRARIES, () => this.addLibraries()), + instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_ADD_LIBRARY_FOLDERS, () => this.addLibraries(true)), instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_REMOVE_LIBRARY, (node: DataNode) => node.uri && this.removeLibrary(Uri.parse(node.uri).fsPath)), instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_REFRESH_LIBRARIES, () => @@ -32,36 +31,34 @@ export class LibraryController implements Disposable { this.disposable.dispose(); } - public async addLibraries(libraryGlobs?: string[]) { - if (!libraryGlobs) { - libraryGlobs = []; - const workspaceFolder: WorkspaceFolder | undefined = Utility.getDefaultWorkspaceFolder(); - const isMac = platform() === "darwin"; - const results: Uri[] | undefined = await window.showOpenDialog({ - defaultUri: workspaceFolder && workspaceFolder.uri, - canSelectFiles: true, - canSelectFolders: isMac ? true : false, - canSelectMany: true, - openLabel: isMac ? "Select jar files or directories" : "Select jar files", - filters: { Library: ["jar"] }, - }); - if (!results) { - return; - } - libraryGlobs = await Promise.all(results.map(async (uri: Uri) => { - // keep the param: `includeWorkspaceFolder` to false here - // since the multi-root is not supported well for invisible projects - const uriPath = workspace.asRelativePath(uri, false); - return (await fse.stat(uri.fsPath)).isDirectory() ? `${uriPath}/**/*.jar` : uriPath; - })); - } - + public async addLibraryGlobs(libraryGlobs: string[]) { const setting = Settings.referencedLibraries(); setting.exclude = this.dedupAlreadyCoveredPattern(libraryGlobs, ...setting.exclude); setting.include = this.updatePatternArray(setting.include, ...libraryGlobs); Settings.updateReferencedLibraries(setting); } + public async addLibraries(folders?: boolean) { + const workspaceFolder: WorkspaceFolder | undefined = Utility.getDefaultWorkspaceFolder(); + const results: Uri[] | undefined = await window.showOpenDialog({ + defaultUri: workspaceFolder && workspaceFolder.uri, + canSelectFiles: !folders, + canSelectFolders: folders, + canSelectMany: true, + openLabel: folders ? "Select Library Folders" : "Select Jar Libraries", + filters: folders ? { Folders: ["*"] } : { "Jar Files": ["jar"] }, + }); + if (!results) { + return; + } + this.addLibraryGlobs(await Promise.all(results.map(async (uri: Uri) => { + // keep the param: `includeWorkspaceFolder` to false here + // since the multi-root is not supported well for invisible projects + const uriPath = workspace.asRelativePath(uri, false); + return folders ? uriPath + "/**/*.jar" : uriPath; + }))); + } + public async removeLibrary(removalFsPath: string) { const setting = Settings.referencedLibraries(); const removedPaths = _.remove(setting.include, (include) => { From 4665d8cdf77d34322da45f2fe858cca612b66049 Mon Sep 17 00:00:00 2001 From: 0dinD Date: Thu, 7 Jan 2021 16:56:18 +0100 Subject: [PATCH 3/6] Make addLibraryFolders an alt-command instead of separate button --- package.json | 10 +++------- package.nls.zh.json | 2 +- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 234b48b4..08580d72 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "command": "java.project.addLibraries", "title": "%contributes.commands.java.project.addLibraries%", "category": "Java", - "icon": "$(new-file)" + "icon": "$(add)" }, { "command": "java.project.addLibraryFolders", @@ -475,14 +475,10 @@ }, { "command": "java.project.addLibraries", + "alt": "java.project.addLibraryFolders", "when": "view == javaProjectExplorer && viewItem =~ /java:container(?=.*?\\b\\+referencedLibrary\\b)/", "group": "inline@0" }, - { - "command": "java.project.addLibraryFolders", - "when": "view == javaProjectExplorer && viewItem =~ /java:container(?=.*?\\b\\+referencedLibrary\\b)/", - "group": "inline@1" - }, { "command": "java.project.removeLibrary", "when": "view == javaProjectExplorer && viewItem =~ /java:jar(?=.*?\\b\\+referencedLibrary\\b)(?=.*?\\b\\+uri\\b)/", @@ -491,7 +487,7 @@ { "command": "java.project.refreshLibraries", "when": "view == javaProjectExplorer && viewItem =~ /java:container(?=.*?\\b\\+referencedLibrary\\b)/", - "group": "inline@2" + "group": "inline@1" }, { "command": "java.view.package.exportJar", diff --git a/package.nls.zh.json b/package.nls.zh.json index c32fd810..f645b10b 100644 --- a/package.nls.zh.json +++ b/package.nls.zh.json @@ -3,7 +3,7 @@ "contributes.commands.java.project.create": "创建 Java 项目...", "contributes.commands.java.project.addLibraries": "TRANSLATION NEEDED...", "contributes.commands.java.project.addLibraryFolders": "TRANSLATION NEEDED...", - "contributes.commands.java.project.removeLibrary": "将该 Jar 文件从 Java 项目类路径中移除", + "contributes.commands.java.project.removeLibrary": "TRANSLATION NEEDED? (English wording changed slightly, see previous commit)", "contributes.commands.java.view.package.refresh": "刷新", "contributes.commands.java.project.build.workspace": "构建工作空间", "contributes.commands.java.project.clean.workspace": "清理工作空间", From a735dc5fda2ddc00f6b5aa1ccbc90707d05c0b17 Mon Sep 17 00:00:00 2001 From: 0dinD Date: Sun, 10 Jan 2021 13:38:13 +0100 Subject: [PATCH 4/6] Address review comments --- src/controllers/libraryController.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/controllers/libraryController.ts b/src/controllers/libraryController.ts index 8c6b3f91..b0cdfdb1 100644 --- a/src/controllers/libraryController.ts +++ b/src/controllers/libraryController.ts @@ -3,6 +3,7 @@ import * as _ from "lodash"; import * as minimatch from "minimatch"; +import { platform } from "os"; import * as path from "path"; import { Disposable, ExtensionContext, Uri, window, workspace, WorkspaceFolder } from "vscode"; import { instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; @@ -38,15 +39,16 @@ export class LibraryController implements Disposable { Settings.updateReferencedLibraries(setting); } - public async addLibraries(folders?: boolean) { + public async addLibraries(canSelectFolders?: boolean) { const workspaceFolder: WorkspaceFolder | undefined = Utility.getDefaultWorkspaceFolder(); + const isMac = platform() === "darwin"; const results: Uri[] | undefined = await window.showOpenDialog({ defaultUri: workspaceFolder && workspaceFolder.uri, - canSelectFiles: !folders, - canSelectFolders: folders, + canSelectFiles: !canSelectFolders, + canSelectFolders: canSelectFolders || isMac, canSelectMany: true, - openLabel: folders ? "Select Library Folders" : "Select Jar Libraries", - filters: folders ? { Folders: ["*"] } : { "Jar Files": ["jar"] }, + openLabel: canSelectFolders ? "Select Library Folders" : "Select Jar Libraries", + filters: canSelectFolders ? { Folders: ["*"] } : { "Jar Files": ["jar"] }, }); if (!results) { return; @@ -55,7 +57,7 @@ export class LibraryController implements Disposable { // keep the param: `includeWorkspaceFolder` to false here // since the multi-root is not supported well for invisible projects const uriPath = workspace.asRelativePath(uri, false); - return folders ? uriPath + "/**/*.jar" : uriPath; + return canSelectFolders ? uriPath + "/**/*.jar" : uriPath; }))); } From 7e571197a345313ff5d70b3dbe4828124eabc8b6 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 11 Jan 2021 15:44:23 +0800 Subject: [PATCH 5/6] Add chinese traslation --- package.nls.json | 2 +- package.nls.zh.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.nls.json b/package.nls.json index 4798ed58..55a540c9 100644 --- a/package.nls.json +++ b/package.nls.json @@ -3,7 +3,7 @@ "contributes.commands.java.project.create": "Create Java Project...", "contributes.commands.java.project.addLibraries": "Add Jar Libraries to Project Classpath...", "contributes.commands.java.project.addLibraryFolders": "Add Library Folders to Project Classpath...", - "contributes.commands.java.project.removeLibrary": "Remove Library from Project Classpath", + "contributes.commands.java.project.removeLibrary": "Remove from Project Classpath", "contributes.commands.java.view.package.refresh": "Refresh", "contributes.commands.java.project.build.workspace": "Build Workspace", "contributes.commands.java.project.clean.workspace": "Clean Workspace", diff --git a/package.nls.zh.json b/package.nls.zh.json index f645b10b..ef65f631 100644 --- a/package.nls.zh.json +++ b/package.nls.zh.json @@ -1,9 +1,9 @@ { "description": "在 Visual Studio Code 中管理 Java 项目", "contributes.commands.java.project.create": "创建 Java 项目...", - "contributes.commands.java.project.addLibraries": "TRANSLATION NEEDED...", - "contributes.commands.java.project.addLibraryFolders": "TRANSLATION NEEDED...", - "contributes.commands.java.project.removeLibrary": "TRANSLATION NEEDED? (English wording changed slightly, see previous commit)", + "contributes.commands.java.project.addLibraries": "添加 Jar 文件至项目 Classpath...", + "contributes.commands.java.project.addLibraryFolders": "添加文件夹至项目 Classpath...", + "contributes.commands.java.project.removeLibrary": "从项目 Classpath 中移除", "contributes.commands.java.view.package.refresh": "刷新", "contributes.commands.java.project.build.workspace": "构建工作空间", "contributes.commands.java.project.clean.workspace": "清理工作空间", From 219736787b6283703be33e16725a3664f806be4e Mon Sep 17 00:00:00 2001 From: 0dinD Date: Mon, 11 Jan 2021 16:26:53 +0100 Subject: [PATCH 6/6] Address review comment --- src/controllers/libraryController.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/controllers/libraryController.ts b/src/controllers/libraryController.ts index b0cdfdb1..563823e3 100644 --- a/src/controllers/libraryController.ts +++ b/src/controllers/libraryController.ts @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +import * as fse from "fs-extra"; import * as _ from "lodash"; import * as minimatch from "minimatch"; import { platform } from "os"; @@ -57,7 +58,8 @@ export class LibraryController implements Disposable { // keep the param: `includeWorkspaceFolder` to false here // since the multi-root is not supported well for invisible projects const uriPath = workspace.asRelativePath(uri, false); - return canSelectFolders ? uriPath + "/**/*.jar" : uriPath; + const isLibraryFolder = canSelectFolders || isMac && (await fse.stat(uri.fsPath)).isDirectory(); + return isLibraryFolder ? uriPath + "/**/*.jar" : uriPath; }))); }