diff --git a/CHANGELOG.md b/CHANGELOG.md
index 34a89efc32a..e52aaab4a26 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,7 @@ Note that this project **does not** adhere to [Semantic Versioning](https://semv
### Added
+- We added a table for naming linked files in the Linked Files tab in Preferences. [#11368](https://github.com/JabRef/jabref/issues/11368)
- We added a new Welcome tab which shows a welcome screen if no database is open. [#12272](https://github.com/JabRef/jabref/issues/12272)
- We added F5 as a shortcut key for fetching data and Alt+F as a shortcut for looking up data using DOI. [#11802](https://github.com/JabRef/jabref/issues/11802)
- We added a feature to rename the subgroup, with the keybinding (F2) for quick access. [#11896](https://github.com/JabRef/jabref/issues/11896)
diff --git a/src/main/java/org/jabref/gui/commonfxcontrols/CitationKeyPatternsPanel.java b/src/main/java/org/jabref/gui/commonfxcontrols/CitationKeyPatternsPanel.java
index 2b044661236..1c866cac305 100644
--- a/src/main/java/org/jabref/gui/commonfxcontrols/CitationKeyPatternsPanel.java
+++ b/src/main/java/org/jabref/gui/commonfxcontrols/CitationKeyPatternsPanel.java
@@ -15,7 +15,7 @@
import org.jabref.gui.icon.IconTheme;
import org.jabref.gui.util.ValueTableCellFactory;
import org.jabref.logic.citationkeypattern.AbstractCitationKeyPatterns;
-import org.jabref.logic.citationkeypattern.CitationKeyPattern;
+import org.jabref.logic.citationkeypattern.KeyPattern;
import org.jabref.logic.l10n.Localization;
import org.jabref.logic.preferences.CliPreferences;
import org.jabref.model.entry.BibEntryType;
@@ -24,11 +24,11 @@
import com.airhacks.afterburner.views.ViewLoader;
import jakarta.inject.Inject;
-public class CitationKeyPatternsPanel extends TableView {
+public class CitationKeyPatternsPanel extends TableView {
- @FXML public TableColumn entryTypeColumn;
- @FXML public TableColumn patternColumn;
- @FXML public TableColumn actionsColumn;
+ @FXML public TableColumn entryTypeColumn;
+ @FXML public TableColumn patternColumn;
+ @FXML public TableColumn actionsColumn;
@Inject private CliPreferences preferences;
@@ -41,9 +41,9 @@ public class CitationKeyPatternsPanel extends TableView cellData.getValue().entryType());
- new ValueTableCellFactory()
+ new ValueTableCellFactory()
.withText(EntryType::getDisplayName)
.install(entryTypeColumn);
this.setOnSort(event ->
@@ -69,16 +69,16 @@ private void initialize() {
patternColumn.setSortable(true);
patternColumn.setReorderable(false);
patternColumn.setCellValueFactory(cellData -> cellData.getValue().pattern());
- patternColumn.setCellFactory(_ -> new CitationKeyPatternSuggestionCell(patterns));
+ patternColumn.setCellFactory(_ -> new PatternSuggestionCell(patterns));
patternColumn.setEditable(true);
patternColumn.setOnEditCommit(
- (TableColumn.CellEditEvent event) ->
+ (TableColumn.CellEditEvent event) ->
event.getRowValue().setPattern(event.getNewValue()));
actionsColumn.setSortable(false);
actionsColumn.setReorderable(false);
actionsColumn.setCellValueFactory(cellData -> cellData.getValue().entryType());
- new ValueTableCellFactory()
+ new ValueTableCellFactory()
.withGraphic(entryType -> IconTheme.JabRefIcons.REFRESH.getGraphicNode())
.withTooltip(entryType ->
Localization.lang("Reset %s to default value").formatted(entryType.getDisplayName()))
@@ -99,11 +99,11 @@ public void resetAll() {
viewModel.resetAll();
}
- public ListProperty patternListProperty() {
+ public ListProperty patternListProperty() {
return viewModel.patternListProperty();
}
- public ObjectProperty defaultKeyPatternProperty() {
+ public ObjectProperty defaultKeyPatternProperty() {
return viewModel.defaultKeyPatternProperty();
}
@@ -124,9 +124,9 @@ private void jumpToSearchKey(KeyEvent keypressed) {
.findFirst().ifPresent(this::scrollTo);
}
- private static class HighlightTableRow extends TableRow {
+ private static class HighlightTableRow extends TableRow {
@Override
- public void updateItem(CitationKeyPatternsPanelItemModel item, boolean empty) {
+ public void updateItem(PatternsItemModel item, boolean empty) {
super.updateItem(item, empty);
if (item == null || item.getEntryType() == null) {
setStyle("");
diff --git a/src/main/java/org/jabref/gui/commonfxcontrols/CitationKeyPatternsPanelViewModel.java b/src/main/java/org/jabref/gui/commonfxcontrols/CitationKeyPatternsPanelViewModel.java
index 78df89b5ba7..cee0ddb3de4 100644
--- a/src/main/java/org/jabref/gui/commonfxcontrols/CitationKeyPatternsPanelViewModel.java
+++ b/src/main/java/org/jabref/gui/commonfxcontrols/CitationKeyPatternsPanelViewModel.java
@@ -10,8 +10,8 @@
import javafx.collections.FXCollections;
import org.jabref.logic.citationkeypattern.AbstractCitationKeyPatterns;
-import org.jabref.logic.citationkeypattern.CitationKeyPattern;
import org.jabref.logic.citationkeypattern.CitationKeyPatternPreferences;
+import org.jabref.logic.citationkeypattern.KeyPattern;
import org.jabref.logic.l10n.Localization;
import org.jabref.model.entry.BibEntryType;
import org.jabref.model.entry.types.EntryType;
@@ -20,7 +20,7 @@ public class CitationKeyPatternsPanelViewModel {
public static final String ENTRY_TYPE_DEFAULT_NAME = "default";
- public static Comparator defaultOnTopComparator = (o1, o2) -> {
+ public static Comparator defaultOnTopComparator = (o1, o2) -> {
String itemOneName = o1.getEntryType().getName();
String itemTwoName = o2.getEntryType().getName();
@@ -35,8 +35,8 @@ public class CitationKeyPatternsPanelViewModel {
return 0;
};
- private final ListProperty patternListProperty = new SimpleListProperty<>();
- private final ObjectProperty defaultItemProperty = new SimpleObjectProperty<>();
+ private final ListProperty patternListProperty = new SimpleListProperty<>();
+ private final ObjectProperty defaultItemProperty = new SimpleObjectProperty<>();
private final CitationKeyPatternPreferences keyPatternPreferences;
@@ -46,13 +46,13 @@ public CitationKeyPatternsPanelViewModel(CitationKeyPatternPreferences keyPatter
public void setValues(Collection entryTypeList, AbstractCitationKeyPatterns initialKeyPattern) {
String defaultPattern;
- if ((initialKeyPattern.getDefaultValue() == null) || initialKeyPattern.getDefaultValue().equals(CitationKeyPattern.NULL_CITATION_KEY_PATTERN)) {
+ if ((initialKeyPattern.getDefaultValue() == null) || initialKeyPattern.getDefaultValue().equals(KeyPattern.NULL_PATTERN)) {
defaultPattern = "";
} else {
defaultPattern = initialKeyPattern.getDefaultValue().stringRepresentation();
}
- defaultItemProperty.setValue(new CitationKeyPatternsPanelItemModel(new DefaultEntryType(), defaultPattern));
+ defaultItemProperty.setValue(new PatternsItemModel(new DefaultEntryType(), defaultPattern));
patternListProperty.setValue(FXCollections.observableArrayList());
patternListProperty.add(defaultItemProperty.getValue());
@@ -65,11 +65,11 @@ public void setValues(Collection entryTypeList, AbstractCitationKe
} else {
pattern = initialKeyPattern.getPatterns().get(entryType).stringRepresentation();
}
- patternListProperty.add(new CitationKeyPatternsPanelItemModel(entryType, pattern));
+ patternListProperty.add(new PatternsItemModel(entryType, pattern));
});
}
- public void setItemToDefaultPattern(CitationKeyPatternsPanelItemModel item) {
+ public void setItemToDefaultPattern(PatternsItemModel item) {
item.setPattern(keyPatternPreferences.getDefaultPattern());
}
@@ -78,11 +78,11 @@ public void resetAll() {
defaultItemProperty.getValue().setPattern(keyPatternPreferences.getDefaultPattern());
}
- public ListProperty patternListProperty() {
+ public ListProperty patternListProperty() {
return patternListProperty;
}
- public ObjectProperty defaultKeyPatternProperty() {
+ public ObjectProperty defaultKeyPatternProperty() {
return defaultItemProperty;
}
diff --git a/src/main/java/org/jabref/gui/commonfxcontrols/CitationKeyPatternSuggestionCell.java b/src/main/java/org/jabref/gui/commonfxcontrols/PatternSuggestionCell.java
similarity index 80%
rename from src/main/java/org/jabref/gui/commonfxcontrols/CitationKeyPatternSuggestionCell.java
rename to src/main/java/org/jabref/gui/commonfxcontrols/PatternSuggestionCell.java
index f8f2958b272..f9ef8c34a91 100644
--- a/src/main/java/org/jabref/gui/commonfxcontrols/CitationKeyPatternSuggestionCell.java
+++ b/src/main/java/org/jabref/gui/commonfxcontrols/PatternSuggestionCell.java
@@ -16,13 +16,13 @@
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.stage.Window;
-import org.jabref.logic.citationkeypattern.CitationKeyPattern;
+import org.jabref.logic.citationkeypattern.KeyPattern;
import org.jabref.logic.l10n.Localization;
-public class CitationKeyPatternSuggestionCell extends TextFieldTableCell {
+public class PatternSuggestionCell extends TextFieldTableCell {
private final CitationKeyPatternSuggestionTextField searchField;
- public CitationKeyPatternSuggestionCell(List citationKeyPatterns) {
+ public PatternSuggestionCell(List citationKeyPatterns) {
this.searchField = new CitationKeyPatternSuggestionTextField(citationKeyPatterns);
searchField.setOnAction(event -> commitEdit(searchField.getText()));
}
@@ -145,10 +145,6 @@ public static double getAvailableSpaceBelow(TextField textField) {
}
Window window = textField.getScene().getWindow();
- if (window == null) {
- return 0;
- }
-
Bounds bounds = textField.localToScreen(textField.getBoundsInLocal());
double screenHeight = window.getHeight();
double textFieldBottom = bounds.getMinY() + textField.getHeight();
@@ -159,26 +155,26 @@ public static double getAvailableSpaceBelow(TextField textField) {
private Menu createPatternsSubMenu() {
Menu patternsSubMenu = new Menu(Localization.lang("All patterns"));
- Map> categorizedPatterns =
- CitationKeyPattern.getAllPatterns().stream()
- .collect(Collectors.groupingBy(CitationKeyPattern::getCategory));
+ Map> categorizedPatterns =
+ KeyPattern.getAllPatterns().stream()
+ .collect(Collectors.groupingBy(KeyPattern::getCategory));
- Map categoryNames = Map.of(
- CitationKeyPattern.Category.AUTHOR_RELATED, Localization.lang("Author related"),
- CitationKeyPattern.Category.EDITOR_RELATED, Localization.lang("Editor related"),
- CitationKeyPattern.Category.TITLE_RELATED, Localization.lang("Title related"),
- CitationKeyPattern.Category.OTHER_FIELDS, Localization.lang("Other fields"),
- CitationKeyPattern.Category.BIBENTRY_FIELDS, Localization.lang("Entry fields")
+ Map categoryNames = Map.of(
+ KeyPattern.Category.AUTHOR_RELATED, Localization.lang("Author related"),
+ KeyPattern.Category.EDITOR_RELATED, Localization.lang("Editor related"),
+ KeyPattern.Category.TITLE_RELATED, Localization.lang("Title related"),
+ KeyPattern.Category.OTHER_FIELDS, Localization.lang("Other fields"),
+ KeyPattern.Category.BIBENTRY_FIELDS, Localization.lang("Entry fields")
);
- for (Map.Entry entry : categoryNames.entrySet()) {
- CitationKeyPattern.Category category = entry.getKey();
+ for (Map.Entry entry : categoryNames.entrySet()) {
+ KeyPattern.Category category = entry.getKey();
String categoryName = entry.getValue();
Menu categoryMenu = new Menu(categoryName);
- List patterns = categorizedPatterns.getOrDefault(category, List.of());
+ List patterns = categorizedPatterns.getOrDefault(category, List.of());
- for (CitationKeyPattern pattern : patterns) {
+ for (KeyPattern pattern : patterns) {
MenuItem menuItem = new MenuItem(pattern.stringRepresentation());
menuItem.setOnAction(event -> {
setText(pattern.stringRepresentation());
diff --git a/src/main/java/org/jabref/gui/commonfxcontrols/CitationKeyPatternsPanelItemModel.java b/src/main/java/org/jabref/gui/commonfxcontrols/PatternsItemModel.java
similarity index 89%
rename from src/main/java/org/jabref/gui/commonfxcontrols/CitationKeyPatternsPanelItemModel.java
rename to src/main/java/org/jabref/gui/commonfxcontrols/PatternsItemModel.java
index 86cd170d4ea..65f660d7373 100644
--- a/src/main/java/org/jabref/gui/commonfxcontrols/CitationKeyPatternsPanelItemModel.java
+++ b/src/main/java/org/jabref/gui/commonfxcontrols/PatternsItemModel.java
@@ -9,11 +9,11 @@
import org.jabref.model.entry.types.EntryType;
-public class CitationKeyPatternsPanelItemModel {
+public class PatternsItemModel {
private final ObjectProperty entryType = new SimpleObjectProperty<>();
private final StringProperty pattern = new SimpleStringProperty("");
- public CitationKeyPatternsPanelItemModel(EntryType entryType, String pattern) {
+ public PatternsItemModel(EntryType entryType, String pattern) {
Objects.requireNonNull(entryType);
Objects.requireNonNull(pattern);
this.entryType.setValue(entryType);
diff --git a/src/main/java/org/jabref/gui/libraryproperties/keypattern/KeyPatternPropertiesViewModel.java b/src/main/java/org/jabref/gui/libraryproperties/keypattern/KeyPatternPropertiesViewModel.java
index 0ee72445c80..6f916bd230b 100644
--- a/src/main/java/org/jabref/gui/libraryproperties/keypattern/KeyPatternPropertiesViewModel.java
+++ b/src/main/java/org/jabref/gui/libraryproperties/keypattern/KeyPatternPropertiesViewModel.java
@@ -6,8 +6,8 @@
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
-import org.jabref.gui.commonfxcontrols.CitationKeyPatternsPanelItemModel;
import org.jabref.gui.commonfxcontrols.CitationKeyPatternsPanelViewModel;
+import org.jabref.gui.commonfxcontrols.PatternsItemModel;
import org.jabref.gui.libraryproperties.PropertiesTabViewModel;
import org.jabref.logic.citationkeypattern.DatabaseCitationKeyPatterns;
import org.jabref.logic.preferences.CliPreferences;
@@ -17,9 +17,9 @@ public class KeyPatternPropertiesViewModel implements PropertiesTabViewModel {
// The list and the default properties are being overwritten by the bound properties of the tableView, but to
// prevent an NPE on storing the preferences before lazy-loading of the setValues, they need to be initialized.
- private final ListProperty patternListProperty = new SimpleListProperty<>(FXCollections.observableArrayList());
- private final ObjectProperty defaultKeyPatternProperty = new SimpleObjectProperty<>(
- new CitationKeyPatternsPanelItemModel(new CitationKeyPatternsPanelViewModel.DefaultEntryType(), ""));
+ private final ListProperty patternListProperty = new SimpleListProperty<>(FXCollections.observableArrayList());
+ private final ObjectProperty defaultKeyPatternProperty = new SimpleObjectProperty<>(
+ new PatternsItemModel(new CitationKeyPatternsPanelViewModel.DefaultEntryType(), ""));
private final CliPreferences preferences;
@@ -57,11 +57,11 @@ public void storeSettings() {
databaseContext.getMetaData().setCiteKeyPattern(newKeyPattern);
}
- public ListProperty patternListProperty() {
+ public ListProperty patternListProperty() {
return patternListProperty;
}
- public ObjectProperty defaultKeyPatternProperty() {
+ public ObjectProperty defaultKeyPatternProperty() {
return defaultKeyPatternProperty;
}
}
diff --git a/src/main/java/org/jabref/gui/linkedfile/LinkedFileNamePatternsPanel.fxml b/src/main/java/org/jabref/gui/linkedfile/LinkedFileNamePatternsPanel.fxml
new file mode 100644
index 00000000000..e173ccdf1be
--- /dev/null
+++ b/src/main/java/org/jabref/gui/linkedfile/LinkedFileNamePatternsPanel.fxml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/org/jabref/gui/linkedfile/LinkedFileNamePatternsPanel.java b/src/main/java/org/jabref/gui/linkedfile/LinkedFileNamePatternsPanel.java
new file mode 100644
index 00000000000..1487757822a
--- /dev/null
+++ b/src/main/java/org/jabref/gui/linkedfile/LinkedFileNamePatternsPanel.java
@@ -0,0 +1,140 @@
+package org.jabref.gui.linkedfile;
+
+import java.util.Collection;
+
+import javafx.beans.property.ListProperty;
+import javafx.beans.property.ObjectProperty;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.fxml.FXML;
+import javafx.scene.control.TableColumn;
+import javafx.scene.control.TableRow;
+import javafx.scene.control.TableView;
+import javafx.scene.input.KeyEvent;
+
+import org.jabref.gui.commonfxcontrols.PatternSuggestionCell;
+import org.jabref.gui.commonfxcontrols.PatternsItemModel;
+import org.jabref.gui.icon.IconTheme;
+import org.jabref.gui.util.ValueTableCellFactory;
+import org.jabref.logic.citationkeypattern.KeyPattern;
+import org.jabref.logic.l10n.Localization;
+import org.jabref.logic.linkedfile.AbstractLinkedFileNamePatterns;
+import org.jabref.model.entry.BibEntryType;
+import org.jabref.model.entry.types.EntryType;
+
+import com.airhacks.afterburner.views.ViewLoader;
+
+public class LinkedFileNamePatternsPanel extends TableView {
+
+ @FXML public TableColumn entryTypeColumn;
+ @FXML public TableColumn patternColumn;
+ @FXML public TableColumn actionsColumn;
+
+ private LinkedFileNamePatternsPanelViewModel viewModel;
+
+ private long lastKeyPressTime;
+ private String tableSearchTerm;
+ private final ObservableList patterns;
+
+ public LinkedFileNamePatternsPanel() {
+ super();
+ this.patterns = FXCollections.observableArrayList(
+ KeyPattern.getAllPatterns().stream()
+ .map(KeyPattern::stringRepresentation)
+ .toList()
+ );
+
+ ViewLoader.view(this)
+ .root(this)
+ .load();
+ }
+
+ @FXML
+ private void initialize() {
+ viewModel = new LinkedFileNamePatternsPanelViewModel();
+
+ this.setEditable(true);
+
+ entryTypeColumn.setSortable(true);
+ entryTypeColumn.setReorderable(false);
+ entryTypeColumn.setCellValueFactory(cellData -> cellData.getValue().entryType());
+ new ValueTableCellFactory()
+ .withText(EntryType::getDisplayName)
+ .install(entryTypeColumn);
+ this.setOnSort(event ->
+ viewModel.patternListProperty().sort(LinkedFileNamePatternsPanelViewModel.defaultOnTopComparator));
+
+ patternColumn.setSortable(true);
+ patternColumn.setReorderable(false);
+ patternColumn.setCellValueFactory(cellData -> cellData.getValue().pattern());
+ patternColumn.setCellFactory(a -> new PatternSuggestionCell(patterns));
+ patternColumn.setEditable(true);
+ patternColumn.setOnEditCommit(
+ (TableColumn.CellEditEvent event) ->
+ event.getRowValue().setPattern(event.getNewValue()));
+
+ actionsColumn.setSortable(false);
+ actionsColumn.setReorderable(false);
+ actionsColumn.setCellValueFactory(cellData -> cellData.getValue().entryType());
+ new ValueTableCellFactory()
+ .withGraphic(entryType -> IconTheme.JabRefIcons.REFRESH.getGraphicNode())
+ .withTooltip(entryType ->
+ Localization.lang("Reset %s to default value").formatted(entryType.getDisplayName()))
+ .withOnMouseClickedEvent(item -> evt ->
+ viewModel.setItemToDefaultPattern(this.getFocusModel().getFocusedItem()))
+ .install(actionsColumn);
+
+ this.setRowFactory(item -> new HighlightTableRow());
+ this.setOnKeyTyped(this::jumpToSearchKey);
+ this.itemsProperty().bindBidirectional(viewModel.patternListProperty());
+ }
+
+ public void setValues(Collection entryTypeList, AbstractLinkedFileNamePatterns keyPattern) {
+ viewModel.setValues(entryTypeList, keyPattern);
+ }
+
+ public void resetAll() {
+ viewModel.resetAll();
+ }
+
+ public ListProperty patternListProperty() {
+ return viewModel.patternListProperty();
+ }
+
+ public ObjectProperty defaultNamePatternProperty() {
+ return viewModel.defaultNamePatternProperty();
+ }
+
+ private void jumpToSearchKey(KeyEvent keypressed) {
+ if (keypressed.getCharacter() == null) {
+ return;
+ }
+
+ if (System.currentTimeMillis() - lastKeyPressTime < 1000) {
+ tableSearchTerm += keypressed.getCharacter().toLowerCase();
+ } else {
+ tableSearchTerm = keypressed.getCharacter().toLowerCase();
+ }
+
+ lastKeyPressTime = System.currentTimeMillis();
+
+ this.getItems().stream().filter(item -> item.getEntryType().getName().toLowerCase().startsWith(tableSearchTerm))
+ .findFirst().ifPresent(this::scrollTo);
+ }
+
+ private static class HighlightTableRow extends TableRow {
+ @Override
+ public void updateItem(PatternsItemModel item, boolean empty) {
+ super.updateItem(item, empty);
+ if (item == null || item.getEntryType() == null) {
+ setStyle("");
+ } else if (isSelected()) {
+ setStyle("-fx-background-color: -fx-selection-bar");
+ } else if (LinkedFileNamePatternsPanelViewModel.ENTRY_TYPE_DEFAULT_NAME.equals(item.getEntryType().getName())) {
+ setStyle("-fx-background-color: -fx-default-button");
+ } else {
+ setStyle("");
+ }
+ }
+ }
+}
diff --git a/src/main/java/org/jabref/gui/linkedfile/LinkedFileNamePatternsPanelViewModel.java b/src/main/java/org/jabref/gui/linkedfile/LinkedFileNamePatternsPanelViewModel.java
new file mode 100644
index 00000000000..f7a10a99a32
--- /dev/null
+++ b/src/main/java/org/jabref/gui/linkedfile/LinkedFileNamePatternsPanelViewModel.java
@@ -0,0 +1,95 @@
+package org.jabref.gui.linkedfile;
+
+import java.util.Collection;
+import java.util.Comparator;
+
+import javafx.beans.property.ListProperty;
+import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.SimpleListProperty;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.collections.FXCollections;
+
+import org.jabref.gui.commonfxcontrols.PatternsItemModel;
+import org.jabref.logic.citationkeypattern.KeyPattern;
+import org.jabref.logic.l10n.Localization;
+import org.jabref.logic.linkedfile.AbstractLinkedFileNamePatterns;
+import org.jabref.model.entry.BibEntryType;
+import org.jabref.model.entry.types.EntryType;
+
+public class LinkedFileNamePatternsPanelViewModel {
+ public static final String ENTRY_TYPE_DEFAULT_NAME = "default";
+
+ public static Comparator defaultOnTopComparator = (o1, o2) -> {
+ String itemOneName = o1.getEntryType().getName();
+ String itemTwoName = o2.getEntryType().getName();
+
+ if (itemOneName.equals(itemTwoName)) {
+ return 0;
+ } else if (ENTRY_TYPE_DEFAULT_NAME.equals(itemOneName)) {
+ return -1;
+ } else if (ENTRY_TYPE_DEFAULT_NAME.equals(itemTwoName)) {
+ return 1;
+ }
+
+ return 0;
+ };
+
+ private final ListProperty patternListProperty = new SimpleListProperty<>();
+ private final ObjectProperty defaultItemProperty = new SimpleObjectProperty<>();
+
+ public LinkedFileNamePatternsPanelViewModel() { }
+
+ public void setValues(Collection entryTypeList, AbstractLinkedFileNamePatterns initialNamePattern) {
+ String defaultPattern;
+ if ((initialNamePattern.getDefaultValue() == null) || initialNamePattern.getDefaultValue().equals(KeyPattern.NULL_PATTERN)) {
+ defaultPattern = "";
+ } else {
+ defaultPattern = initialNamePattern.getDefaultValue().stringRepresentation();
+ }
+
+ defaultItemProperty.setValue(new PatternsItemModel(new DefaultEntryType(), defaultPattern));
+ patternListProperty.setValue(FXCollections.observableArrayList());
+ patternListProperty.add(defaultItemProperty.getValue());
+
+ entryTypeList.stream()
+ .map(BibEntryType::getType)
+ .forEach(entryType -> {
+ String pattern;
+ if (initialNamePattern.isDefaultValue(entryType)) {
+ pattern = "";
+ } else {
+ pattern = initialNamePattern.getPatterns().get(entryType).stringRepresentation();
+ }
+ patternListProperty.add(new PatternsItemModel(entryType, pattern));
+ });
+ }
+
+ public void setItemToDefaultPattern(PatternsItemModel item) {
+ item.setPattern(KeyPattern.AUTHOR_YEAR.stringRepresentation());
+ }
+
+ public void resetAll() {
+ patternListProperty.forEach(item -> item.setPattern(""));
+ defaultItemProperty.getValue().setPattern(ENTRY_TYPE_DEFAULT_NAME);
+ }
+
+ public ListProperty patternListProperty() {
+ return patternListProperty;
+ }
+
+ public ObjectProperty defaultNamePatternProperty() {
+ return defaultItemProperty;
+ }
+
+ public static class DefaultEntryType implements EntryType {
+ @Override
+ public String getName() {
+ return ENTRY_TYPE_DEFAULT_NAME;
+ }
+
+ @Override
+ public String getDisplayName() {
+ return Localization.lang("Default pattern");
+ }
+ }
+}
diff --git a/src/main/java/org/jabref/gui/preferences/citationkeypattern/CitationKeyPatternTabViewModel.java b/src/main/java/org/jabref/gui/preferences/citationkeypattern/CitationKeyPatternTabViewModel.java
index 2ccfdf85897..61f27fea895 100644
--- a/src/main/java/org/jabref/gui/preferences/citationkeypattern/CitationKeyPatternTabViewModel.java
+++ b/src/main/java/org/jabref/gui/preferences/citationkeypattern/CitationKeyPatternTabViewModel.java
@@ -10,8 +10,8 @@
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
-import org.jabref.gui.commonfxcontrols.CitationKeyPatternsPanelItemModel;
import org.jabref.gui.commonfxcontrols.CitationKeyPatternsPanelViewModel;
+import org.jabref.gui.commonfxcontrols.PatternsItemModel;
import org.jabref.gui.preferences.PreferenceTabViewModel;
import org.jabref.logic.citationkeypattern.CitationKeyPatternPreferences;
import org.jabref.logic.citationkeypattern.GlobalCitationKeyPatterns;
@@ -32,9 +32,9 @@ public class CitationKeyPatternTabViewModel implements PreferenceTabViewModel {
// The list and the default properties are being overwritten by the bound properties of the tableView, but to
// prevent an NPE on storing the preferences before lazy-loading of the setValues, they need to be initialized.
- private final ListProperty patternListProperty = new SimpleListProperty<>(FXCollections.observableArrayList());
- private final ObjectProperty defaultKeyPatternProperty = new SimpleObjectProperty<>(
- new CitationKeyPatternsPanelItemModel(new CitationKeyPatternsPanelViewModel.DefaultEntryType(), ""));
+ private final ListProperty patternListProperty = new SimpleListProperty<>(FXCollections.observableArrayList());
+ private final ObjectProperty defaultKeyPatternProperty = new SimpleObjectProperty<>(
+ new PatternsItemModel(new CitationKeyPatternsPanelViewModel.DefaultEntryType(), ""));
private final CitationKeyPatternPreferences keyPatternPreferences;
@@ -153,11 +153,11 @@ public StringProperty keyPatternReplacementProperty() {
return keyPatternReplacementProperty;
}
- public ListProperty patternListProperty() {
+ public ListProperty patternListProperty() {
return patternListProperty;
}
- public ObjectProperty defaultKeyPatternProperty() {
+ public ObjectProperty defaultKeyPatternProperty() {
return defaultKeyPatternProperty;
}
diff --git a/src/main/java/org/jabref/gui/preferences/linkedfiles/LinkedFilesTab.fxml b/src/main/java/org/jabref/gui/preferences/linkedfiles/LinkedFilesTab.fxml
index 56600d64e34..651d074bfa1 100644
--- a/src/main/java/org/jabref/gui/preferences/linkedfiles/LinkedFilesTab.fxml
+++ b/src/main/java/org/jabref/gui/preferences/linkedfiles/LinkedFilesTab.fxml
@@ -8,12 +8,14 @@
+
+
@@ -59,23 +61,11 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
diff --git a/src/main/java/org/jabref/gui/preferences/linkedfiles/LinkedFilesTab.java b/src/main/java/org/jabref/gui/preferences/linkedfiles/LinkedFilesTab.java
index c624862c684..9c51e46f367 100644
--- a/src/main/java/org/jabref/gui/preferences/linkedfiles/LinkedFilesTab.java
+++ b/src/main/java/org/jabref/gui/preferences/linkedfiles/LinkedFilesTab.java
@@ -4,7 +4,6 @@
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
-import javafx.scene.control.ComboBox;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextField;
@@ -12,12 +11,15 @@
import org.jabref.gui.actions.StandardActions;
import org.jabref.gui.desktop.os.NativeDesktop;
import org.jabref.gui.help.HelpAction;
+import org.jabref.gui.linkedfile.LinkedFileNamePatternsPanel;
import org.jabref.gui.preferences.AbstractPreferenceTabView;
import org.jabref.gui.preferences.PreferencesTab;
import org.jabref.gui.util.IconValidationDecorator;
import org.jabref.logic.help.HelpFile;
import org.jabref.logic.l10n.Localization;
+import org.jabref.model.entry.BibEntryTypesManager;
+import com.airhacks.afterburner.injection.Injector;
import com.airhacks.afterburner.views.ViewLoader;
import de.saxsys.mvvmfx.utils.validation.visualization.ControlsFxVisualizer;
@@ -35,11 +37,11 @@ public class LinkedFilesTab extends AbstractPreferenceTabView fileNamePattern;
- @FXML private TextField fileDirectoryPattern;
@FXML private CheckBox confirmLinkedFileDelete;
@FXML private CheckBox moveToTrash;
+ @FXML private LinkedFileNamePatternsPanel linkedFileNamePatternTable;
+
private final ControlsFxVisualizer validationVisualizer = new ControlsFxVisualizer();
public LinkedFilesTab() {
@@ -71,11 +73,11 @@ public void initialize() {
autolinkRegexKey.textProperty().bindBidirectional(viewModel.autolinkRegexKeyProperty());
autolinkRegexKey.disableProperty().bind(autolinkUseRegex.selectedProperty().not());
fulltextIndex.selectedProperty().bindBidirectional(viewModel.fulltextIndexProperty());
- fileNamePattern.valueProperty().bindBidirectional(viewModel.fileNamePatternProperty());
- fileNamePattern.itemsProperty().bind(viewModel.defaultFileNamePatternsProperty());
- fileDirectoryPattern.textProperty().bindBidirectional(viewModel.fileDirectoryPatternProperty());
confirmLinkedFileDelete.selectedProperty().bindBidirectional(viewModel.confirmLinkedFileDeleteProperty());
+ linkedFileNamePatternTable.patternListProperty().bindBidirectional(viewModel.patternListProperty());
+ linkedFileNamePatternTable.defaultNamePatternProperty().bindBidirectional(viewModel.defaultNamePatternProperty());
+
ActionFactory actionFactory = new ActionFactory();
actionFactory.configureIconButton(StandardActions.HELP_REGEX_SEARCH, new HelpAction(HelpFile.REGEX_SEARCH, dialogService, preferences.getExternalApplicationsPreferences()), autolinkRegexHelp);
@@ -86,4 +88,23 @@ public void initialize() {
public void mainFileDirBrowse() {
viewModel.mainFileDirBrowse();
}
+
+ @Override
+ public void setValues() {
+ viewModel.setValues();
+ BibEntryTypesManager entryTypesManager = Injector.instantiateModelOrService(BibEntryTypesManager.class);
+ linkedFileNamePatternTable.setValues(
+ entryTypesManager.getAllTypes(preferences.getLibraryPreferences().getDefaultBibDatabaseMode()),
+ preferences.getFilePreferences().fileNamePatternProperty().get());
+ }
+
+ @Override
+ public void storeSettings() {
+ viewModel.storeSettings();
+ }
+
+ @FXML
+ public void resetAllKeyPatterns() {
+ linkedFileNamePatternTable.resetAll();
+ }
}
diff --git a/src/main/java/org/jabref/gui/preferences/linkedfiles/LinkedFilesTabViewModel.java b/src/main/java/org/jabref/gui/preferences/linkedfiles/LinkedFilesTabViewModel.java
index 437d6d713fb..a57c3b9a276 100644
--- a/src/main/java/org/jabref/gui/preferences/linkedfiles/LinkedFilesTabViewModel.java
+++ b/src/main/java/org/jabref/gui/preferences/linkedfiles/LinkedFilesTabViewModel.java
@@ -6,17 +6,22 @@
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.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import org.jabref.gui.DialogService;
+import org.jabref.gui.commonfxcontrols.PatternsItemModel;
+import org.jabref.gui.linkedfile.LinkedFileNamePatternsPanelViewModel;
import org.jabref.gui.preferences.PreferenceTabViewModel;
import org.jabref.gui.util.DirectoryDialogConfiguration;
import org.jabref.logic.FilePreferences;
import org.jabref.logic.l10n.Localization;
+import org.jabref.logic.linkedfile.GlobalLinkedFileNamePatterns;
import org.jabref.logic.preferences.CliPreferences;
import org.jabref.logic.util.io.AutoLinkPreferences;
@@ -34,14 +39,16 @@ public class LinkedFilesTabViewModel implements PreferenceTabViewModel {
private final BooleanProperty autolinkFileExactBibtexProperty = new SimpleBooleanProperty();
private final BooleanProperty autolinkUseRegexProperty = new SimpleBooleanProperty();
private final StringProperty autolinkRegexKeyProperty = new SimpleStringProperty("");
- private final ListProperty defaultFileNamePatternsProperty =
- new SimpleListProperty<>(FXCollections.observableArrayList(FilePreferences.DEFAULT_FILENAME_PATTERNS));
+ private final ListProperty defaultFileNamePatternsProperty = new SimpleListProperty<>(FXCollections.observableArrayList(FilePreferences.DEFAULT_FILENAME_PATTERNS));
private final BooleanProperty fulltextIndex = new SimpleBooleanProperty();
- private final StringProperty fileNamePatternProperty = new SimpleStringProperty();
private final StringProperty fileDirectoryPatternProperty = new SimpleStringProperty();
private final BooleanProperty confirmLinkedFileDeleteProperty = new SimpleBooleanProperty();
private final BooleanProperty moveToTrashProperty = new SimpleBooleanProperty();
+ private final ListProperty patternListProperty = new SimpleListProperty<>(FXCollections.observableArrayList());
+ private final ObjectProperty defaultNamePatternProperty = new SimpleObjectProperty<>(
+ new PatternsItemModel(new LinkedFileNamePatternsPanelViewModel.DefaultEntryType(), ""));
+
private final Validator mainFileDirValidator;
private final DialogService dialogService;
@@ -80,19 +87,27 @@ public void setValues() {
useMainFileDirectoryProperty.setValue(!filePreferences.shouldStoreFilesRelativeToBibFile());
useBibLocationAsPrimaryProperty.setValue(filePreferences.shouldStoreFilesRelativeToBibFile());
fulltextIndex.setValue(filePreferences.shouldFulltextIndexLinkedFiles());
- fileNamePatternProperty.setValue(filePreferences.getFileNamePattern());
fileDirectoryPatternProperty.setValue(filePreferences.getFileDirectoryPattern());
confirmLinkedFileDeleteProperty.setValue(filePreferences.confirmDeleteLinkedFile());
moveToTrashProperty.setValue(filePreferences.moveToTrash());
- // Autolink preferences
- switch (autoLinkPreferences.getCitationKeyDependency()) {
- case START -> autolinkFileStartsBibtexProperty.setValue(true);
- case EXACT -> autolinkFileExactBibtexProperty.setValue(true);
- case REGEX -> autolinkUseRegexProperty.setValue(true);
+ autolinkRegexKeyProperty.setValue(autoLinkPreferences.getRegularExpression());
+
+ GlobalLinkedFileNamePatterns newKeyPattern =
+ new GlobalLinkedFileNamePatterns(filePreferences.fileNamePatternProperty().get().getDefaultValue());
+ patternListProperty.forEach(item -> {
+ String patternString = item.getPattern();
+ if (!"default".equals(item.getEntryType().getName())) {
+ if (!patternString.trim().isEmpty()) {
+ newKeyPattern.addLinkedFileNamePattern(item.getEntryType(), patternString);
+ }
+ }
+ });
+ if (!defaultNamePatternProperty.getValue().getPattern().trim().isEmpty()) {
+ newKeyPattern.setDefaultValue(defaultNamePatternProperty.getValue().getPattern());
}
- autolinkRegexKeyProperty.setValue(autoLinkPreferences.getRegularExpression());
+ filePreferences.setFileNamePattern(newKeyPattern);
}
@Override
@@ -100,10 +115,26 @@ public void storeSettings() {
// External files preferences / Attached files preferences / File preferences
filePreferences.setMainFileDirectory(mainFileDirectoryProperty.getValue());
filePreferences.setStoreFilesRelativeToBibFile(useBibLocationAsPrimaryProperty.getValue());
- filePreferences.setFileNamePattern(fileNamePatternProperty.getValue());
filePreferences.setFileDirectoryPattern(fileDirectoryPatternProperty.getValue());
filePreferences.setFulltextIndexLinkedFiles(fulltextIndex.getValue());
+ GlobalLinkedFileNamePatterns newKeyPattern =
+ new GlobalLinkedFileNamePatterns(filePreferences.getKeyPatterns().getDefaultValue());
+ patternListProperty.forEach(item -> {
+ String patternString = item.getPattern();
+ if (!"default".equals(item.getEntryType().getName())) {
+ if (!patternString.trim().isEmpty()) {
+ newKeyPattern.addLinkedFileNamePattern(item.getEntryType(), patternString);
+ }
+ }
+ });
+
+ if (!defaultNamePatternProperty.getValue().getPattern().trim().isEmpty()) {
+ // we do not trim the value at the assignment to enable users to have spaces at the beginning and
+ // at the end of the pattern
+ newKeyPattern.setDefaultValue(defaultNamePatternProperty.getValue().getPattern());
+ }
+
// Autolink preferences
if (autolinkFileStartsBibtexProperty.getValue()) {
autoLinkPreferences.setCitationKeyDependency(AutoLinkPreferences.CitationKeyDependency.START);
@@ -116,6 +147,7 @@ public void storeSettings() {
autoLinkPreferences.setRegularExpression(autolinkRegexKeyProperty.getValue());
filePreferences.confirmDeleteLinkedFile(confirmLinkedFileDeleteProperty.getValue());
filePreferences.moveToTrash(moveToTrashProperty.getValue());
+ filePreferences.setFileNamePattern(newKeyPattern);
}
ValidationStatus mainFileDirValidationStatus() {
@@ -173,10 +205,6 @@ public ListProperty defaultFileNamePatternsProperty() {
return defaultFileNamePatternsProperty;
}
- public StringProperty fileNamePatternProperty() {
- return fileNamePatternProperty;
- }
-
public StringProperty fileDirectoryPatternProperty() {
return fileDirectoryPatternProperty;
}
@@ -192,5 +220,13 @@ public BooleanProperty confirmLinkedFileDeleteProperty() {
public BooleanProperty moveToTrashProperty() {
return this.moveToTrashProperty;
}
+
+ public ListProperty patternListProperty() {
+ return patternListProperty;
+ }
+
+ public ObjectProperty defaultNamePatternProperty() {
+ return defaultNamePatternProperty;
+ }
}
diff --git a/src/main/java/org/jabref/logic/FilePreferences.java b/src/main/java/org/jabref/logic/FilePreferences.java
index 17f469f8f8f..2b811459285 100644
--- a/src/main/java/org/jabref/logic/FilePreferences.java
+++ b/src/main/java/org/jabref/logic/FilePreferences.java
@@ -10,6 +10,7 @@
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
+import org.jabref.logic.linkedfile.GlobalLinkedFileNamePatterns;
import org.jabref.model.strings.StringUtil;
/**
@@ -22,7 +23,6 @@ public class FilePreferences {
private final StringProperty userAndHost = new SimpleStringProperty();
private final SimpleStringProperty mainFileDirectory = new SimpleStringProperty();
private final BooleanProperty storeFilesRelativeToBibFile = new SimpleBooleanProperty();
- private final StringProperty fileNamePattern = new SimpleStringProperty();
private final StringProperty fileDirectoryPattern = new SimpleStringProperty();
private final BooleanProperty downloadLinkedFiles = new SimpleBooleanProperty();
private final BooleanProperty fulltextIndexLinkedFiles = new SimpleBooleanProperty();
@@ -32,11 +32,12 @@ public class FilePreferences {
private final BooleanProperty confirmDeleteLinkedFile = new SimpleBooleanProperty();
private final BooleanProperty moveToTrash = new SimpleBooleanProperty();
private final BooleanProperty shouldKeepDownloadUrl = new SimpleBooleanProperty();
+ private final ObjectProperty keyPatterns = new SimpleObjectProperty<>();
+ private final String defaultPattern;
public FilePreferences(String userAndHost,
String mainFileDirectory,
boolean storeFilesRelativeToBibFile,
- String fileNamePattern,
String fileDirectoryPattern,
boolean downloadLinkedFiles,
boolean fulltextIndexLinkedFiles,
@@ -45,11 +46,12 @@ public FilePreferences(String userAndHost,
Path backupDirectory,
boolean confirmDeleteLinkedFile,
boolean moveToTrash,
- boolean shouldKeepDownloadUrl) {
+ boolean shouldKeepDownloadUrl,
+ GlobalLinkedFileNamePatterns keyPatterns,
+ String defaultPattern) {
this.userAndHost.setValue(userAndHost);
this.mainFileDirectory.setValue(mainFileDirectory);
this.storeFilesRelativeToBibFile.setValue(storeFilesRelativeToBibFile);
- this.fileNamePattern.setValue(fileNamePattern);
this.fileDirectoryPattern.setValue(fileDirectoryPattern);
this.downloadLinkedFiles.setValue(downloadLinkedFiles);
this.fulltextIndexLinkedFiles.setValue(fulltextIndexLinkedFiles);
@@ -59,6 +61,8 @@ public FilePreferences(String userAndHost,
this.confirmDeleteLinkedFile.setValue(confirmDeleteLinkedFile);
this.moveToTrash.setValue(moveToTrash);
this.shouldKeepDownloadUrl.setValue(shouldKeepDownloadUrl);
+ this.keyPatterns.set(keyPatterns);
+ this.defaultPattern = defaultPattern;
}
public String getUserAndHost() {
@@ -97,16 +101,20 @@ public void setStoreFilesRelativeToBibFile(boolean shouldStoreFilesRelativeToBib
this.storeFilesRelativeToBibFile.set(shouldStoreFilesRelativeToBibFile);
}
- public String getFileNamePattern() {
- return fileNamePattern.get();
+ public GlobalLinkedFileNamePatterns getKeyPatterns() {
+ return keyPatterns.get();
+ }
+
+ public ObjectProperty fileNamePatternProperty() {
+ return keyPatterns;
}
- public StringProperty fileNamePatternProperty() {
- return fileNamePattern;
+ public String getFileNamePattern() {
+ return keyPatterns.get().toString();
}
- public void setFileNamePattern(String fileNamePattern) {
- this.fileNamePattern.set(fileNamePattern);
+ public void setFileNamePattern(GlobalLinkedFileNamePatterns fileNamePattern) {
+ this.keyPatterns.set(fileNamePattern);
}
public String getFileDirectoryPattern() {
diff --git a/src/main/java/org/jabref/logic/bibtex/comparator/MetaDataDiff.java b/src/main/java/org/jabref/logic/bibtex/comparator/MetaDataDiff.java
index caf8a053b54..1f565d7c271 100644
--- a/src/main/java/org/jabref/logic/bibtex/comparator/MetaDataDiff.java
+++ b/src/main/java/org/jabref/logic/bibtex/comparator/MetaDataDiff.java
@@ -6,8 +6,8 @@
import java.util.Objects;
import java.util.Optional;
-import org.jabref.logic.citationkeypattern.CitationKeyPattern;
import org.jabref.logic.citationkeypattern.GlobalCitationKeyPatterns;
+import org.jabref.logic.citationkeypattern.KeyPattern;
import org.jabref.logic.groups.DefaultGroupsFactory;
import org.jabref.model.entry.field.Field;
import org.jabref.model.groups.GroupTreeNode;
@@ -48,7 +48,7 @@ public static Optional compare(MetaData originalMetaData, MetaData
return Optional.empty();
} else {
MetaDataDiff diff = new MetaDataDiff(originalMetaData, newMetaData);
- List differences = diff.getDifferences(new GlobalCitationKeyPatterns(CitationKeyPattern.NULL_CITATION_KEY_PATTERN));
+ List differences = diff.getDifferences(new GlobalCitationKeyPatterns(KeyPattern.NULL_PATTERN));
if (differences.isEmpty()) {
return Optional.empty();
}
@@ -136,7 +136,7 @@ public String toString() {
"groupDiff=" + groupDiff +
", originalMetaData=" + originalMetaData +
", newMetaData=" + getNewMetaData() +
- ", getDifferences()=" + getDifferences(new GlobalCitationKeyPatterns(CitationKeyPattern.NULL_CITATION_KEY_PATTERN)) +
+ ", getDifferences()=" + getDifferences(new GlobalCitationKeyPatterns(KeyPattern.NULL_PATTERN)) +
'}';
}
}
diff --git a/src/main/java/org/jabref/logic/citationkeypattern/AbstractCitationKeyPatterns.java b/src/main/java/org/jabref/logic/citationkeypattern/AbstractCitationKeyPatterns.java
index 4a026a5bd5e..c6f3b2cb836 100644
--- a/src/main/java/org/jabref/logic/citationkeypattern/AbstractCitationKeyPatterns.java
+++ b/src/main/java/org/jabref/logic/citationkeypattern/AbstractCitationKeyPatterns.java
@@ -14,12 +14,12 @@
*/
public abstract class AbstractCitationKeyPatterns {
- protected CitationKeyPattern defaultPattern = CitationKeyPattern.NULL_CITATION_KEY_PATTERN;
+ protected KeyPattern defaultPattern = KeyPattern.NULL_PATTERN;
- protected Map data = new HashMap<>();
+ protected Map data = new HashMap<>();
public void addCitationKeyPattern(EntryType type, String pattern) {
- data.put(type, new CitationKeyPattern(pattern));
+ data.put(type, new KeyPattern(pattern));
}
@Override
@@ -57,13 +57,13 @@ public int hashCode() {
* @param entryType a String
* @return the list of Strings for the given key. First entry: the complete key
*/
- public CitationKeyPattern getValue(EntryType entryType) {
- CitationKeyPattern result = data.get(entryType);
+ public KeyPattern getValue(EntryType entryType) {
+ KeyPattern result = data.get(entryType);
// Test to see if we found anything
if (result == null) {
// check default value
result = getDefaultValue();
- if (result == null || CitationKeyPattern.NULL_CITATION_KEY_PATTERN.equals(result)) {
+ if (result == null || KeyPattern.NULL_PATTERN.equals(result)) {
// we are the "last" to ask
// we don't have anything left
return getLastLevelCitationKeyPattern(entryType);
@@ -84,7 +84,7 @@ public final boolean isDefaultValue(EntryType entryType) {
*
* @return null if not available.
*/
- public CitationKeyPattern getDefaultValue() {
+ public KeyPattern getDefaultValue() {
return this.defaultPattern;
}
@@ -95,16 +95,16 @@ public CitationKeyPattern getDefaultValue() {
*/
public void setDefaultValue(String bibtexKeyPattern) {
Objects.requireNonNull(bibtexKeyPattern);
- this.defaultPattern = new CitationKeyPattern(bibtexKeyPattern);
+ this.defaultPattern = new KeyPattern(bibtexKeyPattern);
}
public Set getAllKeys() {
return data.keySet();
}
- public Map getPatterns() {
+ public Map getPatterns() {
return data.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}
- public abstract CitationKeyPattern getLastLevelCitationKeyPattern(EntryType key);
+ public abstract KeyPattern getLastLevelCitationKeyPattern(EntryType key);
}
diff --git a/src/main/java/org/jabref/logic/citationkeypattern/CitationKeyGenerator.java b/src/main/java/org/jabref/logic/citationkeypattern/CitationKeyGenerator.java
index a4eedc7ac18..aac7f33b672 100644
--- a/src/main/java/org/jabref/logic/citationkeypattern/CitationKeyGenerator.java
+++ b/src/main/java/org/jabref/logic/citationkeypattern/CitationKeyGenerator.java
@@ -174,8 +174,8 @@ private String replaceWithRegex(String key) {
private String createCitationKeyFromPattern(BibEntry entry) {
// get the type of entry
EntryType entryType = entry.getType();
- CitationKeyPattern citationKeyPattern = citeKeyPattern.getValue(entryType);
- if (citationKeyPattern == null || CitationKeyPattern.NULL_CITATION_KEY_PATTERN.equals(citationKeyPattern)) {
+ KeyPattern citationKeyPattern = citeKeyPattern.getValue(entryType);
+ if (citationKeyPattern == null || KeyPattern.NULL_PATTERN.equals(citationKeyPattern)) {
return "";
}
return expandBrackets(citationKeyPattern.stringRepresentation(), expandBracketContent(entry));
diff --git a/src/main/java/org/jabref/logic/citationkeypattern/CitationKeyPattern.java b/src/main/java/org/jabref/logic/citationkeypattern/CitationKeyPattern.java
deleted file mode 100644
index 1375b0907b3..00000000000
--- a/src/main/java/org/jabref/logic/citationkeypattern/CitationKeyPattern.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.jabref.logic.citationkeypattern;
-
-import java.lang.reflect.Modifier;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-public record CitationKeyPattern(String stringRepresentation, Category category) {
- public enum Category {
- AUTHOR_RELATED, EDITOR_RELATED, TITLE_RELATED, OTHER_FIELDS, BIBENTRY_FIELDS
- }
-
- public static final CitationKeyPattern NULL_CITATION_KEY_PATTERN = new CitationKeyPattern("", Category.OTHER_FIELDS);
-
- // region - Author-related field markers
- public static final CitationKeyPattern AUTHOR_YEAR = new CitationKeyPattern("[auth_year]", Category.AUTHOR_RELATED);
- public static final CitationKeyPattern AUTHOR_FIRST_FULL = new CitationKeyPattern("[authFirstFull]", Category.AUTHOR_RELATED);
- public static final CitationKeyPattern AUTHOR_FORE_INI = new CitationKeyPattern("[authForeIni]", Category.AUTHOR_RELATED);
- public static final CitationKeyPattern AUTHOR_ETAL = new CitationKeyPattern("[auth.etal]", Category.AUTHOR_RELATED);
- public static final CitationKeyPattern AUTHOR_ET_AL = new CitationKeyPattern("[authEtAl]", Category.AUTHOR_RELATED);
- public static final CitationKeyPattern AUTHOR_AUTH_EA = new CitationKeyPattern("[auth.auth.ea]", Category.AUTHOR_RELATED);
- public static final CitationKeyPattern AUTHORS = new CitationKeyPattern("[authors]", Category.AUTHOR_RELATED);
- public static final CitationKeyPattern AUTHORS_N = new CitationKeyPattern("[authorsN]", Category.AUTHOR_RELATED);
- public static final CitationKeyPattern AUTH_INI_N = new CitationKeyPattern("[authIniN]", Category.AUTHOR_RELATED);
- public static final CitationKeyPattern AUTH_N = new CitationKeyPattern("[authN]", Category.AUTHOR_RELATED);
- public static final CitationKeyPattern AUTH_N_M = new CitationKeyPattern("[authN_M]", Category.AUTHOR_RELATED);
- public static final CitationKeyPattern AUTHOR_INI = new CitationKeyPattern("[authorIni]", Category.AUTHOR_RELATED);
- public static final CitationKeyPattern AUTH_SHORT = new CitationKeyPattern("[authshort]", Category.AUTHOR_RELATED);
- public static final CitationKeyPattern AUTHORS_ALPHA = new CitationKeyPattern("[authorsAlpha]", Category.AUTHOR_RELATED);
- public static final CitationKeyPattern AUTHORS_ALPHA_LNI = new CitationKeyPattern("[authorsAlphaLNI]", Category.AUTHOR_RELATED);
- public static final CitationKeyPattern AUTHORS_LAST = new CitationKeyPattern("[authorsLast]", Category.AUTHOR_RELATED);
- public static final CitationKeyPattern AUTHORS_LAST_FORE_INI = new CitationKeyPattern("[authorsLastForeIni]", Category.AUTHOR_RELATED);
- // endregion
-
- // region - Editor-related field markers
- public static final CitationKeyPattern EDTR = new CitationKeyPattern("[edtr]", Category.EDITOR_RELATED);
- public static final CitationKeyPattern EDTR_INI_N = new CitationKeyPattern("[edtrIniN]", Category.EDITOR_RELATED);
- public static final CitationKeyPattern EDITORS = new CitationKeyPattern("[editors]", Category.EDITOR_RELATED);
- public static final CitationKeyPattern EDITOR_LAST = new CitationKeyPattern("[editorLast]", Category.EDITOR_RELATED);
- public static final CitationKeyPattern EDITOR_INI = new CitationKeyPattern("[editorIni]", Category.EDITOR_RELATED);
- public static final CitationKeyPattern EDTR_N = new CitationKeyPattern("[edtrN]", Category.EDITOR_RELATED);
- public static final CitationKeyPattern EDTR_N_M = new CitationKeyPattern("[edtrN_M]", Category.EDITOR_RELATED);
- public static final CitationKeyPattern EDTR_EDTR_EA = new CitationKeyPattern("[edtr.edtr.ea]", Category.EDITOR_RELATED);
- public static final CitationKeyPattern EDTRSHORT = new CitationKeyPattern("[edtrshort]", Category.EDITOR_RELATED);
- public static final CitationKeyPattern EDTR_FORE_INI = new CitationKeyPattern("[edtrForeIni]", Category.EDITOR_RELATED);
- public static final CitationKeyPattern EDITOR_LAST_FORE_INI = new CitationKeyPattern("[editorLastForeIni]", Category.EDITOR_RELATED);
- // endregion
-
- // region - Title-related field markers
- public static final CitationKeyPattern SHORTTITLE = new CitationKeyPattern("[shorttitle]", Category.TITLE_RELATED);
- public static final CitationKeyPattern SHORTTITLE_INI = new CitationKeyPattern("[shorttitleINI]", Category.TITLE_RELATED);
- public static final CitationKeyPattern VERYSHORTTITLE = new CitationKeyPattern("[veryshorttitle]", Category.TITLE_RELATED);
- public static final CitationKeyPattern CAMEL = new CitationKeyPattern("[camel]", Category.TITLE_RELATED);
- public static final CitationKeyPattern CAMEL_N = new CitationKeyPattern("[camelN]", Category.TITLE_RELATED);
- public static final CitationKeyPattern TITLE = new CitationKeyPattern("[title]", Category.TITLE_RELATED);
- public static final CitationKeyPattern FULLTITLE = new CitationKeyPattern("[fulltitle]", Category.TITLE_RELATED);
- // endregion
-
- // region - Other field markers
- public static final CitationKeyPattern ENTRYTYPE = new CitationKeyPattern("[entrytype]", Category.OTHER_FIELDS);
- public static final CitationKeyPattern FIRSTPAGE = new CitationKeyPattern("[firstpage]", Category.OTHER_FIELDS);
- public static final CitationKeyPattern PAGEPREFIX = new CitationKeyPattern("[pageprefix]", Category.OTHER_FIELDS);
- public static final CitationKeyPattern KEYWORD_N = new CitationKeyPattern("[keywordN]", Category.OTHER_FIELDS);
- public static final CitationKeyPattern KEYWORDS_N = new CitationKeyPattern("[keywordsN]", Category.OTHER_FIELDS);
- public static final CitationKeyPattern LASTPAGE = new CitationKeyPattern("[lastpage]", Category.OTHER_FIELDS);
- public static final CitationKeyPattern SHORTYEAR = new CitationKeyPattern("[shortyear]", Category.OTHER_FIELDS);
- // endregion
-
- // region - Bibentry fields
- public static final CitationKeyPattern AUTHOR = new CitationKeyPattern("[AUTHOR]", Category.BIBENTRY_FIELDS);
- public static final CitationKeyPattern DATE = new CitationKeyPattern("[DATE]", Category.BIBENTRY_FIELDS);
- public static final CitationKeyPattern DAY = new CitationKeyPattern("[DAY]", Category.BIBENTRY_FIELDS);
- public static final CitationKeyPattern GROUPS = new CitationKeyPattern("[GROUPS]", Category.BIBENTRY_FIELDS);
- public static final CitationKeyPattern MONTH = new CitationKeyPattern("[MONTH]", Category.BIBENTRY_FIELDS);
- public static final CitationKeyPattern YEAR = new CitationKeyPattern("[YEAR]", Category.BIBENTRY_FIELDS);
- // endregion
-
- public CitationKeyPattern(String stringRepresentation) {
- this(stringRepresentation, Category.OTHER_FIELDS);
- }
-
- public static List getAllPatterns() {
- return Arrays.stream(CitationKeyPattern.class.getDeclaredFields())
- .filter(field -> {
- int modifiers = field.getModifiers();
- return Modifier.isPublic(modifiers) &&
- Modifier.isStatic(modifiers) &&
- Modifier.isFinal(modifiers) &&
- field.getType() == CitationKeyPattern.class &&
- !field.equals(CitationKeyPattern.NULL_CITATION_KEY_PATTERN);
- })
- .map(field -> {
- try {
- return (CitationKeyPattern) field.get(null);
- } catch (IllegalAccessException e) {
- throw new RuntimeException("Could not access field", e);
- }
- })
- .collect(Collectors.toList());
- }
-
- public Category getCategory() {
- return this.category;
- }
-}
diff --git a/src/main/java/org/jabref/logic/citationkeypattern/DatabaseCitationKeyPatterns.java b/src/main/java/org/jabref/logic/citationkeypattern/DatabaseCitationKeyPatterns.java
index bf7499afcdf..1816a0b9f4f 100644
--- a/src/main/java/org/jabref/logic/citationkeypattern/DatabaseCitationKeyPatterns.java
+++ b/src/main/java/org/jabref/logic/citationkeypattern/DatabaseCitationKeyPatterns.java
@@ -11,7 +11,7 @@ public DatabaseCitationKeyPatterns(GlobalCitationKeyPatterns globalCitationKeyPa
}
@Override
- public CitationKeyPattern getLastLevelCitationKeyPattern(EntryType entryType) {
+ public KeyPattern getLastLevelCitationKeyPattern(EntryType entryType) {
return globalCitationKeyPattern.getValue(entryType);
}
}
diff --git a/src/main/java/org/jabref/logic/citationkeypattern/GlobalCitationKeyPatterns.java b/src/main/java/org/jabref/logic/citationkeypattern/GlobalCitationKeyPatterns.java
index e5b67b10c0d..225cfbbc31a 100644
--- a/src/main/java/org/jabref/logic/citationkeypattern/GlobalCitationKeyPatterns.java
+++ b/src/main/java/org/jabref/logic/citationkeypattern/GlobalCitationKeyPatterns.java
@@ -4,16 +4,16 @@
public class GlobalCitationKeyPatterns extends AbstractCitationKeyPatterns {
- public GlobalCitationKeyPatterns(CitationKeyPattern defaultPattern) {
+ public GlobalCitationKeyPatterns(KeyPattern defaultPattern) {
this.defaultPattern = defaultPattern;
}
public static GlobalCitationKeyPatterns fromPattern(String pattern) {
- return new GlobalCitationKeyPatterns(new CitationKeyPattern(pattern));
+ return new GlobalCitationKeyPatterns(new KeyPattern(pattern));
}
@Override
- public CitationKeyPattern getLastLevelCitationKeyPattern(EntryType entryType) {
+ public KeyPattern getLastLevelCitationKeyPattern(EntryType entryType) {
return defaultPattern;
}
}
diff --git a/src/main/java/org/jabref/logic/citationkeypattern/KeyPattern.java b/src/main/java/org/jabref/logic/citationkeypattern/KeyPattern.java
new file mode 100644
index 00000000000..5dfb1d5107d
--- /dev/null
+++ b/src/main/java/org/jabref/logic/citationkeypattern/KeyPattern.java
@@ -0,0 +1,105 @@
+package org.jabref.logic.citationkeypattern;
+
+import java.lang.reflect.Modifier;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public record KeyPattern(String stringRepresentation, Category category) {
+ public enum Category {
+ AUTHOR_RELATED, EDITOR_RELATED, TITLE_RELATED, OTHER_FIELDS, BIBENTRY_FIELDS
+ }
+
+ public static final KeyPattern NULL_PATTERN = new KeyPattern("", Category.OTHER_FIELDS);
+
+ // region - Author-related field markers
+ public static final KeyPattern AUTHOR_YEAR = new KeyPattern("[auth_year]", Category.AUTHOR_RELATED);
+ public static final KeyPattern AUTHOR_FIRST_FULL = new KeyPattern("[authFirstFull]", Category.AUTHOR_RELATED);
+ public static final KeyPattern AUTHOR_FORE_INI = new KeyPattern("[authForeIni]", Category.AUTHOR_RELATED);
+ public static final KeyPattern AUTHOR_ETAL = new KeyPattern("[auth.etal]", Category.AUTHOR_RELATED);
+ public static final KeyPattern AUTHOR_ET_AL = new KeyPattern("[authEtAl]", Category.AUTHOR_RELATED);
+ public static final KeyPattern AUTHOR_AUTH_EA = new KeyPattern("[auth.auth.ea]", Category.AUTHOR_RELATED);
+ public static final KeyPattern AUTHORS = new KeyPattern("[authors]", Category.AUTHOR_RELATED);
+ public static final KeyPattern AUTHORS_N = new KeyPattern("[authorsN]", Category.AUTHOR_RELATED);
+ public static final KeyPattern AUTH_INI_N = new KeyPattern("[authIniN]", Category.AUTHOR_RELATED);
+ public static final KeyPattern AUTH_N = new KeyPattern("[authN]", Category.AUTHOR_RELATED);
+ public static final KeyPattern AUTH_N_M = new KeyPattern("[authN_M]", Category.AUTHOR_RELATED);
+ public static final KeyPattern AUTHOR_INI = new KeyPattern("[authorIni]", Category.AUTHOR_RELATED);
+ public static final KeyPattern AUTH_SHORT = new KeyPattern("[authshort]", Category.AUTHOR_RELATED);
+ public static final KeyPattern AUTHORS_ALPHA = new KeyPattern("[authorsAlpha]", Category.AUTHOR_RELATED);
+ public static final KeyPattern AUTHORS_ALPHA_LNI = new KeyPattern("[authorsAlphaLNI]", Category.AUTHOR_RELATED);
+ public static final KeyPattern AUTHORS_LAST = new KeyPattern("[authorsLast]", Category.AUTHOR_RELATED);
+ public static final KeyPattern AUTHORS_LAST_FORE_INI = new KeyPattern("[authorsLastForeIni]", Category.AUTHOR_RELATED);
+ // endregion
+
+ // region - Editor-related field markers
+ public static final KeyPattern EDTR = new KeyPattern("[edtr]", Category.EDITOR_RELATED);
+ public static final KeyPattern EDTR_INI_N = new KeyPattern("[edtrIniN]", Category.EDITOR_RELATED);
+ public static final KeyPattern EDITORS = new KeyPattern("[editors]", Category.EDITOR_RELATED);
+ public static final KeyPattern EDITOR_LAST = new KeyPattern("[editorLast]", Category.EDITOR_RELATED);
+ public static final KeyPattern EDITOR_INI = new KeyPattern("[editorIni]", Category.EDITOR_RELATED);
+ public static final KeyPattern EDTR_N = new KeyPattern("[edtrN]", Category.EDITOR_RELATED);
+ public static final KeyPattern EDTR_N_M = new KeyPattern("[edtrN_M]", Category.EDITOR_RELATED);
+ public static final KeyPattern EDTR_EDTR_EA = new KeyPattern("[edtr.edtr.ea]", Category.EDITOR_RELATED);
+ public static final KeyPattern EDTRSHORT = new KeyPattern("[edtrshort]", Category.EDITOR_RELATED);
+ public static final KeyPattern EDTR_FORE_INI = new KeyPattern("[edtrForeIni]", Category.EDITOR_RELATED);
+ public static final KeyPattern EDITOR_LAST_FORE_INI = new KeyPattern("[editorLastForeIni]", Category.EDITOR_RELATED);
+ // endregion
+
+ // region - Title-related field markers
+ public static final KeyPattern SHORTTITLE = new KeyPattern("[shorttitle]", Category.TITLE_RELATED);
+ public static final KeyPattern SHORTTITLE_INI = new KeyPattern("[shorttitleINI]", Category.TITLE_RELATED);
+ public static final KeyPattern VERYSHORTTITLE = new KeyPattern("[veryshorttitle]", Category.TITLE_RELATED);
+ public static final KeyPattern CAMEL = new KeyPattern("[camel]", Category.TITLE_RELATED);
+ public static final KeyPattern CAMEL_N = new KeyPattern("[camelN]", Category.TITLE_RELATED);
+ public static final KeyPattern TITLE = new KeyPattern("[title]", Category.TITLE_RELATED);
+ public static final KeyPattern FULLTITLE = new KeyPattern("[fulltitle]", Category.TITLE_RELATED);
+ // endregion
+
+ // region - Other field markers
+ public static final KeyPattern ENTRYTYPE = new KeyPattern("[entrytype]", Category.OTHER_FIELDS);
+ public static final KeyPattern FIRSTPAGE = new KeyPattern("[firstpage]", Category.OTHER_FIELDS);
+ public static final KeyPattern PAGEPREFIX = new KeyPattern("[pageprefix]", Category.OTHER_FIELDS);
+ public static final KeyPattern KEYWORD_N = new KeyPattern("[keywordN]", Category.OTHER_FIELDS);
+ public static final KeyPattern KEYWORDS_N = new KeyPattern("[keywordsN]", Category.OTHER_FIELDS);
+ public static final KeyPattern LASTPAGE = new KeyPattern("[lastpage]", Category.OTHER_FIELDS);
+ public static final KeyPattern SHORTYEAR = new KeyPattern("[shortyear]", Category.OTHER_FIELDS);
+ // endregion
+
+ // region - Bibentry fields
+ public static final KeyPattern AUTHOR = new KeyPattern("[AUTHOR]", Category.BIBENTRY_FIELDS);
+ public static final KeyPattern DATE = new KeyPattern("[DATE]", Category.BIBENTRY_FIELDS);
+ public static final KeyPattern DAY = new KeyPattern("[DAY]", Category.BIBENTRY_FIELDS);
+ public static final KeyPattern GROUPS = new KeyPattern("[GROUPS]", Category.BIBENTRY_FIELDS);
+ public static final KeyPattern MONTH = new KeyPattern("[MONTH]", Category.BIBENTRY_FIELDS);
+ public static final KeyPattern YEAR = new KeyPattern("[YEAR]", Category.BIBENTRY_FIELDS);
+ // endregion
+
+ public KeyPattern(String stringRepresentation) {
+ this(stringRepresentation, Category.OTHER_FIELDS);
+ }
+
+ public static List getAllPatterns() {
+ return Arrays.stream(KeyPattern.class.getDeclaredFields())
+ .filter(field -> {
+ int modifiers = field.getModifiers();
+ return Modifier.isPublic(modifiers) &&
+ Modifier.isStatic(modifiers) &&
+ Modifier.isFinal(modifiers) &&
+ field.getType() == KeyPattern.class &&
+ !field.equals(KeyPattern.NULL_PATTERN);
+ })
+ .map(field -> {
+ try {
+ return (KeyPattern) field.get(null);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException("Could not access field", e);
+ }
+ })
+ .collect(Collectors.toList());
+ }
+
+ public Category getCategory() {
+ return this.category;
+ }
+}
diff --git a/src/main/java/org/jabref/logic/exporter/MetaDataSerializer.java b/src/main/java/org/jabref/logic/exporter/MetaDataSerializer.java
index f9755996beb..3fdc0fc6dc9 100644
--- a/src/main/java/org/jabref/logic/exporter/MetaDataSerializer.java
+++ b/src/main/java/org/jabref/logic/exporter/MetaDataSerializer.java
@@ -9,8 +9,8 @@
import java.util.TreeMap;
import org.jabref.logic.citationkeypattern.AbstractCitationKeyPatterns;
-import org.jabref.logic.citationkeypattern.CitationKeyPattern;
import org.jabref.logic.citationkeypattern.GlobalCitationKeyPatterns;
+import org.jabref.logic.citationkeypattern.KeyPattern;
import org.jabref.logic.cleanup.FieldFormatterCleanups;
import org.jabref.logic.os.OS;
import org.jabref.model.entry.BibEntryType;
@@ -136,7 +136,7 @@ private static Map> serializeCiteKeyPatterns(MetaData metaD
stringyPattern.put(metaDataKey, data);
}
}
- if ((citationKeyPattern.getDefaultValue() != null) && !citationKeyPattern.getDefaultValue().equals(CitationKeyPattern.NULL_CITATION_KEY_PATTERN)) {
+ if ((citationKeyPattern.getDefaultValue() != null) && !citationKeyPattern.getDefaultValue().equals(KeyPattern.NULL_PATTERN)) {
List data = new ArrayList<>();
data.add(citationKeyPattern.getDefaultValue().stringRepresentation());
stringyPattern.put(MetaData.KEYPATTERNDEFAULT, data);
diff --git a/src/main/java/org/jabref/logic/importer/util/MetaDataParser.java b/src/main/java/org/jabref/logic/importer/util/MetaDataParser.java
index d6bd258d283..8fbc3ce270f 100644
--- a/src/main/java/org/jabref/logic/importer/util/MetaDataParser.java
+++ b/src/main/java/org/jabref/logic/importer/util/MetaDataParser.java
@@ -12,7 +12,7 @@
import java.util.Optional;
import java.util.regex.Pattern;
-import org.jabref.logic.citationkeypattern.CitationKeyPattern;
+import org.jabref.logic.citationkeypattern.KeyPattern;
import org.jabref.logic.cleanup.FieldFormatterCleanup;
import org.jabref.logic.cleanup.FieldFormatterCleanups;
import org.jabref.logic.formatter.bibtexfields.NormalizeDateFormatter;
@@ -103,8 +103,8 @@ public MetaData parse(Map data, Character keywordSeparator) thro
* @return the given metaData instance (which is modified, too)
*/
public MetaData parse(MetaData metaData, Map data, Character keywordSeparator) throws ParseException {
- CitationKeyPattern defaultCiteKeyPattern = CitationKeyPattern.NULL_CITATION_KEY_PATTERN;
- Map nonDefaultCiteKeyPatterns = new HashMap<>();
+ KeyPattern defaultCiteKeyPattern = KeyPattern.NULL_PATTERN;
+ Map nonDefaultCiteKeyPatterns = new HashMap<>();
// process groups (GROUPSTREE and GROUPSTREE_LEGACY) at the very end (otherwise it can happen that not all dependent data are set)
List> entryList = new ArrayList<>(data.entrySet());
@@ -115,7 +115,7 @@ public MetaData parse(MetaData metaData, Map data, Character key
if (entry.getKey().startsWith(MetaData.PREFIX_KEYPATTERN)) {
EntryType entryType = EntryTypeFactory.parse(entry.getKey().substring(MetaData.PREFIX_KEYPATTERN.length()));
- nonDefaultCiteKeyPatterns.put(entryType, new CitationKeyPattern(getSingleItem(values)));
+ nonDefaultCiteKeyPatterns.put(entryType, new KeyPattern(getSingleItem(values)));
} else if (entry.getKey().startsWith(MetaData.SELECTOR_META_PREFIX)) {
// edge case, it might be one special field e.g. article from biblatex-apa, but we can't distinguish this from any other field and rather prefer to handle it as UnknownField
metaData.addContentSelector(ContentSelectors.parse(FieldFactory.parseField(entry.getKey().substring(MetaData.SELECTOR_META_PREFIX.length())), StringUtil.unquote(entry.getValue(), MetaData.ESCAPE_CHARACTER)));
@@ -135,7 +135,7 @@ public MetaData parse(MetaData metaData, Map data, Character key
} else if (MetaData.DATABASE_TYPE.equals(entry.getKey())) {
metaData.setMode(BibDatabaseMode.parse(getSingleItem(values)));
} else if (MetaData.KEYPATTERNDEFAULT.equals(entry.getKey())) {
- defaultCiteKeyPattern = new CitationKeyPattern(getSingleItem(values));
+ defaultCiteKeyPattern = new KeyPattern(getSingleItem(values));
} else if (MetaData.PROTECTED_FLAG_META.equals(entry.getKey())) {
if (Boolean.parseBoolean(getSingleItem(values))) {
metaData.markAsProtected();
@@ -157,7 +157,7 @@ public MetaData parse(MetaData metaData, Map data, Character key
}
}
- if (!defaultCiteKeyPattern.equals(CitationKeyPattern.NULL_CITATION_KEY_PATTERN) || !nonDefaultCiteKeyPatterns.isEmpty()) {
+ if (!defaultCiteKeyPattern.equals(KeyPattern.NULL_PATTERN) || !nonDefaultCiteKeyPatterns.isEmpty()) {
metaData.setCiteKeyPattern(defaultCiteKeyPattern, nonDefaultCiteKeyPatterns);
}
diff --git a/src/main/java/org/jabref/logic/linkedfile/AbstractLinkedFileNamePatterns.java b/src/main/java/org/jabref/logic/linkedfile/AbstractLinkedFileNamePatterns.java
new file mode 100644
index 00000000000..9ee83aca3e3
--- /dev/null
+++ b/src/main/java/org/jabref/logic/linkedfile/AbstractLinkedFileNamePatterns.java
@@ -0,0 +1,111 @@
+package org.jabref.logic.linkedfile;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.jabref.logic.citationkeypattern.KeyPattern;
+import org.jabref.model.entry.types.EntryType;
+
+/**
+ * A small table, where an entry type is associated with a Bibtex key pattern (an
+ * ArrayList
). A parent LinkedFileNamePattern can be set.
+ */
+public abstract class AbstractLinkedFileNamePatterns {
+
+ protected KeyPattern defaultPattern = KeyPattern.NULL_PATTERN;
+
+ protected Map data = new HashMap<>();
+
+ public void addLinkedFileNamePattern(EntryType type, String pattern) {
+ data.put(type, new KeyPattern(pattern));
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder("AbstractLinkedFileNamePattern{");
+ sb.append("defaultPattern=").append(defaultPattern);
+ sb.append(", data=").append(data);
+ sb.append('}');
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if ((o == null) || (getClass() != o.getClass())) {
+ return false;
+ }
+ AbstractLinkedFileNamePatterns that = (AbstractLinkedFileNamePatterns) o;
+ return Objects.equals(defaultPattern, that.defaultPattern) && Objects.equals(data, that.data);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(defaultPattern, data);
+ }
+
+ /**
+ * Gets an object for a desired key from this LinkedFileNamePattern or one of it's parents (in the case of
+ * DatabaseLinkedFileNamePattern). This method first tries to obtain the object from this LinkedFileNamePattern via the
+ * get
method of Hashtable
. If this fails, we try the default.
If that fails, we try
+ * the parent.
If that fails, we return the DEFAULT_LABELPATTERN
+ *
+ * @param entryType a String
+ * @return the list of Strings for the given key. First entry: the complete key
+ */
+ public KeyPattern getValue(EntryType entryType) {
+ KeyPattern result = data.get(entryType);
+ // Test to see if we found anything
+ if (result == null) {
+ // check default value
+ result = getDefaultValue();
+ if (result == null || KeyPattern.NULL_PATTERN.equals(result)) {
+ // we are the "last" to ask
+ // we don't have anything left
+ return getLastLevelLinkedFileNamePattern(entryType);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Checks whether this pattern is customized or the default value.
+ */
+ public final boolean isDefaultValue(EntryType entryType) {
+ return data.get(entryType) == null;
+ }
+
+ /**
+ * This method is called "...Value" to be in line with the other methods
+ *
+ * @return null if not available.
+ */
+ public KeyPattern getDefaultValue() {
+ return this.defaultPattern;
+ }
+
+ /**
+ * Sets the DEFAULT PATTERN for this key pattern
+ *
+ * @param bibtexKeyPattern the pattern to store
+ */
+ public void setDefaultValue(String bibtexKeyPattern) {
+ Objects.requireNonNull(bibtexKeyPattern);
+ this.defaultPattern = new KeyPattern(bibtexKeyPattern);
+ }
+
+ public Set getAllKeys() {
+ return data.keySet();
+ }
+
+ public Map getPatterns() {
+ return data.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+ }
+
+ public abstract KeyPattern getLastLevelLinkedFileNamePattern(EntryType key);
+}
diff --git a/src/main/java/org/jabref/logic/linkedfile/GlobalLinkedFileNamePatterns.java b/src/main/java/org/jabref/logic/linkedfile/GlobalLinkedFileNamePatterns.java
new file mode 100644
index 00000000000..2e9c4fa061d
--- /dev/null
+++ b/src/main/java/org/jabref/logic/linkedfile/GlobalLinkedFileNamePatterns.java
@@ -0,0 +1,20 @@
+package org.jabref.logic.linkedfile;
+
+import org.jabref.logic.citationkeypattern.KeyPattern;
+import org.jabref.model.entry.types.EntryType;
+
+public class GlobalLinkedFileNamePatterns extends AbstractLinkedFileNamePatterns {
+
+ public GlobalLinkedFileNamePatterns(KeyPattern defaultPattern) {
+ this.defaultPattern = defaultPattern;
+ }
+
+ public static GlobalLinkedFileNamePatterns fromPattern(String pattern) {
+ return new GlobalLinkedFileNamePatterns(new KeyPattern(pattern));
+ }
+
+ @Override
+ public KeyPattern getLastLevelLinkedFileNamePattern(EntryType entryType) {
+ return defaultPattern;
+ }
+}
diff --git a/src/main/java/org/jabref/logic/linkedfile/LinkedFileNamePatternPreferences.java b/src/main/java/org/jabref/logic/linkedfile/LinkedFileNamePatternPreferences.java
new file mode 100644
index 00000000000..f4df1ecf8fc
--- /dev/null
+++ b/src/main/java/org/jabref/logic/linkedfile/LinkedFileNamePatternPreferences.java
@@ -0,0 +1,30 @@
+package org.jabref.logic.linkedfile;
+
+import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.SimpleObjectProperty;
+
+public class LinkedFileNamePatternPreferences {
+
+ private final ObjectProperty namePatterns = new SimpleObjectProperty<>();
+ private final String defaultPattern;
+
+ public LinkedFileNamePatternPreferences(String defaultPattern) {
+ this.defaultPattern = defaultPattern;
+ }
+
+ public GlobalLinkedFileNamePatterns getNamePatterns() {
+ return namePatterns.get();
+ }
+
+ public ObjectProperty namePatternsProperty() {
+ return namePatterns;
+ }
+
+ public void setNamePatterns(GlobalLinkedFileNamePatterns namePatterns) {
+ this.namePatterns.set(namePatterns);
+ }
+
+ public String getDefaultPattern() {
+ return defaultPattern;
+ }
+}
diff --git a/src/main/java/org/jabref/logic/preferences/CliPreferences.java b/src/main/java/org/jabref/logic/preferences/CliPreferences.java
index 0d39cdf55a1..b5487045314 100644
--- a/src/main/java/org/jabref/logic/preferences/CliPreferences.java
+++ b/src/main/java/org/jabref/logic/preferences/CliPreferences.java
@@ -21,6 +21,7 @@
import org.jabref.logic.journals.JournalAbbreviationPreferences;
import org.jabref.logic.layout.LayoutFormatterPreferences;
import org.jabref.logic.layout.format.NameFormatterPreferences;
+import org.jabref.logic.linkedfile.LinkedFileNamePatternPreferences;
import org.jabref.logic.net.ProxyPreferences;
import org.jabref.logic.net.ssl.SSLPreferences;
import org.jabref.logic.openoffice.OpenOfficePreferences;
@@ -93,6 +94,8 @@ public interface CliPreferences {
SSLPreferences getSSLPreferences();
+ LinkedFileNamePatternPreferences getLinkedFileNamePatternPreferences();
+
CitationKeyPatternPreferences getCitationKeyPatternPreferences();
AutoLinkPreferences getAutoLinkPreferences();
diff --git a/src/main/java/org/jabref/logic/preferences/JabRefCliPreferences.java b/src/main/java/org/jabref/logic/preferences/JabRefCliPreferences.java
index b350ebebb24..b3b8fa95f72 100644
--- a/src/main/java/org/jabref/logic/preferences/JabRefCliPreferences.java
+++ b/src/main/java/org/jabref/logic/preferences/JabRefCliPreferences.java
@@ -40,9 +40,9 @@
import org.jabref.logic.ai.AiPreferences;
import org.jabref.logic.ai.templates.AiTemplate;
import org.jabref.logic.bibtex.FieldPreferences;
-import org.jabref.logic.citationkeypattern.CitationKeyPattern;
import org.jabref.logic.citationkeypattern.CitationKeyPatternPreferences;
import org.jabref.logic.citationkeypattern.GlobalCitationKeyPatterns;
+import org.jabref.logic.citationkeypattern.KeyPattern;
import org.jabref.logic.citationstyle.CitationStyle;
import org.jabref.logic.cleanup.CleanupPreferences;
import org.jabref.logic.cleanup.FieldFormatterCleanups;
@@ -71,6 +71,8 @@
import org.jabref.logic.l10n.Localization;
import org.jabref.logic.layout.LayoutFormatterPreferences;
import org.jabref.logic.layout.format.NameFormatterPreferences;
+import org.jabref.logic.linkedfile.GlobalLinkedFileNamePatterns;
+import org.jabref.logic.linkedfile.LinkedFileNamePatternPreferences;
import org.jabref.logic.net.ProxyPreferences;
import org.jabref.logic.net.ssl.SSLPreferences;
import org.jabref.logic.net.ssl.TrustStoreManager;
@@ -226,6 +228,8 @@ public class JabRefCliPreferences implements CliPreferences {
public static final String GROBID_PREFERENCE = "grobidPreference";
public static final String GROBID_URL = "grobidURL";
+ public static final String DEFAULT_LINKED_FILE_NAME_PATTERN = "defaultLinkedFileNamePattern";
+
public static final String DEFAULT_CITATION_KEY_PATTERN = "defaultBibtexKeyPattern";
public static final String UNWANTED_CITATION_KEY_CHARACTERS = "defaultUnwantedBibtexKeyCharacters";
public static final String CONFIRM_LINKED_FILE_DELETE = "confirmLinkedFileDelete";
@@ -277,6 +281,8 @@ public class JabRefCliPreferences implements CliPreferences {
public static final String OO_CURRENT_STYLE = "ooCurrentStyle";
public static final String OO_ALWAYS_ADD_CITED_ON_PAGES = "ooAlwaysAddCitedOnPages";
+ // Prefs node for LinkedFileNamePatterns
+ public static final String LINKED_FILE_NAME_PATTERNS_NODE = "bibtexkeypatterns";
// Prefs node for CitationKeyPatterns
public static final String CITATION_KEY_PATTERNS_NODE = "bibtexkeypatterns";
// Prefs node for customized entry types
@@ -416,6 +422,7 @@ public class JabRefCliPreferences implements CliPreferences {
private InternalPreferences internalPreferences;
private XmpPreferences xmpPreferences;
private CleanupPreferences cleanupPreferences;
+ private LinkedFileNamePatternPreferences linkedFileNamePatternPreferences;
private CitationKeyPatternPreferences citationKeyPatternPreferences;
private JournalAbbreviationPreferences journalAbbreviationPreferences;
private FieldPreferences fieldPreferences;
@@ -576,6 +583,7 @@ protected JabRefCliPreferences() {
defaults.put(WARN_BEFORE_OVERWRITING_KEY, Boolean.TRUE);
defaults.put(CONFIRM_LINKED_FILE_DELETE, Boolean.TRUE);
defaults.put(KEEP_DOWNLOAD_URL, Boolean.TRUE);
+ defaults.put(DEFAULT_LINKED_FILE_NAME_PATTERN, "[auth][year]");
defaults.put(DEFAULT_CITATION_KEY_PATTERN, "[auth][year]");
defaults.put(UNWANTED_CITATION_KEY_CHARACTERS, "-`สน:!;?^");
defaults.put(RESOLVE_STRINGS_FOR_FIELDS, "author;booktitle;editor;editora;editorb;editorc;institution;issuetitle;journal;journalsubtitle;journaltitle;mainsubtitle;month;publisher;shortauthor;shorteditor;subtitle;titleaddon");
@@ -840,6 +848,7 @@ private Path getPath(String key, Path defaultValue) {
public void clear() throws BackingStoreException {
clearAllBibEntryTypes();
clearCitationKeyPatterns();
+ clearLinkedFileNamePatterns();
clearTruststoreFromCustomCertificates();
clearCustomFetcherKeys();
prefs.clear();
@@ -1322,6 +1331,73 @@ public SSLPreferences getSSLPreferences() {
return sslPreferences;
}
+ //*************************************************************************************************************
+ // LinkedFileNamePatternPreferences
+ //*************************************************************************************************************
+
+ private GlobalLinkedFileNamePatterns getGlobalLinkedFileNamePattern() {
+ GlobalLinkedFileNamePatterns linkedFileNamePattern = GlobalLinkedFileNamePatterns.fromPattern(get(DEFAULT_LINKED_FILE_NAME_PATTERN));
+ Preferences preferences = PREFS_NODE.node(LINKED_FILE_NAME_PATTERNS_NODE);
+ try {
+ String[] keys = preferences.keys();
+ for (String key : keys) {
+ linkedFileNamePattern.addLinkedFileNamePattern(
+ EntryTypeFactory.parse(key),
+ preferences.get(key, null));
+ }
+ } catch (BackingStoreException ex) {
+ LOGGER.info("BackingStoreException in JabRefPreferences.getKeyPattern", ex);
+ }
+
+ return linkedFileNamePattern;
+ }
+
+ // public for use in PreferenceMigrations
+ public void storeGlobalLinkedFileNamePattern(GlobalLinkedFileNamePatterns pattern) {
+ if ((pattern.getDefaultValue() == null)
+ || pattern.getDefaultValue().equals(KeyPattern.NULL_PATTERN)) {
+ put(DEFAULT_LINKED_FILE_NAME_PATTERN, "");
+ } else {
+ put(DEFAULT_LINKED_FILE_NAME_PATTERN, pattern.getDefaultValue().stringRepresentation());
+ }
+
+ // Store overridden definitions to Preferences.
+ Preferences preferences = PREFS_NODE.node(LINKED_FILE_NAME_PATTERNS_NODE);
+ try {
+ preferences.clear(); // We remove all old entries.
+ } catch (BackingStoreException ex) {
+ LOGGER.info("BackingStoreException in JabRefPreferences::putKeyPattern", ex);
+ }
+
+ for (EntryType entryType : pattern.getAllKeys()) {
+ if (!pattern.isDefaultValue(entryType)) {
+ // first entry in the map is the full pattern
+ preferences.put(entryType.getName(), pattern.getValue(entryType).stringRepresentation());
+ }
+ }
+ }
+
+ private void clearLinkedFileNamePatterns() throws BackingStoreException {
+ Preferences preferences = PREFS_NODE.node(LINKED_FILE_NAME_PATTERNS_NODE);
+ preferences.clear();
+ getLinkedFileNamePatternPreferences().setNamePatterns(getGlobalLinkedFileNamePattern());
+ }
+
+ @Override
+ public LinkedFileNamePatternPreferences getLinkedFileNamePatternPreferences() {
+ if (linkedFileNamePatternPreferences != null) {
+ return linkedFileNamePatternPreferences;
+ }
+
+ linkedFileNamePatternPreferences = new LinkedFileNamePatternPreferences(
+ (String) defaults.get(DEFAULT_LINKED_FILE_NAME_PATTERN));
+
+ EasyBind.listen(linkedFileNamePatternPreferences.namePatternsProperty(),
+ (obs, oldValue, newValue) -> storeGlobalLinkedFileNamePattern(newValue));
+
+ return linkedFileNamePatternPreferences;
+ }
+
//*************************************************************************************************************
// CitationKeyPatternPreferences
//*************************************************************************************************************
@@ -1346,7 +1422,7 @@ private GlobalCitationKeyPatterns getGlobalCitationKeyPattern() {
// public for use in PreferenceMigrations
public void storeGlobalCitationKeyPattern(GlobalCitationKeyPatterns pattern) {
if ((pattern.getDefaultValue() == null)
- || pattern.getDefaultValue().equals(CitationKeyPattern.NULL_CITATION_KEY_PATTERN)) {
+ || pattern.getDefaultValue().equals(KeyPattern.NULL_PATTERN)) {
put(DEFAULT_CITATION_KEY_PATTERN, "");
} else {
put(DEFAULT_CITATION_KEY_PATTERN, pattern.getDefaultValue().stringRepresentation());
@@ -1543,7 +1619,6 @@ public FilePreferences getFilePreferences() {
getInternalPreferences().getUserAndHost(),
getPath(MAIN_FILE_DIRECTORY, getDefaultPath()).toString(),
getBoolean(STORE_RELATIVE_TO_BIB),
- get(IMPORT_FILENAMEPATTERN),
get(IMPORT_FILEDIRPATTERN),
getBoolean(DOWNLOAD_LINKED_FILES),
getBoolean(FULLTEXT_INDEX_LINKED_FILES),
@@ -1554,12 +1629,14 @@ public FilePreferences getFilePreferences() {
getBoolean(CONFIRM_LINKED_FILE_DELETE),
// We make use of the fallback, because we need AWT being initialized, which is not the case at the constructor JabRefPreferences()
getBoolean(TRASH_INSTEAD_OF_DELETE, moveToTrashSupported()),
- getBoolean(KEEP_DOWNLOAD_URL));
+ getBoolean(KEEP_DOWNLOAD_URL),
+ getGlobalLinkedFileNamePattern(),
+ (String) defaults.get(DEFAULT_LINKED_FILE_NAME_PATTERN));
EasyBind.listen(getInternalPreferences().getUserAndHostProperty(), (obs, oldValue, newValue) -> filePreferences.getUserAndHostProperty().setValue(newValue));
EasyBind.listen(filePreferences.mainFileDirectoryProperty(), (obs, oldValue, newValue) -> put(MAIN_FILE_DIRECTORY, newValue));
EasyBind.listen(filePreferences.storeFilesRelativeToBibFileProperty(), (obs, oldValue, newValue) -> putBoolean(STORE_RELATIVE_TO_BIB, newValue));
- EasyBind.listen(filePreferences.fileNamePatternProperty(), (obs, oldValue, newValue) -> put(IMPORT_FILENAMEPATTERN, newValue));
+ EasyBind.listen(filePreferences.fileNamePatternProperty(), (obs, oldValue, newValue) -> storeGlobalLinkedFileNamePattern(newValue));
EasyBind.listen(filePreferences.fileDirectoryPatternProperty(), (obs, oldValue, newValue) -> put(IMPORT_FILEDIRPATTERN, newValue));
EasyBind.listen(filePreferences.downloadLinkedFilesProperty(), (obs, oldValue, newValue) -> putBoolean(DOWNLOAD_LINKED_FILES, newValue));
EasyBind.listen(filePreferences.fulltextIndexLinkedFilesProperty(), (obs, oldValue, newValue) -> putBoolean(FULLTEXT_INDEX_LINKED_FILES, newValue));
diff --git a/src/main/java/org/jabref/migrations/PreferencesMigrations.java b/src/main/java/org/jabref/migrations/PreferencesMigrations.java
index 10d0eb4e30f..8c3e97458f0 100644
--- a/src/main/java/org/jabref/migrations/PreferencesMigrations.java
+++ b/src/main/java/org/jabref/migrations/PreferencesMigrations.java
@@ -68,6 +68,7 @@ public static void runMigrations(JabRefGuiPreferences preferences) {
upgradeCleanups(preferences);
moveApiKeysToKeyring(preferences);
removeCommentsFromCustomEditorTabs(preferences);
+ upgradeFileImportPatternToLinkedFileNamePattern(preferences, mainPrefsNode);
}
/**
@@ -555,4 +556,22 @@ static void moveApiKeysToKeyring(JabRefCliPreferences preferences) {
static void removeCommentsFromCustomEditorTabs(GuiPreferences preferences) {
preferences.getEntryEditorPreferences().getEntryEditorTabs().remove("Comments");
}
+
+ /**
+ * Migrated from a single file name pattern to a file name pattern for each type.
+ */
+ private static void upgradeFileImportPatternToLinkedFileNamePattern(JabRefCliPreferences prefs, Preferences mainPrefsNode) {
+ String preferenceFileNamePattern = mainPrefsNode.get(JabRefCliPreferences.IMPORT_FILENAMEPATTERN, null);
+
+ GlobalCitationKeyPatterns keyPattern = GlobalCitationKeyPatterns.fromPattern(
+ prefs.get(JabRefCliPreferences.DEFAULT_CITATION_KEY_PATTERN));
+
+ if (preferenceFileNamePattern != null) {
+ mainPrefsNode.put(JabRefCliPreferences.LINKED_FILE_NAME_PATTERNS_NODE, "[auth_year]");
+ if (prefs.hasKey(JabRefCliPreferences.IMPORT_FILENAMEPATTERN)) {
+ prefs.put(JabRefCliPreferences.LINKED_FILE_NAME_PATTERNS_NODE, "[auth_year]");
+ LOGGER.info("migrated single file name pattern to file name pattern for each type");
+ }
+ }
+ }
}
diff --git a/src/main/java/org/jabref/model/metadata/MetaData.java b/src/main/java/org/jabref/model/metadata/MetaData.java
index c7be01ce09b..d5fc18f84c9 100644
--- a/src/main/java/org/jabref/model/metadata/MetaData.java
+++ b/src/main/java/org/jabref/model/metadata/MetaData.java
@@ -15,9 +15,9 @@
import org.jabref.architecture.AllowedToUseLogic;
import org.jabref.logic.citationkeypattern.AbstractCitationKeyPatterns;
-import org.jabref.logic.citationkeypattern.CitationKeyPattern;
import org.jabref.logic.citationkeypattern.DatabaseCitationKeyPatterns;
import org.jabref.logic.citationkeypattern.GlobalCitationKeyPatterns;
+import org.jabref.logic.citationkeypattern.KeyPattern;
import org.jabref.logic.cleanup.FieldFormatterCleanups;
import org.jabref.logic.util.Version;
import org.jabref.model.database.BibDatabaseMode;
@@ -149,22 +149,22 @@ public AbstractCitationKeyPatterns getCiteKeyPatterns(GlobalCitationKeyPatterns
public void setCiteKeyPattern(AbstractCitationKeyPatterns bibtexKeyPatterns) {
Objects.requireNonNull(bibtexKeyPatterns);
- CitationKeyPattern defaultValue = bibtexKeyPatterns.getDefaultValue();
- Map nonDefaultPatterns = bibtexKeyPatterns.getPatterns();
+ KeyPattern defaultValue = bibtexKeyPatterns.getDefaultValue();
+ Map nonDefaultPatterns = bibtexKeyPatterns.getPatterns();
setCiteKeyPattern(defaultValue, nonDefaultPatterns);
}
- public void setCiteKeyPattern(CitationKeyPattern defaultValue, Map nonDefaultPatterns) {
+ public void setCiteKeyPattern(KeyPattern defaultValue, Map nonDefaultPatterns) {
// Remove all patterns from metadata
citeKeyPatterns.clear();
// Set new value if it is not a default value
- for (Map.Entry pattern : nonDefaultPatterns.entrySet()) {
+ for (Map.Entry pattern : nonDefaultPatterns.entrySet()) {
citeKeyPatterns.put(pattern.getKey(), pattern.getValue().stringRepresentation());
}
// Store default pattern
- if (defaultValue.equals(CitationKeyPattern.NULL_CITATION_KEY_PATTERN)) {
+ if (defaultValue.equals(KeyPattern.NULL_PATTERN)) {
defaultCiteKeyPattern = null;
} else {
defaultCiteKeyPattern = defaultValue.stringRepresentation();
diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties
index e7496463445..3bdba0c0aee 100644
--- a/src/main/resources/l10n/JabRef_en.properties
+++ b/src/main/resources/l10n/JabRef_en.properties
@@ -1116,7 +1116,6 @@ exportFormat=exportFormat
Output\ file\ missing=Output file missing
The\ output\ option\ depends\ on\ a\ valid\ input\ option.=The output option depends on a valid input option.
Linked\ file\ name\ conventions=Linked file name conventions
-Filename\ format\ pattern=Filename format pattern
Filename\ format\ pattern\ (from\ preferences)=Filename format pattern (from preferences)
Additional\ parameters=Additional parameters
Cite\ selected\ entries\ between\ parenthesis=Cite selected entries between parenthesis
@@ -1186,7 +1185,6 @@ Could\ not\ open\ %0=Could not open %0
Unknown\ import\ format=Unknown import format
Style\ selection=Style selection
No\ valid\ style\ file\ defined=No valid style file defined
-Choose\ pattern=Choose pattern
Search\ and\ store\ files\ relative\ to\ library\ file\ location=Search and store files relative to library file location
File\ directory=File directory
@@ -1893,7 +1891,6 @@ This\ might\ be\ caused\ by\ reaching\ the\ traffic\ limitation\ of\ Google\ Sch
Could\ not\ open\ website.=Could not open website.
Problem\ downloading\ from\ %1=Problem downloading from %1
-File\ directory\ pattern=File directory pattern
Update\ with\ bibliographic\ information\ from\ the\ web=Update with bibliographic information from the web
Could\ not\ find\ any\ bibliographic\ information.=Could not find any bibliographic information.
diff --git a/src/test/java/org/jabref/logic/citationkeypattern/AbstractCitationKeyPatternsTest.java b/src/test/java/org/jabref/logic/citationkeypattern/AbstractCitationKeyPatternsTest.java
index 47c2666610b..dab7db67796 100644
--- a/src/test/java/org/jabref/logic/citationkeypattern/AbstractCitationKeyPatternsTest.java
+++ b/src/test/java/org/jabref/logic/citationkeypattern/AbstractCitationKeyPatternsTest.java
@@ -16,7 +16,7 @@ void AbstractCitationKeyPatternParse() {
AbstractCitationKeyPatterns pattern = mock(AbstractCitationKeyPatterns.class, Mockito.CALLS_REAL_METHODS);
pattern.setDefaultValue("[field1]spacer1[field2]spacer2[field3]");
- CitationKeyPattern expectedPattern = new CitationKeyPattern("[field1]spacer1[field2]spacer2[field3]");
+ KeyPattern expectedPattern = new KeyPattern("[field1]spacer1[field2]spacer2[field3]");
assertEquals(expectedPattern, pattern.getDefaultValue());
}
@@ -25,7 +25,7 @@ void AbstractCitationKeyPatternParseEmptySpacer() {
AbstractCitationKeyPatterns pattern = mock(AbstractCitationKeyPatterns.class, Mockito.CALLS_REAL_METHODS);
pattern.setDefaultValue("[field1][field2]spacer2[field3]");
- CitationKeyPattern expectedPattern = new CitationKeyPattern("[field1][field2]spacer2[field3]");
+ KeyPattern expectedPattern = new KeyPattern("[field1][field2]spacer2[field3]");
assertEquals(expectedPattern, pattern.getDefaultValue());
}
}
diff --git a/src/test/java/org/jabref/logic/citationkeypattern/MakeLabelWithoutDatabaseTest.java b/src/test/java/org/jabref/logic/citationkeypattern/MakeLabelWithoutDatabaseTest.java
index 61d98eccb92..101357e9ed8 100644
--- a/src/test/java/org/jabref/logic/citationkeypattern/MakeLabelWithoutDatabaseTest.java
+++ b/src/test/java/org/jabref/logic/citationkeypattern/MakeLabelWithoutDatabaseTest.java
@@ -22,7 +22,7 @@ class MakeLabelWithoutDatabaseTest {
@BeforeEach
void setUp() {
- GlobalCitationKeyPatterns keyPattern = new GlobalCitationKeyPatterns(CitationKeyPattern.NULL_CITATION_KEY_PATTERN);
+ GlobalCitationKeyPatterns keyPattern = new GlobalCitationKeyPatterns(KeyPattern.NULL_PATTERN);
keyPattern.setDefaultValue("[auth]");
patternPreferences = new CitationKeyPatternPreferences(
false,