From ec864d3457c9d3ccfad7293e8aa44b6db04e8c47 Mon Sep 17 00:00:00 2001 From: ankamde Date: Sat, 12 Jul 2025 14:09:38 +0200 Subject: [PATCH 1/8] Some initial changes + split of the placeholder to label and hyperlink. --- .../CitationRelationsTab.java | 68 ++++++++++++------- .../main/resources/l10n/JabRef_de.properties | 3 +- .../main/resources/l10n/JabRef_en.properties | 3 +- .../main/resources/l10n/JabRef_es.properties | 3 +- .../main/resources/l10n/JabRef_fr.properties | 3 +- .../main/resources/l10n/JabRef_it.properties | 3 +- .../resources/l10n/JabRef_pt_BR.properties | 3 +- .../main/resources/l10n/JabRef_tr.properties | 4 +- .../resources/l10n/JabRef_zh_CN.properties | 5 +- 9 files changed, 62 insertions(+), 33 deletions(-) diff --git a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java index b883672d884..de0762068bf 100644 --- a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java +++ b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java @@ -20,6 +20,7 @@ import javafx.scene.control.Button; import javafx.scene.control.ButtonType; import javafx.scene.control.DialogPane; +import javafx.scene.control.Hyperlink; import javafx.scene.control.Label; import javafx.scene.control.ProgressIndicator; import javafx.scene.control.ScrollPane; @@ -199,24 +200,29 @@ private SplitPane getPaneAndStartSearch(BibEntry entry) { citingVBox.getChildren().addAll(citingHBox, citingListView); citedByVBox.getChildren().addAll(citedByHBox, citedByListView); + HBox citiesRelationsPlaceholder = createPlaceholder(); + HBox citiedByRelationsPlaceholder = createPlaceholder(); + refreshCitingButton.setOnMouseClicked(_ -> { searchForRelations( - entry, - citingListView, + entry, + citingListView, + citiesRelationsPlaceholder, abortCitingButton, - refreshCitingButton, - CitationFetcher.SearchType.CITES, - importCitingButton, + refreshCitingButton, + CitationFetcher.SearchType.CITES, + importCitingButton, citingProgress); }); refreshCitedByButton.setOnMouseClicked(_ -> searchForRelations( - entry, - citedByListView, + entry, + citedByListView, + citiedByRelationsPlaceholder, abortCitedButton, - refreshCitedByButton, - CitationFetcher.SearchType.CITED_BY, - importCitedByButton, + refreshCitedByButton, + CitationFetcher.SearchType.CITED_BY, + importCitedByButton, citedByProgress)); // Create SplitPane to hold all nodes above @@ -225,26 +231,42 @@ private SplitPane getPaneAndStartSearch(BibEntry entry) { styleFetchedListView(citingListView); searchForRelations( - entry, - citingListView, - abortCitingButton, + entry, + citingListView, + citiesRelationsPlaceholder, + abortCitingButton, refreshCitingButton, - CitationFetcher.SearchType.CITES, - importCitingButton, + CitationFetcher.SearchType.CITES, + importCitingButton, citingProgress); searchForRelations( - entry, - citedByListView, - abortCitedButton, + entry, + citedByListView, + citiedByRelationsPlaceholder, + abortCitedButton, refreshCitedByButton, - CitationFetcher.SearchType.CITED_BY, - importCitedByButton, + CitationFetcher.SearchType.CITED_BY, + importCitedByButton, citedByProgress); return container; } + private static HBox createPlaceholder() { + HBox placeholderHBox = new HBox(); + Label placeholder = new Label(Localization.lang("The selected entry doesn't have a DOI linked to it.")); + Hyperlink doiLookUpLink = new Hyperlink(Localization.lang("Look Up a DOI and try again.")); + + placeholderHBox.getChildren().add(placeholder); + placeholderHBox.getChildren().add(doiLookUpLink); + placeholderHBox.setSpacing(2d); + placeholderHBox.setStyle("-fx-alignment: center;"); + placeholderHBox.setFillHeight(true); + + return placeholderHBox; + } + /** * Styles a given CheckListView to display BibEntries either with a hyperlink or an add button * @@ -428,19 +450,19 @@ protected void bindToEntry(BibEntry entry) { * * @param entry BibEntry currently selected in Jabref Database * @param listView ListView to use + * @param placeholder * @param abortButton Button to stop the search * @param refreshButton refresh Button to use * @param searchType type of search (CITING / CITEDBY) */ - private void searchForRelations(BibEntry entry, CheckListView listView, Button abortButton, + private void searchForRelations(BibEntry entry, CheckListView listView, HBox placeholder, Button abortButton, Button refreshButton, CitationFetcher.SearchType searchType, Button importButton, ProgressIndicator progress) { if (entry.getDOI().isEmpty()) { hideNodes(abortButton, progress); showNodes(refreshButton); listView.getItems().clear(); - listView.setPlaceholder( - new Label(Localization.lang("The selected entry doesn't have a DOI linked to it. Lookup a DOI and try again."))); + listView.setPlaceholder(placeholder); return; } diff --git a/jablib/src/main/resources/l10n/JabRef_de.properties b/jablib/src/main/resources/l10n/JabRef_de.properties index 54d907b2bea..c8dc4970e27 100644 --- a/jablib/src/main/resources/l10n/JabRef_de.properties +++ b/jablib/src/main/resources/l10n/JabRef_de.properties @@ -2719,7 +2719,8 @@ Get\ more\ themes...=Weitere Designs erhalten ... Miscellaneous=Verschiedenes File-related=Datei-bezogen -The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.\ Lookup\ a\ DOI\ and\ try\ again.=Der ausgewählte Eintrag hat keine DOI verlinkt. Suchen Sie eine DOI und versuchen Sie es erneut. +The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.=Der ausgewählte Eintrag hat keine DOI verlinkt. +Look\ Up\ a\ DOI\ and\ try\ again.=Suchen Sie eine DOI und versuchen Sie es erneut. Cited\ By=Zitiert von Cites=Zitate No\ articles\ found=Keine Artikel gefunden diff --git a/jablib/src/main/resources/l10n/JabRef_en.properties b/jablib/src/main/resources/l10n/JabRef_en.properties index 740154de3e2..61058b76211 100644 --- a/jablib/src/main/resources/l10n/JabRef_en.properties +++ b/jablib/src/main/resources/l10n/JabRef_en.properties @@ -2792,7 +2792,8 @@ Miscellaneous=Miscellaneous File-related=File-related Add\ selected\ entry(s)\ to\ library=Add selected entry(s) to library -The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.\ Lookup\ a\ DOI\ and\ try\ again.=The selected entry doesn't have a DOI linked to it. Lookup a DOI and try again. +The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.=The selected entry doesn't have a DOI linked to it. +Look\ Up\ a\ DOI\ and\ try\ again.=Lookup a DOI and try again. Cited\ By=Cited By Cites=Cites No\ articles\ found=No articles found diff --git a/jablib/src/main/resources/l10n/JabRef_es.properties b/jablib/src/main/resources/l10n/JabRef_es.properties index ff8006ea863..e5a5d0375a4 100644 --- a/jablib/src/main/resources/l10n/JabRef_es.properties +++ b/jablib/src/main/resources/l10n/JabRef_es.properties @@ -2364,7 +2364,8 @@ Writing\ metadata\ to\ %0=Escribiendo metadatos a %0 Get\ more\ themes...=Obtener más temas... -The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.\ Lookup\ a\ DOI\ and\ try\ again.=La entrada seleccionada no tiene ningún DOI enlazado. Busque un DOI e inténtelo de nuevo. +The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.=La entrada seleccionada no tiene ningún DOI enlazado. +Look\ Up\ a\ DOI\ and\ try\ again.=Busque un DOI e inténtelo de nuevo. Cited\ By=Citado por No\ articles\ found=No se encontró ningún artículo Restart\ search=Reiniciar búsqueda diff --git a/jablib/src/main/resources/l10n/JabRef_fr.properties b/jablib/src/main/resources/l10n/JabRef_fr.properties index 5f0874842b4..b6d0d267eee 100644 --- a/jablib/src/main/resources/l10n/JabRef_fr.properties +++ b/jablib/src/main/resources/l10n/JabRef_fr.properties @@ -2791,7 +2791,8 @@ Miscellaneous=Divers File-related=Lié au fichier Add\ selected\ entry(s)\ to\ library=Ajouter les entrées sélectionnées à la bibliothèque -The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.\ Lookup\ a\ DOI\ and\ try\ again.=L'entrée sélectionnée ne contient pas de DOI. Recherchez un DOI et réessayez. +The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.=L'entrée sélectionnée ne contient pas de DOI. +Look\ Up\ a\ DOI\ and\ try\ again.=Recherchez un DOI et réessayez. Cited\ By=Cité par Cites=Citations No\ articles\ found=Pas d'article trouvé diff --git a/jablib/src/main/resources/l10n/JabRef_it.properties b/jablib/src/main/resources/l10n/JabRef_it.properties index 3f9655c10e1..8fb667cd93c 100644 --- a/jablib/src/main/resources/l10n/JabRef_it.properties +++ b/jablib/src/main/resources/l10n/JabRef_it.properties @@ -2764,7 +2764,8 @@ Miscellaneous=Varie File-related=Correlato al file Add\ selected\ entry(s)\ to\ library=Aggiungi la/e voce/i selezionata/e alla libreria -The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.\ Lookup\ a\ DOI\ and\ try\ again.=La voce selezionata non ha un DOI collegato ad essa. Cerca un DOI e riprova. +The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.=La voce selezionata non ha un DOI collegato ad essa. +Look\ Up\ a\ DOI\ and\ try\ again.=Cerca un DOI e riprova. Cited\ By=Citato da Cites=Citazioni No\ articles\ found=Nessun articolo trovato diff --git a/jablib/src/main/resources/l10n/JabRef_pt_BR.properties b/jablib/src/main/resources/l10n/JabRef_pt_BR.properties index 6accb3d1e4f..33fc4988aec 100644 --- a/jablib/src/main/resources/l10n/JabRef_pt_BR.properties +++ b/jablib/src/main/resources/l10n/JabRef_pt_BR.properties @@ -2791,7 +2791,8 @@ Miscellaneous=Diversos File-related=Arquivo relacionado Add\ selected\ entry(s)\ to\ library=Adicionar as referências selecionadas à biblioteca -The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.\ Lookup\ a\ DOI\ and\ try\ again.=A entrada selecionada não tem um DOI vinculado a ele. Verifique um DOI e tente novamente. +The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.=A entrada selecionada não tem um DOI vinculado a ele. +Look\ Up\ a\ DOI\ and\ try\ again.=Verifique um DOI e tente novamente. Cited\ By=Citado por Cites=Citar No\ articles\ found=Nenhum artigo encontrado diff --git a/jablib/src/main/resources/l10n/JabRef_tr.properties b/jablib/src/main/resources/l10n/JabRef_tr.properties index 071c28dbfe6..6396173617d 100644 --- a/jablib/src/main/resources/l10n/JabRef_tr.properties +++ b/jablib/src/main/resources/l10n/JabRef_tr.properties @@ -2403,8 +2403,8 @@ Writing\ metadata\ to\ %0=Metaverisi %0'e yazılıyor Get\ more\ themes...=Daha fazla tema getir... - -The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.\ Lookup\ a\ DOI\ and\ try\ again.=Seçili girdiyle bağlantılı bir DOI yok. Bir DOI arayıp tekrar deneyin. +The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.=Seçili girdiyle bağlantılı bir DOI yok. +Look\ Up\ a\ DOI\ and\ try\ again.=Bir DOI arayıp tekrar deneyin. Cited\ By=Tarafından atfedilmiş No\ articles\ found=Makale bulunamadı Restart\ search=Aramayı tekrar başlat diff --git a/jablib/src/main/resources/l10n/JabRef_zh_CN.properties b/jablib/src/main/resources/l10n/JabRef_zh_CN.properties index e8630c6bc13..0322dc68bd0 100644 --- a/jablib/src/main/resources/l10n/JabRef_zh_CN.properties +++ b/jablib/src/main/resources/l10n/JabRef_zh_CN.properties @@ -1295,7 +1295,7 @@ Convert\ to\ BibTeX\ format\ (e.g.,\ store\ publication\ date\ in\ year\ and\ mo Deprecated\ fields=废弃的字段 Shows\ fields\ having\ a\ successor\ in\ biblatex.=Shows fields having a successor in biblatex. -Shows\ fields\ having\ a\ successor\ in\ biblatex.\nFor\ instance,\ the\ publication\ month\ should\ be\ part\ of\ the\ date\ field.\nUse\ the\ Clean\ up\ Entries\ functionality\ to\ convert\ the\ entry\ to\ biblatex.=显示在biblatex中具有后继关系的field。\n例如,发布月份(publication month)应当是日期(date)的一部分。\n使用"清理记录"功能来转换条目为biblatex。 +Shows\ fields\ having\ a\ successor\ in\ biblatex.\nFor\ instance,\ the\ publication\ month\ should\ be\ part\ of\ the\ date\ field.\nUse\ the\ Clean\ up\ Entries\ functionality\ to\ convert\ the\ entry\ to\ biblatex.=显示在biblatex中具有后继关系的field。\n例如,发布月份(publication month)应当是日期(date)的一部分。\n使用"清理记录"功能来转换条目为biblatex。 No\ read\ status\ information=无阅读情况信息 @@ -2709,7 +2709,8 @@ Get\ more\ themes...=获取更多主题... Miscellaneous=杂项 File-related=文件相关的 -The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.\ Lookup\ a\ DOI\ and\ try\ again.=选中的条目并没有链接的 DOI。查找一个 DOI,然后再次尝试。 +The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.=选中的条目并没有链接的 DOI。 +Look\ Up\ a\ DOI\ and\ try\ again.=查找一个 DOI,然后再次尝试。 Cited\ By=被引用 Cites=引用 No\ articles\ found=未找到文章 From 365b4faa93f4bf7ee2a951dfcb2fb4d1b7fd58e0 Mon Sep 17 00:00:00 2001 From: ankamde Date: Sun, 13 Jul 2025 09:55:50 +0200 Subject: [PATCH 2/8] Commit before switching to different branch. --- .../CitationRelationsTab.java | 121 ++++++++---------- 1 file changed, 54 insertions(+), 67 deletions(-) diff --git a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java index de0762068bf..3d63c028730 100644 --- a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java +++ b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java @@ -120,12 +120,12 @@ public CitationRelationsTab(DialogService dialogService, this.searchCitationsRelationsService = searchCitationsRelationsService; this.citationsRelationsTabViewModel = new CitationsRelationsTabViewModel( - preferences, - undoManager, - stateManager, - dialogService, - fileUpdateMonitor, - taskExecutor + preferences, + undoManager, + stateManager, + dialogService, + fileUpdateMonitor, + taskExecutor ); } @@ -200,47 +200,20 @@ private SplitPane getPaneAndStartSearch(BibEntry entry) { citingVBox.getChildren().addAll(citingHBox, citingListView); citedByVBox.getChildren().addAll(citedByHBox, citedByListView); - HBox citiesRelationsPlaceholder = createPlaceholder(); - HBox citiedByRelationsPlaceholder = createPlaceholder(); + HBox citingRelationsPlaceholder = createPlaceholder(citingListView, citedByListView); + HBox citiedByRelationsPlaceholder = createPlaceholder(citingListView, citedByListView); - refreshCitingButton.setOnMouseClicked(_ -> { - searchForRelations( - entry, - citingListView, - citiesRelationsPlaceholder, - abortCitingButton, - refreshCitingButton, - CitationFetcher.SearchType.CITES, - importCitingButton, - citingProgress); - }); - - refreshCitedByButton.setOnMouseClicked(_ -> searchForRelations( - entry, - citedByListView, - citiedByRelationsPlaceholder, - abortCitedButton, - refreshCitedByButton, - CitationFetcher.SearchType.CITED_BY, - importCitedByButton, - citedByProgress)); - - // Create SplitPane to hold all nodes above - SplitPane container = new SplitPane(citingVBox, citedByVBox); - styleFetchedListView(citedByListView); - styleFetchedListView(citingListView); - - searchForRelations( + Runnable citingTask = () -> searchForRelations( entry, citingListView, - citiesRelationsPlaceholder, + citingRelationsPlaceholder, abortCitingButton, refreshCitingButton, CitationFetcher.SearchType.CITES, importCitingButton, citingProgress); - searchForRelations( + Runnable citedByTask = () -> searchForRelations( entry, citedByListView, citiedByRelationsPlaceholder, @@ -250,21 +223,33 @@ private SplitPane getPaneAndStartSearch(BibEntry entry) { importCitedByButton, citedByProgress); + refreshCitingButton.setOnMouseClicked(_ -> citingTask.run()); + refreshCitedByButton.setOnMouseClicked(_ -> citedByTask.run()); + + // Create SplitPane to hold all nodes above + SplitPane container = new SplitPane(citingVBox, citedByVBox); + styleFetchedListView(citedByListView); + styleFetchedListView(citingListView); + + citingTask.run(); + citedByTask.run(); + return container; } - private static HBox createPlaceholder() { - HBox placeholderHBox = new HBox(); - Label placeholder = new Label(Localization.lang("The selected entry doesn't have a DOI linked to it.")); - Hyperlink doiLookUpLink = new Hyperlink(Localization.lang("Look Up a DOI and try again.")); + private static HBox createPlaceholder(CheckListView citingListView, + CheckListView citedByListView) { + HBox hBox = new HBox(); + Label label = new Label(Localization.lang("The selected entry doesn't have a DOI linked to it.")); + Hyperlink link = new Hyperlink(Localization.lang("Look Up a DOI and try again.")); - placeholderHBox.getChildren().add(placeholder); - placeholderHBox.getChildren().add(doiLookUpLink); - placeholderHBox.setSpacing(2d); - placeholderHBox.setStyle("-fx-alignment: center;"); - placeholderHBox.setFillHeight(true); + hBox.getChildren().add(label); + hBox.getChildren().add(link); + hBox.setSpacing(2d); + hBox.setStyle("-fx-alignment: center;"); + hBox.setFillHeight(true); - return placeholderHBox; + return hBox; } /** @@ -293,9 +278,9 @@ private void styleFetchedListView(CheckListView listView) jumpTo.getStyleClass().add("addEntryButton"); jumpTo.setOnMouseClicked(_ -> jumpToEntry(entry)); hContainer.setOnMouseClicked(event -> { - if (event.getClickCount() == 2) { - jumpToEntry(entry); - } + if (event.getClickCount() == 2) { + jumpToEntry(entry); + } }); vContainer.getChildren().add(jumpTo); @@ -329,7 +314,8 @@ private void styleFetchedListView(CheckListView listView) } try { NativeDesktop.openBrowser(url, preferences.getExternalApplicationsPreferences()); - } catch (IOException ex) { + } catch ( + IOException ex) { dialogService.notify(Localization.lang("Unable to open link.")); } }); @@ -381,7 +367,8 @@ private void showEntrySourceDialog(BibEntry entry) { BibDatabaseMode mode = stateManager.getActiveDatabase().map(BibDatabaseContext::getMode) .orElse(BibDatabaseMode.BIBLATEX); ca.appendText(getSourceString(entry, mode, preferences.getFieldPreferences(), this.entryTypesManager)); - } catch (IOException e) { + } catch ( + IOException e) { LOGGER.warn("Incorrect entry, could not load source:", e); return; } @@ -479,18 +466,18 @@ private void searchForRelations(BibEntry entry, CheckListView prepareToSearchForRelations( - abortButton, refreshButton, importButton, progress, task + abortButton, refreshButton, importButton, progress, task )) .onSuccess(fetchedList -> onSearchForRelationsSucceed( - entry, - listView, - abortButton, - refreshButton, - searchType, - importButton, - progress, - fetchedList, - observableList + entry, + listView, + abortButton, + refreshButton, + searchType, + importButton, + progress, + fetchedList, + observableList )) .onFailure(exception -> { LOGGER.error("Error while fetching citing Articles", exception); @@ -507,18 +494,18 @@ private void searchForRelations(BibEntry entry, CheckListView> createBackgroundTask( - BibEntry entry, CitationFetcher.SearchType searchType + BibEntry entry, CitationFetcher.SearchType searchType ) { return switch (searchType) { case CitationFetcher.SearchType.CITES -> { citingTask = BackgroundTask.wrap( - () -> this.searchCitationsRelationsService.searchReferences(entry) + () -> this.searchCitationsRelationsService.searchReferences(entry) ); yield citingTask; } case CitationFetcher.SearchType.CITED_BY -> { citedByTask = BackgroundTask.wrap( - () -> this.searchCitationsRelationsService.searchCitations(entry) + () -> this.searchCitationsRelationsService.searchCitations(entry) ); yield citedByTask; } @@ -596,7 +583,7 @@ private void importEntries(List entriesToImport, CitationF * Function to open possible duplicate entries window to compare duplicate entries * * @param citationRelationItem duplicate in the citation relations tab - * @param listView CheckListView to display citations + * @param listView CheckListView to display citations */ private void openPossibleDuplicateEntriesWindow(CitationRelationItem citationRelationItem, CheckListView listView) { BibEntry libraryEntry = citationRelationItem.localEntry(); From a24dd53fe699d611f9d4e1082b11b70741d08f82 Mon Sep 17 00:00:00 2001 From: ankamde Date: Sun, 13 Jul 2025 14:58:48 +0200 Subject: [PATCH 3/8] Cited by panel ready. --- .../CitationRelationsTab.java | 358 +++++++++--------- .../RelationSearchComponents.java | 20 + 2 files changed, 205 insertions(+), 173 deletions(-) create mode 100644 jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/RelationSearchComponents.java diff --git a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java index 3d63c028730..d750a08915f 100644 --- a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java +++ b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java @@ -53,6 +53,7 @@ import org.jabref.logic.citation.SearchCitationsRelationsService; import org.jabref.logic.database.DuplicateCheck; import org.jabref.logic.exporter.BibWriter; +import org.jabref.logic.importer.fetcher.CrossRef; import org.jabref.logic.importer.fetcher.citation.CitationFetcher; import org.jabref.logic.l10n.Localization; import org.jabref.logic.os.OS; @@ -120,12 +121,12 @@ public CitationRelationsTab(DialogService dialogService, this.searchCitationsRelationsService = searchCitationsRelationsService; this.citationsRelationsTabViewModel = new CitationsRelationsTabViewModel( - preferences, - undoManager, - stateManager, - dialogService, - fileUpdateMonitor, - taskExecutor + preferences, + undoManager, + stateManager, + dialogService, + fileUpdateMonitor, + taskExecutor ); } @@ -200,56 +201,211 @@ private SplitPane getPaneAndStartSearch(BibEntry entry) { citingVBox.getChildren().addAll(citingHBox, citingListView); citedByVBox.getChildren().addAll(citedByHBox, citedByListView); - HBox citingRelationsPlaceholder = createPlaceholder(citingListView, citedByListView); - HBox citiedByRelationsPlaceholder = createPlaceholder(citingListView, citedByListView); - - Runnable citingTask = () -> searchForRelations( + RelationSearchComponents citingRelationSearchComponents = new RelationSearchComponents( entry, citingListView, - citingRelationsPlaceholder, + citedByListView, abortCitingButton, refreshCitingButton, CitationFetcher.SearchType.CITES, importCitingButton, citingProgress); - Runnable citedByTask = () -> searchForRelations( + RelationSearchComponents citedByRelationSearchComponents = new RelationSearchComponents( entry, citedByListView, - citiedByRelationsPlaceholder, + citingListView, abortCitedButton, refreshCitedByButton, CitationFetcher.SearchType.CITED_BY, importCitedByButton, citedByProgress); - refreshCitingButton.setOnMouseClicked(_ -> citingTask.run()); - refreshCitedByButton.setOnMouseClicked(_ -> citedByTask.run()); + refreshCitingButton.setOnMouseClicked(_ -> searchForRelations(citingRelationSearchComponents)); + refreshCitedByButton.setOnMouseClicked(_ -> searchForRelations(citedByRelationSearchComponents)); // Create SplitPane to hold all nodes above SplitPane container = new SplitPane(citingVBox, citedByVBox); styleFetchedListView(citedByListView); styleFetchedListView(citingListView); - citingTask.run(); - citedByTask.run(); + searchForRelations(citingRelationSearchComponents); + searchForRelations(citedByRelationSearchComponents); return container; } - private static HBox createPlaceholder(CheckListView citingListView, - CheckListView citedByListView) { + /** + * Method to start search for relations and display them in the associated ListView + * + * @param relationSearchComponents + */ + private void searchForRelations(RelationSearchComponents relationSearchComponents) { + if (relationSearchComponents.entry().getDOI().isEmpty()) { + setUpEmptyPanel(relationSearchComponents); + return; + } + executeSearch(relationSearchComponents); + } + + private void setUpEmptyPanel(RelationSearchComponents relationSearchComponents) { + hideNodes(relationSearchComponents.abortButton(), relationSearchComponents.progress()); + showNodes(relationSearchComponents.refreshButton()); + HBox hBox = new HBox(); Label label = new Label(Localization.lang("The selected entry doesn't have a DOI linked to it.")); Hyperlink link = new Hyperlink(Localization.lang("Look Up a DOI and try again.")); + link.setOnAction(e -> { + CrossRef doiFetcher = new CrossRef(); + + BackgroundTask.wrap(() -> doiFetcher.findIdentifier(relationSearchComponents.entry())) + .onRunning(() -> { + setLabelOn(relationSearchComponents.listView(), "Looking Up DOI..."); + setLabelOn(relationSearchComponents.otherListView(), "Looking Up DOI..."); + }) + .onSuccess(identifier -> { + if (identifier.isPresent()) { + relationSearchComponents.entry().setField(StandardField.DOI, identifier.get().asString()); +// setLabelOn(relationSearchComponents.listView(), "Found DOI"); +// setLabelOn(relationSearchComponents.otherListView(), "Found DOI"); + executeSearch(relationSearchComponents); + // fetch data separately + } else { + // not found + // just invoke setUpEmptyPanel on both relationSearch + setLabelOn(relationSearchComponents.listView(), "No DOI Found"); + setLabelOn(relationSearchComponents.otherListView(), "No DOI Found"); + } + }).onFailure(ex -> { + setLabelOn(relationSearchComponents.listView(), "Error " + ex.getMessage()); + setLabelOn(relationSearchComponents.otherListView(), "Error " + ex.getMessage()); + }).executeWith(taskExecutor); + }); + hBox.getChildren().add(label); hBox.getChildren().add(link); hBox.setSpacing(2d); hBox.setStyle("-fx-alignment: center;"); hBox.setFillHeight(true); - return hBox; + relationSearchComponents.listView().getItems().clear(); + relationSearchComponents.listView().setPlaceholder(hBox); + } + + private void executeSearch(RelationSearchComponents relationSearchComponents) { + ObservableList observableList = FXCollections.observableArrayList(); + relationSearchComponents.listView().setItems(observableList); + + // TODO: It should not be possible to cancel a search task that is already running for same tab + if (citingTask != null && !citingTask.isCancelled() && relationSearchComponents.searchType() == CitationFetcher.SearchType.CITES) { + citingTask.cancel(); + } else if (citedByTask != null && !citedByTask.isCancelled() && relationSearchComponents.searchType() == CitationFetcher.SearchType.CITED_BY) { + citedByTask.cancel(); + } + + this.createBackgroundTask(relationSearchComponents.entry(), relationSearchComponents.searchType()) + .consumeOnRunning(task -> prepareToSearchForRelations(relationSearchComponents, task)) + .onSuccess(fetchedList -> onSearchForRelationsSucceed(relationSearchComponents, + fetchedList, + observableList + )) + .onFailure(exception -> { + LOGGER.error("Error while fetching citing Articles", exception); + hideNodes(relationSearchComponents.abortButton(), relationSearchComponents.progress(), relationSearchComponents.importButton()); + relationSearchComponents.listView().setPlaceholder(new Label(Localization.lang("Error while fetching citing entries: %0", + exception.getMessage()))); + relationSearchComponents.refreshButton().setVisible(true); + dialogService.notify(exception.getMessage()); + }) + .executeWith(taskExecutor); + } + + private void prepareToSearchForRelations(RelationSearchComponents relationSearchComponents, BackgroundTask> task) { + showNodes(relationSearchComponents.abortButton(), relationSearchComponents.progress()); + hideNodes(relationSearchComponents.refreshButton(), relationSearchComponents.importButton()); + + relationSearchComponents.abortButton().setOnAction(event -> { + hideNodes(relationSearchComponents.abortButton(), relationSearchComponents.progress(), relationSearchComponents.importButton()); + showNodes(relationSearchComponents.refreshButton()); + task.cancel(); + dialogService.notify(Localization.lang("Search aborted!")); + }); + } + + private void onSearchForRelationsSucceed(RelationSearchComponents relationSearchComponents, + List fetchedList, + ObservableList observableList) { + + hideNodes(relationSearchComponents.abortButton(), relationSearchComponents.progress()); + + BibDatabase database = stateManager.getActiveDatabase().map(BibDatabaseContext::getDatabase).orElse(new BibDatabase()); + observableList.setAll( + fetchedList.stream().map(entr -> + duplicateCheck.containsDuplicate( + database, + entr, + BibDatabaseModeDetection.inferMode(database)) + .map(localEntry -> new CitationRelationItem(entr, localEntry, true)) + .orElseGet(() -> new CitationRelationItem(entr, false))) + .toList() + ); + + if (!observableList.isEmpty()) { + relationSearchComponents.listView().refresh(); + } else { + Label placeholder = new Label(Localization.lang("No articles found")); + relationSearchComponents.listView().setPlaceholder(placeholder); + } + BooleanBinding booleanBind = Bindings.isEmpty(relationSearchComponents.listView().getCheckModel().getCheckedItems()); + relationSearchComponents.importButton().disableProperty().bind(booleanBind); + relationSearchComponents.importButton().setOnMouseClicked(event -> importEntries(relationSearchComponents.listView().getCheckModel().getCheckedItems(), relationSearchComponents.searchType(), relationSearchComponents.entry())); + showNodes(relationSearchComponents.refreshButton(), relationSearchComponents.importButton()); + } + + private void jumpToEntry(CitationRelationItem entry) { + citingTask.cancel(); + citedByTask.cancel(); + stateManager.activeTabProperty().get().ifPresent(tab -> tab.showAndEdit(entry.localEntry())); + } + + /** + * @implNote This code is similar to {@link PreviewWithSourceTab#getSourceString(BibEntry, BibDatabaseMode, FieldPreferences, BibEntryTypesManager)}. + */ + private String getSourceString(BibEntry entry, BibDatabaseMode type, FieldPreferences fieldPreferences, BibEntryTypesManager entryTypesManager) throws IOException { + StringWriter writer = new StringWriter(); + BibWriter bibWriter = new BibWriter(writer, OS.NEWLINE); + FieldWriter fieldWriter = FieldWriter.buildIgnoreHashes(fieldPreferences); + new BibEntryWriter(fieldWriter, entryTypesManager).write(entry, bibWriter, type); + return writer.toString(); + } + + private void showEntrySourceDialog(BibEntry entry) { + CodeArea ca = new CodeArea(); + try { + BibDatabaseMode mode = stateManager.getActiveDatabase().map(BibDatabaseContext::getMode) + .orElse(BibDatabaseMode.BIBLATEX); + ca.appendText(getSourceString(entry, mode, preferences.getFieldPreferences(), this.entryTypesManager)); + } catch (IOException e) { + LOGGER.warn("Incorrect entry, could not load source:", e); + return; + } + + ca.setWrapText(true); + ca.setPadding(new Insets(0, 10, 0, 10)); + ca.showParagraphAtTop(0); + + ScrollPane scrollPane = new ScrollPane(); + scrollPane.setFitToWidth(true); + scrollPane.setFitToHeight(true); + scrollPane.setContent(new VirtualizedScrollPane<>(ca)); + + DialogPane dialogPane = new DialogPane(); + dialogPane.setPrefSize(800, 400); + dialogPane.setContent(scrollPane); + String title = Localization.lang("Show BibTeX source"); + + dialogService.showCustomDialogAndWait(title, dialogPane, ButtonType.OK); } /** @@ -314,8 +470,7 @@ private void styleFetchedListView(CheckListView listView) } try { NativeDesktop.openBrowser(url, preferences.getExternalApplicationsPreferences()); - } catch ( - IOException ex) { + } catch (IOException ex) { dialogService.notify(Localization.lang("Unable to open link.")); } }); @@ -344,52 +499,6 @@ private void styleFetchedListView(CheckListView listView) listView.setSelectionModel(new NoSelectionModel<>()); } - private void jumpToEntry(CitationRelationItem entry) { - citingTask.cancel(); - citedByTask.cancel(); - stateManager.activeTabProperty().get().ifPresent(tab -> tab.showAndEdit(entry.localEntry())); - } - - /** - * @implNote This code is similar to {@link PreviewWithSourceTab#getSourceString(BibEntry, BibDatabaseMode, FieldPreferences, BibEntryTypesManager)}. - */ - private String getSourceString(BibEntry entry, BibDatabaseMode type, FieldPreferences fieldPreferences, BibEntryTypesManager entryTypesManager) throws IOException { - StringWriter writer = new StringWriter(); - BibWriter bibWriter = new BibWriter(writer, OS.NEWLINE); - FieldWriter fieldWriter = FieldWriter.buildIgnoreHashes(fieldPreferences); - new BibEntryWriter(fieldWriter, entryTypesManager).write(entry, bibWriter, type); - return writer.toString(); - } - - private void showEntrySourceDialog(BibEntry entry) { - CodeArea ca = new CodeArea(); - try { - BibDatabaseMode mode = stateManager.getActiveDatabase().map(BibDatabaseContext::getMode) - .orElse(BibDatabaseMode.BIBLATEX); - ca.appendText(getSourceString(entry, mode, preferences.getFieldPreferences(), this.entryTypesManager)); - } catch ( - IOException e) { - LOGGER.warn("Incorrect entry, could not load source:", e); - return; - } - - ca.setWrapText(true); - ca.setPadding(new Insets(0, 10, 0, 10)); - ca.showParagraphAtTop(0); - - ScrollPane scrollPane = new ScrollPane(); - scrollPane.setFitToWidth(true); - scrollPane.setFitToHeight(true); - scrollPane.setContent(new VirtualizedScrollPane<>(ca)); - - DialogPane dialogPane = new DialogPane(); - dialogPane.setPrefSize(800, 400); - dialogPane.setContent(scrollPane); - String title = Localization.lang("Show BibTeX source"); - - dialogService.showCustomDialogAndWait(title, dialogPane, ButtonType.OK); - } - /** * Method to style heading labels * @@ -432,131 +541,34 @@ protected void bindToEntry(BibEntry entry) { setContent(getPaneAndStartSearch(entry)); } - /** - * Method to start search for relations and display them in the associated ListView - * - * @param entry BibEntry currently selected in Jabref Database - * @param listView ListView to use - * @param placeholder - * @param abortButton Button to stop the search - * @param refreshButton refresh Button to use - * @param searchType type of search (CITING / CITEDBY) - */ - private void searchForRelations(BibEntry entry, CheckListView listView, HBox placeholder, Button abortButton, - Button refreshButton, CitationFetcher.SearchType searchType, Button importButton, - ProgressIndicator progress) { - if (entry.getDOI().isEmpty()) { - hideNodes(abortButton, progress); - showNodes(refreshButton); - listView.getItems().clear(); - listView.setPlaceholder(placeholder); - return; - } - - ObservableList observableList = FXCollections.observableArrayList(); - - listView.setItems(observableList); - - // TODO: It should not be possible to cancel a search task that is already running for same tab - if (citingTask != null && !citingTask.isCancelled() && searchType == CitationFetcher.SearchType.CITES) { - citingTask.cancel(); - } else if (citedByTask != null && !citedByTask.isCancelled() && searchType == CitationFetcher.SearchType.CITED_BY) { - citedByTask.cancel(); - } - - this.createBackgroundTask(entry, searchType) - .consumeOnRunning(task -> prepareToSearchForRelations( - abortButton, refreshButton, importButton, progress, task - )) - .onSuccess(fetchedList -> onSearchForRelationsSucceed( - entry, - listView, - abortButton, - refreshButton, - searchType, - importButton, - progress, - fetchedList, - observableList - )) - .onFailure(exception -> { - LOGGER.error("Error while fetching citing Articles", exception); - hideNodes(abortButton, progress, importButton); - listView.setPlaceholder(new Label(Localization.lang("Error while fetching citing entries: %0", - exception.getMessage()))); - refreshButton.setVisible(true); - dialogService.notify(exception.getMessage()); - }) - .executeWith(taskExecutor); + private static void setLabelOn(CheckListView listView, String message) { + Label lookingUpDoiLabel = new Label(message); + listView.getItems().clear(); + listView.setPlaceholder(lookingUpDoiLabel); } /** * TODO: Make the method return a callable and let the calling method create the background task. */ private BackgroundTask> createBackgroundTask( - BibEntry entry, CitationFetcher.SearchType searchType + BibEntry entry, CitationFetcher.SearchType searchType ) { return switch (searchType) { case CitationFetcher.SearchType.CITES -> { citingTask = BackgroundTask.wrap( - () -> this.searchCitationsRelationsService.searchReferences(entry) + () -> this.searchCitationsRelationsService.searchReferences(entry) ); yield citingTask; } case CitationFetcher.SearchType.CITED_BY -> { citedByTask = BackgroundTask.wrap( - () -> this.searchCitationsRelationsService.searchCitations(entry) + () -> this.searchCitationsRelationsService.searchCitations(entry) ); yield citedByTask; } }; } - private void onSearchForRelationsSucceed(BibEntry entry, CheckListView listView, - Button abortButton, Button refreshButton, - CitationFetcher.SearchType searchType, Button importButton, - ProgressIndicator progress, List fetchedList, - ObservableList observableList) { - hideNodes(abortButton, progress); - - BibDatabase database = stateManager.getActiveDatabase().map(BibDatabaseContext::getDatabase) - .orElse(new BibDatabase()); - observableList.setAll( - fetchedList.stream().map(entr -> - duplicateCheck.containsDuplicate( - database, - entr, - BibDatabaseModeDetection.inferMode(database)) - .map(localEntry -> new CitationRelationItem(entr, localEntry, true)) - .orElseGet(() -> new CitationRelationItem(entr, false))) - .toList() - ); - - if (!observableList.isEmpty()) { - listView.refresh(); - } else { - Label placeholder = new Label(Localization.lang("No articles found")); - listView.setPlaceholder(placeholder); - } - BooleanBinding booleanBind = Bindings.isEmpty(listView.getCheckModel().getCheckedItems()); - importButton.disableProperty().bind(booleanBind); - importButton.setOnMouseClicked(event -> importEntries(listView.getCheckModel().getCheckedItems(), searchType, entry)); - showNodes(refreshButton, importButton); - } - - private void prepareToSearchForRelations(Button abortButton, Button refreshButton, Button importButton, - ProgressIndicator progress, BackgroundTask> task) { - showNodes(abortButton, progress); - hideNodes(refreshButton, importButton); - - abortButton.setOnAction(event -> { - hideNodes(abortButton, progress, importButton); - showNodes(refreshButton); - task.cancel(); - dialogService.notify(Localization.lang("Search aborted!")); - }); - } - private void hideNodes(Node... nodes) { Arrays.stream(nodes).forEach(node -> node.setVisible(false)); } @@ -583,7 +595,7 @@ private void importEntries(List entriesToImport, CitationF * Function to open possible duplicate entries window to compare duplicate entries * * @param citationRelationItem duplicate in the citation relations tab - * @param listView CheckListView to display citations + * @param listView CheckListView to display citations */ private void openPossibleDuplicateEntriesWindow(CitationRelationItem citationRelationItem, CheckListView listView) { BibEntry libraryEntry = citationRelationItem.localEntry(); diff --git a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/RelationSearchComponents.java b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/RelationSearchComponents.java new file mode 100644 index 00000000000..cf897d78417 --- /dev/null +++ b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/RelationSearchComponents.java @@ -0,0 +1,20 @@ +package org.jabref.gui.entryeditor.citationrelationtab; + +import javafx.scene.control.Button; +import javafx.scene.control.ProgressIndicator; + +import org.jabref.logic.importer.fetcher.citation.CitationFetcher; +import org.jabref.model.entry.BibEntry; + +import org.controlsfx.control.CheckListView; + +public record RelationSearchComponents( + BibEntry entry, + CheckListView listView, + CheckListView otherListView, + Button abortButton, + Button refreshButton, + CitationFetcher.SearchType searchType, + Button importButton, + ProgressIndicator progress) { +} From 4ef4dd4cea645d71366ef9fbd105124cfa53837b Mon Sep 17 00:00:00 2001 From: ankamde Date: Sun, 13 Jul 2025 14:59:30 +0200 Subject: [PATCH 4/8] Cited by panel ready. --- .../entryeditor/citationrelationtab/CitationRelationsTab.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java index d750a08915f..21579773597 100644 --- a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java +++ b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java @@ -238,7 +238,7 @@ private SplitPane getPaneAndStartSearch(BibEntry entry) { /** * Method to start search for relations and display them in the associated ListView * - * @param relationSearchComponents + * @param relationSearchComponents components used to properly display panel */ private void searchForRelations(RelationSearchComponents relationSearchComponents) { if (relationSearchComponents.entry().getDOI().isEmpty()) { From af8b91867c92e6efa162567cb03cfaaeb8d4bdb7 Mon Sep 17 00:00:00 2001 From: ankamde Date: Mon, 14 Jul 2025 17:51:31 +0200 Subject: [PATCH 5/8] Finished DOI lookup, add notification about not found DOI. --- CHANGELOG.md | 1 + ...omponents.java => CitationComponents.java} | 3 +- .../CitationRelationsTab.java | 114 +++++++++--------- 3 files changed, 56 insertions(+), 62 deletions(-) rename jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/{RelationSearchComponents.java => CitationComponents.java} (84%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22db2799aeb..d675a7f2c5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Note that this project **does not** adhere to [Semantic Versioning](https://semv ### Added +- We added automatic lookup of DOI at citation relations [#13234](https://github.com/JabRef/jabref/issues/13234) - We introduced a settings parameter to manage citations' relations local storage time-to-live with a default value set to 30 days. [#11189](https://github.com/JabRef/jabref/issues/11189) - We distribute arm64 images for Linux. [#10842](https://github.com/JabRef/jabref/issues/10842) - When adding an entry to a library, a warning is displayed if said entry already exists in an active library. [#13261](https://github.com/JabRef/jabref/issues/13261) diff --git a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/RelationSearchComponents.java b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationComponents.java similarity index 84% rename from jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/RelationSearchComponents.java rename to jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationComponents.java index cf897d78417..00e61751bc7 100644 --- a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/RelationSearchComponents.java +++ b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationComponents.java @@ -8,10 +8,9 @@ import org.controlsfx.control.CheckListView; -public record RelationSearchComponents( +public record CitationComponents( BibEntry entry, CheckListView listView, - CheckListView otherListView, Button abortButton, Button refreshButton, CitationFetcher.SearchType searchType, diff --git a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java index 21579773597..daf2e29b136 100644 --- a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java +++ b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java @@ -201,56 +201,51 @@ private SplitPane getPaneAndStartSearch(BibEntry entry) { citingVBox.getChildren().addAll(citingHBox, citingListView); citedByVBox.getChildren().addAll(citedByHBox, citedByListView); - RelationSearchComponents citingRelationSearchComponents = new RelationSearchComponents( + CitationComponents citingComponents = new CitationComponents( entry, citingListView, - citedByListView, abortCitingButton, refreshCitingButton, CitationFetcher.SearchType.CITES, importCitingButton, citingProgress); - RelationSearchComponents citedByRelationSearchComponents = new RelationSearchComponents( + CitationComponents citedByComponents = new CitationComponents( entry, citedByListView, - citingListView, abortCitedButton, refreshCitedByButton, CitationFetcher.SearchType.CITED_BY, importCitedByButton, citedByProgress); - refreshCitingButton.setOnMouseClicked(_ -> searchForRelations(citingRelationSearchComponents)); - refreshCitedByButton.setOnMouseClicked(_ -> searchForRelations(citedByRelationSearchComponents)); + refreshCitingButton.setOnMouseClicked(_ -> searchForRelations(citingComponents, citedByComponents)); + refreshCitedByButton.setOnMouseClicked(_ -> searchForRelations(citedByComponents, citingComponents)); // Create SplitPane to hold all nodes above SplitPane container = new SplitPane(citingVBox, citedByVBox); styleFetchedListView(citedByListView); styleFetchedListView(citingListView); - searchForRelations(citingRelationSearchComponents); - searchForRelations(citedByRelationSearchComponents); + searchForRelations(citingComponents, citedByComponents); + searchForRelations(citedByComponents, citingComponents); return container; } - /** - * Method to start search for relations and display them in the associated ListView - * - * @param relationSearchComponents components used to properly display panel - */ - private void searchForRelations(RelationSearchComponents relationSearchComponents) { - if (relationSearchComponents.entry().getDOI().isEmpty()) { - setUpEmptyPanel(relationSearchComponents); + private void searchForRelations(CitationComponents citationComponents, + CitationComponents otherCitationComponents) { + if (citationComponents.entry().getDOI().isEmpty()) { + setUpEmptyPanel(citationComponents, otherCitationComponents); return; } - executeSearch(relationSearchComponents); + executeSearch(citationComponents); } - private void setUpEmptyPanel(RelationSearchComponents relationSearchComponents) { - hideNodes(relationSearchComponents.abortButton(), relationSearchComponents.progress()); - showNodes(relationSearchComponents.refreshButton()); + private void setUpEmptyPanel(CitationComponents citationComponents, + CitationComponents otherCitationComponents) { + hideNodes(citationComponents.abortButton(), citationComponents.progress()); + showNodes(citationComponents.refreshButton()); HBox hBox = new HBox(); Label label = new Label(Localization.lang("The selected entry doesn't have a DOI linked to it.")); @@ -259,27 +254,26 @@ private void setUpEmptyPanel(RelationSearchComponents relationSearchComponents) link.setOnAction(e -> { CrossRef doiFetcher = new CrossRef(); - BackgroundTask.wrap(() -> doiFetcher.findIdentifier(relationSearchComponents.entry())) + BackgroundTask.wrap(() -> doiFetcher.findIdentifier(citationComponents.entry())) .onRunning(() -> { - setLabelOn(relationSearchComponents.listView(), "Looking Up DOI..."); - setLabelOn(relationSearchComponents.otherListView(), "Looking Up DOI..."); + showNodes(citationComponents.progress(), otherCitationComponents.progress()); + setLabelOn(citationComponents.listView(), "Looking Up DOI..."); + setLabelOn(otherCitationComponents.listView(), "Looking Up DOI..."); }) .onSuccess(identifier -> { if (identifier.isPresent()) { - relationSearchComponents.entry().setField(StandardField.DOI, identifier.get().asString()); -// setLabelOn(relationSearchComponents.listView(), "Found DOI"); -// setLabelOn(relationSearchComponents.otherListView(), "Found DOI"); - executeSearch(relationSearchComponents); - // fetch data separately + citationComponents.entry().setField(StandardField.DOI, identifier.get().asString()); + executeSearch(citationComponents); + executeSearch(otherCitationComponents); } else { - // not found - // just invoke setUpEmptyPanel on both relationSearch - setLabelOn(relationSearchComponents.listView(), "No DOI Found"); - setLabelOn(relationSearchComponents.otherListView(), "No DOI Found"); + dialogService.notify("No DOI found"); + setUpEmptyPanel(citationComponents, otherCitationComponents); + setUpEmptyPanel(otherCitationComponents, citationComponents); } }).onFailure(ex -> { - setLabelOn(relationSearchComponents.listView(), "Error " + ex.getMessage()); - setLabelOn(relationSearchComponents.otherListView(), "Error " + ex.getMessage()); + hideNodes(citationComponents.progress(), otherCitationComponents.progress()); + setLabelOn(citationComponents.listView(), "Error " + ex.getMessage()); + setLabelOn(otherCitationComponents.listView(), "Error " + ex.getMessage()); }).executeWith(taskExecutor); }); @@ -289,55 +283,55 @@ private void setUpEmptyPanel(RelationSearchComponents relationSearchComponents) hBox.setStyle("-fx-alignment: center;"); hBox.setFillHeight(true); - relationSearchComponents.listView().getItems().clear(); - relationSearchComponents.listView().setPlaceholder(hBox); + citationComponents.listView().getItems().clear(); + citationComponents.listView().setPlaceholder(hBox); } - private void executeSearch(RelationSearchComponents relationSearchComponents) { + private void executeSearch(CitationComponents citationComponents) { ObservableList observableList = FXCollections.observableArrayList(); - relationSearchComponents.listView().setItems(observableList); + citationComponents.listView().setItems(observableList); // TODO: It should not be possible to cancel a search task that is already running for same tab - if (citingTask != null && !citingTask.isCancelled() && relationSearchComponents.searchType() == CitationFetcher.SearchType.CITES) { + if (citingTask != null && !citingTask.isCancelled() && citationComponents.searchType() == CitationFetcher.SearchType.CITES) { citingTask.cancel(); - } else if (citedByTask != null && !citedByTask.isCancelled() && relationSearchComponents.searchType() == CitationFetcher.SearchType.CITED_BY) { + } else if (citedByTask != null && !citedByTask.isCancelled() && citationComponents.searchType() == CitationFetcher.SearchType.CITED_BY) { citedByTask.cancel(); } - this.createBackgroundTask(relationSearchComponents.entry(), relationSearchComponents.searchType()) - .consumeOnRunning(task -> prepareToSearchForRelations(relationSearchComponents, task)) - .onSuccess(fetchedList -> onSearchForRelationsSucceed(relationSearchComponents, + this.createBackgroundTask(citationComponents.entry(), citationComponents.searchType()) + .consumeOnRunning(task -> prepareToSearchForRelations(citationComponents, task)) + .onSuccess(fetchedList -> onSearchForRelationsSucceed(citationComponents, fetchedList, observableList )) .onFailure(exception -> { LOGGER.error("Error while fetching citing Articles", exception); - hideNodes(relationSearchComponents.abortButton(), relationSearchComponents.progress(), relationSearchComponents.importButton()); - relationSearchComponents.listView().setPlaceholder(new Label(Localization.lang("Error while fetching citing entries: %0", + hideNodes(citationComponents.abortButton(), citationComponents.progress(), citationComponents.importButton()); + citationComponents.listView().setPlaceholder(new Label(Localization.lang("Error while fetching citing entries: %0", exception.getMessage()))); - relationSearchComponents.refreshButton().setVisible(true); + citationComponents.refreshButton().setVisible(true); dialogService.notify(exception.getMessage()); }) .executeWith(taskExecutor); } - private void prepareToSearchForRelations(RelationSearchComponents relationSearchComponents, BackgroundTask> task) { - showNodes(relationSearchComponents.abortButton(), relationSearchComponents.progress()); - hideNodes(relationSearchComponents.refreshButton(), relationSearchComponents.importButton()); + private void prepareToSearchForRelations(CitationComponents citationComponents, BackgroundTask> task) { + showNodes(citationComponents.abortButton(), citationComponents.progress()); + hideNodes(citationComponents.refreshButton(), citationComponents.importButton()); - relationSearchComponents.abortButton().setOnAction(event -> { - hideNodes(relationSearchComponents.abortButton(), relationSearchComponents.progress(), relationSearchComponents.importButton()); - showNodes(relationSearchComponents.refreshButton()); + citationComponents.abortButton().setOnAction(event -> { + hideNodes(citationComponents.abortButton(), citationComponents.progress(), citationComponents.importButton()); + showNodes(citationComponents.refreshButton()); task.cancel(); dialogService.notify(Localization.lang("Search aborted!")); }); } - private void onSearchForRelationsSucceed(RelationSearchComponents relationSearchComponents, + private void onSearchForRelationsSucceed(CitationComponents citationComponents, List fetchedList, ObservableList observableList) { - hideNodes(relationSearchComponents.abortButton(), relationSearchComponents.progress()); + hideNodes(citationComponents.abortButton(), citationComponents.progress()); BibDatabase database = stateManager.getActiveDatabase().map(BibDatabaseContext::getDatabase).orElse(new BibDatabase()); observableList.setAll( @@ -352,15 +346,15 @@ private void onSearchForRelationsSucceed(RelationSearchComponents relationSearch ); if (!observableList.isEmpty()) { - relationSearchComponents.listView().refresh(); + citationComponents.listView().refresh(); } else { Label placeholder = new Label(Localization.lang("No articles found")); - relationSearchComponents.listView().setPlaceholder(placeholder); + citationComponents.listView().setPlaceholder(placeholder); } - BooleanBinding booleanBind = Bindings.isEmpty(relationSearchComponents.listView().getCheckModel().getCheckedItems()); - relationSearchComponents.importButton().disableProperty().bind(booleanBind); - relationSearchComponents.importButton().setOnMouseClicked(event -> importEntries(relationSearchComponents.listView().getCheckModel().getCheckedItems(), relationSearchComponents.searchType(), relationSearchComponents.entry())); - showNodes(relationSearchComponents.refreshButton(), relationSearchComponents.importButton()); + BooleanBinding booleanBind = Bindings.isEmpty(citationComponents.listView().getCheckModel().getCheckedItems()); + citationComponents.importButton().disableProperty().bind(booleanBind); + citationComponents.importButton().setOnMouseClicked(event -> importEntries(citationComponents.listView().getCheckModel().getCheckedItems(), citationComponents.searchType(), citationComponents.entry())); + showNodes(citationComponents.refreshButton(), citationComponents.importButton()); } private void jumpToEntry(CitationRelationItem entry) { From 5fa2d722bb3027aae22bf99122c8052b478f6a06 Mon Sep 17 00:00:00 2001 From: ankamde Date: Wed, 16 Jul 2025 16:15:56 +0200 Subject: [PATCH 6/8] Add messages to JabRef_en.properties. Modified lang files rolled back. --- .../citationrelationtab/CitationRelationsTab.java | 6 +++--- jablib/src/main/resources/l10n/JabRef_de.properties | 3 +-- jablib/src/main/resources/l10n/JabRef_en.properties | 4 +++- jablib/src/main/resources/l10n/JabRef_es.properties | 3 +-- jablib/src/main/resources/l10n/JabRef_fr.properties | 3 +-- jablib/src/main/resources/l10n/JabRef_it.properties | 3 +-- jablib/src/main/resources/l10n/JabRef_pt_BR.properties | 3 +-- jablib/src/main/resources/l10n/JabRef_tr.properties | 4 ++-- jablib/src/main/resources/l10n/JabRef_zh_CN.properties | 3 +-- 9 files changed, 14 insertions(+), 18 deletions(-) diff --git a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java index daf2e29b136..f6b4bfa87a5 100644 --- a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java +++ b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java @@ -257,8 +257,8 @@ private void setUpEmptyPanel(CitationComponents citationComponents, BackgroundTask.wrap(() -> doiFetcher.findIdentifier(citationComponents.entry())) .onRunning(() -> { showNodes(citationComponents.progress(), otherCitationComponents.progress()); - setLabelOn(citationComponents.listView(), "Looking Up DOI..."); - setLabelOn(otherCitationComponents.listView(), "Looking Up DOI..."); + setLabelOn(citationComponents.listView(), Localization.lang("Looking Up DOI...")); + setLabelOn(otherCitationComponents.listView(), Localization.lang("Looking Up DOI...")); }) .onSuccess(identifier -> { if (identifier.isPresent()) { @@ -266,7 +266,7 @@ private void setUpEmptyPanel(CitationComponents citationComponents, executeSearch(citationComponents); executeSearch(otherCitationComponents); } else { - dialogService.notify("No DOI found"); + dialogService.notify(Localization.lang("No DOI found")); setUpEmptyPanel(citationComponents, otherCitationComponents); setUpEmptyPanel(otherCitationComponents, citationComponents); } diff --git a/jablib/src/main/resources/l10n/JabRef_de.properties b/jablib/src/main/resources/l10n/JabRef_de.properties index c8dc4970e27..54d907b2bea 100644 --- a/jablib/src/main/resources/l10n/JabRef_de.properties +++ b/jablib/src/main/resources/l10n/JabRef_de.properties @@ -2719,8 +2719,7 @@ Get\ more\ themes...=Weitere Designs erhalten ... Miscellaneous=Verschiedenes File-related=Datei-bezogen -The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.=Der ausgewählte Eintrag hat keine DOI verlinkt. -Look\ Up\ a\ DOI\ and\ try\ again.=Suchen Sie eine DOI und versuchen Sie es erneut. +The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.\ Lookup\ a\ DOI\ and\ try\ again.=Der ausgewählte Eintrag hat keine DOI verlinkt. Suchen Sie eine DOI und versuchen Sie es erneut. Cited\ By=Zitiert von Cites=Zitate No\ articles\ found=Keine Artikel gefunden diff --git a/jablib/src/main/resources/l10n/JabRef_en.properties b/jablib/src/main/resources/l10n/JabRef_en.properties index 61058b76211..3780d3bb549 100644 --- a/jablib/src/main/resources/l10n/JabRef_en.properties +++ b/jablib/src/main/resources/l10n/JabRef_en.properties @@ -2793,7 +2793,9 @@ File-related=File-related Add\ selected\ entry(s)\ to\ library=Add selected entry(s) to library The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.=The selected entry doesn't have a DOI linked to it. -Look\ Up\ a\ DOI\ and\ try\ again.=Lookup a DOI and try again. +Look\ Up\ a\ DOI\ and\ try\ again.=Look Up a DOI and try again. +Looking\ Up\ DOI...=Looking Up DOI... +No\ DOI\ found=No DOI found Cited\ By=Cited By Cites=Cites No\ articles\ found=No articles found diff --git a/jablib/src/main/resources/l10n/JabRef_es.properties b/jablib/src/main/resources/l10n/JabRef_es.properties index e5a5d0375a4..ff8006ea863 100644 --- a/jablib/src/main/resources/l10n/JabRef_es.properties +++ b/jablib/src/main/resources/l10n/JabRef_es.properties @@ -2364,8 +2364,7 @@ Writing\ metadata\ to\ %0=Escribiendo metadatos a %0 Get\ more\ themes...=Obtener más temas... -The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.=La entrada seleccionada no tiene ningún DOI enlazado. -Look\ Up\ a\ DOI\ and\ try\ again.=Busque un DOI e inténtelo de nuevo. +The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.\ Lookup\ a\ DOI\ and\ try\ again.=La entrada seleccionada no tiene ningún DOI enlazado. Busque un DOI e inténtelo de nuevo. Cited\ By=Citado por No\ articles\ found=No se encontró ningún artículo Restart\ search=Reiniciar búsqueda diff --git a/jablib/src/main/resources/l10n/JabRef_fr.properties b/jablib/src/main/resources/l10n/JabRef_fr.properties index b6d0d267eee..5f0874842b4 100644 --- a/jablib/src/main/resources/l10n/JabRef_fr.properties +++ b/jablib/src/main/resources/l10n/JabRef_fr.properties @@ -2791,8 +2791,7 @@ Miscellaneous=Divers File-related=Lié au fichier Add\ selected\ entry(s)\ to\ library=Ajouter les entrées sélectionnées à la bibliothèque -The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.=L'entrée sélectionnée ne contient pas de DOI. -Look\ Up\ a\ DOI\ and\ try\ again.=Recherchez un DOI et réessayez. +The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.\ Lookup\ a\ DOI\ and\ try\ again.=L'entrée sélectionnée ne contient pas de DOI. Recherchez un DOI et réessayez. Cited\ By=Cité par Cites=Citations No\ articles\ found=Pas d'article trouvé diff --git a/jablib/src/main/resources/l10n/JabRef_it.properties b/jablib/src/main/resources/l10n/JabRef_it.properties index 8fb667cd93c..3f9655c10e1 100644 --- a/jablib/src/main/resources/l10n/JabRef_it.properties +++ b/jablib/src/main/resources/l10n/JabRef_it.properties @@ -2764,8 +2764,7 @@ Miscellaneous=Varie File-related=Correlato al file Add\ selected\ entry(s)\ to\ library=Aggiungi la/e voce/i selezionata/e alla libreria -The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.=La voce selezionata non ha un DOI collegato ad essa. -Look\ Up\ a\ DOI\ and\ try\ again.=Cerca un DOI e riprova. +The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.\ Lookup\ a\ DOI\ and\ try\ again.=La voce selezionata non ha un DOI collegato ad essa. Cerca un DOI e riprova. Cited\ By=Citato da Cites=Citazioni No\ articles\ found=Nessun articolo trovato diff --git a/jablib/src/main/resources/l10n/JabRef_pt_BR.properties b/jablib/src/main/resources/l10n/JabRef_pt_BR.properties index 33fc4988aec..6accb3d1e4f 100644 --- a/jablib/src/main/resources/l10n/JabRef_pt_BR.properties +++ b/jablib/src/main/resources/l10n/JabRef_pt_BR.properties @@ -2791,8 +2791,7 @@ Miscellaneous=Diversos File-related=Arquivo relacionado Add\ selected\ entry(s)\ to\ library=Adicionar as referências selecionadas à biblioteca -The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.=A entrada selecionada não tem um DOI vinculado a ele. -Look\ Up\ a\ DOI\ and\ try\ again.=Verifique um DOI e tente novamente. +The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.\ Lookup\ a\ DOI\ and\ try\ again.=A entrada selecionada não tem um DOI vinculado a ele. Verifique um DOI e tente novamente. Cited\ By=Citado por Cites=Citar No\ articles\ found=Nenhum artigo encontrado diff --git a/jablib/src/main/resources/l10n/JabRef_tr.properties b/jablib/src/main/resources/l10n/JabRef_tr.properties index 6396173617d..071c28dbfe6 100644 --- a/jablib/src/main/resources/l10n/JabRef_tr.properties +++ b/jablib/src/main/resources/l10n/JabRef_tr.properties @@ -2403,8 +2403,8 @@ Writing\ metadata\ to\ %0=Metaverisi %0'e yazılıyor Get\ more\ themes...=Daha fazla tema getir... -The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.=Seçili girdiyle bağlantılı bir DOI yok. -Look\ Up\ a\ DOI\ and\ try\ again.=Bir DOI arayıp tekrar deneyin. + +The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.\ Lookup\ a\ DOI\ and\ try\ again.=Seçili girdiyle bağlantılı bir DOI yok. Bir DOI arayıp tekrar deneyin. Cited\ By=Tarafından atfedilmiş No\ articles\ found=Makale bulunamadı Restart\ search=Aramayı tekrar başlat diff --git a/jablib/src/main/resources/l10n/JabRef_zh_CN.properties b/jablib/src/main/resources/l10n/JabRef_zh_CN.properties index 0322dc68bd0..73d52580842 100644 --- a/jablib/src/main/resources/l10n/JabRef_zh_CN.properties +++ b/jablib/src/main/resources/l10n/JabRef_zh_CN.properties @@ -2709,8 +2709,7 @@ Get\ more\ themes...=获取更多主题... Miscellaneous=杂项 File-related=文件相关的 -The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.=选中的条目并没有链接的 DOI。 -Look\ Up\ a\ DOI\ and\ try\ again.=查找一个 DOI,然后再次尝试。 +The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.\ Lookup\ a\ DOI\ and\ try\ again.=选中的条目并没有链接的 DOI。查找一个 DOI,然后再次尝试。 Cited\ By=被引用 Cites=引用 No\ articles\ found=未找到文章 From dfdec86ab9d3baf9ed3378c31088dab4d54d83cd Mon Sep 17 00:00:00 2001 From: ankamde Date: Wed, 16 Jul 2025 16:32:35 +0200 Subject: [PATCH 7/8] Change "Up" to "up" in the messages. --- .../citationrelationtab/CitationRelationsTab.java | 6 +++--- jablib/src/main/resources/l10n/JabRef_en.properties | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java index f6b4bfa87a5..b262a633566 100644 --- a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java +++ b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java @@ -249,7 +249,7 @@ private void setUpEmptyPanel(CitationComponents citationComponents, HBox hBox = new HBox(); Label label = new Label(Localization.lang("The selected entry doesn't have a DOI linked to it.")); - Hyperlink link = new Hyperlink(Localization.lang("Look Up a DOI and try again.")); + Hyperlink link = new Hyperlink(Localization.lang("Look up a DOI and try again.")); link.setOnAction(e -> { CrossRef doiFetcher = new CrossRef(); @@ -257,8 +257,8 @@ private void setUpEmptyPanel(CitationComponents citationComponents, BackgroundTask.wrap(() -> doiFetcher.findIdentifier(citationComponents.entry())) .onRunning(() -> { showNodes(citationComponents.progress(), otherCitationComponents.progress()); - setLabelOn(citationComponents.listView(), Localization.lang("Looking Up DOI...")); - setLabelOn(otherCitationComponents.listView(), Localization.lang("Looking Up DOI...")); + setLabelOn(citationComponents.listView(), Localization.lang("Looking up DOI...")); + setLabelOn(otherCitationComponents.listView(), Localization.lang("Looking up DOI...")); }) .onSuccess(identifier -> { if (identifier.isPresent()) { diff --git a/jablib/src/main/resources/l10n/JabRef_en.properties b/jablib/src/main/resources/l10n/JabRef_en.properties index 69e86aba2ef..3b99cf3c987 100644 --- a/jablib/src/main/resources/l10n/JabRef_en.properties +++ b/jablib/src/main/resources/l10n/JabRef_en.properties @@ -2802,8 +2802,8 @@ File-related=File-related Add\ selected\ entry(s)\ to\ library=Add selected entry(s) to library The\ selected\ entry\ doesn't\ have\ a\ DOI\ linked\ to\ it.=The selected entry doesn't have a DOI linked to it. -Look\ Up\ a\ DOI\ and\ try\ again.=Look Up a DOI and try again. -Looking\ Up\ DOI...=Looking Up DOI... +Look\ up\ a\ DOI\ and\ try\ again.=Look up a DOI and try again. +Looking\ up\ DOI...=Looking up DOI... No\ DOI\ found=No DOI found Cited\ By=Cited By Cites=Cites From 43e1ce7f85076c90efbc96793560cadf4946c2d4 Mon Sep 17 00:00:00 2001 From: ankamde Date: Wed, 16 Jul 2025 16:41:40 +0200 Subject: [PATCH 8/8] Remove exclamation from the message. --- .../entryeditor/citationrelationtab/CitationRelationsTab.java | 2 +- jablib/src/main/resources/l10n/JabRef_en.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java index b262a633566..afdd909a4a8 100644 --- a/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java +++ b/jabgui/src/main/java/org/jabref/gui/entryeditor/citationrelationtab/CitationRelationsTab.java @@ -323,7 +323,7 @@ private void prepareToSearchForRelations(CitationComponents citationComponents, hideNodes(citationComponents.abortButton(), citationComponents.progress(), citationComponents.importButton()); showNodes(citationComponents.refreshButton()); task.cancel(); - dialogService.notify(Localization.lang("Search aborted!")); + dialogService.notify(Localization.lang("Search aborted.")); }); } diff --git a/jablib/src/main/resources/l10n/JabRef_en.properties b/jablib/src/main/resources/l10n/JabRef_en.properties index 3b99cf3c987..1225a8e43f1 100644 --- a/jablib/src/main/resources/l10n/JabRef_en.properties +++ b/jablib/src/main/resources/l10n/JabRef_en.properties @@ -2811,7 +2811,7 @@ No\ articles\ found=No articles found Restart\ search=Restart search Cancel\ search=Cancel search Select\ entry=Select entry -Search\ aborted!=Search aborted! +Search\ aborted.=Search aborted. Citation\ relations=Citation relations Show\ articles\ related\ by\ citation=Show articles related by citation Error\ while\ fetching\ citing\ entries\:\ %0=Error while fetching citing entries: %0