From b7a2ac00104fbd931fc08588f1dc01a379dd3b12 Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Wed, 12 Jul 2017 23:17:49 +0200 Subject: [PATCH] Fix #2897: readd content selectors --- src/main/java/org/jabref/gui/BasePanel.java | 9 - .../AutoCompletionTextInputBinding.java | 45 ++-- .../ContentSelectorSuggestionProvider.java | 13 +- .../ContentSelectorDialog.java | 19 +- .../contentselector/FieldContentSelector.java | 200 ------------------ .../jabref/gui/entryeditor/EntryEditor.java | 34 --- .../gui/entryeditor/FieldExtraComponents.java | 40 ---- .../gui/entryeditor/FieldsEditorTab.java | 12 -- .../jabref/gui/fieldeditors/FieldEditors.java | 28 ++- .../jabref/gui/fieldeditors/SimpleEditor.java | 7 +- 10 files changed, 81 insertions(+), 326 deletions(-) delete mode 100644 src/main/java/org/jabref/gui/contentselector/FieldContentSelector.java delete mode 100644 src/main/java/org/jabref/gui/entryeditor/FieldExtraComponents.java diff --git a/src/main/java/org/jabref/gui/BasePanel.java b/src/main/java/org/jabref/gui/BasePanel.java index f048050424b..5f02b5d009c 100644 --- a/src/main/java/org/jabref/gui/BasePanel.java +++ b/src/main/java/org/jabref/gui/BasePanel.java @@ -1988,15 +1988,6 @@ private String formatOutputMessage(String start, int count) { (count > 1 ? Localization.lang("entries") : Localization.lang("entry"))); } - /** - * This method iterates through all existing entry editors in this BasePanel, telling each to update all its - * instances of FieldContentSelector. This is done to ensure that the list of words in each selector is up-to-date - * after the user has made changes in the Manage dialog. - */ - public void updateAllContentSelectors() { - currentEditor.updateAllContentSelectors(); - } - /** * Set the preview active state for all BasePanel instances. */ diff --git a/src/main/java/org/jabref/gui/autocompleter/AutoCompletionTextInputBinding.java b/src/main/java/org/jabref/gui/autocompleter/AutoCompletionTextInputBinding.java index 451eae63bad..8bd97ec3b02 100644 --- a/src/main/java/org/jabref/gui/autocompleter/AutoCompletionTextInputBinding.java +++ b/src/main/java/org/jabref/gui/autocompleter/AutoCompletionTextInputBinding.java @@ -44,11 +44,6 @@ */ public class AutoCompletionTextInputBinding extends AutoCompletionBinding { - private final ChangeListener focusChangedListener = (obs, oldFocused, newFocused) -> { - if (!newFocused) { - hidePopup(); - } - }; /** * String converter to be used to convert suggestions to strings. */ @@ -56,11 +51,19 @@ public class AutoCompletionTextInputBinding extends AutoCompletionBinding private AutoCompletionStrategy inputAnalyzer; private final ChangeListener textChangeListener = (obs, oldText, newText) -> { if (getCompletionTarget().isFocused()) { - AutoCompletionInput input = inputAnalyzer.analyze(newText); - setUserInput(input.getUnfinishedPart()); + setUserInputText(newText); + } + }; + private boolean showOnFocus; + private final ChangeListener focusChangedListener = (obs, oldFocused, newFocused) -> { + if (newFocused) { + if (showOnFocus) { + setUserInputText(getCompletionTarget().getText()); + } + } else { + hidePopup(); } }; - /** * Creates a new auto-completion binding between the given textInputControl @@ -117,12 +120,20 @@ public static void autoComplete(TextInputControl textArea, Callback(textArea, suggestionProvider, converter); } - public static void autoComplete(TextInputControl textArea, Callback> suggestionProvider, StringConverter converter, AutoCompletionStrategy inputAnalyzer) { - new AutoCompletionTextInputBinding<>(textArea, suggestionProvider, converter, inputAnalyzer); + public static AutoCompletionTextInputBinding autoComplete(TextInputControl textArea, Callback> suggestionProvider, StringConverter converter, AutoCompletionStrategy inputAnalyzer) { + return new AutoCompletionTextInputBinding<>(textArea, suggestionProvider, converter, inputAnalyzer); + } + + public static AutoCompletionTextInputBinding autoComplete(TextInputControl textArea, Callback> suggestionProvider, AutoCompletionStrategy inputAnalyzer) { + return autoComplete(textArea, suggestionProvider, AutoCompletionTextInputBinding.defaultStringConverter(), inputAnalyzer); } - public static void autoComplete(TextInputControl textArea, Callback> suggestionProvider, AutoCompletionStrategy inputAnalyzer) { - autoComplete(textArea, suggestionProvider, AutoCompletionTextInputBinding.defaultStringConverter(), inputAnalyzer); + private void setUserInputText(String newText) { + if (newText == null) { + newText = ""; + } + AutoCompletionInput input = inputAnalyzer.analyze(newText); + setUserInput(input.getUnfinishedPart()); } @Override @@ -139,9 +150,17 @@ public void dispose() { @Override protected void completeUserInput(T completion) { String completionText = converter.toString(completion); - AutoCompletionInput input = inputAnalyzer.analyze(getCompletionTarget().getText()); + String inputText = getCompletionTarget().getText(); + if (inputText == null) { + inputText = ""; + } + AutoCompletionInput input = inputAnalyzer.analyze(inputText); String newText = input.getPrefix() + completionText; getCompletionTarget().setText(newText); getCompletionTarget().positionCaret(newText.length()); } + + public void setShowOnFocus(boolean showOnFocus) { + this.showOnFocus = showOnFocus; + } } diff --git a/src/main/java/org/jabref/gui/autocompleter/ContentSelectorSuggestionProvider.java b/src/main/java/org/jabref/gui/autocompleter/ContentSelectorSuggestionProvider.java index 085b997108c..6c969f2713b 100644 --- a/src/main/java/org/jabref/gui/autocompleter/ContentSelectorSuggestionProvider.java +++ b/src/main/java/org/jabref/gui/autocompleter/ContentSelectorSuggestionProvider.java @@ -4,14 +4,14 @@ import java.util.Collection; import java.util.List; -import javafx.util.Callback; +import org.jabref.model.entry.BibEntry; import org.controlsfx.control.textfield.AutoCompletionBinding; /** * Enriches a suggestion provider by a given set of content selector values. */ -public class ContentSelectorSuggestionProvider implements Callback> { +public class ContentSelectorSuggestionProvider implements AutoCompleteSuggestionProvider { private final AutoCompleteSuggestionProvider suggestionProvider; private final List contentSelectorValues; @@ -26,8 +26,15 @@ public ContentSelectorSuggestionProvider(AutoCompleteSuggestionProvider @Override public Collection call(AutoCompletionBinding.ISuggestionRequest request) { List suggestions = new ArrayList<>(); - suggestions.addAll(suggestionProvider.call(request)); + if (suggestionProvider != null) { + suggestions.addAll(suggestionProvider.call(request)); + } suggestions.addAll(contentSelectorValues); return suggestions; } + + @Override + public void indexEntry(BibEntry entry) { + suggestionProvider.indexEntry(entry); + } } diff --git a/src/main/java/org/jabref/gui/contentselector/ContentSelectorDialog.java b/src/main/java/org/jabref/gui/contentselector/ContentSelectorDialog.java index 6298bd33d7a..9bbafa663d4 100644 --- a/src/main/java/org/jabref/gui/contentselector/ContentSelectorDialog.java +++ b/src/main/java/org/jabref/gui/contentselector/ContentSelectorDialog.java @@ -72,11 +72,11 @@ public class ContentSelectorDialog extends JabRefDialog { private final JTextField fieldNameField = new JTextField("", 20); private final JTextField wordEditField = new JTextField("", 20); private final JScrollPane fPane = new JScrollPane(fieldList); - private DefaultListModel wordListModel = new DefaultListModel<>(); private final Map> wordListModels = new HashMap<>(); - private final JList wordList = new JList<>(wordListModel); private final JScrollPane wPane = new JScrollPane(wordList); private final List removedFields = new ArrayList<>(); + private DefaultListModel wordListModel = new DefaultListModel<>(); + private final JList wordList = new JList<>(wordListModel); private String currentField; @@ -262,7 +262,6 @@ private void newWordAction() { } private void applyChanges() { - boolean changedFieldSet = false; // Watch if we need to rebuild entry editors boolean anythingChanged = false; // Watch if we should mark as there is data changed // First remove the mappings for fields that have been deleted. @@ -270,7 +269,6 @@ private void applyChanges() { // cause any harm to remove them here. for (String fieldName : removedFields) { metaData.clearContentSelectors(fieldName); - changedFieldSet = true; anythingChanged = true; } @@ -302,21 +300,16 @@ private void applyChanges() { // Check if there are words to be added and previously there were no content selector for the field if (!data.isEmpty() && metaData.getContentSelectorValuesForField(entry.getKey()).isEmpty()) { - changedFieldSet = true; + anythingChanged = true; } metaData.addContentSelector(new ContentSelector(entry.getKey(), new ArrayList<>(data))); } - // Update all selectors in the current BasePanel. - if (changedFieldSet) { - // TODO: We have added or removed content selectors, update the entry editor - } else if (anythingChanged) { - // Enough to update the content selectors, if anything changed - panel.updateAllContentSelectors(); - } - if (anythingChanged) { + // Update all selectors in the current BasePanel. + panel.setupMainPanel(); + // Mark the database updated so changes are not lost panel.markNonUndoableBaseChanged(); } diff --git a/src/main/java/org/jabref/gui/contentselector/FieldContentSelector.java b/src/main/java/org/jabref/gui/contentselector/FieldContentSelector.java deleted file mode 100644 index 1501ea7f294..00000000000 --- a/src/main/java/org/jabref/gui/contentselector/FieldContentSelector.java +++ /dev/null @@ -1,200 +0,0 @@ -package org.jabref.gui.contentselector; - -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Window; -import java.awt.event.ActionEvent; - -import javax.swing.AbstractAction; -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.KeyStroke; - -import org.jabref.gui.BasePanel; -import org.jabref.gui.JabRefFrame; -import org.jabref.gui.fieldeditors.FieldEditor; -import org.jabref.logic.l10n.Localization; -import org.jabref.model.entry.Keyword; -import org.jabref.model.entry.KeywordList; -import org.jabref.model.metadata.MetaData; - -import com.jgoodies.forms.layout.Sizes; -import com.jgoodies.looks.Options; - -/** - * A combo-box and a manage button that will add selected strings to an - * associated entry editor. - * - * Used to manage keywords and authors for instance. - */ -public class FieldContentSelector extends JComponent { - - private static final int MAX_CONTENT_SELECTOR_WIDTH = 240; // The max width of the combobox for content selectors. - private final JComboBox comboBox; - - private final FieldEditor editor; - - private final MetaData metaData; - - private final AbstractAction action; - private final String delimiter; - - - /** - * - * Create a new FieldContentSelector. - * - * @param frame - * The one JabRef-Frame. - * @param panel - * The basepanel the entry-editor is on. - * @param owner - * The window/frame/dialog which should be the owner of the - * content selector dialog. - * @param editor - * The entry editor which will be appended by the text selected - * by the user from the combobox. - * @param action - * The action that will be performed to after an item from the - * combobox has been appended to the text in the entryeditor. - * @param horizontalLayout - * Whether to put a 2 pixel horizontal strut between combobox and - * button. - */ - public FieldContentSelector(JabRefFrame frame, final BasePanel panel, Window owner, final FieldEditor editor, - final AbstractAction action, boolean horizontalLayout, String delimiter) { - - - this.editor = editor; - this.metaData = panel.getBibDatabaseContext().getMetaData(); - this.action = action; - this.delimiter = delimiter; - - comboBox = new JComboBox() { - - @Override - public Dimension getPreferredSize() { - Dimension parents = super.getPreferredSize(); - if (parents.width > MAX_CONTENT_SELECTOR_WIDTH) { - parents.width = MAX_CONTENT_SELECTOR_WIDTH; - } - return parents; - } - }; - - GridBagLayout gbl = new GridBagLayout(); - GridBagConstraints con = new GridBagConstraints(); - - setLayout(gbl); - - // comboBox.setEditable(true); - - comboBox.setMaximumRowCount(35); - - // Set the width of the popup independent of the size of th box itself: - comboBox.putClientProperty(Options.COMBO_POPUP_PROTOTYPE_DISPLAY_VALUE_KEY, - "The longest text in the combo popup menu. And even longer."); - - rebuildComboBox(); - - con.gridwidth = horizontalLayout ? 3 : GridBagConstraints.REMAINDER; - con.fill = GridBagConstraints.HORIZONTAL; - con.weightx = 1; - gbl.setConstraints(comboBox, con); - - comboBox.addActionListener(e -> { - /* - * These conditions signify arrow key navigation in the dropdown - * list, so we should not react to it. I'm not sure if this is - * well defined enough to be guaranteed to work everywhere. - */ - if ("comboBoxChanged".equals(e.getActionCommand()) && (e.getModifiers() == 0)) { - return; - } - - selectionMade(); - }); - // Add an action for the Enter key that signals a selection: - comboBox.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "enter"); - comboBox.getActionMap().put("enter", new AbstractAction() { - - @Override - public void actionPerformed(ActionEvent actionEvent) { - selectionMade(); - comboBox.setPopupVisible(false); - } - }); - - add(comboBox); - - if (horizontalLayout) { - add(Box.createHorizontalStrut(Sizes.dialogUnitXAsPixel(2, this))); - } - - JButton manage = new JButton(Localization.lang("Manage")); - gbl.setConstraints(manage, con); - add(manage); - - manage.addActionListener(e -> { - ContentSelectorDialog csd = new ContentSelectorDialog(owner, frame, panel, true, editor.getFieldName()); - csd.setLocationRelativeTo(frame); - - // Calling setVisible(true) will open the modal dialog and block - // for the dialog to close. - csd.setVisible(true); - - // So we need to rebuild the ComboBox afterwards - rebuildComboBox(); - }); - } - - private void selectionMade() { - // The first element is empty to avoid a preselection - if (comboBox.getSelectedIndex() == 0) { - return; - } - - String chosen = (String) comboBox.getSelectedItem(); - if ((chosen == null) || chosen.isEmpty()) { - return; - } - - String currentText = editor.getText(); - KeywordList words = KeywordList.parse(currentText, this.delimiter.charAt(0)); - boolean alreadyInList = words.contains(new Keyword(chosen)); - - // not the first word and no duplicate -> we need a comma - if (!"".equals(currentText) && !alreadyInList) { - editor.append(FieldContentSelector.this.delimiter); - } - - // no duplicate -> add it - if (!alreadyInList) { - editor.append(chosen); - } - - comboBox.setSelectedIndex(0); - - // Fire event that we changed the editor - if (action != null) { - action.actionPerformed(new ActionEvent(editor, 0, "")); - } - - // Transfer focus to the editor. - editor.requestFocus(); - } - - public void rebuildComboBox() { - comboBox.removeAllItems(); - - // To have an empty field as the default for the combobox - comboBox.addItem(""); - for (String item : metaData.getContentSelectorValuesForField(editor.getFieldName())) { - comboBox.addItem(item); - } - } - -} diff --git a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java index f9b651d5113..a7416b313e6 100644 --- a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java +++ b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java @@ -14,11 +14,9 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Optional; -import java.util.Set; import javax.swing.AbstractAction; import javax.swing.Action; @@ -49,7 +47,6 @@ import org.jabref.gui.JabRefFrame; import org.jabref.gui.OSXCompatibleToolbar; import org.jabref.gui.actions.Actions; -import org.jabref.gui.contentselector.FieldContentSelector; import org.jabref.gui.externalfiles.WriteXMPEntryEditorAction; import org.jabref.gui.fieldeditors.FieldEditor; import org.jabref.gui.fieldeditors.TextField; @@ -135,7 +132,6 @@ public class EntryEditor extends JPanel implements EntryContainer { private final TabPane tabbed = new TabPane(); private final JabRefFrame frame; private final BasePanel panel; - private final Set contentSelectors = new HashSet<>(); private final HelpAction helpAction = new HelpAction(HelpFile.ENTRY_EDITOR, IconTheme.JabRefIcon.HELP.getIcon()); private final UndoAction undoAction = new UndoAction(); private final RedoAction redoAction = new RedoAction(); @@ -402,28 +398,6 @@ public void mousePressed(MouseEvent e) { add(leftPan, BorderLayout.WEST); } - /** - * getExtra checks the field name against InternalBibtexFields.getFieldExtras(name). - * If the name has an entry, the proper component to be shown is created and - * returned. Otherwise, null is returned. In addition, e.g. listeners can be - * added to the field editor, even if no component is returned. - * - * @return Component to show, or null if none. - */ - /* - public Optional getExtra(final FieldEditor editor) { - final String fieldName = editor.getFieldName(); - - final Set fieldExtras = InternalBibtexFields.getFieldProperties(fieldName); - - if (!panel.getBibDatabaseContext().getMetaData().getContentSelectorValuesForField(fieldName).isEmpty()) { - return FieldExtraComponents.getSelectorExtraComponent(frame, panel, editor, contentSelectors, - storeFieldAction); - } - return Optional.empty(); - } - */ - void addSearchListener(SearchQueryHighlightListener listener) { // TODO: Highlight search text in entry editors searchListeners.add(listener); @@ -482,14 +456,6 @@ public void setFocusToField(String fieldName) { } } - public void updateAllContentSelectors() { - if (!contentSelectors.isEmpty()) { - for (FieldContentSelector contentSelector : contentSelectors) { - contentSelector.rebuildComboBox(); - } - } - } - public void setMovingToDifferentEntry() { movingToDifferentEntry = true; unregisterListeners(); diff --git a/src/main/java/org/jabref/gui/entryeditor/FieldExtraComponents.java b/src/main/java/org/jabref/gui/entryeditor/FieldExtraComponents.java deleted file mode 100644 index 5603aaa0b49..00000000000 --- a/src/main/java/org/jabref/gui/entryeditor/FieldExtraComponents.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.jabref.gui.entryeditor; - -import java.util.Optional; -import java.util.Set; - -import javax.swing.JComponent; - -import org.jabref.gui.BasePanel; -import org.jabref.gui.JabRefFrame; -import org.jabref.gui.contentselector.FieldContentSelector; -import org.jabref.gui.entryeditor.EntryEditor.StoreFieldAction; -import org.jabref.gui.fieldeditors.FieldEditor; -import org.jabref.model.entry.FieldProperty; -import org.jabref.model.entry.InternalBibtexFields; - -public class FieldExtraComponents { - - private FieldExtraComponents() { - } - - - /** - * Return a button opening a content selector for fields where one exists - * - * @param frame - * @param panel - * @param editor - * @param contentSelectors - * @param storeFieldAction - * @return - */ - public static Optional getSelectorExtraComponent(JabRefFrame frame, BasePanel panel, FieldEditor editor, - Set contentSelectors, StoreFieldAction storeFieldAction) { - FieldContentSelector ws = new FieldContentSelector(frame, panel, frame, editor, storeFieldAction, false, - InternalBibtexFields.getFieldProperties(editor.getFieldName()) - .contains(FieldProperty.PERSON_NAMES) ? " and " : ", "); - contentSelectors.add(ws); - return Optional.of(ws); - } -} diff --git a/src/main/java/org/jabref/gui/entryeditor/FieldsEditorTab.java b/src/main/java/org/jabref/gui/entryeditor/FieldsEditorTab.java index caa0743a6dd..6956ba518d3 100644 --- a/src/main/java/org/jabref/gui/entryeditor/FieldsEditorTab.java +++ b/src/main/java/org/jabref/gui/entryeditor/FieldsEditorTab.java @@ -132,18 +132,6 @@ private Region setupPanel(JabRefFrame frame, BasePanel bPanel, boolean compresse } */ - /* - // TODO: Reenable content selector - if (!panel.getBibDatabaseContext().getMetaData().getContentSelectorValuesForField(editor.getFieldName()).isEmpty()) { - FieldContentSelector ws = new FieldContentSelector(frame, panel, frame, editor, storeFieldAction, false, - ", "); - contentSelectors.add(ws); - controls.add(ws, BorderLayout.NORTH); - } - //} else if (!panel.getBibDatabaseContext().getMetaData().getContentSelectorValuesForField(fieldName).isEmpty()) { - //return FieldExtraComponents.getSelectorExtraComponent(frame, panel, editor, contentSelectors, storeFieldAction); - */ - labels.add(new FieldNameLabel(fieldName)); } diff --git a/src/main/java/org/jabref/gui/fieldeditors/FieldEditors.java b/src/main/java/org/jabref/gui/fieldeditors/FieldEditors.java index 6f02ed966f6..fbc9207d07c 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/FieldEditors.java +++ b/src/main/java/org/jabref/gui/fieldeditors/FieldEditors.java @@ -1,11 +1,13 @@ package org.jabref.gui.fieldeditors; import java.time.format.DateTimeFormatter; +import java.util.List; import java.util.Set; import org.jabref.Globals; import org.jabref.gui.DialogService; import org.jabref.gui.autocompleter.AutoCompleteSuggestionProvider; +import org.jabref.gui.autocompleter.ContentSelectorSuggestionProvider; import org.jabref.gui.autocompleter.SuggestionProviders; import org.jabref.gui.util.TaskExecutor; import org.jabref.logic.journals.JournalAbbreviationLoader; @@ -13,14 +15,20 @@ import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.FieldProperty; import org.jabref.model.entry.InternalBibtexFields; +import org.jabref.model.metadata.MetaData; import org.jabref.preferences.JabRefPreferences; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + public class FieldEditors { + private static final Log LOGGER = LogFactory.getLog(FieldEditors.class); + public static FieldEditorFX getForField(String fieldName, TaskExecutor taskExecutor, DialogService dialogService, JournalAbbreviationLoader journalAbbreviationLoader, JournalAbbreviationPreferences journalAbbreviationPreferences, JabRefPreferences preferences, BibDatabaseContext databaseContext, String entryType, SuggestionProviders suggestionProviders) { final Set fieldExtras = InternalBibtexFields.getFieldProperties(fieldName); - AutoCompleteSuggestionProvider suggestionProvider = suggestionProviders.getForField(fieldName); + AutoCompleteSuggestionProvider suggestionProvider = getSuggestionProvider(fieldName, suggestionProviders, databaseContext.getMetaData()); if (Globals.prefs.get(JabRefPreferences.TIME_STAMP_FIELD).equals(fieldName) || fieldExtras.contains(FieldProperty.DATE)) { if (fieldExtras.contains(FieldProperty.ISO_DATE)) { @@ -63,4 +71,22 @@ public static FieldEditorFX getForField(String fieldName, TaskExecutor taskExecu // default return new SimpleEditor(fieldName, suggestionProvider); } + + @SuppressWarnings("unchecked") + private static AutoCompleteSuggestionProvider getSuggestionProvider(String fieldName, SuggestionProviders suggestionProviders, MetaData metaData) { + AutoCompleteSuggestionProvider suggestionProvider = suggestionProviders.getForField(fieldName); + + List contentSelectorValues = metaData.getContentSelectorValuesForField(fieldName); + if (!contentSelectorValues.isEmpty()) { + // Enrich auto completion by content selector values + try { + return new ContentSelectorSuggestionProvider((AutoCompleteSuggestionProvider) suggestionProvider, contentSelectorValues); + } catch (ClassCastException exception) { + LOGGER.error("Content selectors are only supported for normal fields with string-based auto completion."); + return suggestionProvider; + } + } else { + return suggestionProvider; + } + } } diff --git a/src/main/java/org/jabref/gui/fieldeditors/SimpleEditor.java b/src/main/java/org/jabref/gui/fieldeditors/SimpleEditor.java index 347504def11..261e8a43501 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/SimpleEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/SimpleEditor.java @@ -7,6 +7,7 @@ import org.jabref.gui.autocompleter.AutoCompleteSuggestionProvider; import org.jabref.gui.autocompleter.AutoCompletionTextInputBinding; +import org.jabref.gui.autocompleter.ContentSelectorSuggestionProvider; import org.jabref.gui.fieldeditors.contextmenu.EditorMenus; import org.jabref.model.entry.BibEntry; @@ -23,7 +24,11 @@ public SimpleEditor(String fieldName, AutoCompleteSuggestionProvider suggesti textArea.addToContextMenu(EditorMenus.getDefaultMenu(textArea)); this.getChildren().add(textArea); - AutoCompletionTextInputBinding.autoComplete(textArea, viewModel::complete, viewModel.getAutoCompletionStrategy()); + AutoCompletionTextInputBinding autoCompleter = AutoCompletionTextInputBinding.autoComplete(textArea, viewModel::complete, viewModel.getAutoCompletionStrategy()); + if (suggestionProvider instanceof ContentSelectorSuggestionProvider) { + // If content selector values are present, then we want to show the auto complete suggestions immediately on focus + autoCompleter.setShowOnFocus(true); + } } @Override