diff --git a/CHANGELOG.md b/CHANGELOG.md index 762f841e60d..f377137dd6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve - We created a new install screen for macOS. [#5759](https://github.com/JabRef/jabref/issues/5759) - We implemented an option to download fulltext files while importing. [#6381](https://github.com/JabRef/jabref/pull/6381) - We fixed the bug when strike the delete key in the text field. [#6421](https://github.com/JabRef/jabref/issues/6421) +- We added support for jumping to target entry when typing letter/digit after sorting a column in maintable [#6146](https://github.com/JabRef/jabref/issues/6146) ### Changed diff --git a/src/main/java/org/jabref/gui/maintable/MainTable.java b/src/main/java/org/jabref/gui/maintable/MainTable.java index e15ac98e4ce..f9a2122041a 100644 --- a/src/main/java/org/jabref/gui/maintable/MainTable.java +++ b/src/main/java/org/jabref/gui/maintable/MainTable.java @@ -12,6 +12,7 @@ import javafx.collections.ListChangeListener; import javafx.scene.control.SelectionMode; +import javafx.scene.control.TableColumn; import javafx.scene.control.TableRow; import javafx.scene.control.TableView; import javafx.scene.input.ClipboardContent; @@ -57,11 +58,21 @@ public class MainTable extends TableView { private final ImportHandler importHandler; private final CustomLocalDragboard localDragboard; + private long lastKeyPressTime; + private String columnSearchTerm; + public MainTable(MainTableDataModel model, JabRefFrame frame, BasePanel panel, BibDatabaseContext database, MainTablePreferences preferences, ExternalFileTypes externalFileTypes, KeyBindingRepository keyBindingRepository) { super(); + this.setOnKeyTyped(key -> { + if (this.getSortOrder().isEmpty()) { + return; + } + this.jumpToSearchKey(getSortOrder().get(0), key); + }); + this.model = model; this.database = Objects.requireNonNull(database); @@ -123,6 +134,40 @@ public MainTable(MainTableDataModel model, JabRefFrame frame, database.getDatabase().registerListener(this); } + /** + * This is called, if a user starts typing some characters into the keyboard with focus on main table. + * The {@link MainTable} will scroll to the cell with the same starting column value and typed string + * + * @param sortedColumn The sorted column in {@link MainTable} + * @param keyEvent The pressed character + */ + + private void jumpToSearchKey(TableColumn sortedColumn, KeyEvent keyEvent) { + if (keyEvent.getCharacter() == null || sortedColumn == null) { + return; + } + + if (System.currentTimeMillis() - lastKeyPressTime < 700) { + columnSearchTerm += keyEvent.getCharacter().toLowerCase(); + } else { + columnSearchTerm = keyEvent.getCharacter().toLowerCase(); + } + + lastKeyPressTime = System.currentTimeMillis(); + + this.getItems().stream() + .filter(item -> Optional.ofNullable(sortedColumn.getCellObservableValue(item).getValue()) + .map(Object::toString) + .orElse("") + .toLowerCase() + .startsWith(columnSearchTerm)) + .findFirst() + .ifPresent(item -> { + this.scrollTo(item); + this.clearAndSelect(item.getEntry()); + }); + } + @Subscribe public void listen(EntriesAddedEvent event) { DefaultTaskExecutor.runInJavaFXThread(() -> clearAndSelect(event.getFirstEntry()));