diff --git a/CHANGELOG.md b/CHANGELOG.md index 14d5f1a561a..affa6d36241 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,8 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve - We added support for parsing MathML in the Medline importer. [#4273](https://github.com/JabRef/jabref/issues/4273) - We added the ability to search for a DOI directly from 'Web Search'. [#9674](https://github.com/JabRef/jabref/issues/9674) - We added a cleanup activity that identifies a URL in the `note` field and moves it to the `url` field. [koppor#216](https://github.com/koppor/jabref/issues/216) +- We enabled the user to change the name of a field in a custom entry type by double-clicking on it. [#9840](https://github.com/JabRef/jabref/issues/9840) + ### Changed diff --git a/src/main/java/org/jabref/gui/preferences/customentrytypes/CustomEntryTypesTab.java b/src/main/java/org/jabref/gui/preferences/customentrytypes/CustomEntryTypesTab.java index 266e538874d..5cea7fded54 100644 --- a/src/main/java/org/jabref/gui/preferences/customentrytypes/CustomEntryTypesTab.java +++ b/src/main/java/org/jabref/gui/preferences/customentrytypes/CustomEntryTypesTab.java @@ -2,6 +2,7 @@ import javafx.application.Platform; import javafx.beans.property.ReadOnlyStringWrapper; +import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.Group; import javafx.scene.control.Button; @@ -12,6 +13,7 @@ import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.control.cell.CheckBoxTableCell; +import javafx.scene.control.cell.TextFieldTableCell; import javafx.scene.input.ClipboardContent; import javafx.scene.input.DragEvent; import javafx.scene.input.Dragboard; @@ -33,6 +35,8 @@ import org.jabref.model.database.BibDatabaseMode; import org.jabref.model.entry.BibEntryTypesManager; import org.jabref.model.entry.field.Field; +import org.jabref.model.entry.field.UnknownField; +import org.jabref.model.strings.StringUtil; import com.airhacks.afterburner.views.ViewLoader; import com.tobiasdiez.easybind.EasyBind; @@ -143,6 +147,29 @@ private void setupEntryTypesTable() { private void setupFieldsTable() { fieldNameColumn.setCellValueFactory(item -> item.getValue().nameProperty()); + fieldNameColumn.setCellFactory(TextFieldTableCell.forTableColumn()); + fieldNameColumn.setEditable(true); + fieldNameColumn.setOnEditCommit( + (TableColumn.CellEditEvent event) -> { + // This makes the displayed name consistent to org.jabref.model.entry.field.Field #getDisplayName() + String newFieldValue = StringUtil.capitalizeFirst(event.getNewValue()); + UnknownField field = (UnknownField) event.getRowValue().getField(); + EntryTypeViewModel selectedEntryType = viewModel.selectedEntryTypeProperty().get(); + ObservableList entryFields = selectedEntryType.fields(); + // The first predicate will check if the user input the original field name or doesn't edit anything after double click + boolean fieldExists = !newFieldValue.equals(field.getDisplayName()) && entryFields.stream().anyMatch(fieldViewModel -> + fieldViewModel.nameProperty().getValue().equalsIgnoreCase(newFieldValue)); + + if (fieldExists) { + dialogService.notify(Localization.lang("Unable to change field name. \"%0\" already in use.", newFieldValue)); + event.getTableView().edit(-1, null); + event.getTableView().refresh(); + } else { + event.getRowValue().setField(newFieldValue); + field.setName(newFieldValue); + event.getTableView().refresh(); + } + }); fieldTypeColumn.setCellFactory(CheckBoxTableCell.forTableColumn(fieldTypeColumn)); fieldTypeColumn.setCellValueFactory(item -> item.getValue().requiredProperty()); diff --git a/src/main/java/org/jabref/gui/preferences/customentrytypes/FieldViewModel.java b/src/main/java/org/jabref/gui/preferences/customentrytypes/FieldViewModel.java index 0cfae0c826d..2f9fb0741fd 100644 --- a/src/main/java/org/jabref/gui/preferences/customentrytypes/FieldViewModel.java +++ b/src/main/java/org/jabref/gui/preferences/customentrytypes/FieldViewModel.java @@ -70,6 +70,10 @@ public FieldPriority getPriority() { return priorityProperty.getValue(); } + public void setField(String field) { + this.fieldName.setValue(field); + } + public BibField toBibField() { return new BibField(field, priorityProperty.getValue()); } diff --git a/src/main/java/org/jabref/model/entry/field/UnknownField.java b/src/main/java/org/jabref/model/entry/field/UnknownField.java index f1de44ce00a..2d9bca32eaf 100644 --- a/src/main/java/org/jabref/model/entry/field/UnknownField.java +++ b/src/main/java/org/jabref/model/entry/field/UnknownField.java @@ -6,7 +6,7 @@ import java.util.Set; public class UnknownField implements Field { - private final String name; + private String name; private final Set properties; public UnknownField(String name) { @@ -29,6 +29,10 @@ public String getName() { return name; } + public void setName(String name) { + this.name = name; + } + @Override public boolean isStandardField() { return false; diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 2b42a9f85d8..36874bf9637 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -275,6 +275,8 @@ duplicate\ removal=duplicate removal Duplicate\ fields=Duplicate fields +Unable\ to\ change\ field\ name\.\ "%0"\ already\ in\ use.=Unable to change field name. "%0" already in use. + Duplicate\ string\ name=Duplicate string name Duplicates\ found=Duplicates found