Skip to content

Commit

Permalink
Fixes #2580 Keyword - Special field synchronization
Browse files Browse the repository at this point in the history
  • Loading branch information
stefan-kolb committed Feb 22, 2017
1 parent bdc535f commit 17e4263
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<FieldChange> 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<FieldChange> 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)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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());
});
}

Expand Down
5 changes: 4 additions & 1 deletion src/main/java/org/jabref/logic/importer/OpenDatabase.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,16 @@ public static List<FieldChange> 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<FieldChange> exportFieldToKeywords(SpecialField specialField, BibEntry entry, boolean isKeywordSyncEnabled, Character keywordDelimiter) {
private static List<FieldChange> exportFieldToKeywords(SpecialField specialField, BibEntry entry, Character keywordDelimiter) {
List<FieldChange> fieldChanges = new ArrayList<>();

if (!isKeywordSyncEnabled) {
return fieldChanges;
}

Optional<Keyword> newValue = entry.getField(specialField.getFieldName()).map(Keyword::new);
KeywordList keyWords = specialField.getKeyWords();

Expand All @@ -59,18 +57,19 @@ private static List<FieldChange> exportFieldToKeywords(SpecialField specialField
/**
* Update keywords according to values of special fields
*/
public static List<FieldChange> syncKeywordsFromSpecialFields(BibEntry entry, boolean isKeywordSyncEnabled, Character keywordDelimiter) {
public static List<FieldChange> syncKeywordsFromSpecialFields(BibEntry entry, Character keywordDelimiter) {
List<FieldChange> 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;
}

private static List<FieldChange> importKeywordsForField(KeywordList keywordList, SpecialField field, BibEntry entry) {
List<FieldChange> fieldChanges = new ArrayList<>();

KeywordList values = field.getKeyWords();
Optional<Keyword> newValue = Optional.empty();
for (Keyword keyword : values) {
Expand All @@ -88,7 +87,7 @@ private static List<FieldChange> importKeywordsForField(KeywordList keywordList,
}

/**
* updates field values according to keywords
* Updates special field values according to keywords
*/
public static List<FieldChange> syncSpecialFieldsFromKeywords(BibEntry entry, Character keywordDelimiter) {
List<FieldChange> fieldChanges = new ArrayList<>();
Expand Down

0 comments on commit 17e4263

Please sign in to comment.