From 195ebc35fbd562ba29e02c3c46eaa75fb9b0d70e Mon Sep 17 00:00:00 2001 From: xqzlgy2 Date: Mon, 28 Sep 2020 12:24:40 +0800 Subject: [PATCH 01/13] feat: Add 'delete' to context menu (#207) --- package.json | 24 ++++++++++++++++++ package.nls.json | 1 + package.nls.zh.json | 1 + src/commands.ts | 2 ++ src/constants.ts | 2 ++ src/explorerCommands/delete.ts | 39 +++++++++++++++++++++++++++++ src/views/PrimaryTypeNode.ts | 15 +++++++++++ src/views/dependencyDataProvider.ts | 2 ++ src/views/fileNode.ts | 5 ++++ 9 files changed, 91 insertions(+) create mode 100644 src/explorerCommands/delete.ts diff --git a/package.json b/package.json index 278ef24b..7ae32e8f 100644 --- a/package.json +++ b/package.json @@ -138,6 +138,11 @@ "command": "java.view.package.newPackage", "title": "%contributes.commands.java.view.package.newPackage%", "category": "Java" + }, + { + "command": "java.view.package.moveFileToTrash", + "title": "%contributes.commands.java.view.package.moveFileToTrash%", + "category": "Java" } ], "configuration": { @@ -233,6 +238,10 @@ "command": "java.view.package.newPackage", "when": "never" }, + { + "command": "java.view.package.moveFileToTrash", + "when": "never" + }, { "command": "java.project.build.workspace", "when": "never" @@ -326,6 +335,21 @@ "when": "view == javaProjectExplorer && viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)(?=.*?\\b\\+uri\\b)/", "group": "new@20" }, + { + "command": "java.view.package.moveFileToTrash", + "when": "view == javaProjectExplorer && viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)(?=.*?\\b\\+uri\\b)/", + "group": "delete@10" + }, + { + "command": "java.view.package.moveFileToTrash", + "when": "view == javaProjectExplorer && viewItem =~ /java:file(?=.*?\\b\\+uri\\b)/", + "group": "delete@10" + }, + { + "command": "java.view.package.moveFileToTrash", + "when": "view == javaProjectExplorer && viewItem =~ /java:sourceFile(?=.*?\\b\\+uri\\b)/", + "group": "delete@10" + }, { "command": "java.project.addLibraries", "when": "view == javaProjectExplorer && viewItem =~ /java:container(?=.*?\\b\\+referencedLibrary\\b)/", diff --git a/package.nls.json b/package.nls.json index 175238ee..43e92b23 100644 --- a/package.nls.json +++ b/package.nls.json @@ -17,6 +17,7 @@ "contributes.commands.java.view.package.copyRelativeFilePath": "Copy Relative Path", "contributes.commands.java.view.package.newJavaClass": "New Java Class", "contributes.commands.java.view.package.newPackage": "New Package", + "contributes.commands.java.view.package.moveFileToTrash": "Delete", "configuration.java.dependency.showMembers": "Show the members in the explorer", "configuration.java.dependency.syncWithFolderExplorer": "Synchronize Java Projects explorer selection with folder explorer", "configuration.java.dependency.autoRefresh": "Synchronize Java Projects explorer with changes", diff --git a/package.nls.zh.json b/package.nls.zh.json index 3b5ec71e..1b7e332e 100644 --- a/package.nls.zh.json +++ b/package.nls.zh.json @@ -17,6 +17,7 @@ "contributes.commands.java.view.package.copyRelativeFilePath": "复制相对路径", "contributes.commands.java.view.package.newJavaClass": "创建 Java 类", "contributes.commands.java.view.package.newPackage": "创建包", + "contributes.commands.java.view.package.moveFileToTrash": "删除", "configuration.java.dependency.showMembers": "在 Java 项目管理器中显示成员", "configuration.java.dependency.syncWithFolderExplorer": "在 Java 项目管理器中同步关联当前打开的文件", "configuration.java.dependency.autoRefresh": "在 Java 项目管理器中自动同步修改", diff --git a/src/commands.ts b/src/commands.ts index fd078262..618aa92d 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -36,6 +36,8 @@ export namespace Commands { export const VIEW_PACKAGE_NEW_JAVA_PACKAGE = "java.view.package.newPackage"; + export const VIEW_PACKAGE_MOVE_FILE_TO_TRASH = "java.view.package.moveFileToTrash"; + export const VIEW_PACKAGE_REVEAL_IN_PROJECT_EXPLORER = "java.view.package.revealInProjectExplorer"; export const JAVA_PROJECT_CREATE = "java.project.create"; diff --git a/src/constants.ts b/src/constants.ts index bdb47cb0..338757c5 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -13,5 +13,7 @@ export namespace Explorer { PackageRoot = "packageRoot", Package = "package", Jar = "jar", + File = "file", + SourceFile = "sourceFile" } } diff --git a/src/explorerCommands/delete.ts b/src/explorerCommands/delete.ts new file mode 100644 index 00000000..a99501b4 --- /dev/null +++ b/src/explorerCommands/delete.ts @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { window, workspace, Uri } from "vscode"; +import { DataNode } from "../views/dataNode"; + +const deleteOptions = { + recursive: true, + useTrash: true +} + +const userActions = { + confirm: "Move to Recycle Bin", + cancel: "Cancel" +} + +function getInformationMessage(name: string, isFolder: boolean): string { + const folderMsg = isFolder ? " and its contents" : ""; + const msg = `Are you sure you want to delete \'${name}\'${folderMsg}? `; + const additionMsg = "You can restore from the Recycle Bin."; + return msg + additionMsg; +} + +export async function deleteFiles(node: DataNode): Promise { + const children = await node.getChildren(); + const isFolder = children && children.length !== 0; + const message = getInformationMessage(node.name, isFolder); + const actions = [userActions.confirm, userActions.cancel]; + + let answer: string | undefined = await window.showInformationMessage(message, ...actions); + + if (!answer) { + return; + } + + if (answer == userActions.confirm) { + workspace.fs.delete(Uri.parse(node.uri), deleteOptions); + } +} diff --git a/src/views/PrimaryTypeNode.ts b/src/views/PrimaryTypeNode.ts index 7f473c3e..638e5b71 100644 --- a/src/views/PrimaryTypeNode.ts +++ b/src/views/PrimaryTypeNode.ts @@ -9,6 +9,7 @@ import { Settings } from "../settings"; import { DataNode } from "./dataNode"; import { DocumentSymbolNode } from "./documentSymbolNode"; import { ExplorerNode } from "./explorerNode"; +import { Explorer } from "../constants"; export class PrimaryTypeNode extends DataNode { @@ -88,4 +89,18 @@ export class PrimaryTypeNode extends DataNode { arguments: [this.uri], }; } + + protected get contextValue(): string { + let context: string = Explorer.ContextValueType.SourceFile; + const type = this.nodeData.metaData[PrimaryTypeNode.K_TYPE_KIND]; + + if (type === TypeKind.Enum) { + context += "+enum"; + } else if (type === TypeKind.Interface) { + context += "+interface"; + } else { + context += "+class"; + } + return context; + } } diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index 349162c4..29521e5b 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -9,6 +9,7 @@ import { import { instrumentOperation, instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; import { Commands } from "../commands"; import { newJavaClass, newPackage } from "../explorerCommands/new"; +import { deleteFiles } from "../explorerCommands/delete"; import { createJarFile } from "../exportJarFileCommand"; import { isLightWeightMode, isSwitchingServer } from "../extension"; import { Jdtls } from "../java/jdtls"; @@ -36,6 +37,7 @@ export class DependencyDataProvider implements TreeDataProvider { context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_EXPORT_JAR, (node: INodeData) => createJarFile(node))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_CLASS, (node: DataNode) => newJavaClass(node))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_PACKAGE, (node: DataNode) => newPackage(node))); + context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_MOVE_FILE_TO_TRASH, (node: DataNode) =>deleteFiles(node))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_REVEAL_FILE_OS, (node?: INodeData) => commands.executeCommand("revealFileInOS", Uri.parse(node.uri)))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_COPY_FILE_PATH, (node: INodeData) => diff --git a/src/views/fileNode.ts b/src/views/fileNode.ts index 9b3f1b38..c6481857 100644 --- a/src/views/fileNode.ts +++ b/src/views/fileNode.ts @@ -6,6 +6,7 @@ import { Commands } from "../commands"; import { INodeData } from "../java/nodeData"; import { DataNode } from "./dataNode"; import { ExplorerNode } from "./explorerNode"; +import { Explorer } from "../constants"; export class FileNode extends DataNode { constructor(nodeData: INodeData, parent: DataNode) { @@ -35,4 +36,8 @@ export class FileNode extends DataNode { arguments: [this.uri], }; } + + protected get contextValue(): string { + return Explorer.ContextValueType.File; + } } From c2f2288f61c2773e017a34cd381aad64dd8b70df Mon Sep 17 00:00:00 2001 From: xqzlgy2 Date: Tue, 29 Sep 2020 09:48:27 +0800 Subject: [PATCH 02/13] Change 'never' to 'false' in when clause --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 36259163..9e3a7478 100644 --- a/package.json +++ b/package.json @@ -241,7 +241,7 @@ }, { "command": "java.view.package.moveFileToTrash", - "when": "never" + "when": "false" }, { "command": "java.project.build.workspace", From 17f79e9c5c7451992a5d8c1b384adc6343660bfb Mon Sep 17 00:00:00 2001 From: xqzlgy2 Date: Tue, 29 Sep 2020 13:39:36 +0800 Subject: [PATCH 03/13] Change message prompt to modal --- src/explorerCommands/delete.ts | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/explorerCommands/delete.ts b/src/explorerCommands/delete.ts index a99501b4..0718f3f7 100644 --- a/src/explorerCommands/delete.ts +++ b/src/explorerCommands/delete.ts @@ -4,19 +4,11 @@ import { window, workspace, Uri } from "vscode"; import { DataNode } from "../views/dataNode"; -const deleteOptions = { - recursive: true, - useTrash: true -} - -const userActions = { - confirm: "Move to Recycle Bin", - cancel: "Cancel" -} +const confirmMessage = "Move to Recycle Bin"; function getInformationMessage(name: string, isFolder: boolean): string { const folderMsg = isFolder ? " and its contents" : ""; - const msg = `Are you sure you want to delete \'${name}\'${folderMsg}? `; + const msg = `Are you sure you want to delete \'${name}\'${folderMsg}?\n`; const additionMsg = "You can restore from the Recycle Bin."; return msg + additionMsg; } @@ -25,15 +17,21 @@ export async function deleteFiles(node: DataNode): Promise { const children = await node.getChildren(); const isFolder = children && children.length !== 0; const message = getInformationMessage(node.name, isFolder); - const actions = [userActions.confirm, userActions.cancel]; - let answer: string | undefined = await window.showInformationMessage(message, ...actions); + let answer: string | undefined = await window.showInformationMessage( + message, + { modal: true }, + confirmMessage + ); if (!answer) { return; } - if (answer == userActions.confirm) { - workspace.fs.delete(Uri.parse(node.uri), deleteOptions); + if (answer == confirmMessage) { + workspace.fs.delete(Uri.parse(node.uri), { + recursive: true, + useTrash: true + }); } } From 8992cac203f48dc87d024f85442f1cfba006b21a Mon Sep 17 00:00:00 2001 From: xqzlgy2 Date: Tue, 29 Sep 2020 17:16:08 +0800 Subject: [PATCH 04/13] Change file type definition --- package.json | 2 +- src/constants.ts | 4 +++- src/explorerCommands/delete.ts | 2 +- src/views/PrimaryTypeNode.ts | 8 +++----- src/views/dependencyDataProvider.ts | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 9e3a7478..e90cdee0 100644 --- a/package.json +++ b/package.json @@ -385,7 +385,7 @@ }, { "command": "java.view.package.moveFileToTrash", - "when": "view == javaProjectExplorer && viewItem =~ /java:sourceFile(?=.*?\\b\\+uri\\b)/", + "when": "view == javaProjectExplorer && viewItem =~ /java:(enum|interface|class)(?=.*?\\b\\+uri\\b)/", "group": "delete@10" }, { diff --git a/src/constants.ts b/src/constants.ts index 32dc7429..aa2664dd 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -15,7 +15,9 @@ export namespace Explorer { Package = "package", Jar = "jar", File = "file", - SourceFile = "sourceFile" + Enum = "enum", + Interface = "interface", + Class = "class" } } diff --git a/src/explorerCommands/delete.ts b/src/explorerCommands/delete.ts index 0718f3f7..b07a22b1 100644 --- a/src/explorerCommands/delete.ts +++ b/src/explorerCommands/delete.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { window, workspace, Uri } from "vscode"; +import { window, workspace, Uri } from "vscode"; import { DataNode } from "../views/dataNode"; const confirmMessage = "Move to Recycle Bin"; diff --git a/src/views/PrimaryTypeNode.ts b/src/views/PrimaryTypeNode.ts index 638e5b71..163ab11c 100644 --- a/src/views/PrimaryTypeNode.ts +++ b/src/views/PrimaryTypeNode.ts @@ -91,16 +91,14 @@ export class PrimaryTypeNode extends DataNode { } protected get contextValue(): string { - let context: string = Explorer.ContextValueType.SourceFile; const type = this.nodeData.metaData[PrimaryTypeNode.K_TYPE_KIND]; if (type === TypeKind.Enum) { - context += "+enum"; + return Explorer.ContextValueType.Enum; } else if (type === TypeKind.Interface) { - context += "+interface"; + return Explorer.ContextValueType.Interface; } else { - context += "+class"; + return Explorer.ContextValueType.Class; } - return context; } } diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index 5196477e..49ed0b4c 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -37,7 +37,7 @@ export class DependencyDataProvider implements TreeDataProvider { context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_EXPORT_JAR, (node: INodeData) => createJarFile(node))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_CLASS, (node: DataNode) => newJavaClass(node))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_PACKAGE, (node: DataNode) => newPackage(node))); - context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_MOVE_FILE_TO_TRASH, (node: DataNode) =>deleteFiles(node))); + context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_MOVE_FILE_TO_TRASH, (node: DataNode) => deleteFiles(node))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_REVEAL_FILE_OS, (node?: INodeData) => commands.executeCommand("revealFileInOS", Uri.parse(node.uri)))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_COPY_FILE_PATH, (node: INodeData) => From 1ed274d97b565a89325dfe8376dc69e7f0cf1c47 Mon Sep 17 00:00:00 2001 From: xqzlgy2 Date: Tue, 29 Sep 2020 17:36:34 +0800 Subject: [PATCH 05/13] Fix tslint error --- src/constants.ts | 2 +- src/explorerCommands/delete.ts | 14 +++++++------- src/views/PrimaryTypeNode.ts | 2 +- src/views/dependencyDataProvider.ts | 5 +++-- src/views/fileNode.ts | 2 +- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/constants.ts b/src/constants.ts index aa2664dd..a6264d46 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -17,7 +17,7 @@ export namespace Explorer { File = "file", Enum = "enum", Interface = "interface", - Class = "class" + Class = "class", } } diff --git a/src/explorerCommands/delete.ts b/src/explorerCommands/delete.ts index b07a22b1..e8a86166 100644 --- a/src/explorerCommands/delete.ts +++ b/src/explorerCommands/delete.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { window, workspace, Uri } from "vscode"; +import { Uri, window, workspace } from "vscode"; import { DataNode } from "../views/dataNode"; const confirmMessage = "Move to Recycle Bin"; @@ -18,20 +18,20 @@ export async function deleteFiles(node: DataNode): Promise { const isFolder = children && children.length !== 0; const message = getInformationMessage(node.name, isFolder); - let answer: string | undefined = await window.showInformationMessage( - message, + const answer: string | undefined = await window.showInformationMessage( + message, { modal: true }, - confirmMessage + confirmMessage, ); if (!answer) { return; } - - if (answer == confirmMessage) { + + if (answer === confirmMessage) { workspace.fs.delete(Uri.parse(node.uri), { recursive: true, - useTrash: true + useTrash: true, }); } } diff --git a/src/views/PrimaryTypeNode.ts b/src/views/PrimaryTypeNode.ts index 163ab11c..61f190d5 100644 --- a/src/views/PrimaryTypeNode.ts +++ b/src/views/PrimaryTypeNode.ts @@ -4,12 +4,12 @@ import { Command, commands, DocumentSymbol, SymbolInformation, SymbolKind, TextDocument, ThemeIcon, Uri, workspace } from "vscode"; import { createUuid, sendOperationEnd, sendOperationStart } from "vscode-extension-telemetry-wrapper"; import { Commands } from "../commands"; +import { Explorer } from "../constants"; import { INodeData, TypeKind } from "../java/nodeData"; import { Settings } from "../settings"; import { DataNode } from "./dataNode"; import { DocumentSymbolNode } from "./documentSymbolNode"; import { ExplorerNode } from "./explorerNode"; -import { Explorer } from "../constants"; export class PrimaryTypeNode extends DataNode { diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index a31258e8..ef801b62 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -8,8 +8,8 @@ import { } from "vscode"; import { instrumentOperation, instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; import { Commands } from "../commands"; -import { newJavaClass, newPackage } from "../explorerCommands/new"; import { deleteFiles } from "../explorerCommands/delete"; +import { newJavaClass, newPackage } from "../explorerCommands/new"; import { createJarFile } from "../exportJarFileCommand"; import { isLightWeightMode, isSwitchingServer } from "../extension"; import { Jdtls } from "../java/jdtls"; @@ -40,7 +40,8 @@ export class DependencyDataProvider implements TreeDataProvider { context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_EXPORT_JAR, (node: INodeData) => createJarFile(node))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_CLASS, (node: DataNode) => newJavaClass(node))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_PACKAGE, (node: DataNode) => newPackage(node))); - context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_MOVE_FILE_TO_TRASH, (node: DataNode) => deleteFiles(node))); + context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_MOVE_FILE_TO_TRASH, (node: DataNode) => + deleteFiles(node))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_REVEAL_FILE_OS, (node?: INodeData) => commands.executeCommand("revealFileInOS", Uri.parse(node.uri)))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_COPY_FILE_PATH, (node: INodeData) => diff --git a/src/views/fileNode.ts b/src/views/fileNode.ts index c6481857..35297ceb 100644 --- a/src/views/fileNode.ts +++ b/src/views/fileNode.ts @@ -3,10 +3,10 @@ import { Command, ThemeColor, ThemeIcon, TreeItem, TreeItemCollapsibleState } from "vscode"; import { Commands } from "../commands"; +import { Explorer } from "../constants"; import { INodeData } from "../java/nodeData"; import { DataNode } from "./dataNode"; import { ExplorerNode } from "./explorerNode"; -import { Explorer } from "../constants"; export class FileNode extends DataNode { constructor(nodeData: INodeData, parent: DataNode) { From 2153cae5ea391d13b1683dd357b5a7581427ce46 Mon Sep 17 00:00:00 2001 From: xqzlgy2 Date: Wed, 30 Sep 2020 09:50:20 +0800 Subject: [PATCH 06/13] Change type definition --- package.json | 2 +- src/constants.ts | 4 +--- src/views/PrimaryTypeNode.ts | 7 ++++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index e90cdee0..7ca08c36 100644 --- a/package.json +++ b/package.json @@ -385,7 +385,7 @@ }, { "command": "java.view.package.moveFileToTrash", - "when": "view == javaProjectExplorer && viewItem =~ /java:(enum|interface|class)(?=.*?\\b\\+uri\\b)/", + "when": "view == javaProjectExplorer && viewItem =~ /java:type(?=.*?\\b\\+uri\\b)/", "group": "delete@10" }, { diff --git a/src/constants.ts b/src/constants.ts index a6264d46..5cc5031b 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -15,9 +15,7 @@ export namespace Explorer { Package = "package", Jar = "jar", File = "file", - Enum = "enum", - Interface = "interface", - Class = "class", + Type = "type", } } diff --git a/src/views/PrimaryTypeNode.ts b/src/views/PrimaryTypeNode.ts index 61f190d5..3b7dfb49 100644 --- a/src/views/PrimaryTypeNode.ts +++ b/src/views/PrimaryTypeNode.ts @@ -91,14 +91,15 @@ export class PrimaryTypeNode extends DataNode { } protected get contextValue(): string { + const context = Explorer.ContextValueType.Type; const type = this.nodeData.metaData[PrimaryTypeNode.K_TYPE_KIND]; if (type === TypeKind.Enum) { - return Explorer.ContextValueType.Enum; + return `${context}+enum`; } else if (type === TypeKind.Interface) { - return Explorer.ContextValueType.Interface; + return `${context}+interface`; } else { - return Explorer.ContextValueType.Class; + return `${context}+class`; } } } From e6962293e655a819c31cb82ee2def3f1f2daefec Mon Sep 17 00:00:00 2001 From: xqzlgy2 Date: Wed, 30 Sep 2020 17:24:53 +0800 Subject: [PATCH 07/13] Add key binding for delete --- package.json | 43 +++++++++++++++++------------ src/explorerCommands/delete.ts | 8 +++++- src/views/dependencyDataProvider.ts | 7 ++--- src/views/dependencyExplorer.ts | 8 ++++++ 4 files changed, 42 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index 7ca08c36..d291dc69 100644 --- a/package.json +++ b/package.json @@ -181,6 +181,13 @@ } } }, + "keybindings": [ + { + "command": "java.view.package.moveFileToTrash", + "key": "delete", + "when": "java:projectManagerActivated && focusedView == javaProjectExplorer" + } + ], "menus": { "commandPalette": [ { @@ -331,17 +338,32 @@ { "command": "java.view.package.revealFileInOS", "when": "view == javaProjectExplorer && viewItem =~ /java:(?=.*?\\b\\+uri\\b)/", - "group": "path@10" + "group": "6_copypath@10" }, { "command": "java.view.package.copyFilePath", "when": "view == javaProjectExplorer && viewItem =~ /java:(?=.*?\\b\\+uri\\b)/", - "group": "path@20" + "group": "6_copypath@20" }, { "command": "java.view.package.copyRelativeFilePath", "when": "view == javaProjectExplorer && viewItem =~ /java:(?=.*?\\b\\+uri\\b)/", - "group": "path@25" + "group": "6_copypath@25" + }, + { + "command": "java.view.package.moveFileToTrash", + "when": "view == javaProjectExplorer && viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)(?=.*?\\b\\+uri\\b)/", + "group": "7_modification@10" + }, + { + "command": "java.view.package.moveFileToTrash", + "when": "view == javaProjectExplorer && viewItem =~ /java:file(?=.*?\\b\\+uri\\b)/", + "group": "7_modification@10" + }, + { + "command": "java.view.package.moveFileToTrash", + "when": "view == javaProjectExplorer && viewItem =~ /java:type(?=.*?\\b\\+uri\\b)/", + "group": "7_modification@10" }, { "command": "java.view.package.newJavaClass", @@ -373,21 +395,6 @@ "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+java\\b)(?=.*?\\b\\+uri\\b)/", "group": "new@20" }, - { - "command": "java.view.package.moveFileToTrash", - "when": "view == javaProjectExplorer && viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)(?=.*?\\b\\+uri\\b)/", - "group": "delete@10" - }, - { - "command": "java.view.package.moveFileToTrash", - "when": "view == javaProjectExplorer && viewItem =~ /java:file(?=.*?\\b\\+uri\\b)/", - "group": "delete@10" - }, - { - "command": "java.view.package.moveFileToTrash", - "when": "view == javaProjectExplorer && viewItem =~ /java:type(?=.*?\\b\\+uri\\b)/", - "group": "delete@10" - }, { "command": "java.project.addLibraries", "when": "view == javaProjectExplorer && viewItem =~ /java:container(?=.*?\\b\\+referencedLibrary\\b)/", diff --git a/src/explorerCommands/delete.ts b/src/explorerCommands/delete.ts index e8a86166..a62a1e48 100644 --- a/src/explorerCommands/delete.ts +++ b/src/explorerCommands/delete.ts @@ -3,6 +3,7 @@ import { Uri, window, workspace } from "vscode"; import { DataNode } from "../views/dataNode"; +import { ExplorerNode } from "../views/explorerNode"; const confirmMessage = "Move to Recycle Bin"; @@ -13,7 +14,12 @@ function getInformationMessage(name: string, isFolder: boolean): string { return msg + additionMsg; } -export async function deleteFiles(node: DataNode): Promise { +export async function deleteFiles(node: DataNode, selectedNode: ExplorerNode): Promise { + // if command not invoked by context menu, use selected node in explorer + if (!node) { + node = selectedNode as DataNode; + } + const children = await node.getChildren(); const isFolder = children && children.length !== 0; const message = getInformationMessage(node.name, isFolder); diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index ef801b62..4715af12 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -8,7 +8,6 @@ import { } from "vscode"; import { instrumentOperation, instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; import { Commands } from "../commands"; -import { deleteFiles } from "../explorerCommands/delete"; import { newJavaClass, newPackage } from "../explorerCommands/new"; import { createJarFile } from "../exportJarFileCommand"; import { isLightWeightMode, isSwitchingServer } from "../extension"; @@ -40,8 +39,6 @@ export class DependencyDataProvider implements TreeDataProvider { context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_EXPORT_JAR, (node: INodeData) => createJarFile(node))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_CLASS, (node: DataNode) => newJavaClass(node))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_PACKAGE, (node: DataNode) => newPackage(node))); - context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_MOVE_FILE_TO_TRASH, (node: DataNode) => - deleteFiles(node))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_REVEAL_FILE_OS, (node?: INodeData) => commands.executeCommand("revealFileInOS", Uri.parse(node.uri)))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_COPY_FILE_PATH, (node: INodeData) => @@ -49,9 +46,9 @@ export class DependencyDataProvider implements TreeDataProvider { context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_COPY_RELATIVE_FILE_PATH, (node: INodeData) => commands.executeCommand("copyRelativeFilePath", Uri.parse(node.uri)))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_OPEN_FILE, (uri) => - commands.executeCommand(Commands.VSCODE_OPEN, Uri.parse(uri)))); + commands.executeCommand(Commands.VSCODE_OPEN, Uri.parse(uri), { preserveFocus: true }))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_OUTLINE, (uri, range) => - window.showTextDocument(Uri.parse(uri), { selection: range }))); + window.showTextDocument(Uri.parse(uri), { selection: range }))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_BUILD_WORKSPACE, () => commands.executeCommand(Commands.JAVA_BUILD_WORKSPACE))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_CLEAN_WORKSPACE, () => diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index fa651583..52afeebf 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -7,6 +7,7 @@ import { commands, Disposable, ExtensionContext, TextEditor, TreeView, TreeViewV import { instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; import { Commands } from "../commands"; import { Build } from "../constants"; +import { deleteFiles } from "../explorerCommands/delete"; import { isStandardServerReady } from "../extension"; import { Jdtls } from "../java/jdtls"; import { INodeData } from "../java/nodeData"; @@ -72,6 +73,13 @@ export class DependencyExplorer implements Disposable { this.reveal(uri); }), ); + + context.subscriptions.push( + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_MOVE_FILE_TO_TRASH, (node: DataNode) => { + const firstSelectedNode = this._dependencyViewer.selection[0]; + deleteFiles(node, firstSelectedNode); + }), + ); } public dispose(): void { From 33bdc5a5313d7957245f3a21371d5e40b55957aa Mon Sep 17 00:00:00 2001 From: xqzlgy2 Date: Mon, 12 Oct 2020 13:54:28 +0800 Subject: [PATCH 08/13] Disable keybinding for dependency files --- src/explorerCommands/delete.ts | 5 +++++ src/explorerCommands/utils.ts | 13 +++++++++++++ src/views/dataNode.ts | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 src/explorerCommands/utils.ts diff --git a/src/explorerCommands/delete.ts b/src/explorerCommands/delete.ts index a62a1e48..47f41086 100644 --- a/src/explorerCommands/delete.ts +++ b/src/explorerCommands/delete.ts @@ -4,6 +4,7 @@ import { Uri, window, workspace } from "vscode"; import { DataNode } from "../views/dataNode"; import { ExplorerNode } from "../views/explorerNode"; +import { shouldModifyNode } from "./utils"; const confirmMessage = "Move to Recycle Bin"; @@ -18,6 +19,10 @@ export async function deleteFiles(node: DataNode, selectedNode: ExplorerNode): P // if command not invoked by context menu, use selected node in explorer if (!node) { node = selectedNode as DataNode; + // avoid delete dependency files + if (!shouldModifyNode(node)) { + return; + } } const children = await node.getChildren(); diff --git a/src/explorerCommands/utils.ts b/src/explorerCommands/utils.ts new file mode 100644 index 00000000..887f4f94 --- /dev/null +++ b/src/explorerCommands/utils.ts @@ -0,0 +1,13 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { DataNode } from "../views/dataNode"; + +export function shouldModifyNode(node: DataNode): boolean { + const packageExp = /java:(package|packageRoot)(?=.*?\b\+source\b)(?=.*?\b\+uri\b)/; + const fileExp = /java:file(?=.*?\b\+uri\b)/; + const typeExp = /java:type(?=.*?\b\+uri\b)/; + + const contextValue = node.computeContextValue(); + return packageExp.test(contextValue) || fileExp.test(contextValue) || typeExp.test(contextValue); +} diff --git a/src/views/dataNode.ts b/src/views/dataNode.ts index d3d4d8a3..d8a25482 100644 --- a/src/views/dataNode.ts +++ b/src/views/dataNode.ts @@ -74,7 +74,7 @@ export abstract class DataNode extends ExplorerNode { } } - protected computeContextValue(): string { + public computeContextValue(): string { let contextValue = this.contextValue; if (this.uri && this.uri.startsWith("file:")) { contextValue = `${contextValue || ""}+uri`; From f45415725d9b193d1b059fe4e147fa905b0744cf Mon Sep 17 00:00:00 2001 From: xqzlgy2 Date: Mon, 12 Oct 2020 15:05:56 +0800 Subject: [PATCH 09/13] Refactoring files --- src/explorerCommands/delete.ts | 22 +++++++++------------- src/explorerCommands/utils.ts | 2 +- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/explorerCommands/delete.ts b/src/explorerCommands/delete.ts index 47f41086..1cecdef7 100644 --- a/src/explorerCommands/delete.ts +++ b/src/explorerCommands/delete.ts @@ -4,23 +4,16 @@ import { Uri, window, workspace } from "vscode"; import { DataNode } from "../views/dataNode"; import { ExplorerNode } from "../views/explorerNode"; -import { shouldModifyNode } from "./utils"; +import { isMutable } from "./utils"; const confirmMessage = "Move to Recycle Bin"; -function getInformationMessage(name: string, isFolder: boolean): string { - const folderMsg = isFolder ? " and its contents" : ""; - const msg = `Are you sure you want to delete \'${name}\'${folderMsg}?\n`; - const additionMsg = "You can restore from the Recycle Bin."; - return msg + additionMsg; -} - export async function deleteFiles(node: DataNode, selectedNode: ExplorerNode): Promise { // if command not invoked by context menu, use selected node in explorer if (!node) { node = selectedNode as DataNode; // avoid delete dependency files - if (!shouldModifyNode(node)) { + if (!isMutable(node)) { return; } } @@ -35,10 +28,6 @@ export async function deleteFiles(node: DataNode, selectedNode: ExplorerNode): P confirmMessage, ); - if (!answer) { - return; - } - if (answer === confirmMessage) { workspace.fs.delete(Uri.parse(node.uri), { recursive: true, @@ -46,3 +35,10 @@ export async function deleteFiles(node: DataNode, selectedNode: ExplorerNode): P }); } } + +function getInformationMessage(name: string, isFolder: boolean): string { + const folderMsg = isFolder ? " and its contents" : ""; + const msg = `Are you sure you want to delete \'${name}\'${folderMsg}?\n`; + const additionMsg = "You can restore from the Recycle Bin."; + return msg + additionMsg; +} diff --git a/src/explorerCommands/utils.ts b/src/explorerCommands/utils.ts index 887f4f94..561bfdcd 100644 --- a/src/explorerCommands/utils.ts +++ b/src/explorerCommands/utils.ts @@ -3,7 +3,7 @@ import { DataNode } from "../views/dataNode"; -export function shouldModifyNode(node: DataNode): boolean { +export function isMutable(node: DataNode): boolean { const packageExp = /java:(package|packageRoot)(?=.*?\b\+source\b)(?=.*?\b\+uri\b)/; const fileExp = /java:file(?=.*?\b\+uri\b)/; const typeExp = /java:type(?=.*?\b\+uri\b)/; From 393f14b4bf6b68f04324315bbab1865618f0664f Mon Sep 17 00:00:00 2001 From: xqzlgy2 Date: Mon, 12 Oct 2020 17:10:54 +0800 Subject: [PATCH 10/13] Close editor on delete --- src/commands.ts | 2 ++ src/explorerCommands/delete.ts | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/commands.ts b/src/commands.ts index 618aa92d..9a3e215c 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -74,6 +74,8 @@ export namespace Commands { export const VSCODE_OPEN = "vscode.open"; + export const CLOSE_OTHER_EDITORS_IN_GROUP = "workbench.action.closeOtherEditors"; + export const JAVA_BUILD_WORKSPACE = "java.workspace.compile"; export const JAVA_CLEAN_WORKSPACE = "java.clean.workspace"; diff --git a/src/explorerCommands/delete.ts b/src/explorerCommands/delete.ts index 1cecdef7..366bbad3 100644 --- a/src/explorerCommands/delete.ts +++ b/src/explorerCommands/delete.ts @@ -1,7 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { Uri, window, workspace } from "vscode"; +import { commands, Uri, window, workspace } from "vscode"; +import { Commands } from "../commands"; import { DataNode } from "../views/dataNode"; import { ExplorerNode } from "../views/explorerNode"; import { isMutable } from "./utils"; @@ -29,7 +30,9 @@ export async function deleteFiles(node: DataNode, selectedNode: ExplorerNode): P ); if (answer === confirmMessage) { - workspace.fs.delete(Uri.parse(node.uri), { + const fileUri = Uri.parse(node.uri); + commands.executeCommand(Commands.CLOSE_OTHER_EDITORS_IN_GROUP, fileUri); + workspace.fs.delete(fileUri, { recursive: true, useTrash: true, }); From a5f3e3e5c2c6ac7a90ce5f54892e93699f9af1cd Mon Sep 17 00:00:00 2001 From: xqzlgy2 Date: Tue, 13 Oct 2020 10:47:34 +0800 Subject: [PATCH 11/13] Fix delete problems --- src/commands.ts | 2 +- src/explorerCommands/delete.ts | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/commands.ts b/src/commands.ts index 9a3e215c..e915a13e 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -74,7 +74,7 @@ export namespace Commands { export const VSCODE_OPEN = "vscode.open"; - export const CLOSE_OTHER_EDITORS_IN_GROUP = "workbench.action.closeOtherEditors"; + export const CLOSE_EDITOR_COMMAND_ID = "workbench.action.closeActiveEditor"; export const JAVA_BUILD_WORKSPACE = "java.workspace.compile"; diff --git a/src/explorerCommands/delete.ts b/src/explorerCommands/delete.ts index 366bbad3..d98b90b5 100644 --- a/src/explorerCommands/delete.ts +++ b/src/explorerCommands/delete.ts @@ -31,7 +31,8 @@ export async function deleteFiles(node: DataNode, selectedNode: ExplorerNode): P if (answer === confirmMessage) { const fileUri = Uri.parse(node.uri); - commands.executeCommand(Commands.CLOSE_OTHER_EDITORS_IN_GROUP, fileUri); + await commands.executeCommand(Commands.VSCODE_OPEN, fileUri); + await commands.executeCommand(Commands.CLOSE_EDITOR_COMMAND_ID); workspace.fs.delete(fileUri, { recursive: true, useTrash: true, @@ -41,7 +42,7 @@ export async function deleteFiles(node: DataNode, selectedNode: ExplorerNode): P function getInformationMessage(name: string, isFolder: boolean): string { const folderMsg = isFolder ? " and its contents" : ""; - const msg = `Are you sure you want to delete \'${name}\'${folderMsg}?\n`; + const msg = `Are you sure you want to delete \'${name}\'${folderMsg}?\n\n`; const additionMsg = "You can restore from the Recycle Bin."; return msg + additionMsg; } From 2943926bc8e4f590a88b97168c359c0b0bbeea65 Mon Sep 17 00:00:00 2001 From: xqzlgy2 Date: Tue, 13 Oct 2020 11:09:46 +0800 Subject: [PATCH 12/13] Discard close editor changes --- src/commands.ts | 2 -- src/explorerCommands/delete.ts | 5 +---- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/commands.ts b/src/commands.ts index e915a13e..618aa92d 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -74,8 +74,6 @@ export namespace Commands { export const VSCODE_OPEN = "vscode.open"; - export const CLOSE_EDITOR_COMMAND_ID = "workbench.action.closeActiveEditor"; - export const JAVA_BUILD_WORKSPACE = "java.workspace.compile"; export const JAVA_CLEAN_WORKSPACE = "java.clean.workspace"; diff --git a/src/explorerCommands/delete.ts b/src/explorerCommands/delete.ts index d98b90b5..63071181 100644 --- a/src/explorerCommands/delete.ts +++ b/src/explorerCommands/delete.ts @@ -30,10 +30,7 @@ export async function deleteFiles(node: DataNode, selectedNode: ExplorerNode): P ); if (answer === confirmMessage) { - const fileUri = Uri.parse(node.uri); - await commands.executeCommand(Commands.VSCODE_OPEN, fileUri); - await commands.executeCommand(Commands.CLOSE_EDITOR_COMMAND_ID); - workspace.fs.delete(fileUri, { + workspace.fs.delete(Uri.parse(node.uri), { recursive: true, useTrash: true, }); From 3aae30efc90f78091a359d1ac73cfa6baeffbb24 Mon Sep 17 00:00:00 2001 From: xqzlgy2 Date: Tue, 13 Oct 2020 12:29:59 +0800 Subject: [PATCH 13/13] Remove unused imports --- src/explorerCommands/delete.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/explorerCommands/delete.ts b/src/explorerCommands/delete.ts index 63071181..380679c5 100644 --- a/src/explorerCommands/delete.ts +++ b/src/explorerCommands/delete.ts @@ -1,8 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { commands, Uri, window, workspace } from "vscode"; -import { Commands } from "../commands"; +import { Uri, window, workspace } from "vscode"; import { DataNode } from "../views/dataNode"; import { ExplorerNode } from "../views/explorerNode"; import { isMutable } from "./utils";