From 9243759302cc8a1b87557b204ff46036e9563d58 Mon Sep 17 00:00:00 2001 From: Faneesh Juneja Date: Wed, 8 Apr 2026 15:00:27 -0700 Subject: [PATCH 1/9] added libraryAbbrevationtype to metadata --- .../org/jabref/model/metadata/MetaData.java | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/jablib/src/main/java/org/jabref/model/metadata/MetaData.java b/jablib/src/main/java/org/jabref/model/metadata/MetaData.java index 8baa4c8d88a..3567226ed19 100644 --- a/jablib/src/main/java/org/jabref/model/metadata/MetaData.java +++ b/jablib/src/main/java/org/jabref/model/metadata/MetaData.java @@ -19,6 +19,7 @@ import org.jabref.logic.citationkeypattern.DatabaseCitationKeyPatterns; import org.jabref.logic.citationkeypattern.GlobalCitationKeyPatterns; import org.jabref.logic.cleanup.FieldFormatterCleanupActions; +import org.jabref.logic.journals.AbbreviationType; import org.jabref.logic.util.Version; import org.jabref.model.database.BibDatabaseMode; import org.jabref.model.database.event.ChangePropagation; @@ -41,6 +42,7 @@ public class MetaData { public static final String ENTRYTYPE_FLAG = "jabref-entrytype: "; public static final String SAVE_ORDER_CONFIG = "saveOrderConfig"; // ToDo: Rename in next major version to saveOrder, adapt testbibs public static final String SAVE_ACTIONS = "saveActions"; + public static final String LIBRARY_ABBREVIATION_TYPE = "libraryAbbreviationType"; public static final String PREFIX_KEYPATTERN = "keypattern_"; public static final String KEYPATTERNDEFAULT = "keypatterndefault"; public static final String DATABASE_TYPE = "databaseType"; @@ -74,6 +76,7 @@ public class MetaData { @Nullable private String defaultCiteKeyPattern; @Nullable private FieldFormatterCleanupActions saveActions; @Nullable private BibDatabaseMode mode; + @Nullable private AbbreviationType libraryAbbreviationType; private boolean isProtected; @Nullable private String librarySpecificFileDirectory; @@ -186,6 +189,24 @@ public void setMode(@NonNull BibDatabaseMode mode) { postChange(); } + public Optional getLibraryAbbreviationType() { + return Optional.ofNullable(libraryAbbreviationType); + } + + public void setLibraryAbbreviationType(@NonNull AbbreviationType type) { + if (type == this.libraryAbbreviationType) { + return; + } + + this.libraryAbbreviationType = type; + postChange(); + } + + public void clearLibraryAbbreviationType() { + libraryAbbreviationType = null; + postChange(); + } + public boolean isProtected() { return isProtected; } @@ -376,6 +397,7 @@ public boolean equals(Object o) { && Objects.equals(defaultCiteKeyPattern, that.defaultCiteKeyPattern) && Objects.equals(saveActions, that.saveActions) && (mode == that.mode) + && (libraryAbbreviationType == that.libraryAbbreviationType) && Objects.equals(librarySpecificFileDirectory, that.librarySpecificFileDirectory) && Objects.equals(contentSelectors, that.contentSelectors) && Objects.equals(versionDBStructure, that.versionDBStructure); @@ -384,12 +406,12 @@ public boolean equals(Object o) { @Override public int hashCode() { return Objects.hash(isProtected, groupsRoot.getValue(), encoding, encodingExplicitlySupplied, saveOrder, citeKeyPatterns, userFileDirectory, - latexFileDirectory, defaultCiteKeyPattern, saveActions, mode, librarySpecificFileDirectory, contentSelectors, versionDBStructure); + latexFileDirectory, defaultCiteKeyPattern, saveActions, mode, libraryAbbreviationType, librarySpecificFileDirectory, contentSelectors, versionDBStructure); } @Override public String toString() { - return "MetaData [citeKeyPatterns=" + citeKeyPatterns + ", userFileDirectory=" + userFileDirectory + ", laTexFileDirectory=" + latexFileDirectory + ", groupsRoot=" + groupsRoot + ", encoding=" + encoding + ", saveOrderConfig=" + saveOrder + ", defaultCiteKeyPattern=" + defaultCiteKeyPattern + ", saveActions=" + saveActions + ", mode=" + mode + ", isProtected=" + isProtected + ", librarySpecificFileDirectory=" + librarySpecificFileDirectory + ", contentSelectors=" + contentSelectors + ", encodingExplicitlySupplied=" + encodingExplicitlySupplied + ", VersionDBStructure=" + versionDBStructure + "]"; + return "MetaData [citeKeyPatterns=" + citeKeyPatterns + ", userFileDirectory=" + userFileDirectory + ", laTexFileDirectory=" + latexFileDirectory + ", groupsRoot=" + groupsRoot + ", encoding=" + encoding + ", saveOrderConfig=" + saveOrder + ", defaultCiteKeyPattern=" + defaultCiteKeyPattern + ", saveActions=" + saveActions + ", mode=" + mode + ", libraryAbbreviationType=" + libraryAbbreviationType + ", isProtected=" + isProtected + ", librarySpecificFileDirectory=" + librarySpecificFileDirectory + ", contentSelectors=" + contentSelectors + ", encodingExplicitlySupplied=" + encodingExplicitlySupplied + ", VersionDBStructure=" + versionDBStructure + "]"; } public Optional getBlgFilePath(String user) { From dd2296e6b4126a98a667fb0e8ea5918c38f9fde7 Mon Sep 17 00:00:00 2001 From: Faneesh Juneja Date: Wed, 8 Apr 2026 15:21:14 -0700 Subject: [PATCH 2/9] add metadata seralization --- .../java/org/jabref/logic/exporter/MetaDataSerializer.java | 2 ++ .../org/jabref/logic/importer/util/MetaDataParser.java | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/jablib/src/main/java/org/jabref/logic/exporter/MetaDataSerializer.java b/jablib/src/main/java/org/jabref/logic/exporter/MetaDataSerializer.java index fbc3a5c2fa8..f7451230078 100644 --- a/jablib/src/main/java/org/jabref/logic/exporter/MetaDataSerializer.java +++ b/jablib/src/main/java/org/jabref/logic/exporter/MetaDataSerializer.java @@ -48,6 +48,8 @@ public static Map getSerializedStringMap(MetaData metaData, stringyMetaData.putAll(serializeCiteKeyPatterns(metaData, globalCiteKeyPatterns)); metaData.getMode().ifPresent( mode -> stringyMetaData.put(MetaData.DATABASE_TYPE, List.of(mode.getAsString()))); + metaData.getLibraryAbbreviationType().ifPresent( + abbreviationType -> stringyMetaData.put(MetaData.LIBRARY_ABBREVIATION_TYPE, List.of(abbreviationType.name()))); metaData.getLibrarySpecificFileDirectory().ifPresent( path -> stringyMetaData.put(MetaData.FILE_DIRECTORY, List.of(path.trim()))); metaData.getUserFileDirectories().forEach((user, path) -> stringyMetaData diff --git a/jablib/src/main/java/org/jabref/logic/importer/util/MetaDataParser.java b/jablib/src/main/java/org/jabref/logic/importer/util/MetaDataParser.java index b1f6cc5841e..d64f74c1fff 100644 --- a/jablib/src/main/java/org/jabref/logic/importer/util/MetaDataParser.java +++ b/jablib/src/main/java/org/jabref/logic/importer/util/MetaDataParser.java @@ -20,6 +20,7 @@ import org.jabref.logic.formatter.bibtexfields.NormalizeMonthFormatter; import org.jabref.logic.formatter.bibtexfields.NormalizePagesFormatter; import org.jabref.logic.importer.ParseException; +import org.jabref.logic.journals.AbbreviationType; import org.jabref.logic.layout.format.ReplaceUnicodeLigaturesFormatter; import org.jabref.logic.util.Version; import org.jabref.logic.util.strings.StringUtil; @@ -130,6 +131,12 @@ public MetaData parse(MetaData metaData, Map data, Character key metaData.setSaveActions(fieldFormatterCleanupsParse(values)); } else if (MetaData.DATABASE_TYPE.equals(entry.getKey())) { metaData.setMode(BibDatabaseMode.parse(getSingleItem(values))); + } else if (MetaData.LIBRARY_ABBREVIATION_TYPE.equals(entry.getKey())) { + try { + metaData.setLibraryAbbreviationType(AbbreviationType.valueOf(getSingleItem(values))); + } catch (IllegalArgumentException e) { + LOGGER.debug("Unknown library abbreviation type: {}", getSingleItem(values), e); + } } else if (MetaData.KEYPATTERNDEFAULT.equals(entry.getKey())) { defaultCiteKeyPattern = new CitationKeyPattern(getSingleItem(values)); } else if (MetaData.PROTECTED_FLAG_META.equals(entry.getKey())) { From 1133b549cfd498f8eb228acde355107e6952cbb9 Mon Sep 17 00:00:00 2001 From: Faneesh Juneja Date: Fri, 10 Apr 2026 14:39:43 -0700 Subject: [PATCH 3/9] wire abbreviationJournalcleanup into savadatabaseaction on save --- .../main/java/org/jabref/gui/LibraryTab.java | 2 +- .../jabref/gui/dialogs/AutosaveUiManager.java | 4 +++- .../org/jabref/gui/exporter/SaveAction.java | 4 +++- .../jabref/gui/exporter/SaveAllAction.java | 3 ++- .../gui/exporter/SaveDatabaseAction.java | 23 +++++++++++++++++-- .../SharedDatabaseLoginDialogViewModel.java | 4 +++- .../gui/exporter/SaveDatabaseActionTest.java | 5 ++-- 7 files changed, 36 insertions(+), 9 deletions(-) diff --git a/jabgui/src/main/java/org/jabref/gui/LibraryTab.java b/jabgui/src/main/java/org/jabref/gui/LibraryTab.java index c27188a498f..8d68a2927bb 100644 --- a/jabgui/src/main/java/org/jabref/gui/LibraryTab.java +++ b/jabgui/src/main/java/org/jabref/gui/LibraryTab.java @@ -675,7 +675,7 @@ private boolean confirmClose() { if (buttonType.equals(saveChanges)) { try { - SaveDatabaseAction saveAction = new SaveDatabaseAction(this, dialogService, preferences, Injector.instantiateModelOrService(BibEntryTypesManager.class), stateManager); + SaveDatabaseAction saveAction = new SaveDatabaseAction(this, dialogService, preferences, Injector.instantiateModelOrService(BibEntryTypesManager.class), stateManager, Injector.instantiateModelOrService(JournalAbbreviationRepository.class)); if (saveAction.save()) { return true; } diff --git a/jabgui/src/main/java/org/jabref/gui/dialogs/AutosaveUiManager.java b/jabgui/src/main/java/org/jabref/gui/dialogs/AutosaveUiManager.java index 7ec0504198e..a7818920d4e 100644 --- a/jabgui/src/main/java/org/jabref/gui/dialogs/AutosaveUiManager.java +++ b/jabgui/src/main/java/org/jabref/gui/dialogs/AutosaveUiManager.java @@ -5,9 +5,11 @@ import org.jabref.gui.StateManager; import org.jabref.gui.exporter.SaveDatabaseAction; import org.jabref.gui.preferences.GuiPreferences; +import org.jabref.logic.journals.JournalAbbreviationRepository; import org.jabref.model.database.event.AutosaveEvent; import org.jabref.model.entry.BibEntryTypesManager; +import com.airhacks.afterburner.injection.Injector; import com.google.common.eventbus.Subscribe; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,7 +22,7 @@ public class AutosaveUiManager { private final SaveDatabaseAction saveDatabaseAction; public AutosaveUiManager(LibraryTab libraryTab, DialogService dialogService, GuiPreferences preferences, BibEntryTypesManager entryTypesManager, StateManager stateManager) { - this.saveDatabaseAction = new SaveDatabaseAction(libraryTab, dialogService, preferences, entryTypesManager, stateManager); + this.saveDatabaseAction = new SaveDatabaseAction(libraryTab, dialogService, preferences, entryTypesManager, stateManager, Injector.instantiateModelOrService(JournalAbbreviationRepository.class)); } @Subscribe diff --git a/jabgui/src/main/java/org/jabref/gui/exporter/SaveAction.java b/jabgui/src/main/java/org/jabref/gui/exporter/SaveAction.java index fc625b35dae..75ae80acb80 100644 --- a/jabgui/src/main/java/org/jabref/gui/exporter/SaveAction.java +++ b/jabgui/src/main/java/org/jabref/gui/exporter/SaveAction.java @@ -8,6 +8,7 @@ import org.jabref.gui.actions.ActionHelper; import org.jabref.gui.actions.SimpleCommand; import org.jabref.gui.preferences.GuiPreferences; +import org.jabref.logic.journals.JournalAbbreviationRepository; import org.jabref.model.entry.BibEntryTypesManager; import com.airhacks.afterburner.injection.Injector; @@ -49,7 +50,8 @@ public void execute() { dialogService, preferences, Injector.instantiateModelOrService(BibEntryTypesManager.class), - stateManager); + stateManager, + Injector.instantiateModelOrService(JournalAbbreviationRepository.class)); switch (saveMethod) { case SAVE -> diff --git a/jabgui/src/main/java/org/jabref/gui/exporter/SaveAllAction.java b/jabgui/src/main/java/org/jabref/gui/exporter/SaveAllAction.java index c8b7a51700b..d8771fdd30d 100644 --- a/jabgui/src/main/java/org/jabref/gui/exporter/SaveAllAction.java +++ b/jabgui/src/main/java/org/jabref/gui/exporter/SaveAllAction.java @@ -8,6 +8,7 @@ import org.jabref.gui.StateManager; import org.jabref.gui.actions.SimpleCommand; import org.jabref.gui.preferences.GuiPreferences; +import org.jabref.logic.journals.JournalAbbreviationRepository; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntryTypesManager; @@ -35,7 +36,7 @@ public void execute() { dialogService.notify(Localization.lang("Saving all libraries...")); for (LibraryTab libraryTab : tabsSupplier.get()) { - SaveDatabaseAction saveDatabaseAction = new SaveDatabaseAction(libraryTab, dialogService, preferences, Injector.instantiateModelOrService(BibEntryTypesManager.class), stateManager); + SaveDatabaseAction saveDatabaseAction = new SaveDatabaseAction(libraryTab, dialogService, preferences, Injector.instantiateModelOrService(BibEntryTypesManager.class), stateManager, Injector.instantiateModelOrService(JournalAbbreviationRepository.class)); boolean saveResult = saveDatabaseAction.save(); if (!saveResult) { dialogService.notify(Localization.lang("Could not save file.")); diff --git a/jabgui/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java b/jabgui/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java index 64e8fdfa6df..f913b012903 100644 --- a/jabgui/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java +++ b/jabgui/src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java @@ -10,6 +10,7 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import javafx.scene.control.ButtonBar; import javafx.scene.control.ButtonType; @@ -27,16 +28,19 @@ import org.jabref.gui.maintable.columns.MainTableColumn; import org.jabref.gui.preferences.GuiPreferences; import org.jabref.gui.util.FileDialogConfiguration; +import org.jabref.logic.cleanup.AbbreviateJournalCleanup; import org.jabref.logic.exporter.AtomicFileWriter; import org.jabref.logic.exporter.BibDatabaseWriter; import org.jabref.logic.exporter.BibWriter; import org.jabref.logic.exporter.SaveException; import org.jabref.logic.exporter.SelfContainedSaveConfiguration; +import org.jabref.logic.journals.JournalAbbreviationRepository; import org.jabref.logic.l10n.Localization; import org.jabref.logic.os.OS; import org.jabref.logic.shared.DatabaseLocation; import org.jabref.logic.shared.prefs.SharedDatabasePreferences; import org.jabref.logic.util.StandardFileType; +import org.jabref.model.FieldChange; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.database.event.ChangePropagation; import org.jabref.model.entry.BibEntryTypesManager; @@ -59,6 +63,7 @@ public class SaveDatabaseAction { private final GuiPreferences preferences; private final BibEntryTypesManager entryTypesManager; private final StateManager stateManager; + private final JournalAbbreviationRepository journalAbbreviationRepository; public enum SaveDatabaseMode { SILENT, NORMAL @@ -68,12 +73,14 @@ public SaveDatabaseAction(LibraryTab libraryTab, DialogService dialogService, GuiPreferences preferences, BibEntryTypesManager entryTypesManager, - StateManager stateManager) { + StateManager stateManager, + JournalAbbreviationRepository journalAbbreviationRepository) { this.libraryTab = libraryTab; this.dialogService = dialogService; this.preferences = preferences; this.entryTypesManager = entryTypesManager; this.stateManager = stateManager; + this.journalAbbreviationRepository = journalAbbreviationRepository; } public boolean save() { @@ -266,7 +273,19 @@ private boolean saveDatabase(Path file, boolean selectedOnly, Charset encoding, databaseWriter.writeDatabase(bibDatabaseContext); } - libraryTab.registerUndoableChanges(databaseWriter.getSaveActionsFieldChanges()); + List abbreviationChanges = bibDatabaseContext.getMetaData() + .getLibraryAbbreviationType() + .map(abbreviationType -> { + boolean useFJournal = preferences.getJournalAbbreviationPreferences().shouldUseFJournalField(); + AbbreviateJournalCleanup cleanup = new AbbreviateJournalCleanup( + bibDatabaseContext.getDatabase(), journalAbbreviationRepository, abbreviationType, useFJournal); + return bibDatabaseContext.getDatabase().getEntries().stream() + .flatMap(entry -> cleanup.cleanup(entry).stream()) + .toList(); + }) + .orElse(List.of()); + libraryTab.registerUndoableChanges( + Stream.concat(databaseWriter.getSaveActionsFieldChanges().stream(), abbreviationChanges.stream()).toList()); if (fileWriter.hasEncodingProblems()) { saveWithDifferentEncoding(file, selectedOnly, encoding, fileWriter.getEncodingProblems(), saveType, saveOrder); diff --git a/jabgui/src/main/java/org/jabref/gui/shared/SharedDatabaseLoginDialogViewModel.java b/jabgui/src/main/java/org/jabref/gui/shared/SharedDatabaseLoginDialogViewModel.java index e4661601a5e..ac8fed787c0 100644 --- a/jabgui/src/main/java/org/jabref/gui/shared/SharedDatabaseLoginDialogViewModel.java +++ b/jabgui/src/main/java/org/jabref/gui/shared/SharedDatabaseLoginDialogViewModel.java @@ -34,6 +34,7 @@ import org.jabref.gui.util.FileFilterConverter; import org.jabref.logic.ai.AiService; import org.jabref.logic.help.HelpFile; +import org.jabref.logic.journals.JournalAbbreviationRepository; import org.jabref.logic.l10n.Localization; import org.jabref.logic.shared.DBMSConnectionProperties; import org.jabref.logic.shared.DBMSConnectionPropertiesBuilder; @@ -213,7 +214,8 @@ private boolean openSharedDatabase(DBMSConnectionProperties connectionProperties dialogService, preferences, Injector.instantiateModelOrService(BibEntryTypesManager.class), - stateManager + stateManager, + Injector.instantiateModelOrService(JournalAbbreviationRepository.class) ).saveAs(Path.of(folder.getValue())); } catch (Throwable e) { LOGGER.error("Error while saving the database", e); diff --git a/jabgui/src/test/java/org/jabref/gui/exporter/SaveDatabaseActionTest.java b/jabgui/src/test/java/org/jabref/gui/exporter/SaveDatabaseActionTest.java index bd8ae13fa25..daf181b3a93 100644 --- a/jabgui/src/test/java/org/jabref/gui/exporter/SaveDatabaseActionTest.java +++ b/jabgui/src/test/java/org/jabref/gui/exporter/SaveDatabaseActionTest.java @@ -24,6 +24,7 @@ import org.jabref.logic.exporter.BibDatabaseWriter; import org.jabref.logic.exporter.ExportPreferences; import org.jabref.logic.exporter.SaveConfiguration; +import org.jabref.logic.journals.JournalAbbreviationRepository; import org.jabref.logic.shared.DatabaseLocation; import org.jabref.model.database.BibDatabase; import org.jabref.model.database.BibDatabaseContext; @@ -64,7 +65,7 @@ void setUp() { when(filePreferences.getWorkingDirectory()).thenReturn(Path.of(TEST_BIBTEX_LIBRARY_LOCATION)); when(preferences.getFilePreferences()).thenReturn(filePreferences); when(preferences.getExportPreferences()).thenReturn(mock(ExportPreferences.class)); - saveDatabaseAction = spy(new SaveDatabaseAction(libraryTab, dialogService, preferences, mock(BibEntryTypesManager.class), stateManager)); + saveDatabaseAction = spy(new SaveDatabaseAction(libraryTab, dialogService, preferences, mock(BibEntryTypesManager.class), stateManager, mock(JournalAbbreviationRepository.class))); } @Test @@ -133,7 +134,7 @@ private SaveDatabaseAction createSaveDatabaseActionForBibDatabase(BibDatabase da when(libraryTab.getBibDatabaseContext()).thenReturn(dbContext); when(libraryTab.getUndoManager()).thenReturn(mock(CountingUndoManager.class)); when(libraryTab.getBibDatabaseContext()).thenReturn(dbContext); - saveDatabaseAction = new SaveDatabaseAction(libraryTab, dialogService, preferences, mock(BibEntryTypesManager.class), stateManager); + saveDatabaseAction = new SaveDatabaseAction(libraryTab, dialogService, preferences, mock(BibEntryTypesManager.class), stateManager, mock(JournalAbbreviationRepository.class)); return saveDatabaseAction; } From d3cb9a53d19ee5850177dbf28f0065df3d8a05be Mon Sep 17 00:00:00 2001 From: Faneesh Juneja Date: Sat, 11 Apr 2026 15:13:03 -0700 Subject: [PATCH 4/9] add journal abbreviation preference to library properties --- .../saving/SavingPropertiesView.java | 33 +++++++++++++++++++ .../saving/SavingPropertiesViewModel.java | 19 +++++++++++ .../saving/SavingProperties.fxml | 8 +++++ .../main/resources/l10n/JabRef_en.properties | 3 ++ 4 files changed, 63 insertions(+) diff --git a/jabgui/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesView.java b/jabgui/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesView.java index c1b481662f2..dedcec10375 100644 --- a/jabgui/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesView.java +++ b/jabgui/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesView.java @@ -1,12 +1,16 @@ package org.jabref.gui.libraryproperties.saving; +import javafx.collections.FXCollections; import javafx.fxml.FXML; import javafx.scene.control.CheckBox; +import javafx.scene.control.ComboBox; +import javafx.util.StringConverter; import org.jabref.gui.commonfxcontrols.FieldFormatterCleanupsPanel; import org.jabref.gui.commonfxcontrols.SaveOrderConfigPanel; import org.jabref.gui.libraryproperties.AbstractPropertiesTabView; import org.jabref.gui.libraryproperties.PropertiesTab; +import org.jabref.logic.journals.AbbreviationType; import org.jabref.logic.l10n.Localization; import org.jabref.logic.preferences.CliPreferences; import org.jabref.model.database.BibDatabaseContext; @@ -19,6 +23,7 @@ public class SavingPropertiesView extends AbstractPropertiesTabView journalAbbreviationOnSave; @Inject private CliPreferences preferences; @@ -49,5 +54,33 @@ public void initialize() { fieldFormatterCleanupsPanel.cleanupsDisableProperty().bindBidirectional(viewModel.cleanupsDisableProperty()); fieldFormatterCleanupsPanel.cleanupsProperty().bindBidirectional(viewModel.cleanupsProperty()); + + journalAbbreviationOnSave.setItems(FXCollections.observableArrayList( + null, AbbreviationType.DEFAULT, AbbreviationType.DOTLESS, + AbbreviationType.SHORTEST_UNIQUE, AbbreviationType.LTWA)); + journalAbbreviationOnSave.setConverter(new StringConverter<>() { + @Override + public String toString(AbbreviationType type) { + if (type == null) { + return Localization.lang("None (use global setting)"); + } + return switch (type) { + case DEFAULT -> + Localization.lang("Abbreviate (default)"); + case DOTLESS -> + Localization.lang("Abbreviate (dotless)"); + case SHORTEST_UNIQUE -> + Localization.lang("Abbreviate (shortest unique)"); + case LTWA -> + Localization.lang("Abbreviate (LTWA)"); + }; + } + + @Override + public AbbreviationType fromString(String string) { + return null; + } + }); + journalAbbreviationOnSave.valueProperty().bindBidirectional(viewModel.journalAbbreviationOnSaveProperty()); } } diff --git a/jabgui/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java b/jabgui/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java index bdc23497d9f..22d6f5232c1 100644 --- a/jabgui/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java +++ b/jabgui/src/main/java/org/jabref/gui/libraryproperties/saving/SavingPropertiesViewModel.java @@ -7,8 +7,10 @@ import javafx.beans.property.BooleanProperty; import javafx.beans.property.ListProperty; +import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleListProperty; +import javafx.beans.property.SimpleObjectProperty; import javafx.collections.FXCollections; import org.jabref.gui.commonfxcontrols.SortCriterionViewModel; @@ -16,6 +18,7 @@ import org.jabref.logic.cleanup.CleanupPreferences; import org.jabref.logic.cleanup.FieldFormatterCleanup; import org.jabref.logic.cleanup.FieldFormatterCleanupActions; +import org.jabref.logic.journals.AbbreviationType; import org.jabref.logic.preferences.CliPreferences; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.field.Field; @@ -49,6 +52,9 @@ public class SavingPropertiesViewModel implements PropertiesTabViewModel { private final BooleanProperty cleanupsDisableProperty = new SimpleBooleanProperty(); private final ListProperty cleanupsProperty = new SimpleListProperty<>(FXCollections.emptyObservableList()); + // Journal abbreviation on save + private final ObjectProperty journalAbbreviationOnSaveProperty = new SimpleObjectProperty<>(); + private final BibDatabaseContext databaseContext; private final MetaData initialMetaData; private final SaveOrder saveOrder; @@ -101,6 +107,8 @@ public void setValues() { cleanupsDisableProperty.setValue(!defaultPreset.getFieldFormatterCleanups().isEnabled()); cleanupsProperty.setValue(FXCollections.observableArrayList(defaultPreset.getFieldFormatterCleanups().getConfiguredActions())); }); + + journalAbbreviationOnSaveProperty.setValue(initialMetaData.getLibraryAbbreviationType().orElse(null)); } @Override @@ -140,6 +148,13 @@ public void storeSettings() { } } + AbbreviationType abbreviationType = journalAbbreviationOnSaveProperty.getValue(); + if (abbreviationType != null) { + newMetaData.setLibraryAbbreviationType(abbreviationType); + } else { + newMetaData.clearLibraryAbbreviationType(); + } + databaseContext.setMetaData(newMetaData); } @@ -182,4 +197,8 @@ public BooleanProperty cleanupsDisableProperty() { public ListProperty cleanupsProperty() { return cleanupsProperty; } + + public ObjectProperty journalAbbreviationOnSaveProperty() { + return journalAbbreviationOnSaveProperty; + } } diff --git a/jabgui/src/main/resources/org/jabref/gui/libraryproperties/saving/SavingProperties.fxml b/jabgui/src/main/resources/org/jabref/gui/libraryproperties/saving/SavingProperties.fxml index 03d828fb2ec..d925499d8a7 100644 --- a/jabgui/src/main/resources/org/jabref/gui/libraryproperties/saving/SavingProperties.fxml +++ b/jabgui/src/main/resources/org/jabref/gui/libraryproperties/saving/SavingProperties.fxml @@ -2,7 +2,9 @@ + + @@ -18,6 +20,12 @@