package org.jabref.gui; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; import javafx.beans.binding.Bindings; import javafx.beans.property.ObjectProperty; import javafx.beans.property.ReadOnlyObjectProperty; import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.beans.property.SimpleObjectProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.collections.ObservableMap; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; import org.jabref.model.groups.GroupTreeNode; import org.jabref.model.util.OptionalUtil; import org.fxmisc.easybind.EasyBind; import org.fxmisc.easybind.monadic.MonadicBinding; /** * This class manages the GUI-state of JabRef, including: * - currently selected database * - currently selected group * Coming soon: * - open databases * - active search */ public class StateManager { private final ObjectProperty<Optional<BibDatabaseContext>> activeDatabase = new SimpleObjectProperty<>(Optional.empty()); private final ReadOnlyObjectWrapper<Optional<GroupTreeNode>> activeGroup = new ReadOnlyObjectWrapper<>(Optional.empty()); private final ObservableList<BibEntry> selectedEntries = FXCollections.observableArrayList(); private final ObservableMap<BibDatabaseContext, GroupTreeNode> selectedGroups = FXCollections.observableHashMap(); public StateManager() { MonadicBinding<BibDatabaseContext> currentDatabase = EasyBind.map(activeDatabase, database -> database.orElse(null)); activeGroup.bind(EasyBind.map(Bindings.valueAt(selectedGroups, currentDatabase), Optional::ofNullable)); } public ObjectProperty<Optional<BibDatabaseContext>> activeDatabaseProperty() { return activeDatabase; } public ReadOnlyObjectProperty<Optional<GroupTreeNode>> activeGroupProperty() { return activeGroup.getReadOnlyProperty(); } public ObservableList<BibEntry> getSelectedEntries() { return selectedEntries; } public void setSelectedEntries(List<BibEntry> newSelectedEntries) { selectedEntries.setAll(newSelectedEntries); } public void setSelectedGroup(BibDatabaseContext database, GroupTreeNode newSelectedGroup) { Objects.requireNonNull(newSelectedGroup); selectedGroups.put(database, newSelectedGroup); } public Optional<GroupTreeNode> getSelectedGroup(BibDatabaseContext database) { return Optional.ofNullable(selectedGroups.get(database)); } public void clearSelectedGroup(BibDatabaseContext database) { selectedGroups.remove(database); } public Optional<BibDatabaseContext> getActiveDatabase() { return activeDatabase.get(); } public List<BibEntry> getEntriesInCurrentDatabase() { return OptionalUtil.flatMap(activeDatabase.get(), BibDatabaseContext::getEntries) .collect(Collectors.toList()); } }