package org.jabref.gui.specialfields; import javax.swing.SwingUtilities; import org.jabref.Globals; import org.jabref.JabRefGUI; import org.jabref.logic.specialfields.SpecialFieldsUtils; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.FieldName; import org.jabref.model.entry.event.FieldChangedEvent; import org.jabref.model.entry.specialfields.SpecialField; import com.google.common.eventbus.Subscribe; /** * Listener triggering * * an update of keywords if special field has been updated * * an update of special fields if keywords have been updated */ public class SpecialFieldUpdateListener { private static SpecialFieldUpdateListener INSTANCE; @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 // if we immediately updated the fields, the entry editor would detect a subsequent change as a user change // and re-fire this event // e.g., "keyword = {prio1}, priority = {prio2}" and a change at keyword to prio3 would not succeed. SwingUtilities.invokeLater(() -> { if (FieldName.KEYWORDS.equals(fieldName)) { SpecialFieldsUtils.syncSpecialFieldsFromKeywords(entry, Globals.prefs.getKeywordDelimiter()); } else if (SpecialField.isSpecialField(fieldName)) { SpecialFieldsUtils.syncKeywordsFromSpecialFields(entry, Globals.prefs.getKeywordDelimiter()); } SwingUtilities.invokeLater(() -> JabRefGUI.getMainFrame().getCurrentBasePanel().updateEntryEditorIfShowing()); }); } public static SpecialFieldUpdateListener getInstance() { if (SpecialFieldUpdateListener.INSTANCE == null) { SpecialFieldUpdateListener.INSTANCE = new SpecialFieldUpdateListener(); } return SpecialFieldUpdateListener.INSTANCE; } }