diff --git a/CHANGELOG.md b/CHANGELOG.md index a15c3455a90..ae2d1ca56a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -98,7 +98,6 @@ Note that this project **does not** adhere to [Semantic Versioning](https://semv ### Fixed -- We fixed an issue where pressing Tab in the last text field of a tab did not move the focus to the next tab in the entry editor. [#11937](https://github.com/JabRef/jabref/issues/11937) - We fixed an issue where "Specify Bib(La)TeX" tab was not focused when Bib(La)TeX was in the clipboard [#13597](https://github.com/JabRef/jabref/issues/13597) - We fixed an issue whereby the 'About' dialog was not honouring the user's configured font preferences. [#13558](https://github.com/JabRef/jabref/issues/13558) - We fixed an issue where the Pagetotal column was sorting the values alphabetically instead of numerically. [#12533](https://github.com/JabRef/jabref/issues/12533) diff --git a/jabgui/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java b/jabgui/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java index 4204e2aad1d..fe4573adb69 100644 --- a/jabgui/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java +++ b/jabgui/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java @@ -3,7 +3,6 @@ import java.io.File; import java.nio.file.Path; import java.util.ArrayList; -import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.List; @@ -19,16 +18,12 @@ import javafx.beans.InvalidationListener; import javafx.fxml.FXML; import javafx.geometry.Side; -import javafx.scene.Node; -import javafx.scene.Parent; import javafx.scene.control.Button; import javafx.scene.control.ContextMenu; import javafx.scene.control.Label; import javafx.scene.control.MenuItem; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; -import javafx.scene.control.TextField; -import javafx.scene.control.TextInputControl; import javafx.scene.input.DataFormat; import javafx.scene.input.KeyEvent; import javafx.scene.input.TransferMode; @@ -43,7 +38,6 @@ 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.GrobidUseDialogHelper; import org.jabref.gui.keyboard.KeyBinding; @@ -169,11 +163,6 @@ public EntryEditor(Supplier tabSupplier, UndoAction undoAction, Redo setupDragAndDrop(); - EditorTextField.setupTabNavigation( - this::isLastFieldInCurrentTab, - this::moveToNextTabAndFocus - ); - EasyBind.subscribe(tabbed.getSelectionModel().selectedItemProperty(), tab -> { EntryEditorTab activeTab = (EntryEditorTab) tab; if (activeTab != null) { @@ -539,98 +528,4 @@ public void nextPreviewStyle() { public void previousPreviewStyle() { this.previewPanel.previousPreviewStyle(); } - - /** - * Checks if the given TextField is the last field in the currently selected tab. - * - * @param textField the TextField to check - * @return true if this is the last field in the current tab, false otherwise - */ - private boolean isLastFieldInCurrentTab(TextField textField) { - if (textField == null || tabbed.getSelectionModel().getSelectedItem() == null) { - return false; - } - - Tab selectedTab = tabbed.getSelectionModel().getSelectedItem(); - if (!(selectedTab instanceof FieldsEditorTab currentTab)) { - return false; - } - - Collection shownFields = currentTab.getShownFields(); - if (shownFields.isEmpty() || textField.getId() == null) { - return false; - } - - Optional lastField = shownFields.stream() - .reduce((first, second) -> second); - - return lastField.map(Field::getDisplayName) - .map(displayName -> displayName.equalsIgnoreCase(textField.getId())) - .orElse(false); - } - - /** - * Moves to the next tab and focuses on its first field. - */ - private void moveToNextTabAndFocus() { - tabbed.getSelectionModel().selectNext(); - - UiTaskExecutor.runInJavaFXThread(() -> { - Tab selectedTab = tabbed.getSelectionModel().getSelectedItem(); - if (selectedTab instanceof FieldsEditorTab currentTab) { - focusFirstFieldInTab(currentTab); - } - }); - } - - private void focusFirstFieldInTab(FieldsEditorTab tab) { - Node tabContent = tab.getContent(); - if (tabContent instanceof Parent parent) { - // First try to find field by ID (preferred method) - Collection shownFields = tab.getShownFields(); - if (!shownFields.isEmpty()) { - Field firstField = shownFields.iterator().next(); - String firstFieldId = firstField.getDisplayName(); - Optional firstTextInput = findTextInputById(parent, firstFieldId); - if (firstTextInput.isPresent()) { - firstTextInput.get().requestFocus(); - return; - } - } - - Optional anyTextInput = findAnyTextInput(parent); - if (anyTextInput.isPresent()) { - anyTextInput.get().requestFocus(); - } - } - } - - /// Recursively searches for a TextInputControl (TextField or TextArea) with the given ID. - private Optional findTextInputById(Parent parent, String id) { - for (Node child : parent.getChildrenUnmodifiable()) { - if (child instanceof TextInputControl textInput && id.equalsIgnoreCase(textInput.getId())) { - return Optional.of(textInput); - } else if (child instanceof Parent childParent) { - Optional found = findTextInputById(childParent, id); - if (found.isPresent()) { - return found; - } - } - } - return Optional.empty(); - } - - private Optional findAnyTextInput(Parent parent) { - for (Node child : parent.getChildrenUnmodifiable()) { - if (child instanceof TextInputControl textInput) { - return Optional.of(textInput); - } else if (child instanceof Parent childParent) { - Optional found = findAnyTextInput(childParent); - if (found.isPresent()) { - return found; - } - } - } - return Optional.empty(); - } } diff --git a/jabgui/src/main/java/org/jabref/gui/fieldeditors/CitationKeyEditor.java b/jabgui/src/main/java/org/jabref/gui/fieldeditors/CitationKeyEditor.java index 900bcb67184..53251ba46a2 100644 --- a/jabgui/src/main/java/org/jabref/gui/fieldeditors/CitationKeyEditor.java +++ b/jabgui/src/main/java/org/jabref/gui/fieldeditors/CitationKeyEditor.java @@ -56,8 +56,6 @@ 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/jabgui/src/main/java/org/jabref/gui/fieldeditors/EditorTextField.java b/jabgui/src/main/java/org/jabref/gui/fieldeditors/EditorTextField.java index 86047daaf64..08cd9dde886 100644 --- a/jabgui/src/main/java/org/jabref/gui/fieldeditors/EditorTextField.java +++ b/jabgui/src/main/java/org/jabref/gui/fieldeditors/EditorTextField.java @@ -4,15 +4,12 @@ import java.util.List; import java.util.Objects; import java.util.ResourceBundle; -import java.util.function.Predicate; import java.util.function.Supplier; import javafx.fxml.Initializable; import javafx.scene.control.ContextMenu; import javafx.scene.control.MenuItem; import javafx.scene.control.TextField; -import javafx.scene.input.KeyCode; -import javafx.scene.input.KeyEvent; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; @@ -22,26 +19,13 @@ public class EditorTextField extends TextField implements Initializable, ContextMenuAddable { - private static Runnable nextTabSelector; - private static Predicate isLastFieldChecker; private final ContextMenu contextMenu = new ContextMenu(); - private Runnable additionalPasteActionHandler = () -> { // No additional paste behavior }; public EditorTextField() { this(""); - this.addEventFilter(KeyEvent.KEY_PRESSED, event -> { - if (event.getCode() == KeyCode.TAB && - isLastFieldChecker != null && - isLastFieldChecker.test(this)) { - if (nextTabSelector != null) { - nextTabSelector.run(); - } - event.consume(); - } - }); } public EditorTextField(final String text) { @@ -54,11 +38,6 @@ public EditorTextField(final String text) { ClipBoardManager.addX11Support(this); } - public static void setupTabNavigation(Predicate isLastFieldChecker, Runnable nextTabSelector) { - EditorTextField.isLastFieldChecker = isLastFieldChecker; - EditorTextField.nextTabSelector = nextTabSelector; - } - @Override public void initContextMenu(final Supplier> items, KeyBindingRepository keyBindingRepository) { setOnContextMenuRequested(event -> { diff --git a/jabgui/src/main/java/org/jabref/gui/fieldeditors/MarkdownEditor.java b/jabgui/src/main/java/org/jabref/gui/fieldeditors/MarkdownEditor.java index b859e47c002..7d230d3db2a 100644 --- a/jabgui/src/main/java/org/jabref/gui/fieldeditors/MarkdownEditor.java +++ b/jabgui/src/main/java/org/jabref/gui/fieldeditors/MarkdownEditor.java @@ -22,7 +22,7 @@ public MarkdownEditor(Field field, SuggestionProvider suggestionProvider, Fie } @Override - protected TextInputControl createTextInputControl(Field field) { + protected TextInputControl createTextInputControl() { return new EditorTextArea() { @Override public void paste() { diff --git a/jabgui/src/main/java/org/jabref/gui/fieldeditors/PersonsEditor.java b/jabgui/src/main/java/org/jabref/gui/fieldeditors/PersonsEditor.java index 3fe9a6ffeab..8a15574dee4 100644 --- a/jabgui/src/main/java/org/jabref/gui/fieldeditors/PersonsEditor.java +++ b/jabgui/src/main/java/org/jabref/gui/fieldeditors/PersonsEditor.java @@ -38,7 +38,6 @@ public PersonsEditor(final Field field, this.viewModel = new PersonsEditorViewModel(field, suggestionProvider, preferences.getAutoCompletePreferences(), fieldCheckers, undoManager); 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/jabgui/src/main/java/org/jabref/gui/fieldeditors/SimpleEditor.java b/jabgui/src/main/java/org/jabref/gui/fieldeditors/SimpleEditor.java index 0debe111224..9b9537c967e 100644 --- a/jabgui/src/main/java/org/jabref/gui/fieldeditors/SimpleEditor.java +++ b/jabgui/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(field); + textInput = createTextInputControl(); HBox.setHgrow(textInput, Priority.ALWAYS); establishBinding(textInput, viewModel.textProperty(), preferences.getKeyBindingRepository(), undoAction, redoAction); @@ -54,10 +54,8 @@ public SimpleEditor(final Field field, new EditorValidator(preferences).configureValidation(viewModel.getFieldValidator().getValidationStatus(), textInput); } - protected TextInputControl createTextInputControl(Field field) { - TextInputControl inputControl = isMultiLine ? new EditorTextArea() : new EditorTextField(); - inputControl.setId(field.getName()); - return inputControl; + protected TextInputControl createTextInputControl() { + return isMultiLine ? new EditorTextArea() : new EditorTextField(); } @Override