diff --git a/src/main/java/org/jabref/gui/LibraryTab.java b/src/main/java/org/jabref/gui/LibraryTab.java index 8b9488b1559..c8a5b809d99 100644 --- a/src/main/java/org/jabref/gui/LibraryTab.java +++ b/src/main/java/org/jabref/gui/LibraryTab.java @@ -597,8 +597,8 @@ private void setupAutoCompletion() { if (autoCompletePreferences.shouldAutoComplete()) { suggestionProviders = new SuggestionProviders(getDatabase(), Globals.journalAbbreviationRepository, autoCompletePreferences); } else { - // Create suggestion providers with database for crossref if auto-completion is deactivated - suggestionProviders = new SuggestionProviders(getDatabase()); + // Create empty suggestion providers if auto-completion is deactivated + suggestionProviders = new SuggestionProviders(); } searchAutoCompleter = new PersonNameSuggestionProvider(FieldFactory.getPersonNameFields(), getDatabase()); } diff --git a/src/main/java/org/jabref/gui/autocompleter/ContentSelectorSuggestionProvider.java b/src/main/java/org/jabref/gui/autocompleter/ContentSelectorSuggestionProvider.java index 01e56ff5350..ebb6ec04837 100644 --- a/src/main/java/org/jabref/gui/autocompleter/ContentSelectorSuggestionProvider.java +++ b/src/main/java/org/jabref/gui/autocompleter/ContentSelectorSuggestionProvider.java @@ -1,7 +1,6 @@ package org.jabref.gui.autocompleter; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.stream.Stream; @@ -26,7 +25,7 @@ public Stream getSource() { } @Override - public Collection getPossibleSuggestions() { + public List getPossibleSuggestions() { List suggestions = new ArrayList<>(); if (suggestionProvider != null) { suggestions.addAll(suggestionProvider.getPossibleSuggestions()); diff --git a/src/main/java/org/jabref/gui/autocompleter/SuggestionProvider.java b/src/main/java/org/jabref/gui/autocompleter/SuggestionProvider.java index 341c9ef8f5e..fb64bb372b7 100644 --- a/src/main/java/org/jabref/gui/autocompleter/SuggestionProvider.java +++ b/src/main/java/org/jabref/gui/autocompleter/SuggestionProvider.java @@ -29,6 +29,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -60,7 +61,7 @@ public final Collection provideSuggestions(ISuggestionRequest request) { protected abstract Equivalence getEquivalence(); - public Collection getPossibleSuggestions() { + public List getPossibleSuggestions() { Comparator comparator = getComparator().reversed(); Equivalence equivalence = getEquivalence(); return getSource().map(equivalence::wrap) // Need to do a bit of acrobatic as there is no distinctBy method diff --git a/src/main/java/org/jabref/gui/autocompleter/SuggestionProviders.java b/src/main/java/org/jabref/gui/autocompleter/SuggestionProviders.java index 7d023f4d815..06d2abef8a8 100644 --- a/src/main/java/org/jabref/gui/autocompleter/SuggestionProviders.java +++ b/src/main/java/org/jabref/gui/autocompleter/SuggestionProviders.java @@ -22,21 +22,12 @@ public SuggestionProviders(BibDatabase database, JournalAbbreviationRepository a this.isEmpty = false; } - public SuggestionProviders(BibDatabase database) { - this.database = database; - this.isEmpty = true; - } - public SuggestionProviders() { this.isEmpty = true; } public SuggestionProvider getForField(Field field) { if (isEmpty || !autoCompletePreferences.getCompleteFields().contains(field)) { - Set fieldProperties = field.getProperties(); - if (fieldProperties.contains(FieldProperty.SINGLE_ENTRY_LINK)) { - return new BibEntrySuggestionProvider(database); - } return new EmptySuggestionProvider(); } diff --git a/src/main/java/org/jabref/gui/fieldeditors/FieldEditors.java b/src/main/java/org/jabref/gui/fieldeditors/FieldEditors.java index e699a398451..663f1f07fcb 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/FieldEditors.java +++ b/src/main/java/org/jabref/gui/fieldeditors/FieldEditors.java @@ -15,7 +15,6 @@ import org.jabref.logic.integrity.FieldCheckers; import org.jabref.logic.journals.JournalAbbreviationRepository; import org.jabref.model.database.BibDatabaseContext; -import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldFactory; import org.jabref.model.entry.field.FieldProperty; @@ -90,9 +89,9 @@ public static FieldEditorFX getForField(final Field field, return new OptionEditor<>(new TypeEditorViewModel(field, suggestionProvider, fieldCheckers, undoManager)); } } else if (fieldProperties.contains(FieldProperty.SINGLE_ENTRY_LINK)) { - return new LinkedEntriesEditor(field, databaseContext, (SuggestionProvider) suggestionProvider, fieldCheckers); + return new LinkedEntriesEditor(field, databaseContext, suggestionProvider, fieldCheckers); } else if (fieldProperties.contains(FieldProperty.MULTIPLE_ENTRY_LINK)) { - return new LinkedEntriesEditor(field, databaseContext, (SuggestionProvider) suggestionProvider, fieldCheckers); + return new LinkedEntriesEditor(field, databaseContext, suggestionProvider, fieldCheckers); } else if (fieldProperties.contains(FieldProperty.PERSON_NAMES)) { return new PersonsEditor(field, suggestionProvider, preferences, fieldCheckers, isMultiLine, undoManager); } else if (StandardField.KEYWORDS == field) { diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedEntriesEditor.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedEntriesEditor.java index 3c530084dd3..c13125727cc 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedEntriesEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedEntriesEditor.java @@ -1,7 +1,6 @@ package org.jabref.gui.fieldeditors; import java.util.Comparator; -import java.util.stream.Collectors; import javax.swing.undo.UndoManager; @@ -51,7 +50,7 @@ public class LinkedEntriesEditor extends HBox implements FieldEditorFX { private final LinkedEntriesEditorViewModel viewModel; - public LinkedEntriesEditor(Field field, BibDatabaseContext databaseContext, SuggestionProvider suggestionProvider, FieldCheckers fieldCheckers) { + public LinkedEntriesEditor(Field field, BibDatabaseContext databaseContext, SuggestionProvider suggestionProvider, FieldCheckers fieldCheckers) { ViewLoader.view(this) .root(this) .load(); @@ -59,13 +58,8 @@ public LinkedEntriesEditor(Field field, BibDatabaseContext databaseContext, Sugg this.viewModel = new LinkedEntriesEditorViewModel(field, suggestionProvider, databaseContext, fieldCheckers, undoManager); entryLinkField.setCellFactory(new ViewModelListCellFactory().withText(ParsedEntryLink::getKey)); - // Mind the .collect(Collectors.toList()) as the list needs to be mutable - entryLinkField.setSuggestionProvider(request -> - suggestionProvider.getPossibleSuggestions().stream() - .filter(suggestion -> suggestion.getCitationKey().orElse("").toLowerCase() - .contains(request.getUserText().toLowerCase())) - .map(ParsedEntryLink::new) - .collect(Collectors.toList())); + entryLinkField.setSuggestionProvider(request -> viewModel.getSuggestions(request.getUserText())); + entryLinkField.setTagViewFactory(this::createTag); entryLinkField.setConverter(viewModel.getStringConverter()); entryLinkField.setNewItemProducer(searchText -> viewModel.getStringConverter().fromString(searchText)); diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedEntriesEditorViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedEntriesEditorViewModel.java index 28048defa97..2f0b051e78a 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedEntriesEditorViewModel.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedEntriesEditorViewModel.java @@ -1,5 +1,9 @@ package org.jabref.gui.fieldeditors; +import java.util.List; +import java.util.Locale; +import java.util.stream.Collectors; + import javax.swing.undo.UndoManager; import javafx.beans.property.ListProperty; @@ -11,6 +15,7 @@ import org.jabref.gui.util.BindingsHelper; import org.jabref.logic.integrity.FieldCheckers; import org.jabref.model.database.BibDatabaseContext; +import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.EntryLinkList; import org.jabref.model.entry.ParsedEntryLink; import org.jabref.model.entry.field.Field; @@ -18,12 +23,15 @@ public class LinkedEntriesEditorViewModel extends AbstractEditorViewModel { private final BibDatabaseContext databaseContext; + private final SuggestionProvider suggestionProvider; private final ListProperty linkedEntries; public LinkedEntriesEditorViewModel(Field field, SuggestionProvider suggestionProvider, BibDatabaseContext databaseContext, FieldCheckers fieldCheckers, UndoManager undoManager) { super(field, suggestionProvider, fieldCheckers, undoManager); this.databaseContext = databaseContext; + this.suggestionProvider = suggestionProvider; + linkedEntries = new SimpleListProperty<>(FXCollections.observableArrayList()); BindingsHelper.bindContentBidirectional( linkedEntries, @@ -53,6 +61,24 @@ public ParsedEntryLink fromString(String key) { }; } + public List getSuggestions(String request) { + List suggestions = suggestionProvider + .getPossibleSuggestions() + .stream() + .map(suggestion -> suggestion instanceof BibEntry bibEntry ? bibEntry.getCitationKey().orElse("") : (String) suggestion) + .filter(suggestion -> suggestion.toLowerCase(Locale.ROOT).contains(request.toLowerCase(Locale.ROOT))) + .map(suggestion -> new ParsedEntryLink(suggestion, databaseContext.getDatabase())) + .distinct() + .collect(Collectors.toList()); + + ParsedEntryLink requestedLink = new ParsedEntryLink(request, databaseContext.getDatabase()); + if (!suggestions.contains(requestedLink)) { + suggestions.addFirst(requestedLink); + } + + return suggestions; + } + public void jumpToEntry(ParsedEntryLink parsedEntryLink) { // TODO: Implement jump to entry - The implementation can be based on JabRefFrame.jumpToEntry // TODO: Add toolitp for tag: Localization.lang("Jump to entry")