From eb0f294ab3e195b30a6fa2bdcd5da7adfeb85084 Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Sun, 6 Aug 2017 12:39:19 +0200 Subject: [PATCH] Only update auto completion suggestions upon mayor changes --- CHANGELOG.md | 1 + src/main/java/org/jabref/gui/BasePanel.java | 4 +- .../autosaveandbackup/BackupManager.java | 22 ++-------- .../database/event/CoarseChangeFilter.java | 42 +++++++++++++++++++ 4 files changed, 50 insertions(+), 19 deletions(-) create mode 100644 src/main/java/org/jabref/model/database/event/CoarseChangeFilter.java diff --git a/CHANGELOG.md b/CHANGELOG.md index fb14f814d32..ea74dba6401 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ If fetched article is already in database the ImportInspectionDialog is started ### Fixed - We fixed an issue where the fetcher for the Astrophysics Data System (ADS) added some non-bibtex data to the entry returned from the search [#3035](https://github.com/JabRef/jabref/issues/3035) +- We improved the auto completion so that minor changes are not added as suggestions. [#2998](https://github.com/JabRef/jabref/issues/2998) - We fixed an issue where assigning an entry via drag and drop to a group caused JabRef to stop/freeze completely [#3036](https://github.com/JabRef/jabref/issues/3036) - We fixed an issue where the preferences could not be imported without a restart of JabRef [#3064](https://github.com/JabRef/jabref/issues/3064) - We fixed an issue where DEL, Ctrl+C, Ctrl+V and Ctrl+A in the search field triggered corresponding actions in the main table [#3067](https://github.com/JabRef/jabref/issues/3067) diff --git a/src/main/java/org/jabref/gui/BasePanel.java b/src/main/java/org/jabref/gui/BasePanel.java index 493c6abec6b..3793d030021 100644 --- a/src/main/java/org/jabref/gui/BasePanel.java +++ b/src/main/java/org/jabref/gui/BasePanel.java @@ -127,6 +127,7 @@ import org.jabref.model.database.DatabaseLocation; import org.jabref.model.database.KeyCollisionException; import org.jabref.model.database.event.BibDatabaseContextChangedEvent; +import org.jabref.model.database.event.CoarseChangeFilter; import org.jabref.model.database.event.EntryAddedEvent; import org.jabref.model.database.event.EntryRemovedEvent; import org.jabref.model.entry.BibEntry; @@ -1396,7 +1397,8 @@ private void setupAutoCompletion() { suggestionProviders = new SuggestionProviders(autoCompletePreferences, Globals.journalAbbreviationLoader); suggestionProviders.indexDatabase(getDatabase()); // Ensure that the suggestion providers are in sync with entries - this.getDatabase().registerListener(new AutoCompleteUpdater(suggestionProviders)); + CoarseChangeFilter changeFilter = new CoarseChangeFilter(bibDatabaseContext); + changeFilter.registerListener(new AutoCompleteUpdater(suggestionProviders)); } else { // Create empty suggestion providers if auto completion is deactivated suggestionProviders = new SuggestionProviders(); diff --git a/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java b/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java index 15d04bcaddd..3bf84241134 100644 --- a/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java +++ b/src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java @@ -22,7 +22,7 @@ import org.jabref.logic.util.io.FileUtil; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.database.event.BibDatabaseContextChangedEvent; -import org.jabref.model.entry.event.FieldChangedEvent; +import org.jabref.model.database.event.CoarseChangeFilter; import org.jabref.preferences.JabRefPreferences; import com.google.common.eventbus.Subscribe; @@ -43,8 +43,6 @@ public class BackupManager { private static Set runningInstances = new HashSet<>(); - private String lastFieldChanged; - private final BibDatabaseContext bibDatabaseContext; private final JabRefPreferences preferences; private final ExecutorService executor; @@ -56,9 +54,8 @@ private BackupManager(BibDatabaseContext bibDatabaseContext) { BlockingQueue workerQueue = new ArrayBlockingQueue<>(1); this.executor = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS, workerQueue); - // Listen for change events - bibDatabaseContext.getDatabase().registerListener(this); - bibDatabaseContext.getMetaData().registerListener(this); + CoarseChangeFilter changeFilter = new CoarseChangeFilter(bibDatabaseContext); + changeFilter.registerListener(this); } static Path getBackupPath(Path originalPath) { @@ -131,18 +128,7 @@ private void performBackup(Path backupPath) { @Subscribe public synchronized void listen(@SuppressWarnings("unused") BibDatabaseContextChangedEvent event) { - if (!(event instanceof FieldChangedEvent)) { - startBackupTask(); - } else { - // only do a backup if the field changes are more than one character or a new field is edited - FieldChangedEvent fieldChange = (FieldChangedEvent) event; - boolean isEditOnNewField = lastFieldChanged == null || !lastFieldChanged.equals(fieldChange.getFieldName()); - - if (fieldChange.getDelta() > 1 || isEditOnNewField) { - lastFieldChanged = fieldChange.getFieldName(); - startBackupTask(); - } - } + startBackupTask(); } private void startBackupTask() { diff --git a/src/main/java/org/jabref/model/database/event/CoarseChangeFilter.java b/src/main/java/org/jabref/model/database/event/CoarseChangeFilter.java new file mode 100644 index 00000000000..90191f394e8 --- /dev/null +++ b/src/main/java/org/jabref/model/database/event/CoarseChangeFilter.java @@ -0,0 +1,42 @@ +package org.jabref.model.database.event; + +import org.jabref.model.database.BibDatabaseContext; +import org.jabref.model.entry.event.FieldChangedEvent; + +import com.google.common.eventbus.EventBus; +import com.google.common.eventbus.Subscribe; + +/** + * Filters change events and only relays major changes. + */ +public class CoarseChangeFilter { + + private final EventBus eventBus = new EventBus(); + private String lastFieldChanged; + + public CoarseChangeFilter(BibDatabaseContext bibDatabaseContext) { + // Listen for change events + bibDatabaseContext.getDatabase().registerListener(this); + bibDatabaseContext.getMetaData().registerListener(this); + } + + @Subscribe + public synchronized void listen(@SuppressWarnings("unused") BibDatabaseContextChangedEvent event) { + if (!(event instanceof FieldChangedEvent)) { + eventBus.post(event); + } else { + // Only relay event if the field changes are more than one character or a new field is edited + FieldChangedEvent fieldChange = (FieldChangedEvent) event; + boolean isEditOnNewField = lastFieldChanged == null || !lastFieldChanged.equals(fieldChange.getFieldName()); + + if (fieldChange.getDelta() > 1 || isEditOnNewField) { + lastFieldChanged = fieldChange.getFieldName(); + eventBus.post(event); + } + } + } + + public void registerListener(Object listener) { + eventBus.register(listener); + } +}