From c2f88dac316659a8207f850d9bfd69666ceed8f4 Mon Sep 17 00:00:00 2001 From: kunal Date: Sat, 27 Jul 2024 00:36:48 -0230 Subject: [PATCH 01/18] Add a method to create a new link manually #11017 Manual File Entry Creation: Modified add button functionality so that rather than opening the file explorer, it opens a dialog box for manual file creation. [#11017] --- .../gui/fieldeditors/LinkedFilesEditor.java | 14 +++- .../LinkedFilesEditorViewModel.java | 11 +++ .../LinkedFileAddDialogController.fxml | 56 ++++++++++++++ .../LinkedFileAddDialogController.java | 76 +++++++++++++++++++ 4 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/jabref/gui/linkedfile/LinkedFileAddDialogController.fxml create mode 100644 src/main/java/org/jabref/gui/linkedfile/LinkedFileAddDialogController.java diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java index 9dae928aa4d..05ea2a27c71 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java @@ -1,5 +1,7 @@ package org.jabref.gui.fieldeditors; +import java.io.IOException; +import java.net.URL; import java.util.Optional; import javax.swing.undo.UndoManager; @@ -9,8 +11,10 @@ import javafx.collections.ObservableList; import javafx.css.PseudoClass; import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; import javafx.scene.Node; import javafx.scene.Parent; +import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ContextMenu; import javafx.scene.control.Label; @@ -31,6 +35,8 @@ import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.text.Text; +import javafx.stage.Modality; +import javafx.stage.Stage; import org.jabref.gui.DialogService; import org.jabref.gui.DragAndDropDataFormats; @@ -44,6 +50,8 @@ import org.jabref.gui.importer.GrobidOptInDialogHelper; import org.jabref.gui.keyboard.KeyBinding; import org.jabref.gui.linkedfile.DeleteFileAction; + +import org.jabref.gui.linkedfile.LinkedFileAddDialogController; import org.jabref.gui.util.BindingsHelper; import org.jabref.gui.util.TaskExecutor; import org.jabref.gui.util.ViewModelListCellFactory; @@ -285,7 +293,11 @@ public Parent getNode() { @FXML private void addNewFile() { - viewModel.addNewFile(); + LinkedFileAddDialogController dialog = new LinkedFileAddDialogController(); + dialog.showAndWait().ifPresent(result -> { + // Handle adding the new file + viewModel.addNewManualFile(result); + }); } @FXML diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditorViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditorViewModel.java index f628f9514bf..fc0fd5edb31 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditorViewModel.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditorViewModel.java @@ -174,6 +174,17 @@ public void addNewFile() { } } + public void addNewManualFile(LinkedFile linkedFile) { + + files.add(new LinkedFileViewModel( + linkedFile, + entry, + databaseContext, + taskExecutor, + dialogService, + preferences)); + } + private void addNewLinkedFile(Path correctPath, List fileDirectories) { LinkedFile newLinkedFile = fromFile(correctPath, fileDirectories, preferences.getFilePreferences()); files.add(new LinkedFileViewModel( diff --git a/src/main/java/org/jabref/gui/linkedfile/LinkedFileAddDialogController.fxml b/src/main/java/org/jabref/gui/linkedfile/LinkedFileAddDialogController.fxml new file mode 100644 index 00000000000..fe34cb0d871 --- /dev/null +++ b/src/main/java/org/jabref/gui/linkedfile/LinkedFileAddDialogController.fxml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/org/jabref/gui/linkedfile/LinkedFileAddDialogController.java b/src/main/java/org/jabref/gui/linkedfile/LinkedFileAddDialogController.java new file mode 100644 index 00000000000..482134262e7 --- /dev/null +++ b/src/main/java/org/jabref/gui/linkedfile/LinkedFileAddDialogController.java @@ -0,0 +1,76 @@ +package org.jabref.gui.linkedfile; + +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.control.ButtonType; +import javafx.scene.control.ComboBox; +import javafx.scene.control.TextField; + +import org.jabref.gui.DialogService; +import org.jabref.gui.StateManager; +import org.jabref.gui.externalfiletype.ExternalFileType; +import org.jabref.gui.util.BaseDialog; +import org.jabref.gui.util.ViewModelListCellFactory; +import org.jabref.logic.l10n.Localization; +import org.jabref.model.entry.LinkedFile; +import org.jabref.preferences.PreferencesService; + +import com.airhacks.afterburner.views.ViewLoader; +import jakarta.inject.Inject; + +public class LinkedFileAddDialogController extends BaseDialog { + + @FXML private TextField link; + @FXML private TextField description; + @FXML private ComboBox fileType; + @FXML private TextField sourceUrl; + + @Inject private DialogService dialogService; + @Inject private StateManager stateManager; + @Inject private PreferencesService preferences; + + private LinkedFilesEditDialogViewModel viewModel; + private final LinkedFile linkedFile; + + public LinkedFileAddDialogController() { + this.linkedFile = new LinkedFile("", "", ""); + + ViewLoader.view(this) + .load() + .setAsContent(this.getDialogPane()); + + ButtonType addButtonType = new ButtonType(Localization.lang("Add"), ButtonType.OK.getButtonData()); + this.getDialogPane().getButtonTypes().addAll(addButtonType, ButtonType.CANCEL); + this.setResizable(false); + this.setTitle(Localization.lang("Add file link")); + + this.setResultConverter(button -> { + if (button == addButtonType) { + return viewModel.getNewLinkedFile(); + } else { + return null; + } + }); + } + + @FXML + private void initialize() { + viewModel = new LinkedFilesEditDialogViewModel(linkedFile, stateManager.getActiveDatabase().get(), dialogService, preferences.getFilePreferences()); + fileType.itemsProperty().bindBidirectional(viewModel.externalFileTypeProperty()); + new ViewModelListCellFactory() + .withIcon(ExternalFileType::getIcon) + .withText(ExternalFileType::getName) + .install(fileType); + + description.textProperty().bindBidirectional(viewModel.descriptionProperty()); + link.textProperty().bindBidirectional(viewModel.linkProperty()); + fileType.valueProperty().bindBidirectional(viewModel.selectedExternalFileTypeProperty()); + sourceUrl.textProperty().bindBidirectional(viewModel.sourceUrlProperty()); + } + + @FXML + private void openBrowseDialog(ActionEvent event) { + viewModel.openBrowseDialog(); + link.requestFocus(); + } +} From 86bfc7521e8ed25feb8491b1f62a938d32d73a7c Mon Sep 17 00:00:00 2001 From: kunal Date: Sat, 27 Jul 2024 00:42:10 -0230 Subject: [PATCH 02/18] Updated CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a222f215bfd..fb0450843bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ Note that this project **does not** adhere to [Semantic Versioning](https://semv - We added support for selecting and using CSL Styles in JabRef's OpenOffice/LibreOffice integration for inserting bibliographic and in-text citations into a document. [#2146](https://github.com/JabRef/jabref/issues/2146), [#8893](https://github.com/JabRef/jabref/issues/8893) - Added minimal support for [biblatex data annotation](https://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf#subsection.3.7) fields in .layout files. [#11505](https://github.com/JabRef/jabref/issues/11505) - Added saving of selected options in the [Lookup -> Search for unlinked local files dialog](https://docs.jabref.org/collect/findunlinkedfiles#link-the-pdfs-to-your-bib-library). [#11439](https://github.com/JabRef/jabref/issues/11439) +- Added a method to create a new link manually. [#11017](...) ### Changed From 782e5ae13ad1f322b40d597d00fecb84671a0f7c Mon Sep 17 00:00:00 2001 From: kunal Date: Sat, 27 Jul 2024 11:16:35 -0230 Subject: [PATCH 03/18] Added a method to create a new link manually #11017 - Deleted fxml and java files which were handling edit and add action separately and added a unified way which handles edit and add action dynamically --- .../gui/fieldeditors/LinkedFileViewModel.java | 4 +- .../gui/fieldeditors/LinkedFilesEditor.java | 13 +--- .../gui/linkedfile/AttachFileAction.java | 2 +- ...r.fxml => LinkedFileDialogController.fxml} | 5 +- ...r.java => LinkedFileDialogController.java} | 16 ++-- .../gui/linkedfile/LinkedFileEditDialog.fxml | 56 -------------- .../linkedfile/LinkedFileEditDialogView.java | 77 ------------------- 7 files changed, 19 insertions(+), 154 deletions(-) rename src/main/java/org/jabref/gui/linkedfile/{LinkedFileAddDialogController.fxml => LinkedFileDialogController.fxml} (95%) rename src/main/java/org/jabref/gui/linkedfile/{LinkedFileAddDialogController.java => LinkedFileDialogController.java} (76%) delete mode 100644 src/main/java/org/jabref/gui/linkedfile/LinkedFileEditDialog.fxml delete mode 100644 src/main/java/org/jabref/gui/linkedfile/LinkedFileEditDialogView.java diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java index 8e468cc6b41..ed8e83c5611 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java @@ -29,7 +29,7 @@ import org.jabref.gui.icon.JabRefIcon; import org.jabref.gui.linkedfile.DeleteFileAction; import org.jabref.gui.linkedfile.DownloadLinkedFileAction; -import org.jabref.gui.linkedfile.LinkedFileEditDialogView; +import org.jabref.gui.linkedfile.LinkedFileDialogController; import org.jabref.gui.mergeentries.MultiMergeEntriesView; import org.jabref.gui.util.ControlHelper; import org.jabref.gui.util.TaskExecutor; @@ -375,7 +375,7 @@ public boolean delete() { } public void edit() { - Optional editedFile = dialogService.showCustomDialogAndWait(new LinkedFileEditDialogView(this.linkedFile)); + Optional editedFile = dialogService.showCustomDialogAndWait(new LinkedFileDialogController(this.linkedFile, true)); editedFile.ifPresent(file -> { this.linkedFile.setLink(file.getLink()); this.linkedFile.setDescription(file.getDescription()); diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java index 05ea2a27c71..3e4fbeeb467 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java @@ -1,7 +1,5 @@ package org.jabref.gui.fieldeditors; -import java.io.IOException; -import java.net.URL; import java.util.Optional; import javax.swing.undo.UndoManager; @@ -11,10 +9,8 @@ import javafx.collections.ObservableList; import javafx.css.PseudoClass; import javafx.fxml.FXML; -import javafx.fxml.FXMLLoader; import javafx.scene.Node; import javafx.scene.Parent; -import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ContextMenu; import javafx.scene.control.Label; @@ -35,8 +31,6 @@ import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.text.Text; -import javafx.stage.Modality; -import javafx.stage.Stage; import org.jabref.gui.DialogService; import org.jabref.gui.DragAndDropDataFormats; @@ -51,7 +45,7 @@ import org.jabref.gui.keyboard.KeyBinding; import org.jabref.gui.linkedfile.DeleteFileAction; -import org.jabref.gui.linkedfile.LinkedFileAddDialogController; +import org.jabref.gui.linkedfile.LinkedFileDialogController; import org.jabref.gui.util.BindingsHelper; import org.jabref.gui.util.TaskExecutor; import org.jabref.gui.util.ViewModelListCellFactory; @@ -293,8 +287,9 @@ public Parent getNode() { @FXML private void addNewFile() { - LinkedFileAddDialogController dialog = new LinkedFileAddDialogController(); - dialog.showAndWait().ifPresent(result -> { + LinkedFileDialogController controller = new LinkedFileDialogController(null, false); + + controller.showAndWait().ifPresent(result -> { // Handle adding the new file viewModel.addNewManualFile(result); }); diff --git a/src/main/java/org/jabref/gui/linkedfile/AttachFileAction.java b/src/main/java/org/jabref/gui/linkedfile/AttachFileAction.java index 8e9180da2e0..b82298e7cd4 100644 --- a/src/main/java/org/jabref/gui/linkedfile/AttachFileAction.java +++ b/src/main/java/org/jabref/gui/linkedfile/AttachFileAction.java @@ -66,7 +66,7 @@ public void execute() { databaseContext.getFileDirectories(filePreferences), filePreferences); - LinkedFileEditDialogView dialog = new LinkedFileEditDialogView(linkedFile); + LinkedFileDialogController dialog = new LinkedFileDialogController(linkedFile, true); dialogService.showCustomDialogAndWait(dialog) .ifPresent(editedLinkedFile -> { diff --git a/src/main/java/org/jabref/gui/linkedfile/LinkedFileAddDialogController.fxml b/src/main/java/org/jabref/gui/linkedfile/LinkedFileDialogController.fxml similarity index 95% rename from src/main/java/org/jabref/gui/linkedfile/LinkedFileAddDialogController.fxml rename to src/main/java/org/jabref/gui/linkedfile/LinkedFileDialogController.fxml index fe34cb0d871..1306d64cdff 100644 --- a/src/main/java/org/jabref/gui/linkedfile/LinkedFileAddDialogController.fxml +++ b/src/main/java/org/jabref/gui/linkedfile/LinkedFileDialogController.fxml @@ -1,4 +1,5 @@ + @@ -11,7 +12,7 @@ + fx:controller="org.jabref.gui.linkedfile.LinkedFileDialogController"> @@ -23,6 +24,7 @@ + - diff --git a/src/main/java/org/jabref/gui/linkedfile/LinkedFileAddDialogController.java b/src/main/java/org/jabref/gui/linkedfile/LinkedFileDialogController.java similarity index 76% rename from src/main/java/org/jabref/gui/linkedfile/LinkedFileAddDialogController.java rename to src/main/java/org/jabref/gui/linkedfile/LinkedFileDialogController.java index 482134262e7..5c0ef69ef2d 100644 --- a/src/main/java/org/jabref/gui/linkedfile/LinkedFileAddDialogController.java +++ b/src/main/java/org/jabref/gui/linkedfile/LinkedFileDialogController.java @@ -18,7 +18,7 @@ import com.airhacks.afterburner.views.ViewLoader; import jakarta.inject.Inject; -public class LinkedFileAddDialogController extends BaseDialog { +public class LinkedFileDialogController extends BaseDialog { @FXML private TextField link; @FXML private TextField description; @@ -31,21 +31,23 @@ public class LinkedFileAddDialogController extends BaseDialog { private LinkedFilesEditDialogViewModel viewModel; private final LinkedFile linkedFile; + private final boolean isEditMode; - public LinkedFileAddDialogController() { - this.linkedFile = new LinkedFile("", "", ""); + public LinkedFileDialogController(LinkedFile linkedFile, boolean isEditMode) { + this.linkedFile = linkedFile != null ? linkedFile : new LinkedFile("", "", ""); + this.isEditMode = isEditMode; ViewLoader.view(this) .load() .setAsContent(this.getDialogPane()); - ButtonType addButtonType = new ButtonType(Localization.lang("Add"), ButtonType.OK.getButtonData()); - this.getDialogPane().getButtonTypes().addAll(addButtonType, ButtonType.CANCEL); + ButtonType primaryButtonType = isEditMode ? ButtonType.APPLY : new ButtonType(Localization.lang("Add"), ButtonType.OK.getButtonData()); + this.getDialogPane().getButtonTypes().addAll(primaryButtonType, ButtonType.CANCEL); this.setResizable(false); - this.setTitle(Localization.lang("Add file link")); + this.setTitle(isEditMode ? Localization.lang("Edit file link") : Localization.lang("Add file link")); this.setResultConverter(button -> { - if (button == addButtonType) { + if (button == primaryButtonType) { return viewModel.getNewLinkedFile(); } else { return null; diff --git a/src/main/java/org/jabref/gui/linkedfile/LinkedFileEditDialog.fxml b/src/main/java/org/jabref/gui/linkedfile/LinkedFileEditDialog.fxml deleted file mode 100644 index d644991f741..00000000000 --- a/src/main/java/org/jabref/gui/linkedfile/LinkedFileEditDialog.fxml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/org/jabref/gui/linkedfile/LinkedFileEditDialogView.java b/src/main/java/org/jabref/gui/linkedfile/LinkedFileEditDialogView.java deleted file mode 100644 index 0ef81305267..00000000000 --- a/src/main/java/org/jabref/gui/linkedfile/LinkedFileEditDialogView.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.jabref.gui.linkedfile; - -import javafx.event.ActionEvent; -import javafx.fxml.FXML; -import javafx.scene.control.ButtonType; -import javafx.scene.control.ComboBox; -import javafx.scene.control.TextField; - -import org.jabref.gui.DialogService; -import org.jabref.gui.StateManager; -import org.jabref.gui.externalfiletype.ExternalFileType; -import org.jabref.gui.util.BaseDialog; -import org.jabref.gui.util.ViewModelListCellFactory; -import org.jabref.logic.l10n.Localization; -import org.jabref.model.entry.LinkedFile; -import org.jabref.preferences.PreferencesService; - -import com.airhacks.afterburner.views.ViewLoader; -import jakarta.inject.Inject; - -public class LinkedFileEditDialogView extends BaseDialog { - - @FXML private TextField link; - @FXML private TextField description; - @FXML private ComboBox fileType; - @FXML private TextField sourceUrl; - - @Inject private DialogService dialogService; - @Inject private StateManager stateManager; - - @Inject private PreferencesService preferences; - - private LinkedFilesEditDialogViewModel viewModel; - - private final LinkedFile linkedFile; - - public LinkedFileEditDialogView(LinkedFile linkedFile) { - this.linkedFile = linkedFile; - - ViewLoader.view(this) - .load() - .setAsContent(this.getDialogPane()); - - this.getDialogPane().getButtonTypes().addAll(ButtonType.APPLY, ButtonType.CANCEL); - this.setResizable(false); - this.setTitle(Localization.lang("Edit file link")); - - this.setResultConverter(button -> { - if (button == ButtonType.APPLY) { - return viewModel.getNewLinkedFile(); - } else { - return null; - } - }); - } - - @FXML - private void initialize() { - viewModel = new LinkedFilesEditDialogViewModel(linkedFile, stateManager.getActiveDatabase().get(), dialogService, preferences.getFilePreferences()); - fileType.itemsProperty().bindBidirectional(viewModel.externalFileTypeProperty()); - new ViewModelListCellFactory() - .withIcon(ExternalFileType::getIcon) - .withText(ExternalFileType::getName) - .install(fileType); - - description.textProperty().bindBidirectional(viewModel.descriptionProperty()); - link.textProperty().bindBidirectional(viewModel.linkProperty()); - fileType.valueProperty().bindBidirectional(viewModel.selectedExternalFileTypeProperty()); - sourceUrl.textProperty().bindBidirectional(viewModel.sourceUrlProperty()); - } - - @FXML - private void openBrowseDialog(ActionEvent event) { - viewModel.openBrowseDialog(); - link.requestFocus(); - } -} From f1c55243e1ba69581d79d388eb6b6d8056b74dee Mon Sep 17 00:00:00 2001 From: kunal Date: Sun, 28 Jul 2024 14:09:55 -0230 Subject: [PATCH 04/18] Added a method to create a new link manually #11017 - Overloaded the constructor so that one will take a LinkedFile for editing, another will not take any argument. --- .../gui/fieldeditors/LinkedFileViewModel.java | 2 +- .../gui/fieldeditors/LinkedFilesEditor.java | 2 +- .../gui/linkedfile/AttachFileAction.java | 2 +- .../LinkedFileDialogController.java | 39 ++++++++++++++----- 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java index ed8e83c5611..ae254523507 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java @@ -375,7 +375,7 @@ public boolean delete() { } public void edit() { - Optional editedFile = dialogService.showCustomDialogAndWait(new LinkedFileDialogController(this.linkedFile, true)); + Optional editedFile = dialogService.showCustomDialogAndWait(new LinkedFileDialogController(this.linkedFile)); editedFile.ifPresent(file -> { this.linkedFile.setLink(file.getLink()); this.linkedFile.setDescription(file.getDescription()); diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java index 3e4fbeeb467..7b903463711 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java @@ -287,7 +287,7 @@ public Parent getNode() { @FXML private void addNewFile() { - LinkedFileDialogController controller = new LinkedFileDialogController(null, false); + LinkedFileDialogController controller = new LinkedFileDialogController(); controller.showAndWait().ifPresent(result -> { // Handle adding the new file diff --git a/src/main/java/org/jabref/gui/linkedfile/AttachFileAction.java b/src/main/java/org/jabref/gui/linkedfile/AttachFileAction.java index b82298e7cd4..7fe79b6d16a 100644 --- a/src/main/java/org/jabref/gui/linkedfile/AttachFileAction.java +++ b/src/main/java/org/jabref/gui/linkedfile/AttachFileAction.java @@ -66,7 +66,7 @@ public void execute() { databaseContext.getFileDirectories(filePreferences), filePreferences); - LinkedFileDialogController dialog = new LinkedFileDialogController(linkedFile, true); + LinkedFileDialogController dialog = new LinkedFileDialogController(linkedFile); dialogService.showCustomDialogAndWait(dialog) .ifPresent(editedLinkedFile -> { diff --git a/src/main/java/org/jabref/gui/linkedfile/LinkedFileDialogController.java b/src/main/java/org/jabref/gui/linkedfile/LinkedFileDialogController.java index 5c0ef69ef2d..23d4f4c8de4 100644 --- a/src/main/java/org/jabref/gui/linkedfile/LinkedFileDialogController.java +++ b/src/main/java/org/jabref/gui/linkedfile/LinkedFileDialogController.java @@ -5,7 +5,6 @@ import javafx.scene.control.ButtonType; import javafx.scene.control.ComboBox; import javafx.scene.control.TextField; - import org.jabref.gui.DialogService; import org.jabref.gui.StateManager; import org.jabref.gui.externalfiletype.ExternalFileType; @@ -14,7 +13,6 @@ import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.LinkedFile; import org.jabref.preferences.PreferencesService; - import com.airhacks.afterburner.views.ViewLoader; import jakarta.inject.Inject; @@ -31,20 +29,42 @@ public class LinkedFileDialogController extends BaseDialog { private LinkedFilesEditDialogViewModel viewModel; private final LinkedFile linkedFile; - private final boolean isEditMode; - public LinkedFileDialogController(LinkedFile linkedFile, boolean isEditMode) { - this.linkedFile = linkedFile != null ? linkedFile : new LinkedFile("", "", ""); - this.isEditMode = isEditMode; + private static final ButtonType ADD_BUTTON = new ButtonType(Localization.lang("Add"), ButtonType.OK.getButtonData()); + private static final ButtonType EDIT_BUTTON = ButtonType.APPLY; + + /** + * Constructor for adding a new LinkedFile. + */ + public LinkedFileDialogController() { + this(new LinkedFile("", "", "")); + initializeDialog(Localization.lang("Add file link"), ADD_BUTTON); + } + /** + * Constructor for editing an existing LinkedFile. + * + * @param linkedFile The linked file to be edited. + */ + public LinkedFileDialogController(LinkedFile linkedFile) { + this.linkedFile = linkedFile; + initializeDialog(Localization.lang("Edit file link"), EDIT_BUTTON); + } + + /** + * Initializes the dialog with the given title and button type. + * + * @param title The title of the dialog. + * @param primaryButtonType The primary button type for the dialog. + */ + private void initializeDialog(String title, ButtonType primaryButtonType) { ViewLoader.view(this) .load() .setAsContent(this.getDialogPane()); - ButtonType primaryButtonType = isEditMode ? ButtonType.APPLY : new ButtonType(Localization.lang("Add"), ButtonType.OK.getButtonData()); - this.getDialogPane().getButtonTypes().addAll(primaryButtonType, ButtonType.CANCEL); + this.setTitle(title); this.setResizable(false); - this.setTitle(isEditMode ? Localization.lang("Edit file link") : Localization.lang("Add file link")); + this.getDialogPane().getButtonTypes().setAll(primaryButtonType, ButtonType.CANCEL); this.setResultConverter(button -> { if (button == primaryButtonType) { @@ -58,6 +78,7 @@ public LinkedFileDialogController(LinkedFile linkedFile, boolean isEditMode) { @FXML private void initialize() { viewModel = new LinkedFilesEditDialogViewModel(linkedFile, stateManager.getActiveDatabase().get(), dialogService, preferences.getFilePreferences()); + fileType.itemsProperty().bindBidirectional(viewModel.externalFileTypeProperty()); new ViewModelListCellFactory() .withIcon(ExternalFileType::getIcon) From a8908a7e196761c334b44cc3d3ee28c9c802343a Mon Sep 17 00:00:00 2001 From: kunal Date: Wed, 31 Jul 2024 16:05:04 -0230 Subject: [PATCH 05/18] Added a method to create a new link manually #11017 - Removed extra blank line in LinkedFilesEditorViewModel -Added link to the pr in the CHANGELOG.md --- CHANGELOG.md | 2 +- .../org/jabref/gui/fieldeditors/LinkedFilesEditorViewModel.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb0450843bb..bd152ce2fc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ Note that this project **does not** adhere to [Semantic Versioning](https://semv - We added support for selecting and using CSL Styles in JabRef's OpenOffice/LibreOffice integration for inserting bibliographic and in-text citations into a document. [#2146](https://github.com/JabRef/jabref/issues/2146), [#8893](https://github.com/JabRef/jabref/issues/8893) - Added minimal support for [biblatex data annotation](https://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf#subsection.3.7) fields in .layout files. [#11505](https://github.com/JabRef/jabref/issues/11505) - Added saving of selected options in the [Lookup -> Search for unlinked local files dialog](https://docs.jabref.org/collect/findunlinkedfiles#link-the-pdfs-to-your-bib-library). [#11439](https://github.com/JabRef/jabref/issues/11439) -- Added a method to create a new link manually. [#11017](...) +- Added a method to create a new link manually. [#11017](https://github.com/JabRef/jabref/issues/11017) ### Changed diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditorViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditorViewModel.java index fc0fd5edb31..e91a827996e 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditorViewModel.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditorViewModel.java @@ -175,7 +175,6 @@ public void addNewFile() { } public void addNewManualFile(LinkedFile linkedFile) { - files.add(new LinkedFileViewModel( linkedFile, entry, From 2dd6f93c5a358c7a9d6980ef1fb4b9e000d0c212 Mon Sep 17 00:00:00 2001 From: kunal Date: Wed, 31 Jul 2024 16:29:41 -0230 Subject: [PATCH 06/18] Added a method to create a new link manually #11017 - Fixed checkstyle erorrs --- .../jabref/gui/linkedfile/LinkedFileDialogController.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jabref/gui/linkedfile/LinkedFileDialogController.java b/src/main/java/org/jabref/gui/linkedfile/LinkedFileDialogController.java index 23d4f4c8de4..806b143db9c 100644 --- a/src/main/java/org/jabref/gui/linkedfile/LinkedFileDialogController.java +++ b/src/main/java/org/jabref/gui/linkedfile/LinkedFileDialogController.java @@ -5,6 +5,7 @@ import javafx.scene.control.ButtonType; import javafx.scene.control.ComboBox; import javafx.scene.control.TextField; + import org.jabref.gui.DialogService; import org.jabref.gui.StateManager; import org.jabref.gui.externalfiletype.ExternalFileType; @@ -13,11 +14,15 @@ import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.LinkedFile; import org.jabref.preferences.PreferencesService; + import com.airhacks.afterburner.views.ViewLoader; import jakarta.inject.Inject; public class LinkedFileDialogController extends BaseDialog { + private static final ButtonType ADD_BUTTON = new ButtonType(Localization.lang("Add"), ButtonType.OK.getButtonData()); + private static final ButtonType EDIT_BUTTON = ButtonType.APPLY; + @FXML private TextField link; @FXML private TextField description; @FXML private ComboBox fileType; @@ -30,9 +35,6 @@ public class LinkedFileDialogController extends BaseDialog { private LinkedFilesEditDialogViewModel viewModel; private final LinkedFile linkedFile; - private static final ButtonType ADD_BUTTON = new ButtonType(Localization.lang("Add"), ButtonType.OK.getButtonData()); - private static final ButtonType EDIT_BUTTON = ButtonType.APPLY; - /** * Constructor for adding a new LinkedFile. */ From a2799b20d9bf90b4e52c3a334b95478fa2fa7f0b Mon Sep 17 00:00:00 2001 From: kunal Date: Wed, 31 Jul 2024 16:47:55 -0230 Subject: [PATCH 07/18] Added a method to create a new link manually #11017 - Fixed checkstyle erorrs --- src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java index 7b903463711..4e28b263b36 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java @@ -44,7 +44,6 @@ import org.jabref.gui.importer.GrobidOptInDialogHelper; import org.jabref.gui.keyboard.KeyBinding; import org.jabref.gui.linkedfile.DeleteFileAction; - import org.jabref.gui.linkedfile.LinkedFileDialogController; import org.jabref.gui.util.BindingsHelper; import org.jabref.gui.util.TaskExecutor; From 2415aeeb92f42612795c3c8e9aa7c447c8249eae Mon Sep 17 00:00:00 2001 From: kunal Date: Wed, 31 Jul 2024 20:35:10 -0230 Subject: [PATCH 08/18] Added a method to create a new link manually #11017 - Fixed findObsoleteLocalizationKeys() error by removing unwanted keys. - Fixed findMissingLocalizationKeys() by adding "Add file link" as a key --- src/main/resources/l10n/JabRef_en.properties | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 9679586dc62..15154946b57 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -530,7 +530,6 @@ Language=Language Last\ modified=Last modified LaTeX\ AUX\ file\:=LaTeX AUX file\: -Link=Link Memory\ stick\ mode\ -\ Store\ preferences\ in\ 'jabref.xml'\ in\ the\ app\ folder.=Memory stick mode - Store preferences in 'jabref.xml' in the app folder. Show\ advanced\ hints\ (i.e.\ helpful\ tooltips,\ suggestions\ and\ explanation)=Show advanced hints (i.e. helpful tooltips, suggestions and explanation) @@ -2508,6 +2507,7 @@ Show\ Diff=Show Diff Only\ show\ changed\ fields=Only show changed fields Edit\ file\ link=Edit file link +Add\ file\ link=Add file link (Note\:\ If\ original\ entries\ lack\ keywords\ to\ qualify\ for\ the\ new\ group\ configuration,\ confirming\ here\ will\ add\ them)=(Note: If original entries lack keywords to qualify for the new group configuration, confirming here will add them) Assign=Assign @@ -2638,7 +2638,6 @@ Ask\ every\ time=Ask every time Value\ is\ not\ in\ Unicode's\ Normalization\ Form\ "Canonical\ Composition"\ (NFC)\ format=Value is not in Unicode's Normalization Form "Canonical Composition" (NFC) format Group\ icons=Group icons -Source\ URL=Source URL Redownload\ file=Redownload file Redownload\ missing\ files=Redownload missing files Redownload\ missing\ files\ for\ current\ library?=Redownload missing files for current library? From 701334b64e512eec96ac2d4dd4de7fb82e8e5620 Mon Sep 17 00:00:00 2001 From: kunal Date: Tue, 6 Aug 2024 00:19:46 -0230 Subject: [PATCH 09/18] Added a method to create a new link manually #11017 - Renamed files from controller->view - Made sure both edit and add dialog boxes follow same layout - The add dialog box will have pdf as the default option - fixed minor bugs in some places where some "%" were removed in some of the previous commits, restored those symbols - on hover, rather than showing open, it will show add --- .../gui/fieldeditors/LinkedFileViewModel.java | 4 ++-- .../gui/fieldeditors/LinkedFilesEditor.fxml | 2 +- .../gui/fieldeditors/LinkedFilesEditor.java | 16 ++++++++++------ .../jabref/gui/linkedfile/AttachFileAction.java | 2 +- ...alogController.fxml => LinkedFileDialog.fxml} | 8 ++++---- ...Controller.java => LinkedFileDialogView.java} | 13 +++++++++---- .../LinkedFilesEditDialogViewModel.java | 10 +++++++++- 7 files changed, 36 insertions(+), 19 deletions(-) rename src/main/java/org/jabref/gui/linkedfile/{LinkedFileDialogController.fxml => LinkedFileDialog.fxml} (93%) rename src/main/java/org/jabref/gui/linkedfile/{LinkedFileDialogController.java => LinkedFileDialogView.java} (88%) diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java index ae254523507..fd74a894b1b 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java @@ -29,7 +29,7 @@ import org.jabref.gui.icon.JabRefIcon; import org.jabref.gui.linkedfile.DeleteFileAction; import org.jabref.gui.linkedfile.DownloadLinkedFileAction; -import org.jabref.gui.linkedfile.LinkedFileDialogController; +import org.jabref.gui.linkedfile.LinkedFileDialogView; import org.jabref.gui.mergeentries.MultiMergeEntriesView; import org.jabref.gui.util.ControlHelper; import org.jabref.gui.util.TaskExecutor; @@ -375,7 +375,7 @@ public boolean delete() { } public void edit() { - Optional editedFile = dialogService.showCustomDialogAndWait(new LinkedFileDialogController(this.linkedFile)); + Optional editedFile = dialogService.showCustomDialogAndWait(new LinkedFileDialogView(this.linkedFile)); editedFile.ifPresent(file -> { this.linkedFile.setLink(file.getLink()); this.linkedFile.setDescription(file.getDescription()); diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.fxml b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.fxml index 1fecf35204b..cbe2d08cc96 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.fxml +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.fxml @@ -17,7 +17,7 @@ - + @@ -49,7 +49,7 @@ -