diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java index 3ef40844f14..68da8aec6f5 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java @@ -9,6 +9,7 @@ import java.util.Arrays; import java.util.List; import java.util.Optional; +import java.util.function.BiPredicate; import javax.xml.transform.TransformerException; @@ -44,6 +45,7 @@ import org.jabref.model.entry.LinkedFile; import org.jabref.model.metadata.FilePreferences; import org.jabref.model.strings.StringUtil; +import org.jabref.model.util.OptionalUtil; import org.jabref.preferences.JabRefPreferences; import org.slf4j.Logger; @@ -267,6 +269,37 @@ public void moveToDefaultDirectory() { } } + /** + * Gets the filename for the current linked file and compares it to the new suggested filename. + * @return true if the suggested filename is same as current filename. + */ + public boolean isGeneratedNameSameAsOriginal() { + Path file = Paths.get(this.linkedFile.getLink()); + String currentFileName = file.getFileName().toString(); + String suggestedFileName = this.linkedFileHandler.getSuggestedFileName(); + + return currentFileName.equals(suggestedFileName); + } + + /** + * Compares suggested filepath of current linkedFile with existing filepath. + * @return true if suggested filepath is same as existing filepath. + */ + public boolean isGeneratedPathSameAsOriginal() { + Optional newDir = databaseContext.getFirstExistingFileDir(filePreferences); + + Optional currentDir = linkedFile.findIn(databaseContext, filePreferences); + + BiPredicate equality = (fileA, fileB) -> { + try { + return Files.isSameFile(fileA, fileB); + } catch (IOException e) { + return false; + } + }; + return OptionalUtil.equals(newDir, currentDir, equality); + } + public void moveToDefaultDirectoryAndRename() { moveToDefaultDirectory(); rename(); diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java index b782ae80c61..a2f1f168fce 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java @@ -220,15 +220,15 @@ private ContextMenu createContextMenuForFile(LinkedFileViewModel linkedFile) { MenuItem renameFile = new MenuItem(Localization.lang("Rename file")); renameFile.setOnAction(event -> linkedFile.rename()); - renameFile.setDisable(linkedFile.getFile().isOnlineLink()); + renameFile.setDisable(linkedFile.getFile().isOnlineLink() || linkedFile.isGeneratedNameSameAsOriginal()); MenuItem moveFile = new MenuItem(Localization.lang("Move file to file directory")); moveFile.setOnAction(event -> linkedFile.moveToDefaultDirectory()); - moveFile.setDisable(linkedFile.getFile().isOnlineLink()); + moveFile.setDisable(linkedFile.getFile().isOnlineLink() || linkedFile.isGeneratedPathSameAsOriginal()); MenuItem renameAndMoveFile = new MenuItem(Localization.lang("Move file to file directory and rename file")); renameAndMoveFile.setOnAction(event -> linkedFile.moveToDefaultDirectoryAndRename()); - renameAndMoveFile.setDisable(linkedFile.getFile().isOnlineLink()); + renameAndMoveFile.setDisable(linkedFile.getFile().isOnlineLink() || linkedFile.isGeneratedPathSameAsOriginal()); MenuItem deleteFile = new MenuItem(Localization.lang("Permanently delete local file")); deleteFile.setOnAction(event -> viewModel.deleteFile(linkedFile)); diff --git a/src/main/java/org/jabref/model/util/OptionalUtil.java b/src/main/java/org/jabref/model/util/OptionalUtil.java index 6d127c4e5ce..90290f597b2 100644 --- a/src/main/java/org/jabref/model/util/OptionalUtil.java +++ b/src/main/java/org/jabref/model/util/OptionalUtil.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Optional; import java.util.function.BiFunction; +import java.util.function.BiPredicate; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -20,6 +21,18 @@ public static List toList(Optional value) { } } + public static boolean equals(Optional left, Optional right, BiPredicate equality) { + if (!left.isPresent()) { + return !right.isPresent(); + } else { + if (right.isPresent()) { + return equality.test(left.get(), right.get()); + } else { + return false; + } + } + } + /** * No longer needed in Java 9 where {@code Optional.stream()} is added. */