diff --git a/CHANGELOG.md b/CHANGELOG.md index f2a1bf1aedc..558ed92ec92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,11 +11,12 @@ Note that this project **does not** adhere to [Semantic Versioning](https://semv ### Added -- We added a 'Copy to' context menu option with features for cross-reference inclusion/exclusion, as well as the ability to save user preferences. [#12374](https://github.com/JabRef/jabref/pull/12374) +- We added a feature for copying entries to libraries, available via the context menu, with an option to include cross-references. [#12374](https://github.com/JabRef/jabref/pull/12374) ### Changed - We improved the offline parsing of BibTeX data from PDF-documents. [#12278](https://github.com/JabRef/jabref/issues/12278) +- The tab bar is now hidden when only one library is open. [#9971](https://github.com/JabRef/jabref/issues/9971) ### Fixed diff --git a/src/main/java/org/jabref/gui/Base.css b/src/main/java/org/jabref/gui/Base.css index 87565ef20df..398cfaa1601 100644 --- a/src/main/java/org/jabref/gui/Base.css +++ b/src/main/java/org/jabref/gui/Base.css @@ -664,7 +664,20 @@ TextFlow > .tooltip-text-monospaced { -fx-padding: 0 0 0 0; } +.tab-pane.hide-tab-bar .tab-header-area { + -fx-pref-height: 0; + visibility: hidden; +} + +.tab-pane.hide-tab-bar .tab-header-area > .headers-region > .tab { + -fx-padding: 0; + -fx-border-width: 0; + -fx-pref-height: 0; +} +.numberColumn > .hits:any-selected { + -fx-background-color: derive(-jr-green, 70%); +} .table-view, .tree-table-view { diff --git a/src/main/java/org/jabref/gui/LibraryTab.java b/src/main/java/org/jabref/gui/LibraryTab.java index f93ef8c6101..cf00d78197a 100644 --- a/src/main/java/org/jabref/gui/LibraryTab.java +++ b/src/main/java/org/jabref/gui/LibraryTab.java @@ -345,6 +345,7 @@ private void onDatabaseLoadingFailed(Exception ex) { private void setDatabaseContext(BibDatabaseContext bibDatabaseContext) { TabPane tabPane = this.getTabPane(); + if (tabPane == null) { LOGGER.debug("User interrupted loading. Not showing any library."); return; diff --git a/src/main/java/org/jabref/gui/WorkspacePreferences.java b/src/main/java/org/jabref/gui/WorkspacePreferences.java index 2948be7582e..184aba03691 100644 --- a/src/main/java/org/jabref/gui/WorkspacePreferences.java +++ b/src/main/java/org/jabref/gui/WorkspacePreferences.java @@ -25,6 +25,7 @@ public class WorkspacePreferences { private final BooleanProperty showAdvancedHints; private final BooleanProperty warnAboutDuplicatesInInspection; private final BooleanProperty confirmDelete; + private final BooleanProperty confirmHideTabBar; private final ObservableList selectedSlrCatalogs; public WorkspacePreferences(Language language, @@ -37,6 +38,7 @@ public WorkspacePreferences(Language language, boolean showAdvancedHints, boolean warnAboutDuplicatesInInspection, boolean confirmDelete, + boolean confirmHideTabBar, List selectedSlrCatalogs) { this.language = new SimpleObjectProperty<>(language); this.shouldOverrideDefaultFontSize = new SimpleBooleanProperty(shouldOverrideDefaultFontSize); @@ -48,6 +50,7 @@ public WorkspacePreferences(Language language, this.showAdvancedHints = new SimpleBooleanProperty(showAdvancedHints); this.warnAboutDuplicatesInInspection = new SimpleBooleanProperty(warnAboutDuplicatesInInspection); this.confirmDelete = new SimpleBooleanProperty(confirmDelete); + this.confirmHideTabBar = new SimpleBooleanProperty(confirmHideTabBar); this.selectedSlrCatalogs = FXCollections.observableArrayList(selectedSlrCatalogs); } @@ -163,6 +166,18 @@ public void setConfirmDelete(boolean confirmDelete) { this.confirmDelete.set(confirmDelete); } + public boolean shouldHideTabBar() { + return confirmHideTabBar.get(); + } + + public BooleanProperty confirmHideTabBarProperty() { + return confirmHideTabBar; + } + + public void setHideTabBar(boolean hideTabBar) { + this.confirmHideTabBar.set(hideTabBar); + } + public ObservableList getSelectedSlrCatalogs() { return selectedSlrCatalogs; } diff --git a/src/main/java/org/jabref/gui/frame/JabRefFrame.java b/src/main/java/org/jabref/gui/frame/JabRefFrame.java index 01420aa6b71..37afcfa9002 100644 --- a/src/main/java/org/jabref/gui/frame/JabRefFrame.java +++ b/src/main/java/org/jabref/gui/frame/JabRefFrame.java @@ -12,6 +12,9 @@ import javafx.beans.InvalidationListener; import javafx.beans.binding.Bindings; import javafx.beans.binding.StringBinding; +import javafx.beans.property.IntegerProperty; +import javafx.beans.property.SimpleIntegerProperty; +import javafx.collections.ListChangeListener; import javafx.collections.transformation.FilteredList; import javafx.event.Event; import javafx.scene.control.ContextMenu; @@ -45,6 +48,7 @@ import org.jabref.gui.sidepane.SidePane; import org.jabref.gui.sidepane.SidePaneType; import org.jabref.gui.undo.CountingUndoManager; +import org.jabref.gui.util.BindingsHelper; import org.jabref.logic.UiCommand; import org.jabref.logic.ai.AiService; import org.jabref.logic.journals.JournalAbbreviationRepository; @@ -186,6 +190,7 @@ public JabRefFrame(Stage mainStage, initKeyBindings(); frameDndHandler.initDragAndDrop(); initBindings(); + initTabBarManager(); } private void initLayout() { @@ -393,6 +398,39 @@ private void initBindings() { }); } + private void initTabBarManager() { + IntegerProperty numberOfOpenDatabases = new SimpleIntegerProperty(); + stateManager.getOpenDatabases().addListener((ListChangeListener) change -> { + numberOfOpenDatabases.set(stateManager.getOpenDatabases().size()); + updateTabBarState(numberOfOpenDatabases); + }); + + BindingsHelper.subscribeFuture(preferences.getWorkspacePreferences().confirmHideTabBarProperty(), hideTabBar -> updateTabBarState(numberOfOpenDatabases)); + maintainInitialTabBarState(preferences.getWorkspacePreferences().shouldHideTabBar()); + } + + private void updateTabBarState(IntegerProperty numberOfOpenDatabases) { + if (preferences.getWorkspacePreferences().shouldHideTabBar() && numberOfOpenDatabases.get() == 1) { + if (!tabbedPane.getStyleClass().contains("hide-tab-bar")) { + tabbedPane.getStyleClass().add("hide-tab-bar"); + } + } else { + tabbedPane.getStyleClass().remove("hide-tab-bar"); + } + } + + private void maintainInitialTabBarState(boolean show) { + if (show) { + if (stateManager.getOpenDatabases().size() == 1) { + if (!tabbedPane.getStyleClass().contains("hide-tab-bar")) { + tabbedPane.getStyleClass().add("hide-tab-bar"); + } + } else { + tabbedPane.getStyleClass().remove("hide-tab-bar"); + } + } + } + /* ************************************************************************ * * Public API @@ -461,7 +499,7 @@ private ContextMenu createTabContextMenuFor(LibraryTab tab) { contextMenu.getItems().addAll( factory.createMenuItem(StandardActions.LIBRARY_PROPERTIES, new LibraryPropertiesAction(tab::getBibDatabaseContext, stateManager)), - factory.createMenuItem(StandardActions.OPEN_DATABASE_FOLDER, new OpenDatabaseFolder(tab::getBibDatabaseContext)), + factory.createMenuItem(StandardActions.OPEN_DATABASE_FOLDER, new OpenDatabaseFolder(dialogService, stateManager, preferences, tab::getBibDatabaseContext)), factory.createMenuItem(StandardActions.OPEN_CONSOLE, new OpenConsoleAction(tab::getBibDatabaseContext, stateManager, preferences, dialogService)), new SeparatorMenuItem(), factory.createMenuItem(StandardActions.CLOSE_LIBRARY, new CloseDatabaseAction(this, tab, stateManager)), @@ -632,11 +670,17 @@ public void execute() { } } - private class OpenDatabaseFolder extends SimpleCommand { + public static class OpenDatabaseFolder extends SimpleCommand { private final Supplier databaseContext; - - public OpenDatabaseFolder(Supplier databaseContext) { + private final DialogService dialogService; + private final StateManager stateManager; + private final GuiPreferences preferences; + + public OpenDatabaseFolder(DialogService dialogService, StateManager stateManager, GuiPreferences preferences, Supplier databaseContext) { + this.dialogService = dialogService; + this.stateManager = stateManager; + this.preferences = preferences; this.databaseContext = databaseContext; this.executable.bind(needsSavedLocalDatabase(stateManager)); } diff --git a/src/main/java/org/jabref/gui/frame/MainMenu.java b/src/main/java/org/jabref/gui/frame/MainMenu.java index 4a90a556172..2782eb6d5fc 100644 --- a/src/main/java/org/jabref/gui/frame/MainMenu.java +++ b/src/main/java/org/jabref/gui/frame/MainMenu.java @@ -238,6 +238,11 @@ private void createMenu() { new SeparatorMenuItem(), + factory.createMenuItem(StandardActions.OPEN_DATABASE_FOLDER, new JabRefFrame.OpenDatabaseFolder(dialogService, stateManager, preferences, () -> stateManager.getActiveDatabase().orElse(null))), + factory.createMenuItem(StandardActions.OPEN_CONSOLE, new OpenConsoleAction(stateManager, preferences, dialogService)), + + new SeparatorMenuItem(), + factory.createMenuItem(StandardActions.LIBRARY_PROPERTIES, new LibraryPropertiesAction(stateManager)) ); diff --git a/src/main/java/org/jabref/gui/preferences/JabRefGuiPreferences.java b/src/main/java/org/jabref/gui/preferences/JabRefGuiPreferences.java index ee0b2219e7b..6abce8f54f0 100644 --- a/src/main/java/org/jabref/gui/preferences/JabRefGuiPreferences.java +++ b/src/main/java/org/jabref/gui/preferences/JabRefGuiPreferences.java @@ -170,6 +170,7 @@ public class JabRefGuiPreferences extends JabRefCliPreferences implements GuiPre private static final String OVERRIDE_DEFAULT_FONT_SIZE = "overrideDefaultFontSize"; private static final String SHOW_ADVANCED_HINTS = "showAdvancedHints"; private static final String CONFIRM_DELETE = "confirmDelete"; + private static final String CONFIRM_HIDE_TAB_BAR = "confirmHideTabBar"; // endregion private static final String ENTRY_EDITOR_HEIGHT = "entryEditorHeightFX"; @@ -271,6 +272,7 @@ private JabRefGuiPreferences() { defaults.put(THEME, Theme.BASE_CSS); defaults.put(THEME_SYNC_OS, Boolean.FALSE); defaults.put(CONFIRM_DELETE, Boolean.TRUE); + defaults.put(CONFIRM_HIDE_TAB_BAR, Boolean.TRUE); defaults.put(SHOW_ADVANCED_HINTS, Boolean.TRUE); // endregion @@ -652,6 +654,7 @@ public WorkspacePreferences getWorkspacePreferences() { getBoolean(SHOW_ADVANCED_HINTS), getBoolean(WARN_ABOUT_DUPLICATES_IN_INSPECTION), getBoolean(CONFIRM_DELETE), + getBoolean(CONFIRM_HIDE_TAB_BAR), getStringList(SELECTED_SLR_CATALOGS)); EasyBind.listen(workspacePreferences.languageProperty(), (obs, oldValue, newValue) -> { @@ -670,6 +673,7 @@ public WorkspacePreferences getWorkspacePreferences() { EasyBind.listen(workspacePreferences.showAdvancedHintsProperty(), (obs, oldValue, newValue) -> putBoolean(SHOW_ADVANCED_HINTS, newValue)); EasyBind.listen(workspacePreferences.warnAboutDuplicatesInInspectionProperty(), (obs, oldValue, newValue) -> putBoolean(WARN_ABOUT_DUPLICATES_IN_INSPECTION, newValue)); EasyBind.listen(workspacePreferences.confirmDeleteProperty(), (obs, oldValue, newValue) -> putBoolean(CONFIRM_DELETE, newValue)); + EasyBind.listen(workspacePreferences.confirmHideTabBarProperty(), (obs, oldValue, newValue) -> putBoolean(CONFIRM_HIDE_TAB_BAR, newValue)); workspacePreferences.getSelectedSlrCatalogs().addListener((ListChangeListener) change -> putStringList(SELECTED_SLR_CATALOGS, workspacePreferences.getSelectedSlrCatalogs())); return workspacePreferences; diff --git a/src/main/java/org/jabref/gui/preferences/general/GeneralTab.fxml b/src/main/java/org/jabref/gui/preferences/general/GeneralTab.fxml index b7f6c599498..a7a138a2922 100644 --- a/src/main/java/org/jabref/gui/preferences/general/GeneralTab.fxml +++ b/src/main/java/org/jabref/gui/preferences/general/GeneralTab.fxml @@ -72,6 +72,7 @@ text="%Warn about unresolved duplicates when closing inspection window"/> +