|
2 | 2 |
|
3 | 3 | import javafx.application.Platform;
|
4 | 4 | import javafx.beans.property.ReadOnlyStringWrapper;
|
| 5 | +import javafx.collections.ObservableList; |
5 | 6 | import javafx.fxml.FXML;
|
6 | 7 | import javafx.scene.Group;
|
7 | 8 | import javafx.scene.control.Button;
|
|
12 | 13 | import javafx.scene.control.TableView;
|
13 | 14 | import javafx.scene.control.TextField;
|
14 | 15 | import javafx.scene.control.cell.CheckBoxTableCell;
|
| 16 | +import javafx.scene.control.cell.TextFieldTableCell; |
15 | 17 | import javafx.scene.input.ClipboardContent;
|
16 | 18 | import javafx.scene.input.DragEvent;
|
17 | 19 | import javafx.scene.input.Dragboard;
|
|
33 | 35 | import org.jabref.model.database.BibDatabaseMode;
|
34 | 36 | import org.jabref.model.entry.BibEntryTypesManager;
|
35 | 37 | import org.jabref.model.entry.field.Field;
|
| 38 | +import org.jabref.model.entry.field.UnknownField; |
| 39 | +import org.jabref.model.strings.StringUtil; |
36 | 40 |
|
37 | 41 | import com.airhacks.afterburner.views.ViewLoader;
|
38 | 42 | import com.tobiasdiez.easybind.EasyBind;
|
@@ -143,6 +147,29 @@ private void setupEntryTypesTable() {
|
143 | 147 |
|
144 | 148 | private void setupFieldsTable() {
|
145 | 149 | fieldNameColumn.setCellValueFactory(item -> item.getValue().nameProperty());
|
| 150 | + fieldNameColumn.setCellFactory(TextFieldTableCell.forTableColumn()); |
| 151 | + fieldNameColumn.setEditable(true); |
| 152 | + fieldNameColumn.setOnEditCommit( |
| 153 | + (TableColumn.CellEditEvent<FieldViewModel, String> event) -> { |
| 154 | + // This makes the displayed name consistent to org.jabref.model.entry.field.Field #getDisplayName() |
| 155 | + String newFieldValue = StringUtil.capitalizeFirst(event.getNewValue()); |
| 156 | + UnknownField field = (UnknownField) event.getRowValue().getField(); |
| 157 | + EntryTypeViewModel selectedEntryType = viewModel.selectedEntryTypeProperty().get(); |
| 158 | + ObservableList<FieldViewModel> entryFields = selectedEntryType.fields(); |
| 159 | + // The first predicate will check if the user input the original field name or doesn't edit anything after double click |
| 160 | + boolean fieldExists = !newFieldValue.equals(field.getDisplayName()) && entryFields.stream().anyMatch(fieldViewModel -> |
| 161 | + fieldViewModel.nameProperty().getValue().equalsIgnoreCase(newFieldValue)); |
| 162 | + |
| 163 | + if (fieldExists) { |
| 164 | + dialogService.notify(Localization.lang("Unable to change field name. \"%0\" already in use.", newFieldValue)); |
| 165 | + event.getTableView().edit(-1, null); |
| 166 | + event.getTableView().refresh(); |
| 167 | + } else { |
| 168 | + event.getRowValue().setField(newFieldValue); |
| 169 | + field.setName(newFieldValue); |
| 170 | + event.getTableView().refresh(); |
| 171 | + } |
| 172 | + }); |
146 | 173 |
|
147 | 174 | fieldTypeColumn.setCellFactory(CheckBoxTableCell.forTableColumn(fieldTypeColumn));
|
148 | 175 | fieldTypeColumn.setCellValueFactory(item -> item.getValue().requiredProperty());
|
|
0 commit comments