diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f5ba62e7df..bd430ca8aca 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 a way to navigate through Tabs in Entry Editor by pressing "tab" when the last TextField of a Tab is in focus. [#11937](https://github.com/JabRef/jabref/issues/11937) - We added a "view as BibTeX" option before importing an entry from the citation relation tab. [#11826](https://github.com/JabRef/jabref/issues/11826) - We added probable search hits instead of exact matches. Sorting by hit score can be done by the new score table column. [#11542](https://github.com/JabRef/jabref/pull/11542) - We added support finding LaTeX-encoded special characters based on plain Unicode and vice versa. [#11542](https://github.com/JabRef/jabref/pull/11542) diff --git a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java index 6a382a7a59e..63f1fb06b4a 100644 --- a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java +++ b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java @@ -22,6 +22,7 @@ import javafx.scene.control.MenuItem; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; +import javafx.scene.control.TextField; import javafx.scene.input.DataFormat; import javafx.scene.input.KeyEvent; import javafx.scene.input.TransferMode; @@ -36,6 +37,7 @@ import org.jabref.gui.entryeditor.fileannotationtab.FileAnnotationTab; import org.jabref.gui.entryeditor.fileannotationtab.FulltextSearchResultsTab; import org.jabref.gui.externalfiles.ExternalFilesEntryLinker; +import org.jabref.gui.fieldeditors.EditorTextField; import org.jabref.gui.help.HelpAction; import org.jabref.gui.importer.GrobidOptInDialogHelper; import org.jabref.gui.keyboard.KeyBinding; @@ -142,6 +144,7 @@ public EntryEditor(LibraryTab libraryTab, UndoAction undoAction, RedoAction redo this.previewTabs = this.allPossibleTabs.stream().filter(OffersPreview.class::isInstance).map(OffersPreview.class::cast).toList(); setupDragAndDrop(libraryTab); + EditorTextField.entryContext(tabbed); EasyBind.subscribe(tabbed.getSelectionModel().selectedItemProperty(), tab -> { EntryEditorTab activeTab = (EntryEditorTab) tab; @@ -472,4 +475,20 @@ public void nextPreviewStyle() { public void previousPreviewStyle() { this.previewTabs.forEach(OffersPreview::previousPreviewStyle); } + + public static boolean checkLastTextField(TabPane tabs, TextField textField) { + FieldsEditorTab currentTab = (FieldsEditorTab) tabs.getSelectionModel().getSelectedItem(); + Collection shownFields = currentTab.getShownFields(); + Field lastField = null; + for (Field field : shownFields) { + lastField = field; + } + if (textField != null && lastField != null) { + if (textField.getId() == null) { + return false; + } + return lastField.getDisplayName().equalsIgnoreCase(textField.getId()); + } + return false; +} } diff --git a/src/main/java/org/jabref/gui/fieldeditors/CitationKeyEditor.java b/src/main/java/org/jabref/gui/fieldeditors/CitationKeyEditor.java index 53251ba46a2..189b7b64e5d 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/CitationKeyEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/CitationKeyEditor.java @@ -56,6 +56,7 @@ public CitationKeyEditor(Field field, undoManager, dialogService); + textField.setId(field.getDisplayName()); establishBinding(textField, viewModel.textProperty(), keyBindingRepository, undoAction, redoAction); textField.initContextMenu(Collections::emptyList, keyBindingRepository); new EditorValidator(preferences).configureValidation(viewModel.getFieldValidator().getValidationStatus(), textField); diff --git a/src/main/java/org/jabref/gui/fieldeditors/EditorTextField.java b/src/main/java/org/jabref/gui/fieldeditors/EditorTextField.java index 08cd9dde886..e20153971a9 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/EditorTextField.java +++ b/src/main/java/org/jabref/gui/fieldeditors/EditorTextField.java @@ -9,16 +9,20 @@ import javafx.fxml.Initializable; import javafx.scene.control.ContextMenu; import javafx.scene.control.MenuItem; +import javafx.scene.control.TabPane; import javafx.scene.control.TextField; +import javafx.scene.input.KeyEvent; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import org.jabref.gui.ClipBoardManager; +import org.jabref.gui.entryeditor.EntryEditor; import org.jabref.gui.fieldeditors.contextmenu.EditorContextAction; import org.jabref.gui.keyboard.KeyBindingRepository; public class EditorTextField extends TextField implements Initializable, ContextMenuAddable { + public static TabPane tabs; private final ContextMenu contextMenu = new ContextMenu(); private Runnable additionalPasteActionHandler = () -> { // No additional paste behavior @@ -26,6 +30,13 @@ public class EditorTextField extends TextField implements Initializable, Context public EditorTextField() { this(""); + this.addEventFilter(KeyEvent.KEY_PRESSED, event -> { + String keyText = event.getText(); + if ("\t".equals(keyText) && EntryEditor.checkLastTextField(tabs, this)) { + tabs.getSelectionModel().selectNext(); + event.consume(); + } + }); } public EditorTextField(final String text) { @@ -38,6 +49,10 @@ public EditorTextField(final String text) { ClipBoardManager.addX11Support(this); } + public static void entryContext(TabPane tab) { + tabs = tab; + } + @Override public void initContextMenu(final Supplier> items, KeyBindingRepository keyBindingRepository) { setOnContextMenuRequested(event -> { diff --git a/src/main/java/org/jabref/gui/fieldeditors/MarkdownEditor.java b/src/main/java/org/jabref/gui/fieldeditors/MarkdownEditor.java index 7d230d3db2a..b859e47c002 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/MarkdownEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/MarkdownEditor.java @@ -22,7 +22,7 @@ public MarkdownEditor(Field field, SuggestionProvider suggestionProvider, Fie } @Override - protected TextInputControl createTextInputControl() { + protected TextInputControl createTextInputControl(Field field) { return new EditorTextArea() { @Override public void paste() { diff --git a/src/main/java/org/jabref/gui/fieldeditors/PersonsEditor.java b/src/main/java/org/jabref/gui/fieldeditors/PersonsEditor.java index 8a15574dee4..dca1d9a66da 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/PersonsEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/PersonsEditor.java @@ -37,7 +37,11 @@ public PersonsEditor(final Field field, KeyBindingRepository keyBindingRepository = preferences.getKeyBindingRepository(); this.viewModel = new PersonsEditorViewModel(field, suggestionProvider, preferences.getAutoCompletePreferences(), fieldCheckers, undoManager); - textInput = isMultiLine ? new EditorTextArea() : new EditorTextField(); + textInput = isMultiLine + ? new EditorTextArea() + : new EditorTextField(); + + textInput.setId(field.getName()); decoratedStringProperty = new UiThreadStringProperty(viewModel.textProperty()); establishBinding(textInput, decoratedStringProperty, keyBindingRepository, undoAction, redoAction); ((ContextMenuAddable) textInput).initContextMenu(EditorMenus.getNameMenu(textInput), keyBindingRepository); diff --git a/src/main/java/org/jabref/gui/fieldeditors/SimpleEditor.java b/src/main/java/org/jabref/gui/fieldeditors/SimpleEditor.java index 9b9537c967e..0debe111224 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/SimpleEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/SimpleEditor.java @@ -35,7 +35,7 @@ public SimpleEditor(final Field field, this.viewModel = new SimpleEditorViewModel(field, suggestionProvider, fieldCheckers, undoManager); this.isMultiLine = isMultiLine; - textInput = createTextInputControl(); + textInput = createTextInputControl(field); HBox.setHgrow(textInput, Priority.ALWAYS); establishBinding(textInput, viewModel.textProperty(), preferences.getKeyBindingRepository(), undoAction, redoAction); @@ -54,8 +54,10 @@ public SimpleEditor(final Field field, new EditorValidator(preferences).configureValidation(viewModel.getFieldValidator().getValidationStatus(), textInput); } - protected TextInputControl createTextInputControl() { - return isMultiLine ? new EditorTextArea() : new EditorTextField(); + protected TextInputControl createTextInputControl(Field field) { + TextInputControl inputControl = isMultiLine ? new EditorTextArea() : new EditorTextField(); + inputControl.setId(field.getName()); + return inputControl; } @Override