diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java index 7d843d2188a..3fd76b4b379 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java @@ -37,7 +37,6 @@ import org.jabref.logic.externalfiles.LinkedFileHandler; import org.jabref.logic.l10n.Localization; import org.jabref.logic.net.URLDownload; -import org.jabref.logic.util.io.FileUtil; import org.jabref.logic.xmp.XmpPreferences; import org.jabref.logic.xmp.XmpUtilWriter; import org.jabref.model.database.BibDatabaseContext; @@ -194,7 +193,18 @@ public void openFolder() { } } - public void rename() { + public void renameToSuggestion() { + renameFileToName(linkedFileHandler.getSuggestedFileName()); + } + + public void askForNameAndRename() { + String oldFile = this.linkedFile.getLink(); + Path oldFilePath = Paths.get(oldFile); + Optional askedFileName = dialogService.showInputDialogWithDefaultAndWait(Localization.lang("Rename file"), Localization.lang("New Filename"), oldFilePath.getFileName().toString()); + askedFileName.ifPresent(this::renameFileToName); + } + + public void renameFileToName(String targetFileName) { if (linkedFile.isOnlineLink()) { // Cannot rename remote links return; @@ -202,16 +212,15 @@ public void rename() { Optional file = linkedFile.findIn(databaseContext, filePreferences); if (file.isPresent()) { - performRenameWithConflictCheck(); + performRenameWithConflictCheck(targetFileName); } else { dialogService.showErrorDialogAndWait(Localization.lang("File not found"), Localization.lang("Could not find file '%0'.", linkedFile.getLink())); } } - private void performRenameWithConflictCheck() { - Optional fileConflictCheck = linkedFileHandler.findExistingFile(linkedFile, entry); + private void performRenameWithConflictCheck(String targetFileName) { + Optional fileConflictCheck = linkedFileHandler.findExistingFile(linkedFile, entry, targetFileName); if (fileConflictCheck.isPresent()) { - String targetFileName = linkedFileHandler.getSuggestedFileName(); boolean confirmOverwrite = dialogService.showConfirmationDialogAndWait( Localization.lang("File exists"), Localization.lang("'%0' exists. Overwrite file?", targetFileName), @@ -233,7 +242,7 @@ private void performRenameWithConflictCheck() { } try { - linkedFileHandler.renameToSuggestedName(); + linkedFileHandler.renameToName(targetFileName); } catch (IOException e) { dialogService.showErrorDialogAndWait(Localization.lang("Rename failed"), Localization.lang("JabRef cannot access the file because it is being used by another process.")); } @@ -302,7 +311,7 @@ public boolean isGeneratedPathSameAsOriginal() { public void moveToDefaultDirectoryAndRename() { moveToDefaultDirectory(); - rename(); + renameToSuggestion(); } /** @@ -355,17 +364,6 @@ public void edit() { }); } - public void renameFile() { - String oldFile = this.linkedFile.getLink(); - Path oldFilePath = Paths.get(oldFile); - Optional editedFile = dialogService.showInputDialogWithDefaultAndWait(Localization.lang("Rename file"), Localization.lang("New Filename"), oldFilePath.getFileName().toString()); - editedFile.ifPresent(file -> { - Path newFile = Paths.get(oldFile).resolveSibling(file); - this.linkedFile.setLink(newFile.toString()); - FileUtil.renameFile(Paths.get(oldFile), newFile); - }); - } - public void writeXMPMetadata() { // Localization.lang("Writing XMP-metadata...") BackgroundTask writeTask = BackgroundTask.wrap(() -> { diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java index 6c8761ef7d0..6a2a134042f 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java @@ -219,11 +219,12 @@ private ContextMenu createContextMenuForFile(LinkedFileViewModel linkedFile) { download.setOnAction(event -> linkedFile.download()); MenuItem renameFile = new MenuItem(Localization.lang("Rename file to defined pattern")); - renameFile.setOnAction(event -> linkedFile.rename()); + renameFile.setOnAction(event -> linkedFile.renameToSuggestion()); renameFile.setDisable(linkedFile.getFile().isOnlineLink() || linkedFile.isGeneratedNameSameAsOriginal()); MenuItem renameFileName = new MenuItem(Localization.lang("Rename file to a given name")); - renameFileName.setOnAction(event -> linkedFile.renameFile()); + renameFileName.setOnAction(event -> linkedFile.askForNameAndRename()); + renameFileName.setDisable(linkedFile.getFile().isOnlineLink()); MenuItem moveFile = new MenuItem(Localization.lang("Move file to file directory")); moveFile.setOnAction(event -> linkedFile.moveToDefaultDirectory()); diff --git a/src/main/java/org/jabref/logic/externalfiles/LinkedFileHandler.java b/src/main/java/org/jabref/logic/externalfiles/LinkedFileHandler.java index ac38e27c560..04c26ab179e 100644 --- a/src/main/java/org/jabref/logic/externalfiles/LinkedFileHandler.java +++ b/src/main/java/org/jabref/logic/externalfiles/LinkedFileHandler.java @@ -70,13 +70,16 @@ public boolean moveToDefaultDirectory() throws IOException { } public boolean renameToSuggestedName() throws IOException { + return renameToName(getSuggestedFileName()); + } + + public boolean renameToName(String targetFileName) throws IOException { Optional oldFile = fileEntry.findIn(databaseContext, filePreferences); if (!oldFile.isPresent()) { // Could not find file return false; } - String targetFileName = getSuggestedFileName(); Path newPath = oldFile.get().resolveSibling(targetFileName); String expandedOldFilePath = oldFile.get().toString(); @@ -124,8 +127,7 @@ public String getSuggestedFileName() { * @return First identified path that matches an existing file. This name can be used in subsequent calls to * override the existing file. */ - public Optional findExistingFile(LinkedFile flEntry, BibEntry entry) { - String targetFileName = getSuggestedFileName(); + public Optional findExistingFile(LinkedFile flEntry, BibEntry entry, String targetFileName) { // The .get() is legal without check because the method will always return a value. Path targetFilePath = flEntry.findIn(databaseContext, filePreferences) .get().getParent().resolve(targetFileName);