From 3a310574e1cd2535345a8e341edc376c09e4f6f4 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 14 Apr 2023 13:37:21 +0800 Subject: [PATCH] feat: Support create different kind of resources from inline new button. --- package.json | 19 ++++++++----- package.nls.json | 1 + package.nls.zh-cn.json | 1 + package.nls.zh-tw.json | 1 + src/commands.ts | 2 ++ src/explorerCommands/new.ts | 48 +++++++++++++++++++++++++++++++++ src/views/dependencyExplorer.ts | 5 +++- 7 files changed, 69 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 6ebf1469..5cc552a3 100644 --- a/package.json +++ b/package.json @@ -168,6 +168,12 @@ "title": "%contributes.commands.java.view.package.copyRelativeFilePath%", "category": "Java" }, + { + "command": "java.view.package.new", + "title": "%contributes.commands.java.view.package.new%", + "category": "Java", + "icon": "$(add)" + }, { "command": "java.view.menus.file.newJavaClass", "title": "%contributes.commands.java.view.menus.file.newJavaClass%", @@ -382,6 +388,10 @@ "command": "java.project.refreshLibraries", "when": "false" }, + { + "command": "java.view.package.new", + "when": "false" + }, { "command": "java.view.package.newJavaClass", "when": "false" @@ -576,13 +586,8 @@ "group": "1_new@10" }, { - "command": "java.view.package.newJavaClass", - "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+java\\b)(?=.*?\\b\\+uri\\b)/", - "group": "inline@add_0" - }, - { - "command": "java.view.package.newJavaClass", - "when": "view == javaProjectExplorer && viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)(?=.*?\\b\\+uri\\b)/", + "command": "java.view.package.new", + "when": "view == javaProjectExplorer && viewItem =~ /java(?!:container)(?!:jar)(?!.*?\\b\\+binary\\b)(?=.*?\\b\\+uri\\b)/", "group": "inline@add_0" }, { diff --git a/package.nls.json b/package.nls.json index 75b3d84a..b390d80d 100644 --- a/package.nls.json +++ b/package.nls.json @@ -20,6 +20,7 @@ "contributes.commands.java.view.package.exportJar": "Export Jar...", "contributes.commands.java.view.package.copyFilePath": "Copy Path", "contributes.commands.java.view.package.copyRelativeFilePath": "Copy Relative Path", + "contributes.commands.java.view.package.new": "New...", "contributes.commands.java.view.package.newJavaClass": "Java Class", "contributes.commands.java.view.package.newPackage": "Package", "contributes.commands.java.view.package.newFile": "File", diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index 4a49bb8f..a6729722 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -20,6 +20,7 @@ "contributes.commands.java.view.package.exportJar": "导出到 Jar 文件...", "contributes.commands.java.view.package.copyFilePath": "复制路径", "contributes.commands.java.view.package.copyRelativeFilePath": "复制相对路径", + "contributes.commands.java.view.package.new": "创建...", "contributes.commands.java.view.package.newJavaClass": "Java 类", "contributes.commands.java.view.package.newPackage": "包", "contributes.commands.java.view.package.newFile": "文件", diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index a8151127..fd27c378 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -19,6 +19,7 @@ "contributes.commands.java.view.package.exportJar": "匯出成 Jar 檔案...", "contributes.commands.java.view.package.copyFilePath": "複製路徑", "contributes.commands.java.view.package.copyRelativeFilePath": "複製相對路徑", + "contributes.commands.java.view.package.new": "建立...", "contributes.commands.java.view.package.newJavaClass": "Java 類別", "contributes.commands.java.view.package.newPackage": "套件", "contributes.commands.java.view.package.newFile": "檔案", diff --git a/src/commands.ts b/src/commands.ts index 5fc09b3e..1976893a 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -36,6 +36,8 @@ export namespace Commands { export const EXPORT_JAR_REPORT = "java.view.package.exportJarReport"; + export const VIEW_PACKAGE_NEW = "java.view.package.new"; + export const VIEW_PACKAGE_NEW_JAVA_CLASS = "java.view.package.newJavaClass"; export const VIEW_PACKAGE_NEW_JAVA_PACKAGE = "java.view.package.newPackage"; diff --git a/src/explorerCommands/new.ts b/src/explorerCommands/new.ts index 45837ce0..509439db 100644 --- a/src/explorerCommands/new.ts +++ b/src/explorerCommands/new.ts @@ -13,6 +13,54 @@ import { resourceRoots } from "../views/packageRootNode"; import { checkJavaQualifiedName } from "./utility"; import { sendError, setUserError } from "vscode-extension-telemetry-wrapper"; +export async function newResource(node: DataNode): Promise { + const availableTypes: string[] = []; + // add options for Java nodes + if (node.nodeData.kind === NodeKind.Project || + (node.nodeData.kind === NodeKind.PackageRoot && !resourceRoots.includes(node.nodeData.name)) || + node.nodeData.kind === NodeKind.Package || + node.nodeData.kind === NodeKind.PrimaryType || + node.nodeData.kind === NodeKind.CompilationUnit) { + availableTypes.push("$(symbol-class) Java Class", "$(symbol-namespace) Package"); + } + + // add new file option + availableTypes.push("$(file) File"); + + // add new folder option + if (node.nodeData.kind === NodeKind.Project || + (node.nodeData.kind === NodeKind.PackageRoot && resourceRoots.includes(node.nodeData.name)) || + node.nodeData.kind === NodeKind.Folder || + node.nodeData.kind === NodeKind.File) { + availableTypes.push("$(folder) Folder"); + } + + const type = await window.showQuickPick( + availableTypes, + { + placeHolder: "Select resource type to create.", + ignoreFocusOut: true, + } + ); + + switch (type) { + case "$(symbol-class) Java Class": + await newJavaClass(node); + break; + case "$(symbol-namespace) Package": + await newPackage(node); + break; + case "$(file) File": + await newFile(node); + break; + case "$(folder) Folder": + await newFolder(node); + break; + default: + break; + } +} + // TODO: separate to two function to handle creation from menu bar and explorer. export async function newJavaClass(node?: DataNode): Promise { let packageFsPath: string | undefined; diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index 12e19690..6d1d0a17 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -12,7 +12,7 @@ import { import { instrumentOperationAsVsCodeCommand, sendInfo } from "vscode-extension-telemetry-wrapper"; import { Commands } from "../commands"; import { deleteFiles } from "../explorerCommands/delete"; -import { newFile, newFolder, newJavaClass, newPackage } from "../explorerCommands/new"; +import { newFile, newFolder, newJavaClass, newPackage, newResource } from "../explorerCommands/new"; import { renameFile } from "../explorerCommands/rename"; import { getCmdNode } from "../explorerCommands/utility"; import { Jdtls } from "../java/jdtls"; @@ -125,6 +125,9 @@ export class DependencyExplorer implements Disposable { // register keybinding commands context.subscriptions.push( + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW, async (node: DataNode) => { + newResource(node); + }), instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_CLASS, async (node?: DataNode) => { newJavaClass(node); }),