From 17e4263b41f2876b845313f70f6f080a137a3c23 Mon Sep 17 00:00:00 2001 From: Stefan Kolb Date: Wed, 22 Feb 2017 16:39:54 +0100 Subject: [PATCH] Fixes #2580 Keyword - Special field synchronization --- .../SpecialFieldDatabaseChangeListener.java | 26 +++++++++---------- .../SpecialFieldUpdateListener.java | 16 ++++++------ .../jabref/logic/importer/OpenDatabase.java | 5 +++- .../specialfields/SpecialFieldsUtils.java | 17 ++++++------ 4 files changed, 33 insertions(+), 31 deletions(-) diff --git a/src/main/java/org/jabref/gui/specialfields/SpecialFieldDatabaseChangeListener.java b/src/main/java/org/jabref/gui/specialfields/SpecialFieldDatabaseChangeListener.java index 0c49f90a3d4..1ede5e8007e 100644 --- a/src/main/java/org/jabref/gui/specialfields/SpecialFieldDatabaseChangeListener.java +++ b/src/main/java/org/jabref/gui/specialfields/SpecialFieldDatabaseChangeListener.java @@ -26,19 +26,19 @@ public static SpecialFieldDatabaseChangeListener getInstance() { @Subscribe public void listen(EntryAddedEvent event) { - if (Globals.prefs.isKeywordSyncEnabled()) { - final BibEntry entry = event.getBibEntry(); - // NamedCompount code similar to SpecialFieldUpdateListener - NamedCompound nc = new NamedCompound(Localization.lang("Synchronized special fields based on keywords")); - List changes = SpecialFieldsUtils.syncSpecialFieldsFromKeywords(entry, Globals.prefs.getKeywordDelimiter()); - for(FieldChange change: changes) { - nc.addEdit(new UndoableFieldChange(change)); - } - - // Don't insert the compound into the undoManager, - // it would be added before the component which undoes the insertion of the entry and creates heavy problems - // (which prohibits the undo the deleting multiple entries) + if (!Globals.prefs.isKeywordSyncEnabled()) { + return; } - } + final BibEntry entry = event.getBibEntry(); + // NamedCompount code similar to SpecialFieldUpdateListener + NamedCompound nc = new NamedCompound(Localization.lang("Synchronized special fields based on keywords")); + List changes = SpecialFieldsUtils.syncSpecialFieldsFromKeywords(entry, Globals.prefs.getKeywordDelimiter()); + for(FieldChange change: changes) { + nc.addEdit(new UndoableFieldChange(change)); + } + // Don't insert the compound into the undoManager, + // it would be added before the component which undoes the insertion of the entry and creates heavy problems + // (which prohibits the undo the deleting multiple entries) + } } diff --git a/src/main/java/org/jabref/gui/specialfields/SpecialFieldUpdateListener.java b/src/main/java/org/jabref/gui/specialfields/SpecialFieldUpdateListener.java index 46f3fb5c540..30abd646262 100644 --- a/src/main/java/org/jabref/gui/specialfields/SpecialFieldUpdateListener.java +++ b/src/main/java/org/jabref/gui/specialfields/SpecialFieldUpdateListener.java @@ -23,6 +23,11 @@ public class SpecialFieldUpdateListener { @Subscribe public void listen(FieldChangedEvent fieldChangedEvent) { + // only sync if keyword sync is enabled + if (!Globals.prefs.isKeywordSyncEnabled()) { + return; + } + final BibEntry entry = fieldChangedEvent.getBibEntry(); final String fieldName = fieldChangedEvent.getFieldName(); // Source editor cycles through all entries @@ -32,15 +37,10 @@ public void listen(FieldChangedEvent fieldChangedEvent) { SwingUtilities.invokeLater(() -> { if (FieldName.KEYWORDS.equals(fieldName)) { SpecialFieldsUtils.syncSpecialFieldsFromKeywords(entry, Globals.prefs.getKeywordDelimiter()); - SwingUtilities - .invokeLater(() -> JabRefGUI.getMainFrame().getCurrentBasePanel().updateEntryEditorIfShowing()); - } else { - if (SpecialField.isSpecialField(fieldName)) { - SpecialFieldsUtils.syncKeywordsFromSpecialFields(entry, Globals.prefs.isKeywordSyncEnabled(), Globals.prefs.getKeywordDelimiter()); - SwingUtilities.invokeLater( - () -> JabRefGUI.getMainFrame().getCurrentBasePanel().updateEntryEditorIfShowing()); - } + } else if (SpecialField.isSpecialField(fieldName)) { + SpecialFieldsUtils.syncKeywordsFromSpecialFields(entry, Globals.prefs.getKeywordDelimiter()); } + SwingUtilities.invokeLater(() -> JabRefGUI.getMainFrame().getCurrentBasePanel().updateEntryEditorIfShowing()); }); } diff --git a/src/main/java/org/jabref/logic/importer/OpenDatabase.java b/src/main/java/org/jabref/logic/importer/OpenDatabase.java index 9de364f7f75..9ecaa66ce23 100644 --- a/src/main/java/org/jabref/logic/importer/OpenDatabase.java +++ b/src/main/java/org/jabref/logic/importer/OpenDatabase.java @@ -3,6 +3,7 @@ import java.io.File; import java.io.IOException; +import org.jabref.Globals; import org.jabref.logic.importer.fileformat.BibtexImporter; import org.jabref.logic.l10n.Localization; import org.jabref.logic.specialfields.SpecialFieldsUtils; @@ -66,7 +67,9 @@ public static ParserResult loadDatabase(File fileToOpen, ImportFormatPreferences if (importFormatPreferences.isKeywordSyncEnabled()) { for (BibEntry entry : result.getDatabase().getEntries()) { - SpecialFieldsUtils.syncSpecialFieldsFromKeywords(entry, importFormatPreferences.getKeywordSeparator()); + if (Globals.prefs.isKeywordSyncEnabled()) { + SpecialFieldsUtils.syncSpecialFieldsFromKeywords(entry, importFormatPreferences.getKeywordSeparator()); + } } LOGGER.debug("Synchronized special fields based on keywords"); } diff --git a/src/main/java/org/jabref/logic/specialfields/SpecialFieldsUtils.java b/src/main/java/org/jabref/logic/specialfields/SpecialFieldsUtils.java index bb6870c5b25..125a153c710 100644 --- a/src/main/java/org/jabref/logic/specialfields/SpecialFieldsUtils.java +++ b/src/main/java/org/jabref/logic/specialfields/SpecialFieldsUtils.java @@ -35,18 +35,16 @@ public static List updateField(SpecialField field, String value, Bi UpdateField.updateField(entry, field.getFieldName(), value, nullFieldIfValueIsTheSame) .ifPresent(fieldChange -> fieldChanges.add(fieldChange)); // we cannot use "value" here as updateField has side effects: "nullFieldIfValueIsTheSame" nulls the field if value is the same - fieldChanges.addAll(SpecialFieldsUtils.exportFieldToKeywords(field, entry, isKeywordSyncEnabled, keywordDelimiter)); + if (isKeywordSyncEnabled) { + fieldChanges.addAll(SpecialFieldsUtils.exportFieldToKeywords(field, entry, keywordDelimiter)); + } return fieldChanges; } - private static List exportFieldToKeywords(SpecialField specialField, BibEntry entry, boolean isKeywordSyncEnabled, Character keywordDelimiter) { + private static List exportFieldToKeywords(SpecialField specialField, BibEntry entry, Character keywordDelimiter) { List fieldChanges = new ArrayList<>(); - if (!isKeywordSyncEnabled) { - return fieldChanges; - } - Optional newValue = entry.getField(specialField.getFieldName()).map(Keyword::new); KeywordList keyWords = specialField.getKeyWords(); @@ -59,11 +57,11 @@ private static List exportFieldToKeywords(SpecialField specialField /** * Update keywords according to values of special fields */ - public static List syncKeywordsFromSpecialFields(BibEntry entry, boolean isKeywordSyncEnabled, Character keywordDelimiter) { + public static List syncKeywordsFromSpecialFields(BibEntry entry, Character keywordDelimiter) { List fieldChanges = new ArrayList<>(); for(SpecialField field: SpecialField.values()) { - fieldChanges.addAll(SpecialFieldsUtils.exportFieldToKeywords(field, entry, isKeywordSyncEnabled, keywordDelimiter)); + fieldChanges.addAll(SpecialFieldsUtils.exportFieldToKeywords(field, entry, keywordDelimiter)); } return fieldChanges; @@ -71,6 +69,7 @@ public static List syncKeywordsFromSpecialFields(BibEntry entry, bo private static List importKeywordsForField(KeywordList keywordList, SpecialField field, BibEntry entry) { List fieldChanges = new ArrayList<>(); + KeywordList values = field.getKeyWords(); Optional newValue = Optional.empty(); for (Keyword keyword : values) { @@ -88,7 +87,7 @@ private static List importKeywordsForField(KeywordList keywordList, } /** - * updates field values according to keywords + * Updates special field values according to keywords */ public static List syncSpecialFieldsFromKeywords(BibEntry entry, Character keywordDelimiter) { List fieldChanges = new ArrayList<>();