From a5100173b87489c16757e584b783890e64f8e40a Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Wed, 4 Jun 2025 12:33:10 +0200 Subject: [PATCH 1/4] debug... --- .../java/org/jabref/gui/frame/JabRefFrame.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/jabgui/src/main/java/org/jabref/gui/frame/JabRefFrame.java b/jabgui/src/main/java/org/jabref/gui/frame/JabRefFrame.java index 52ba69e2ca7..353034cb61d 100644 --- a/jabgui/src/main/java/org/jabref/gui/frame/JabRefFrame.java +++ b/jabgui/src/main/java/org/jabref/gui/frame/JabRefFrame.java @@ -93,7 +93,10 @@ private enum PanelMode { MAIN_TABLE, MAIN_TABLE_AND_ENTRY_EDITOR } private final FileHistoryMenu fileHistory; - @SuppressWarnings({"FieldCanBeLocal"}) private EasyObservableList openDatabaseList; + @SuppressWarnings({"FieldCanBeLocal"}) + private FilteredList filteredTabs; + @SuppressWarnings({"FieldCanBeLocal"}) + private EasyObservableList openDatabaseList; private final Stage mainStage; private final StateManager stateManager; @@ -374,12 +377,16 @@ private void initKeyBindings() { } private void initBindings() { - // Bind global state - FilteredList filteredTabs = new FilteredList<>(tabbedPane.getTabs()); - filteredTabs.setPredicate(LibraryTab.class::isInstance); + filteredTabs = new FilteredList<>(tabbedPane.getTabs(), tab -> { + System.out.println(tab); + return tab instanceof LibraryTab; + }); // This variable cannot be inlined, since otherwise the list created by EasyBind is being garbage collected - openDatabaseList = EasyBind.map(filteredTabs, tab -> ((LibraryTab) tab).getBibDatabaseContext()); + openDatabaseList = EasyBind.map(filteredTabs, tab -> { + System.out.println(tab); + return ((LibraryTab) tab).getBibDatabaseContext(); + }); EasyBind.bindContent(stateManager.getOpenDatabases(), openDatabaseList); // the binding for stateManager.activeDatabaseProperty() is at org.jabref.gui.LibraryTab.onDatabaseLoadingSucceed From 882e722fdf5a3b194e13db74629f975788569762 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Wed, 4 Jun 2025 13:21:47 +0200 Subject: [PATCH 2/4] Add test for com.sun.javafx.scene.control.TabObservableList#reorder --- .../javafx/TabObservableListFilteredTest.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 jabgui/src/test/java/org/jabref/gui/javafx/TabObservableListFilteredTest.java diff --git a/jabgui/src/test/java/org/jabref/gui/javafx/TabObservableListFilteredTest.java b/jabgui/src/test/java/org/jabref/gui/javafx/TabObservableListFilteredTest.java new file mode 100644 index 00000000000..a394457b391 --- /dev/null +++ b/jabgui/src/test/java/org/jabref/gui/javafx/TabObservableListFilteredTest.java @@ -0,0 +1,39 @@ +package org.jabref.gui.javafx; + +import java.util.List; + +import javafx.collections.transformation.FilteredList; +import javafx.scene.control.Tab; +import javafx.scene.control.TabPane; + +import com.sun.javafx.scene.control.TabObservableList; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.testfx.framework.junit5.ApplicationExtension; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +@ExtendWith(ApplicationExtension.class) +public class TabObservableListFilteredTest { + + @Test + public void testFilteredListDetectsPermutation() { + Tab lib1 = new Tab("lib1"); + Tab lib2 = new Tab("lib2"); + Tab other = new Tab("other"); + + TabPane tabPane = new TabPane(lib1, other, lib2); + TabObservableList base = (TabObservableList) tabPane.getTabs(); + + FilteredList filtered = new FilteredList<>(base, tab -> tab.getText().startsWith("lib")); + + assertEquals(List.of(lib1, lib2), filtered); + + base.reorder(lib1, other); + + assertNotEquals(other, filtered.get(0)); // This should not fail + + assertEquals(List.of(lib2, lib1), filtered); + } +} From 3135acc5c425d87d8e7ce7ace0d4a56820e84488 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Wed, 4 Jun 2025 13:22:46 +0200 Subject: [PATCH 3/4] Discard changes to jabgui/src/main/java/org/jabref/gui/frame/JabRefFrame.java --- .../java/org/jabref/gui/frame/JabRefFrame.java | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/jabgui/src/main/java/org/jabref/gui/frame/JabRefFrame.java b/jabgui/src/main/java/org/jabref/gui/frame/JabRefFrame.java index 353034cb61d..52ba69e2ca7 100644 --- a/jabgui/src/main/java/org/jabref/gui/frame/JabRefFrame.java +++ b/jabgui/src/main/java/org/jabref/gui/frame/JabRefFrame.java @@ -93,10 +93,7 @@ private enum PanelMode { MAIN_TABLE, MAIN_TABLE_AND_ENTRY_EDITOR } private final FileHistoryMenu fileHistory; - @SuppressWarnings({"FieldCanBeLocal"}) - private FilteredList filteredTabs; - @SuppressWarnings({"FieldCanBeLocal"}) - private EasyObservableList openDatabaseList; + @SuppressWarnings({"FieldCanBeLocal"}) private EasyObservableList openDatabaseList; private final Stage mainStage; private final StateManager stateManager; @@ -377,16 +374,12 @@ private void initKeyBindings() { } private void initBindings() { - filteredTabs = new FilteredList<>(tabbedPane.getTabs(), tab -> { - System.out.println(tab); - return tab instanceof LibraryTab; - }); + // Bind global state + FilteredList filteredTabs = new FilteredList<>(tabbedPane.getTabs()); + filteredTabs.setPredicate(LibraryTab.class::isInstance); // This variable cannot be inlined, since otherwise the list created by EasyBind is being garbage collected - openDatabaseList = EasyBind.map(filteredTabs, tab -> { - System.out.println(tab); - return ((LibraryTab) tab).getBibDatabaseContext(); - }); + openDatabaseList = EasyBind.map(filteredTabs, tab -> ((LibraryTab) tab).getBibDatabaseContext()); EasyBind.bindContent(stateManager.getOpenDatabases(), openDatabaseList); // the binding for stateManager.activeDatabaseProperty() is at org.jabref.gui.LibraryTab.onDatabaseLoadingSucceed From 5070f086adc6d9d0da58a806bf9fc5a94f122ba4 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Wed, 4 Jun 2025 13:42:42 +0200 Subject: [PATCH 4/4] Refine test case (OpenRewrite...) --- .../org/jabref/gui/javafx/TabObservableListFilteredTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jabgui/src/test/java/org/jabref/gui/javafx/TabObservableListFilteredTest.java b/jabgui/src/test/java/org/jabref/gui/javafx/TabObservableListFilteredTest.java index a394457b391..64b408a48be 100644 --- a/jabgui/src/test/java/org/jabref/gui/javafx/TabObservableListFilteredTest.java +++ b/jabgui/src/test/java/org/jabref/gui/javafx/TabObservableListFilteredTest.java @@ -18,7 +18,7 @@ public class TabObservableListFilteredTest { @Test - public void testFilteredListDetectsPermutation() { + public void filteredListDetectsPermutation() { Tab lib1 = new Tab("lib1"); Tab lib2 = new Tab("lib2"); Tab other = new Tab("other"); @@ -32,7 +32,7 @@ public void testFilteredListDetectsPermutation() { base.reorder(lib1, other); - assertNotEquals(other, filtered.get(0)); // This should not fail + assertNotEquals(other, filtered.getFirst()); // This should not fail assertEquals(List.of(lib2, lib1), filtered); }