From 4a2737f0c2d0db8cda253ca80433fa2e635e5dd7 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sat, 21 Mar 2020 21:04:05 +0100 Subject: [PATCH 01/39] [WIP] allow Reordering of custom entry types fields --- .../jabref/gui/DragAndDropDataFormats.java | 1 + .../CustomizeEntryTypeDialogView.java | 80 +++++++++++++++++-- 2 files changed, 73 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/jabref/gui/DragAndDropDataFormats.java b/src/main/java/org/jabref/gui/DragAndDropDataFormats.java index 67aa1cefce0..0ac739a71c3 100644 --- a/src/main/java/org/jabref/gui/DragAndDropDataFormats.java +++ b/src/main/java/org/jabref/gui/DragAndDropDataFormats.java @@ -11,6 +11,7 @@ */ public class DragAndDropDataFormats { + public static final DataFormat FIELD = new DataFormat("dnd/org.jabref.model.entry.field.Field"); public static final DataFormat GROUP = new DataFormat("dnd/org.jabref.model.groups.GroupTreeNode"); public static final DataFormat LINKED_FILE = new DataFormat("dnd/org.jabref.model.entry.LinkedFile"); public static final DataFormat ENTRIES = new DataFormat("dnd/org.jabref.model.entry.BibEntries"); diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java index f978102f4b1..8ec33b95c03 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java @@ -6,20 +6,29 @@ import javafx.application.Platform; import javafx.beans.property.ReadOnlyStringWrapper; +import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.ButtonBar.ButtonData; import javafx.scene.control.ButtonType; import javafx.scene.control.ComboBox; import javafx.scene.control.TableColumn; +import javafx.scene.control.TableRow; import javafx.scene.control.TableView; import javafx.scene.control.TextField; +import javafx.scene.input.ClipboardContent; +import javafx.scene.input.DragEvent; +import javafx.scene.input.Dragboard; +import javafx.scene.input.MouseEvent; +import javafx.scene.input.TransferMode; +import org.jabref.gui.DragAndDropDataFormats; import org.jabref.gui.customentrytypes.CustomEntryTypeDialogViewModel.FieldType; import org.jabref.gui.icon.IconTheme; import org.jabref.gui.util.BaseDialog; import org.jabref.gui.util.RadioButtonCell; import org.jabref.gui.util.ValueTableCellFactory; +import org.jabref.gui.util.ViewModelTableRowFactory; import org.jabref.logic.l10n.Localization; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.database.BibDatabaseMode; @@ -95,10 +104,10 @@ private void setupTable() { entryTypeActionsColumn.setReorderable(false); entryTypeActionsColumn.setCellValueFactory(cellData -> new ReadOnlyStringWrapper(cellData.getValue().getType().getDisplayName())); new ValueTableCellFactory() - .withGraphic(item -> IconTheme.JabRefIcons.DELETE_ENTRY.getGraphicNode()) - .withTooltip(name -> Localization.lang("Remove entry type") + " " + name) - .withOnMouseClickedEvent(item -> evt -> viewModel.removeEntryType(entryTypes.getSelectionModel().getSelectedItem())) - .install(entryTypeActionsColumn); + .withGraphic(item -> IconTheme.JabRefIcons.DELETE_ENTRY.getGraphicNode()) + .withTooltip(name -> Localization.lang("Remove entry type") + " " + name) + .withOnMouseClickedEvent(item -> evt -> viewModel.removeEntryType(entryTypes.getSelectionModel().getSelectedItem())) + .install(entryTypeActionsColumn); fieldTypeColumn.setCellFactory(cellData -> new RadioButtonCell<>(EnumSet.allOf(FieldType.class))); fieldTypeColumn.setCellValueFactory(item -> item.getValue().fieldType()); @@ -121,13 +130,68 @@ private void setupTable() { fieldTypeActionColumn.setCellValueFactory(cellData -> cellData.getValue().fieldName()); new ValueTableCellFactory() - .withGraphic(item -> IconTheme.JabRefIcons.DELETE_ENTRY.getGraphicNode()) - .withTooltip(name -> Localization.lang("Remove field %0 from currently selected entry type", name)) - .withOnMouseClickedEvent(item -> evt -> viewModel.removeField(fields.getSelectionModel().getSelectedItem())) - .install(fieldTypeActionColumn); + .withGraphic(item -> IconTheme.JabRefIcons.DELETE_ENTRY.getGraphicNode()) + .withTooltip(name -> Localization.lang("Remove field %0 from currently selected entry type", name)) + .withOnMouseClickedEvent(item -> evt -> viewModel.removeField(fields.getSelectionModel().getSelectedItem())) + .install(fieldTypeActionColumn); viewModel.newFieldToAddProperty().bindBidirectional(addNewField.valueProperty()); fields.itemsProperty().bindBidirectional(viewModel.fieldsforTypesProperty()); + + new ViewModelTableRowFactory() + .setOnDragDetected(this::handleOnDragDetected) + .setOnDragDropped(this::handleOnDragDropped) + .setOnDragOver(this::handleOnDragOver) + .install(fields); + + } + + private void handleOnDragOver(FieldViewModel originalItem, DragEvent event) { + if ((event.getGestureSource() != originalItem) && event.getDragboard().hasContent(DragAndDropDataFormats.FIELD)) { + event.acceptTransferModes(TransferMode.MOVE); + } + } + + private void handleOnDragDetected(TableRow row, FieldViewModel fieldViewModel, MouseEvent event) { + // Start drag'n'drop + row.startFullDrag(); + + Field field = fields.getSelectionModel().getSelectedItem().getField(); + + ClipboardContent content = new ClipboardContent(); + Dragboard dragboard = fields.startDragAndDrop(TransferMode.MOVE); + content.put(DragAndDropDataFormats.FIELD, field); + dragboard.setContent(content); + event.consume(); + } + + private void handleOnDragDropped(TableRow row, FieldViewModel originalItem, DragEvent event) { + boolean success = false; + Dragboard dragboard = event.getDragboard(); + + ObservableList items = fields.itemsProperty().get(); + + if (dragboard.hasContent(DragAndDropDataFormats.FIELD)) { + + Field field = (Field) dragboard.getContent(DragAndDropDataFormats.FIELD); + FieldViewModel transferedItem = null; + int draggedIdx = 0; + for (int i = 0; i < items.size(); i++) { + if (items.get(i).getField().equals(field)) { + draggedIdx = i; + transferedItem = items.get(i); + break; + } + } + int thisIdx = items.indexOf(originalItem); + items.set(draggedIdx, originalItem); + items.set(thisIdx, transferedItem); + success = true; + } + + event.setDropCompleted(success); + event.consume(); + } @FXML From d06d545b721c2361eaf7369b7dbf09d62ccf526a Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Mon, 23 Mar 2020 18:24:16 +0100 Subject: [PATCH 02/39] change to linkedHashSet Still some differences in the custom entry type dlg --- .../gui/entryeditor/FieldsEditorTab.java | 4 +- .../gui/entryeditor/OptionalFields2Tab.java | 6 +-- .../gui/entryeditor/RequiredFieldsTab.java | 10 ++-- .../org/jabref/model/entry/BibEntryType.java | 47 +++++++++---------- .../model/entry/BibEntryTypeBuilder.java | 3 +- .../model/entry/BibEntryTypesManager.java | 9 ++-- .../model/entry/field/FieldFactory.java | 9 ++-- 7 files changed, 43 insertions(+), 45 deletions(-) diff --git a/src/main/java/org/jabref/gui/entryeditor/FieldsEditorTab.java b/src/main/java/org/jabref/gui/entryeditor/FieldsEditorTab.java index 603450b39ce..2b1f9c8dc51 100644 --- a/src/main/java/org/jabref/gui/entryeditor/FieldsEditorTab.java +++ b/src/main/java/org/jabref/gui/entryeditor/FieldsEditorTab.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.SortedSet; +import java.util.Set; import java.util.stream.Stream; import javax.swing.undo.UndoManager; @@ -196,7 +196,7 @@ protected void previousPreviewStyle() { } } - protected abstract SortedSet determineFieldsToShow(BibEntry entry); + protected abstract Set determineFieldsToShow(BibEntry entry); public Collection getShownFields() { return fields; diff --git a/src/main/java/org/jabref/gui/entryeditor/OptionalFields2Tab.java b/src/main/java/org/jabref/gui/entryeditor/OptionalFields2Tab.java index 7553bc46496..2629af70691 100644 --- a/src/main/java/org/jabref/gui/entryeditor/OptionalFields2Tab.java +++ b/src/main/java/org/jabref/gui/entryeditor/OptionalFields2Tab.java @@ -2,7 +2,7 @@ import java.util.Collections; import java.util.Optional; -import java.util.SortedSet; +import java.util.Set; import javax.swing.undo.UndoManager; @@ -36,13 +36,13 @@ public OptionalFields2Tab(BibDatabaseContext databaseContext, SuggestionProvider } @Override - protected SortedSet determineFieldsToShow(BibEntry entry) { + protected Set determineFieldsToShow(BibEntry entry) { Optional entryType = entryTypesManager.enrich(entry.getType(), databaseContext.getMode()); if (entryType.isPresent()) { return entryType.get().getSecondaryOptionalNotDeprecatedFields(); } else { // Entry type unknown -> treat all fields as required - return Collections.emptySortedSet(); + return Collections.emptySet(); } } } diff --git a/src/main/java/org/jabref/gui/entryeditor/RequiredFieldsTab.java b/src/main/java/org/jabref/gui/entryeditor/RequiredFieldsTab.java index 2ea4b81baaf..2ac02620d9b 100644 --- a/src/main/java/org/jabref/gui/entryeditor/RequiredFieldsTab.java +++ b/src/main/java/org/jabref/gui/entryeditor/RequiredFieldsTab.java @@ -1,9 +1,8 @@ package org.jabref.gui.entryeditor; -import java.util.Comparator; +import java.util.LinkedHashSet; import java.util.Optional; -import java.util.SortedSet; -import java.util.TreeSet; +import java.util.Set; import javax.swing.undo.UndoManager; @@ -26,6 +25,7 @@ import org.jabref.preferences.JabRefPreferences; public class RequiredFieldsTab extends FieldsEditorTab { + private final BibEntryTypesManager entryTypesManager; public RequiredFieldsTab(BibDatabaseContext databaseContext, SuggestionProviders suggestionProviders, UndoManager undoManager, DialogService dialogService, JabRefPreferences preferences, BibEntryTypesManager entryTypesManager, ExternalFileTypes externalFileTypes, TaskExecutor taskExecutor, JournalAbbreviationLoader journalAbbreviationLoader) { @@ -38,9 +38,9 @@ public RequiredFieldsTab(BibDatabaseContext databaseContext, SuggestionProviders } @Override - protected SortedSet determineFieldsToShow(BibEntry entry) { + protected Set determineFieldsToShow(BibEntry entry) { Optional entryType = entryTypesManager.enrich(entry.getType(), databaseContext.getMode()); - SortedSet fields = new TreeSet<>(Comparator.comparing(Field::getName)); + Set fields = new LinkedHashSet<>(); if (entryType.isPresent()) { for (OrFields orFields : entryType.get().getRequiredFields()) { fields.addAll(orFields); diff --git a/src/main/java/org/jabref/model/entry/BibEntryType.java b/src/main/java/org/jabref/model/entry/BibEntryType.java index 2c1b2ea0504..8a200b665d9 100644 --- a/src/main/java/org/jabref/model/entry/BibEntryType.java +++ b/src/main/java/org/jabref/model/entry/BibEntryType.java @@ -2,10 +2,9 @@ import java.util.Collection; import java.util.Collections; -import java.util.Comparator; +import java.util.LinkedHashSet; import java.util.Objects; -import java.util.SortedSet; -import java.util.TreeSet; +import java.util.Set; import java.util.stream.Collectors; import org.jabref.model.entry.field.BibField; @@ -18,13 +17,13 @@ public class BibEntryType implements Comparable { private final EntryType type; - private final SortedSet requiredFields; - private final SortedSet fields; + private final Set requiredFields; + private final Set fields; public BibEntryType(EntryType type, Collection fields, Collection requiredFields) { this.type = Objects.requireNonNull(type); - this.requiredFields = new TreeSet<>(requiredFields); - this.fields = new TreeSet<>(fields); + this.requiredFields = new LinkedHashSet<>(requiredFields); + this.fields = new LinkedHashSet<>(fields); } public EntryType getType() { @@ -36,10 +35,10 @@ public EntryType getType() { * * @return a List of optional field name Strings */ - public SortedSet getOptionalFields() { + public Set getOptionalFields() { return getAllFields().stream() .filter(field -> !isRequired(field.getField())) - .collect(Collectors.toCollection(TreeSet::new)); + .collect(Collectors.toCollection(LinkedHashSet::new)); } public boolean isRequired(Field field) { @@ -54,33 +53,32 @@ public boolean isRequired(Field field) { * * @return a List of required field name Strings */ - public SortedSet getRequiredFields() { - return Collections.unmodifiableSortedSet(requiredFields); + public Set getRequiredFields() { + return Collections.unmodifiableSet(requiredFields); } /** * Returns all defined fields. */ - public SortedSet getAllFields() { - return Collections.unmodifiableSortedSet(fields); + public Set getAllFields() { + return Collections.unmodifiableSet(fields); } - public SortedSet getPrimaryOptionalFields() { + public Set getPrimaryOptionalFields() { return getOptionalFields().stream() .filter(field -> field.getPriority() == FieldPriority.IMPORTANT) - .collect(Collectors.toCollection(TreeSet::new)); + .collect(Collectors.toCollection(LinkedHashSet::new)); } - public SortedSet getSecondaryOptionalFields() { + public Set getSecondaryOptionalFields() { return getOptionalFields().stream() .filter(field -> field.getPriority() == FieldPriority.DETAIL) .map(BibField::getField) - .collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Field::getName)))); + .collect(Collectors.toCollection(LinkedHashSet::new)); } - public SortedSet getDeprecatedFields() { - SortedSet deprecatedFields = new TreeSet<>(Comparator.comparing(Field::getName)); - deprecatedFields.addAll(EntryConverter.FIELD_ALIASES_TEX_TO_LTX.keySet()); + public Set getDeprecatedFields() { + Set deprecatedFields = new LinkedHashSet<>(EntryConverter.FIELD_ALIASES_TEX_TO_LTX.keySet()); deprecatedFields.add(StandardField.YEAR); deprecatedFields.add(StandardField.MONTH); @@ -89,9 +87,8 @@ public SortedSet getDeprecatedFields() { return deprecatedFields; } - public SortedSet getSecondaryOptionalNotDeprecatedFields() { - SortedSet optionalFieldsNotPrimaryOrDeprecated = new TreeSet<>(Comparator.comparing(Field::getName)); - optionalFieldsNotPrimaryOrDeprecated.addAll(getSecondaryOptionalFields()); + public Set getSecondaryOptionalNotDeprecatedFields() { + Set optionalFieldsNotPrimaryOrDeprecated = new LinkedHashSet<>(getSecondaryOptionalFields()); optionalFieldsNotPrimaryOrDeprecated.removeAll(getDeprecatedFields()); return optionalFieldsNotPrimaryOrDeprecated; } @@ -99,8 +96,8 @@ public SortedSet getSecondaryOptionalNotDeprecatedFields() { /** * Get list of all optional fields of this entry and their aliases. */ - private SortedSet getOptionalFieldsAndAliases() { - SortedSet optionalFieldsAndAliases = new TreeSet<>(Comparator.comparing(Field::getName)); + private Set getOptionalFieldsAndAliases() { + Set optionalFieldsAndAliases = new LinkedHashSet<>(getOptionalFields().size()); for (BibField field : getOptionalFields()) { optionalFieldsAndAliases.add(field.getField()); if (EntryConverter.FIELD_ALIASES_LTX_TO_TEX.containsKey(field.getField())) { diff --git a/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java b/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java index a48e7b8001a..99d34e8b296 100644 --- a/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java +++ b/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java @@ -5,7 +5,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.TreeSet; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -75,7 +74,7 @@ public BibEntryTypeBuilder withRequiredFields(List first, Field... req public BibEntryType build() { // Treat required fields as important ones Stream requiredAsImportant = requiredFields.stream() - .flatMap(TreeSet::stream) + .flatMap(Set::stream) .map(field -> new BibField(field, FieldPriority.IMPORTANT)); Set allFields = Stream.concat(fields.stream(), requiredAsImportant).collect(Collectors.toSet()); return new BibEntryType(type, allFields, requiredFields); diff --git a/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java b/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java index 97f40a15a01..4cad06ea0ed 100644 --- a/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java +++ b/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java @@ -1,9 +1,10 @@ package org.jabref.model.entry; import java.util.Collection; -import java.util.Comparator; +import java.util.LinkedHashSet; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import java.util.stream.Collectors; @@ -11,7 +12,6 @@ import org.jabref.model.database.BibDatabaseMode; import org.jabref.model.entry.field.BibField; -import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldFactory; import org.jabref.model.entry.types.BiblatexEntryTypeDefinitions; import org.jabref.model.entry.types.BibtexEntryTypeDefinitions; @@ -62,7 +62,6 @@ public static String serialize(BibEntryType entryType) { entryType.getOptionalFields() .stream() .map(BibField::getField) - .sorted(Comparator.comparing(Field::getName)) .collect(Collectors.toList()))); builder.append("]"); return builder.toString(); @@ -183,8 +182,8 @@ private void removeCustomOrModifiedEntryType(BibEntryType type) { customOrModifiedType.remove(type); } - public SortedSet getAllTypes() { - SortedSet allTypes = new TreeSet<>(customOrModifiedType); + public Set getAllTypes() { + Set allTypes = new LinkedHashSet<>(customOrModifiedType); allTypes.addAll(standardTypes); return allTypes; } diff --git a/src/main/java/org/jabref/model/entry/field/FieldFactory.java b/src/main/java/org/jabref/model/entry/field/FieldFactory.java index a5086283f6a..e5faee98726 100644 --- a/src/main/java/org/jabref/model/entry/field/FieldFactory.java +++ b/src/main/java/org/jabref/model/entry/field/FieldFactory.java @@ -6,6 +6,7 @@ import java.util.Comparator; import java.util.EnumSet; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.TreeSet; @@ -92,14 +93,16 @@ public static Set getJournalNameFields() { } /** - * Returns a sorted List with all standard fields and including some common internal fields + * Returns a List with all standard fields and including some common internal fields */ public static Set getCommonFields() { - TreeSet publicAndInternalFields = new TreeSet<>(Comparator.comparing(Field::getName)); + EnumSet allFields = EnumSet.allOf(StandardField.class); + + LinkedHashSet publicAndInternalFields = new LinkedHashSet<>(allFields.size()); publicAndInternalFields.add(InternalField.INTERNAL_ALL_FIELD); publicAndInternalFields.add(InternalField.INTERNAL_ALL_TEXT_FIELDS_FIELD); publicAndInternalFields.add(InternalField.KEY_FIELD); - publicAndInternalFields.addAll(EnumSet.allOf(StandardField.class)); + publicAndInternalFields.addAll(allFields); return publicAndInternalFields; } From 5353a85ecec4c3b3dbb1dd14fc04fe2daed6682c Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Mon, 23 Mar 2020 18:40:51 +0100 Subject: [PATCH 03/39] Further changes seems to work now more or less todo sorting is weird --- .../jabref/model/entry/BibEntryTypeBuilder.java | 14 +++++++------- .../jabref/model/entry/BibEntryTypesManager.java | 8 ++++---- .../org/jabref/model/entry/field/FieldFactory.java | 8 +++----- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java b/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java index 99d34e8b296..0483aed94ae 100644 --- a/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java +++ b/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java @@ -2,7 +2,7 @@ import java.util.Arrays; import java.util.Collection; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -19,8 +19,8 @@ public class BibEntryTypeBuilder { private EntryType type = StandardEntryType.Misc; - private Set fields = new HashSet<>(); - private Set requiredFields = new HashSet<>(); + private Set fields = new LinkedHashSet<>(); + private Set requiredFields = new LinkedHashSet<>(); public BibEntryTypeBuilder withType(EntryType type) { this.type = type; @@ -57,17 +57,17 @@ public BibEntryTypeBuilder withRequiredFields(Set requiredFields) { } public BibEntryTypeBuilder withRequiredFields(Field... requiredFields) { - this.requiredFields = Arrays.stream(requiredFields).map(OrFields::new).collect(Collectors.toSet()); + this.requiredFields = Arrays.stream(requiredFields).map(OrFields::new).collect(Collectors.toCollection(LinkedHashSet::new)); return this; } public BibEntryTypeBuilder withRequiredFields(OrFields first, Field... requiredFields) { - this.requiredFields = Stream.concat(Stream.of(first), Arrays.stream(requiredFields).map(OrFields::new)).collect(Collectors.toSet()); + this.requiredFields = Stream.concat(Stream.of(first), Arrays.stream(requiredFields).map(OrFields::new)).collect(Collectors.toCollection(LinkedHashSet::new)); return this; } public BibEntryTypeBuilder withRequiredFields(List first, Field... requiredFields) { - this.requiredFields = Stream.concat(first.stream(), Arrays.stream(requiredFields).map(OrFields::new)).collect(Collectors.toSet()); + this.requiredFields = Stream.concat(first.stream(), Arrays.stream(requiredFields).map(OrFields::new)).collect(Collectors.toCollection(LinkedHashSet::new)); return this; } @@ -76,7 +76,7 @@ public BibEntryType build() { Stream requiredAsImportant = requiredFields.stream() .flatMap(Set::stream) .map(field -> new BibField(field, FieldPriority.IMPORTANT)); - Set allFields = Stream.concat(fields.stream(), requiredAsImportant).collect(Collectors.toSet()); + Set allFields = Stream.concat(fields.stream(), requiredAsImportant).collect(Collectors.toCollection(LinkedHashSet::new)); return new BibEntryType(type, allFields, requiredFields); } } diff --git a/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java b/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java index 4cad06ea0ed..42ea53bdba9 100644 --- a/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java +++ b/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java @@ -1,10 +1,9 @@ package org.jabref.model.entry; import java.util.Collection; -import java.util.LinkedHashSet; +import java.util.Comparator; import java.util.List; import java.util.Optional; -import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import java.util.stream.Collectors; @@ -12,6 +11,7 @@ import org.jabref.model.database.BibDatabaseMode; import org.jabref.model.entry.field.BibField; +import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldFactory; import org.jabref.model.entry.types.BiblatexEntryTypeDefinitions; import org.jabref.model.entry.types.BibtexEntryTypeDefinitions; @@ -182,8 +182,8 @@ private void removeCustomOrModifiedEntryType(BibEntryType type) { customOrModifiedType.remove(type); } - public Set getAllTypes() { - Set allTypes = new LinkedHashSet<>(customOrModifiedType); + public SortedSet getAllTypes() { + SortedSet allTypes = new TreeSet<>(customOrModifiedType); allTypes.addAll(standardTypes); return allTypes; } diff --git a/src/main/java/org/jabref/model/entry/field/FieldFactory.java b/src/main/java/org/jabref/model/entry/field/FieldFactory.java index e5faee98726..839390d891a 100644 --- a/src/main/java/org/jabref/model/entry/field/FieldFactory.java +++ b/src/main/java/org/jabref/model/entry/field/FieldFactory.java @@ -3,13 +3,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Comparator; import java.util.EnumSet; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; -import java.util.TreeSet; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -49,20 +47,20 @@ public static List getIdentifierFieldNames() { public static OrFields parseOrFields(String fieldNames) { Set fields = Arrays.stream(fieldNames.split(FieldFactory.FIELD_OR_SEPARATOR)) .map(FieldFactory::parseField) - .collect(Collectors.toSet()); + .collect(Collectors.toCollection(LinkedHashSet::new)); return new OrFields(fields); } public static Set parseOrFieldsList(String fieldNames) { return Arrays.stream(fieldNames.split(FieldFactory.DELIMITER)) .map(FieldFactory::parseOrFields) - .collect(Collectors.toSet()); + .collect(Collectors.toCollection(LinkedHashSet::new)); } public static Set parseFieldList(String fieldNames) { return Arrays.stream(fieldNames.split(FieldFactory.DELIMITER)) .map(FieldFactory::parseField) - .collect(Collectors.toSet()); + .collect(Collectors.toCollection(LinkedHashSet::new)); } public static String serializeFieldsList(Collection fields) { From 13b2923e2f57155021b953dfb69318c4cab87459 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sat, 2 May 2020 19:18:55 +0200 Subject: [PATCH 04/39] iteratre prefs with chidlren recursively to show custom entry types compare bibentry types because it takes fields into account --- .../CustomEntryTypeDialogViewModel.java | 8 ++--- .../model/entry/BibEntryTypesManager.java | 6 ++-- .../jabref/preferences/JabRefPreferences.java | 29 +++++++++++++------ 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java index ccb53b5b13c..1012ba1b75f 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java @@ -56,7 +56,7 @@ public Field fromString(String string) { }; private final ListProperty entryTypes; - private final ListProperty fields; + private final ListProperty fieldsForAdding; private final ObjectProperty selectedEntryTypes = new SimpleObjectProperty<>(); private final ListProperty fieldsForType; private final ObjectProperty selectedFieldToAdd = new SimpleObjectProperty<>(); @@ -85,7 +85,7 @@ public CustomEntryTypeDialogViewModel(BibDatabaseMode mode, PreferencesService p allEntryTypes = FXCollections.observableArrayList(allTypes); entryTypes = new SimpleListProperty<>(allEntryTypes); - fields = new SimpleListProperty<>(FXCollections.observableArrayList(FieldFactory.getCommonFields())); + fieldsForAdding = new SimpleListProperty<>(FXCollections.observableArrayList(FieldFactory.getCommonFields())); for (BibEntryType entryType : allTypes) { List fields = entryType.getAllFields().stream().map(bibField -> new FieldViewModel(bibField.getField(), entryType.isRequired(bibField.getField()), bibField.getPriority(), entryType)).collect(Collectors.toList()); @@ -103,7 +103,7 @@ public CustomEntryTypeDialogViewModel(BibDatabaseMode mode, PreferencesService p Predicate notEmpty = input -> (input != null) && !input.trim().isEmpty(); entryTypeValidator = new FunctionBasedValidator<>(entryTypeToAdd, notEmpty, ValidationMessage.error(Localization.lang("Entry type cannot be empty. Please enter a name."))); fieldValidator = new FunctionBasedValidator<>(newFieldToAdd, - input -> input != null && !input.getDisplayName().isEmpty(), + input -> (input != null) && !input.getDisplayName().isEmpty(), ValidationMessage.error(Localization.lang("Field cannot be empty. Please enter a name."))); } @@ -112,7 +112,7 @@ public ListProperty entryTypes() { } public ListProperty fields() { - return this.fields; + return this.fieldsForAdding; } public enum FieldType { diff --git a/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java b/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java index 42ea53bdba9..2dc1bf8c9c9 100644 --- a/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java +++ b/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java @@ -1,7 +1,6 @@ package org.jabref.model.entry; import java.util.Collection; -import java.util.Comparator; import java.util.List; import java.util.Optional; import java.util.SortedSet; @@ -11,7 +10,6 @@ import org.jabref.model.database.BibDatabaseMode; import org.jabref.model.entry.field.BibField; -import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldFactory; import org.jabref.model.entry.types.BiblatexEntryTypeDefinitions; import org.jabref.model.entry.types.BibtexEntryTypeDefinitions; @@ -177,7 +175,7 @@ private void addCustomOrModifiedType(BibEntryType type) { customOrModifiedType.remove(type); customOrModifiedType.add(type); } - + private void removeCustomOrModifiedEntryType(BibEntryType type) { customOrModifiedType.remove(type); } @@ -190,7 +188,7 @@ public SortedSet getAllTypes() { public boolean isCustomOrModifiedType(BibEntryType entryType) { return customOrModifiedType.stream() - .anyMatch(customizedType -> customizedType.getType().equals(entryType.getType())); + .anyMatch(customizedType -> customizedType.equals(entryType)); } } } diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index 7d3aa8c5f9c..0ce0bd6a455 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -1091,28 +1091,35 @@ private void clearBibEntryTypes(BibDatabaseMode mode) throws BackingStoreExcepti public Map getPreferences() { Map result = new HashMap<>(); + try { - for (String key : this.prefs.keys()) { - Object value = getObject(key); - result.put(key, value); - } + dump(this.prefs, result); + } catch (BackingStoreException e) { LOGGER.info("could not retrieve preference keys", e); } return result; } - private Object getObject(String key) { + private void dump(Preferences prefs, Map result) throws BackingStoreException { + for(String key : prefs.keys()) { + result.put(key, getObject(prefs, key)); + } + for(String child : prefs.childrenNames()) { + dump(prefs.node(child), result); + } + } + private Object getObject(Preferences prefs, String key) { try { - return this.get(key); + return prefs.get(key, (String) defaults.get(key)); } catch (ClassCastException e) { try { - return this.getBoolean(key); + return prefs.getBoolean(key, getBooleanDefault(key)); } catch (ClassCastException e2) { try { - return this.getInt(key); + return prefs.getInt(key, getIntDefault(key)); } catch (ClassCastException e3) { - return this.getDouble(key); + return prefs.getDouble(key, getDoubleDefault(key)); } } } @@ -1212,6 +1219,7 @@ public FieldWriterPreferences getFieldWriterPreferences() { getFieldContentParserPreferences()); } + @Override public FieldContentFormatterPreferences getFieldContentParserPreferences() { return new FieldContentFormatterPreferences(getStringList(NON_WRAPPABLE_FIELDS).stream().map(FieldFactory::parseField).collect(Collectors.toList())); } @@ -1465,12 +1473,14 @@ public JournalAbbreviationPreferences getJournalAbbreviationPreferences() { return new JournalAbbreviationPreferences(getStringList(EXTERNAL_JOURNAL_LISTS), getDefaultEncoding()); } + @Override public CleanupPreferences getCleanupPreferences(JournalAbbreviationRepository abbreviationRepository) { return new CleanupPreferences( getLayoutFormatterPreferences(abbreviationRepository), getFilePreferences()); } + @Override public CleanupPreset getCleanupPreset() { Set activeJobs = EnumSet.noneOf(CleanupPreset.CleanupStep.class); @@ -1485,6 +1495,7 @@ public CleanupPreset getCleanupPreset() { return new CleanupPreset(activeJobs, formatterCleanups); } + @Override public void setCleanupPreset(CleanupPreset cleanupPreset) { for (CleanupPreset.CleanupStep action : EnumSet.allOf(CleanupPreset.CleanupStep.class)) { putBoolean(JabRefPreferences.CLEANUP + action.name(), cleanupPreset.isActive(action)); From 1cbed25e511c35c30e5e2642bbf3f2b7eeb1de22 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sat, 2 May 2020 20:08:57 +0200 Subject: [PATCH 05/39] try around with some more stuff still not saved correct in order argh --- .../org/jabref/model/entry/BibEntryType.java | 20 ++++++++-------- .../jabref/model/entry/field/OrFields.java | 8 ++----- .../model/util/LinkedHashSetEqualsUtil.java | 23 +++++++++++++++++++ 3 files changed, 36 insertions(+), 15 deletions(-) create mode 100644 src/main/java/org/jabref/model/util/LinkedHashSetEqualsUtil.java diff --git a/src/main/java/org/jabref/model/entry/BibEntryType.java b/src/main/java/org/jabref/model/entry/BibEntryType.java index 8a200b665d9..7c45b1d31ba 100644 --- a/src/main/java/org/jabref/model/entry/BibEntryType.java +++ b/src/main/java/org/jabref/model/entry/BibEntryType.java @@ -13,12 +13,13 @@ import org.jabref.model.entry.field.OrFields; import org.jabref.model.entry.field.StandardField; import org.jabref.model.entry.types.EntryType; +import org.jabref.model.util.LinkedHashSetEqualsUtil; public class BibEntryType implements Comparable { private final EntryType type; - private final Set requiredFields; - private final Set fields; + private final LinkedHashSet requiredFields; + private final LinkedHashSet fields; public BibEntryType(EntryType type, Collection fields, Collection requiredFields) { this.type = Objects.requireNonNull(type); @@ -112,13 +113,14 @@ public boolean equals(Object o) { if (this == o) { return true; } - if (o == null || getClass() != o.getClass()) { + if ((o == null) || (getClass() != o.getClass())) { return false; } BibEntryType that = (BibEntryType) o; return type.equals(that.type) && - requiredFields.equals(that.requiredFields) && - fields.equals(that.fields); + LinkedHashSetEqualsUtil.linkedEquals(requiredFields, that.requiredFields) + && LinkedHashSetEqualsUtil.linkedEquals(fields, that.fields); + } @Override @@ -129,10 +131,10 @@ public int hashCode() { @Override public String toString() { return "BibEntryType{" + - "type=" + type + - ", requiredFields=" + requiredFields + - ", fields=" + fields + - '}'; + "type=" + type + + ", requiredFields=" + requiredFields + + ", fields=" + fields + + '}'; } @Override diff --git a/src/main/java/org/jabref/model/entry/field/OrFields.java b/src/main/java/org/jabref/model/entry/field/OrFields.java index a481527489e..baf848d4392 100644 --- a/src/main/java/org/jabref/model/entry/field/OrFields.java +++ b/src/main/java/org/jabref/model/entry/field/OrFields.java @@ -2,24 +2,20 @@ import java.util.Arrays; import java.util.Collection; -import java.util.Comparator; +import java.util.LinkedHashSet; import java.util.StringJoiner; -import java.util.TreeSet; -public class OrFields extends TreeSet implements Comparable { +public class OrFields extends LinkedHashSet implements Comparable { public OrFields(Field field) { - super(Comparator.comparing(Field::getName)); add(field); } public OrFields(Field... fields) { - super(Comparator.comparing(Field::getName)); addAll(Arrays.asList(fields)); } public OrFields(Collection fields) { - super(Comparator.comparing(Field::getName)); addAll(fields); } diff --git a/src/main/java/org/jabref/model/util/LinkedHashSetEqualsUtil.java b/src/main/java/org/jabref/model/util/LinkedHashSetEqualsUtil.java new file mode 100644 index 00000000000..b08d1a2c8a1 --- /dev/null +++ b/src/main/java/org/jabref/model/util/LinkedHashSetEqualsUtil.java @@ -0,0 +1,23 @@ +package org.jabref.model.util; + +import java.util.Iterator; +import java.util.LinkedHashSet; + +public class LinkedHashSetEqualsUtil { + + public static boolean linkedEquals(LinkedHashSet left, LinkedHashSet right) { + Iterator leftItr = left.iterator(); + Iterator rightItr = right.iterator(); + + while (leftItr.hasNext() && rightItr.hasNext()) { + K leftEntry = leftItr.next(); + K rightEntry = rightItr.next(); + + //AbstractList does null checks here but for sets we can assume you never get null entries + if (!leftEntry.equals(rightEntry)) { + return false; + } + } + return !(leftItr.hasNext() || rightItr.hasNext()); + } +} From c937601c45448e5f03439ea427597b8ae212eecc Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sun, 3 May 2020 16:09:40 +0200 Subject: [PATCH 06/39] show prefs path --- src/main/java/org/jabref/preferences/JabRefPreferences.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index 0ce0bd6a455..24c171489ef 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -1148,6 +1148,7 @@ public void exportPreferences(String filename) throws JabRefException { } public void exportPreferences(Path file) throws JabRefException { + LOGGER.debug(file.toAbsolutePath().toString()); try (OutputStream os = Files.newOutputStream(file)) { prefs.exportSubtree(os); } catch (BackingStoreException | IOException ex) { From f49a83918fe009007b52334b0c6bf3f7d5ee7c38 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sun, 3 May 2020 16:10:09 +0200 Subject: [PATCH 07/39] Fix action helper when no library is open --- src/main/java/org/jabref/gui/actions/ActionHelper.java | 7 ++++++- .../gui/documentviewer/ShowDocumentViewerAction.java | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/gui/actions/ActionHelper.java b/src/main/java/org/jabref/gui/actions/ActionHelper.java index 494c64f2fc3..d7ea30ce550 100644 --- a/src/main/java/org/jabref/gui/actions/ActionHelper.java +++ b/src/main/java/org/jabref/gui/actions/ActionHelper.java @@ -7,6 +7,7 @@ import javafx.beans.binding.Bindings; import javafx.beans.binding.BooleanExpression; +import javafx.beans.property.SimpleStringProperty; import javafx.collections.ObservableList; import org.jabref.gui.StateManager; @@ -51,6 +52,10 @@ public static BooleanExpression isAnyFieldSetForSelectedEntry(List fields public static BooleanExpression isFilePresentForSelectedEntry(StateManager stateManager, PreferencesService preferencesService) { return Bindings.createBooleanBinding(() -> { + + if (stateManager.getSelectedEntries().isEmpty()) { + return false; + } List files = stateManager.getSelectedEntries().get(0).getFiles(); if ((files.size() > 0) && stateManager.getActiveDatabase().isPresent()) { Optional filename = FileHelper.find( @@ -62,6 +67,6 @@ public static BooleanExpression isFilePresentForSelectedEntry(StateManager state return false; } }, stateManager.getSelectedEntries(), - stateManager.getSelectedEntries().get(0).getFieldBinding(StandardField.FILE)); + stateManager.getSelectedEntries().isEmpty() ? new SimpleStringProperty("") : stateManager.getSelectedEntries().get(0).getFieldBinding(StandardField.FILE)); } } diff --git a/src/main/java/org/jabref/gui/documentviewer/ShowDocumentViewerAction.java b/src/main/java/org/jabref/gui/documentviewer/ShowDocumentViewerAction.java index 444bf3840e9..a9a94d52b16 100644 --- a/src/main/java/org/jabref/gui/documentviewer/ShowDocumentViewerAction.java +++ b/src/main/java/org/jabref/gui/documentviewer/ShowDocumentViewerAction.java @@ -5,10 +5,12 @@ import org.jabref.gui.actions.SimpleCommand; import org.jabref.preferences.PreferencesService; +import static org.jabref.gui.actions.ActionHelper.needsEntriesSelected; + public class ShowDocumentViewerAction extends SimpleCommand { public ShowDocumentViewerAction(StateManager stateManager, PreferencesService preferences) { - this.executable.bind(ActionHelper.isFilePresentForSelectedEntry(stateManager, preferences)); + this.executable.bind(needsEntriesSelected(stateManager).and(ActionHelper.isFilePresentForSelectedEntry(stateManager, preferences))); } @Override From 0a010bfcceb99132d0a41fa3a4e0915d5ba55c52 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Fri, 22 May 2020 18:51:21 +0200 Subject: [PATCH 08/39] fix checkstyle --- .../CustomEntryTypeDialogViewModel.java | 3 ++- .../model/util/LinkedHashSetEqualsUtil.java | 2 +- .../jabref/preferences/JabRefPreferences.java | 18 +++++++++++------- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java index afa03efa6dd..b39aafa7c7a 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java @@ -100,10 +100,11 @@ public CustomEntryTypeDialogViewModel(BibDatabaseMode mode, PreferencesService p } }); + Predicate notEmpty = input -> (input != null) && !input.trim().isEmpty(); entryTypeValidator = new FunctionBasedValidator<>(entryTypeToAdd, notEmpty, ValidationMessage.error(Localization.lang("Entry type cannot be empty. Please enter a name."))); fieldValidator = new FunctionBasedValidator<>(newFieldToAdd, - input -> input != null && !input.getDisplayName().isEmpty(), + input -> (input != null) && !input.getDisplayName().isEmpty(), ValidationMessage.error(Localization.lang("Field cannot be empty. Please enter a name."))); } diff --git a/src/main/java/org/jabref/model/util/LinkedHashSetEqualsUtil.java b/src/main/java/org/jabref/model/util/LinkedHashSetEqualsUtil.java index b08d1a2c8a1..455c76f3aa7 100644 --- a/src/main/java/org/jabref/model/util/LinkedHashSetEqualsUtil.java +++ b/src/main/java/org/jabref/model/util/LinkedHashSetEqualsUtil.java @@ -13,7 +13,7 @@ public static boolean linkedEquals(LinkedHashSet left, LinkedHashSet r K leftEntry = leftItr.next(); K rightEntry = rightItr.next(); - //AbstractList does null checks here but for sets we can assume you never get null entries + // AbstractList does null checks here but for sets we can assume you never get null entries if (!leftEntry.equals(rightEntry)) { return false; } diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index 18614368e8c..f2cf875e7fb 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -1038,25 +1038,25 @@ public Map getPreferences() { Map result = new HashMap<>(); try { - dump(this.prefs, result); - + addPrefsRecursively(this.prefs, result); } catch (BackingStoreException e) { LOGGER.info("could not retrieve preference keys", e); } return result; } - private void dump(Preferences prefs, Map result) throws BackingStoreException { - for(String key : prefs.keys()) { + private void addPrefsRecursively(Preferences prefs, Map result) throws BackingStoreException { + for (String key : prefs.keys()) { result.put(key, getObject(prefs, key)); } - for(String child : prefs.childrenNames()) { - dump(prefs.node(child), result); + for (String child : prefs.childrenNames()) { + addPrefsRecursively(prefs.node(child), result); } } + private Object getObject(Preferences prefs, String key) { try { - return prefs.get(key, (String) defaults.get(key)); + return prefs.get(key, (String) defaults.get(key)); } catch (ClassCastException e) { try { return prefs.getBoolean(key, getBooleanDefault(key)); @@ -2029,15 +2029,18 @@ public void storeEntryEditorPreferences(EntryEditorPreferences preferences) { // Network preferences //************************************************************************************************************* + @Override public RemotePreferences getRemotePreferences() { return new RemotePreferences(getInt(REMOTE_SERVER_PORT), getBoolean(USE_REMOTE_SERVER)); } + @Override public void storeRemotePreferences(RemotePreferences remotePreferences) { putInt(REMOTE_SERVER_PORT, remotePreferences.getPort()); putBoolean(USE_REMOTE_SERVER, remotePreferences.useRemoteServer()); } + @Override public ProxyPreferences getProxyPreferences() { Boolean useProxy = getBoolean(PROXY_USE); String hostname = get(PROXY_HOSTNAME); @@ -2048,6 +2051,7 @@ public ProxyPreferences getProxyPreferences() { return new ProxyPreferences(useProxy, hostname, port, useAuthentication, username, password); } + @Override public void storeProxyPreferences(ProxyPreferences proxyPreferences) { putBoolean(PROXY_USE, proxyPreferences.isUseProxy()); put(PROXY_HOSTNAME, proxyPreferences.getHostname()); From 1d7832a216096a97d4ce6bff01aacd7bb0fc640e Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Fri, 22 May 2020 18:58:50 +0200 Subject: [PATCH 09/39] fix checkstyle --- src/main/java/org/jabref/gui/actions/ActionHelper.java | 1 - .../gui/customentrytypes/CustomEntryTypeDialogViewModel.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/org/jabref/gui/actions/ActionHelper.java b/src/main/java/org/jabref/gui/actions/ActionHelper.java index 1e308145ef2..bbb22b6022f 100644 --- a/src/main/java/org/jabref/gui/actions/ActionHelper.java +++ b/src/main/java/org/jabref/gui/actions/ActionHelper.java @@ -8,7 +8,6 @@ import javafx.beans.binding.Binding; import javafx.beans.binding.Bindings; import javafx.beans.binding.BooleanExpression; -import javafx.beans.property.SimpleStringProperty; import javafx.collections.ObservableList; import org.jabref.gui.StateManager; diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java index b39aafa7c7a..0c4f6f0d6eb 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java @@ -100,7 +100,6 @@ public CustomEntryTypeDialogViewModel(BibDatabaseMode mode, PreferencesService p } }); - Predicate notEmpty = input -> (input != null) && !input.trim().isEmpty(); entryTypeValidator = new FunctionBasedValidator<>(entryTypeToAdd, notEmpty, ValidationMessage.error(Localization.lang("Entry type cannot be empty. Please enter a name."))); fieldValidator = new FunctionBasedValidator<>(newFieldToAdd, From dc51afda4b67fea78b54f433c1520624fdb88325 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Fri, 22 May 2020 19:27:44 +0200 Subject: [PATCH 10/39] try with Observable --- .../CustomEntryTypeDialogViewModel.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java index 0c4f6f0d6eb..17c063a1da2 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java @@ -65,7 +65,7 @@ public Field fromString(String string) { private final ObservableList allFieldsForType = FXCollections.observableArrayList(extractor -> new Observable[] {extractor.fieldName(), extractor.fieldType()}); private final ObjectProperty newFieldToAdd = new SimpleObjectProperty<>(); private final BibDatabaseMode mode; - private final Map> typesWithFields = new HashMap<>(); + private final Map> typesWithFields = new HashMap<>(); private final List typesToRemove = new ArrayList<>(); private final PreferencesService preferencesService; @@ -89,7 +89,7 @@ public CustomEntryTypeDialogViewModel(BibDatabaseMode mode, PreferencesService p for (BibEntryType entryType : allTypes) { List fields = entryType.getAllFields().stream().map(bibField -> new FieldViewModel(bibField.getField(), entryType.isRequired(bibField.getField()), bibField.getPriority(), entryType)).collect(Collectors.toList()); - typesWithFields.put(entryType, fields); + typesWithFields.put(entryType, FXCollections.observableArrayList(fields)); } this.fieldsForType = new SimpleListProperty<>(allFieldsForType); @@ -139,7 +139,7 @@ public String toString() { public void addNewField() { Field field = newFieldToAdd.getValue(); FieldViewModel model = new FieldViewModel(field, true, FieldPriority.IMPORTANT, selectedEntryTypes.getValue()); - typesWithFields.computeIfAbsent(selectedEntryTypes.getValue(), key -> new ArrayList<>()).add(model); + typesWithFields.computeIfAbsent(selectedEntryTypes.getValue(), key -> FXCollections.observableArrayList()).add(model); allFieldsForType.add(model); newFieldToAddProperty().setValue(null); } @@ -149,7 +149,7 @@ public void addNewCustomEntryType() { BibEntryType type = new BibEntryType(newentryType, new ArrayList<>(), Collections.emptyList()); this.allEntryTypes.add(type); this.entryTypeToAdd.setValue(""); - this.typesWithFields.put(type, new ArrayList<>()); + this.typesWithFields.put(type, FXCollections.observableArrayList()); } public ObjectProperty selectedEntryTypeProperty() { @@ -187,7 +187,7 @@ public void removeEntryType(BibEntryType focusedItem) { } public void removeField(FieldViewModel focusedItem) { - typesWithFields.computeIfAbsent(selectedEntryTypes.getValue(), key -> new ArrayList<>()).remove(focusedItem); + typesWithFields.computeIfAbsent(selectedEntryTypes.getValue(), key -> FXCollections.observableArrayList()).remove(focusedItem); allFieldsForType.remove(focusedItem); } From 28aaa0cfc32c84345d817aec15e71b9a0a58ccac Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sun, 24 May 2020 19:21:43 +0200 Subject: [PATCH 11/39] Create a new EntryTypeViewModel with observable types and fields --- .../CustomEntryTypeDialogViewModel.java | 17 +++++++--- .../customentrytypes/EntryTypeViewModel.java | 32 +++++++++++++++++++ 2 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/jabref/gui/customentrytypes/EntryTypeViewModel.java diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java index 17c063a1da2..4cca30717ed 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java @@ -68,6 +68,8 @@ public Field fromString(String string) { private final Map> typesWithFields = new HashMap<>(); private final List typesToRemove = new ArrayList<>(); + private final ListProperty entryTypesWithFields = new SimpleListProperty<>(FXCollections.observableArrayList()); + private final PreferencesService preferencesService; private final BibEntryTypesManager entryTypesManager; @@ -88,6 +90,10 @@ public CustomEntryTypeDialogViewModel(BibDatabaseMode mode, PreferencesService p fieldsForAdding = new SimpleListProperty<>(FXCollections.observableArrayList(FieldFactory.getCommonFields())); for (BibEntryType entryType : allTypes) { + + EntryTypeViewModel viewModel = new EntryTypeViewModel(entryType); + this.entryTypesWithFields.add(viewModel); + List fields = entryType.getAllFields().stream().map(bibField -> new FieldViewModel(bibField.getField(), entryType.isRequired(bibField.getField()), bibField.getPriority(), entryType)).collect(Collectors.toList()); typesWithFields.put(entryType, FXCollections.observableArrayList(fields)); } @@ -96,15 +102,16 @@ public CustomEntryTypeDialogViewModel(BibDatabaseMode mode, PreferencesService p EasyBind.subscribe(selectedEntryTypes, type -> { if (type != null) { - allFieldsForType.setAll(typesWithFields.get(type)); + entryTypesWithFields.get().stream().filter(t->t.entryType().get().equals(type)).map(f->f.fields()).findFirst(); + //TODO: Bind to list } }); Predicate notEmpty = input -> (input != null) && !input.trim().isEmpty(); entryTypeValidator = new FunctionBasedValidator<>(entryTypeToAdd, notEmpty, ValidationMessage.error(Localization.lang("Entry type cannot be empty. Please enter a name."))); fieldValidator = new FunctionBasedValidator<>(newFieldToAdd, - input -> (input != null) && !input.getDisplayName().isEmpty(), - ValidationMessage.error(Localization.lang("Field cannot be empty. Please enter a name."))); + input -> (input != null) && !input.getDisplayName().isEmpty(), + ValidationMessage.error(Localization.lang("Field cannot be empty. Please enter a name."))); } public ListProperty entryTypes() { @@ -210,7 +217,7 @@ public void apply() { preferencesService.saveCustomEntryTypes(); // Reload types from preferences to make sure any modifications are present when reopening the dialog entryTypesManager.addCustomOrModifiedTypes( - preferencesService.loadBibEntryTypes(BibDatabaseMode.BIBTEX), - preferencesService.loadBibEntryTypes(BibDatabaseMode.BIBLATEX)); + preferencesService.loadBibEntryTypes(BibDatabaseMode.BIBTEX), + preferencesService.loadBibEntryTypes(BibDatabaseMode.BIBLATEX)); } } diff --git a/src/main/java/org/jabref/gui/customentrytypes/EntryTypeViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/EntryTypeViewModel.java new file mode 100644 index 00000000000..006e06ee067 --- /dev/null +++ b/src/main/java/org/jabref/gui/customentrytypes/EntryTypeViewModel.java @@ -0,0 +1,32 @@ +package org.jabref.gui.customentrytypes; + +import java.util.stream.Collectors; + +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.model.entry.BibEntryType; + +public class EntryTypeViewModel { + + private final ObjectProperty entryType = new SimpleObjectProperty<>(); + private final ListProperty fields = new SimpleListProperty<>(FXCollections.emptyObservableList()); + + public EntryTypeViewModel(BibEntryType entryType) { + this.entryType.set(entryType); + this.fields.setAll(entryType.getAllFields().stream().map(bibField -> new FieldViewModel(bibField.getField(), entryType.isRequired(bibField.getField()), bibField.getPriority(), entryType)).collect(Collectors.toList())); + + } + + public ListProperty fields() { + return this.fields; + } + + public ObjectProperty entryType() { + return this.entryType; + } + +} From ca23628467589f4e5b671a5664d33d269f6b3f01 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sat, 6 Jun 2020 16:26:31 +0200 Subject: [PATCH 12/39] simplify code adapt bindings TODO: add/remove --- .../CustomEntryTypeDialogViewModel.java | 62 +++++-------------- ...del.java => CustomEntryTypeViewModel.java} | 11 ++-- .../CustomizeEntryTypeDialogView.java | 22 ++++--- 3 files changed, 38 insertions(+), 57 deletions(-) rename src/main/java/org/jabref/gui/customentrytypes/{EntryTypeViewModel.java => CustomEntryTypeViewModel.java} (57%) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java index 4cca30717ed..f420771df02 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java @@ -3,13 +3,10 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.function.Predicate; import java.util.stream.Collectors; -import javafx.beans.Observable; import javafx.beans.property.ListProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleListProperty; @@ -34,7 +31,6 @@ import org.jabref.model.entry.types.UnknownEntryType; import org.jabref.preferences.PreferencesService; -import com.tobiasdiez.easybind.EasyBind; import de.saxsys.mvvmfx.utils.validation.FunctionBasedValidator; import de.saxsys.mvvmfx.utils.validation.ValidationMessage; import de.saxsys.mvvmfx.utils.validation.ValidationStatus; @@ -55,20 +51,16 @@ public Field fromString(String string) { } }; - private final ListProperty entryTypes; private final ListProperty fieldsForAdding; - private final ObjectProperty selectedEntryTypes = new SimpleObjectProperty<>(); - private final ListProperty fieldsForType; + private final ObjectProperty selectedEntryTypes = new SimpleObjectProperty<>(); private final ObjectProperty selectedFieldToAdd = new SimpleObjectProperty<>(); private final StringProperty entryTypeToAdd = new SimpleStringProperty(""); private final ObservableList allEntryTypes; - private final ObservableList allFieldsForType = FXCollections.observableArrayList(extractor -> new Observable[] {extractor.fieldName(), extractor.fieldType()}); private final ObjectProperty newFieldToAdd = new SimpleObjectProperty<>(); private final BibDatabaseMode mode; - private final Map> typesWithFields = new HashMap<>(); private final List typesToRemove = new ArrayList<>(); - private final ListProperty entryTypesWithFields = new SimpleListProperty<>(FXCollections.observableArrayList()); + private final ListProperty entryTypesWithFields = new SimpleListProperty<>(FXCollections.observableArrayList()); private final PreferencesService preferencesService; private final BibEntryTypesManager entryTypesManager; @@ -85,28 +77,14 @@ public CustomEntryTypeDialogViewModel(BibDatabaseMode mode, PreferencesService p allTypes.addAll(entryTypesManager.getAllCustomTypes(mode)); allEntryTypes = FXCollections.observableArrayList(allTypes); - entryTypes = new SimpleListProperty<>(allEntryTypes); fieldsForAdding = new SimpleListProperty<>(FXCollections.observableArrayList(FieldFactory.getCommonFields())); for (BibEntryType entryType : allTypes) { - - EntryTypeViewModel viewModel = new EntryTypeViewModel(entryType); + CustomEntryTypeViewModel viewModel = new CustomEntryTypeViewModel(entryType); this.entryTypesWithFields.add(viewModel); - - List fields = entryType.getAllFields().stream().map(bibField -> new FieldViewModel(bibField.getField(), entryType.isRequired(bibField.getField()), bibField.getPriority(), entryType)).collect(Collectors.toList()); - typesWithFields.put(entryType, FXCollections.observableArrayList(fields)); } - this.fieldsForType = new SimpleListProperty<>(allFieldsForType); - - EasyBind.subscribe(selectedEntryTypes, type -> { - if (type != null) { - entryTypesWithFields.get().stream().filter(t->t.entryType().get().equals(type)).map(f->f.fields()).findFirst(); - //TODO: Bind to list - } - }); - Predicate notEmpty = input -> (input != null) && !input.trim().isEmpty(); entryTypeValidator = new FunctionBasedValidator<>(entryTypeToAdd, notEmpty, ValidationMessage.error(Localization.lang("Entry type cannot be empty. Please enter a name."))); fieldValidator = new FunctionBasedValidator<>(newFieldToAdd, @@ -114,8 +92,8 @@ public CustomEntryTypeDialogViewModel(BibDatabaseMode mode, PreferencesService p ValidationMessage.error(Localization.lang("Field cannot be empty. Please enter a name."))); } - public ListProperty entryTypes() { - return this.entryTypes; + public ListProperty entryTypes() { + return this.entryTypesWithFields; } public ListProperty fields() { @@ -145,9 +123,9 @@ public String toString() { public void addNewField() { Field field = newFieldToAdd.getValue(); - FieldViewModel model = new FieldViewModel(field, true, FieldPriority.IMPORTANT, selectedEntryTypes.getValue()); - typesWithFields.computeIfAbsent(selectedEntryTypes.getValue(), key -> FXCollections.observableArrayList()).add(model); - allFieldsForType.add(model); + FieldViewModel model = new FieldViewModel(field, true, FieldPriority.IMPORTANT, selectedEntryTypes.getValue().entryType().get()); + //typesWithFields.computeIfAbsent(selectedEntryTypes.getValue().entryType(), key -> FXCollections.observableArrayList()).add(model); + //allFieldsForType.add(model); newFieldToAddProperty().setValue(null); } @@ -156,17 +134,12 @@ public void addNewCustomEntryType() { BibEntryType type = new BibEntryType(newentryType, new ArrayList<>(), Collections.emptyList()); this.allEntryTypes.add(type); this.entryTypeToAdd.setValue(""); - this.typesWithFields.put(type, FXCollections.observableArrayList()); } - public ObjectProperty selectedEntryTypeProperty() { + public ObjectProperty selectedEntryTypeProperty() { return this.selectedEntryTypes; } - public ListProperty fieldsforTypesProperty() { - return this.fieldsForType; - } - public ObjectProperty selectedFieldToAddProperty() { return this.selectedFieldToAdd; } @@ -187,22 +160,21 @@ public ValidationStatus fieldValidationStatus() { return fieldValidator.getValidationStatus(); } - public void removeEntryType(BibEntryType focusedItem) { - typesToRemove.add(focusedItem); - typesWithFields.remove(focusedItem); - allEntryTypes.remove(focusedItem); + public void removeEntryType(CustomEntryTypeViewModel focusedItem) { + //typesToRemove.add(focusedItem); + //typesWithFields.remove(focusedItem); + // allEntryTypes.remove(focusedItem); } public void removeField(FieldViewModel focusedItem) { - typesWithFields.computeIfAbsent(selectedEntryTypes.getValue(), key -> FXCollections.observableArrayList()).remove(focusedItem); - allFieldsForType.remove(focusedItem); + // typesWithFields.computeIfAbsent(selectedEntryTypes.getValue(), key -> FXCollections.observableArrayList()).remove(focusedItem); } public void apply() { - for (var typeWithField : typesWithFields.entrySet()) { - BibEntryType type = typeWithField.getKey(); - List allFields = typeWithField.getValue(); + for (var typeWithField : entryTypesWithFields) { + BibEntryType type = typeWithField.entryType().getValue(); + List allFields = typeWithField.fields().getValue(); List requiredFields = allFields.stream().filter(field -> field.getFieldType() == FieldType.REQUIRED).map(FieldViewModel::getField).map(OrFields::new).collect(Collectors.toList()); List otherFields = allFields.stream().filter(field -> field.getFieldType() == FieldType.OPTIONAL).map(bibField -> new BibField(bibField.getField(), bibField.getFieldPriority())).collect(Collectors.toList()); diff --git a/src/main/java/org/jabref/gui/customentrytypes/EntryTypeViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java similarity index 57% rename from src/main/java/org/jabref/gui/customentrytypes/EntryTypeViewModel.java rename to src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java index 006e06ee067..774331bd45f 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/EntryTypeViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java @@ -1,5 +1,6 @@ package org.jabref.gui.customentrytypes; +import java.util.List; import java.util.stream.Collectors; import javafx.beans.property.ListProperty; @@ -10,15 +11,17 @@ import org.jabref.model.entry.BibEntryType; -public class EntryTypeViewModel { +public class CustomEntryTypeViewModel { private final ObjectProperty entryType = new SimpleObjectProperty<>(); - private final ListProperty fields = new SimpleListProperty<>(FXCollections.emptyObservableList()); + private final ListProperty fields; - public EntryTypeViewModel(BibEntryType entryType) { + public CustomEntryTypeViewModel(BibEntryType entryType) { this.entryType.set(entryType); - this.fields.setAll(entryType.getAllFields().stream().map(bibField -> new FieldViewModel(bibField.getField(), entryType.isRequired(bibField.getField()), bibField.getPriority(), entryType)).collect(Collectors.toList())); + List types = entryType.getAllFields().stream().map(bibField -> new FieldViewModel(bibField.getField(), entryType.isRequired(bibField.getField()), bibField.getPriority(), entryType)).collect(Collectors.toList()); + + fields = new SimpleListProperty<>(FXCollections.observableArrayList(types)); } public ListProperty fields() { diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java index 1792080e24f..e3849e3c8cd 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java @@ -32,12 +32,12 @@ import org.jabref.logic.l10n.Localization; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.database.BibDatabaseMode; -import org.jabref.model.entry.BibEntryType; import org.jabref.model.entry.BibEntryTypesManager; import org.jabref.model.entry.field.Field; import org.jabref.preferences.PreferencesService; import com.airhacks.afterburner.views.ViewLoader; +import com.tobiasdiez.easybind.EasyBind; import de.saxsys.mvvmfx.utils.validation.visualization.ControlsFxVisualizer; public class CustomizeEntryTypeDialogView extends BaseDialog { @@ -45,9 +45,9 @@ public class CustomizeEntryTypeDialogView extends BaseDialog { private final BibDatabaseMode mode; private final BibEntryTypesManager entryTypesManager; - @FXML private TableView entryTypes; - @FXML private TableColumn entryTypColumn; - @FXML private TableColumn entryTypeActionsColumn; + @FXML private TableView entryTypes; + @FXML private TableColumn entryTypColumn; + @FXML private TableColumn entryTypeActionsColumn; @FXML private TextField addNewEntryType; @FXML private TableView fields; @FXML private TableColumn fieldNameColumn; @@ -97,14 +97,14 @@ private void setupTable() { // Table View must be editable, otherwise the change of the Radiobuttons does not propagate the commit event fields.setEditable(true); - entryTypColumn.setCellValueFactory(cellData -> new ReadOnlyStringWrapper(cellData.getValue().getType().getDisplayName())); + entryTypColumn.setCellValueFactory(cellData -> new ReadOnlyStringWrapper(cellData.getValue().entryType().get().getType().getDisplayName())); entryTypes.itemsProperty().bind(viewModel.entryTypes()); entryTypes.getSelectionModel().selectFirst(); entryTypeActionsColumn.setSortable(false); entryTypeActionsColumn.setReorderable(false); - entryTypeActionsColumn.setCellValueFactory(cellData -> new ReadOnlyStringWrapper(cellData.getValue().getType().getDisplayName())); - new ValueTableCellFactory() + entryTypeActionsColumn.setCellValueFactory(cellData -> new ReadOnlyStringWrapper(cellData.getValue().entryType().get().getType().getDisplayName())); + new ValueTableCellFactory() .withGraphic(item -> IconTheme.JabRefIcons.DELETE_ENTRY.getGraphicNode()) .withTooltip(name -> Localization.lang("Remove entry type") + " " + name) .withOnMouseClickedEvent(item -> evt -> viewModel.removeEntryType(entryTypes.getSelectionModel().getSelectedItem())) @@ -137,7 +137,13 @@ private void setupTable() { .install(fieldTypeActionColumn); viewModel.newFieldToAddProperty().bindBidirectional(addNewField.valueProperty()); - fields.itemsProperty().bindBidirectional(viewModel.fieldsforTypesProperty()); + + //Here we would need to select the + EasyBind.subscribe(viewModel.selectedEntryTypeProperty(), type -> { + if (type != null) { + fields.itemsProperty().bindBidirectional(type.fields()); + } + }); new ViewModelTableRowFactory() .setOnDragDetected(this::handleOnDragDetected) From 5eb5bfc3b3cb68fd77a1a5c0c900ca455946e7b8 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sat, 6 Jun 2020 20:18:25 +0200 Subject: [PATCH 13/39] add/remove handling --- .../CustomEntryTypeDialogViewModel.java | 9 +++---- .../CustomEntryTypeViewModel.java | 26 +++++++++++++++++-- .../CustomizeEntryTypeDialogView.java | 1 + .../org/jabref/model/entry/BibEntryType.java | 5 ++-- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java index f420771df02..918d7e2a93a 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java @@ -124,8 +124,7 @@ public String toString() { public void addNewField() { Field field = newFieldToAdd.getValue(); FieldViewModel model = new FieldViewModel(field, true, FieldPriority.IMPORTANT, selectedEntryTypes.getValue().entryType().get()); - //typesWithFields.computeIfAbsent(selectedEntryTypes.getValue().entryType(), key -> FXCollections.observableArrayList()).add(model); - //allFieldsForType.add(model); + this.selectedEntryTypes.getValue().addField(model); newFieldToAddProperty().setValue(null); } @@ -161,12 +160,12 @@ public ValidationStatus fieldValidationStatus() { } public void removeEntryType(CustomEntryTypeViewModel focusedItem) { - //typesToRemove.add(focusedItem); - //typesWithFields.remove(focusedItem); - // allEntryTypes.remove(focusedItem); + entryTypesWithFields.remove(focusedItem); } public void removeField(FieldViewModel focusedItem) { + this.selectedEntryTypes.getValue().removeField(focusedItem); + // typesWithFields.computeIfAbsent(selectedEntryTypes.getValue(), key -> FXCollections.observableArrayList()).remove(focusedItem); } diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java index 774331bd45f..1a7f1e27639 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java @@ -1,5 +1,6 @@ package org.jabref.gui.customentrytypes; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -8,6 +9,7 @@ import javafx.beans.property.SimpleListProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.collections.FXCollections; +import javafx.collections.ListChangeListener; import org.jabref.model.entry.BibEntryType; @@ -15,13 +17,28 @@ public class CustomEntryTypeViewModel { private final ObjectProperty entryType = new SimpleObjectProperty<>(); private final ListProperty fields; + private final List fieldsToRemove = new ArrayList<>(); public CustomEntryTypeViewModel(BibEntryType entryType) { this.entryType.set(entryType); - List types = entryType.getAllFields().stream().map(bibField -> new FieldViewModel(bibField.getField(), entryType.isRequired(bibField.getField()), bibField.getPriority(), entryType)).collect(Collectors.toList()); + List allFieldsForType = entryType.getAllFields().stream().map(bibField -> new FieldViewModel(bibField.getField(), entryType.isRequired(bibField.getField()), bibField.getPriority(), entryType)).collect(Collectors.toList()); - fields = new SimpleListProperty<>(FXCollections.observableArrayList(types)); + fields = new SimpleListProperty<>(FXCollections.observableArrayList(allFieldsForType)); + + fields.addListener((ListChangeListener) change -> { + + while (change.next()) { + if (change.wasRemoved()) { + fieldsToRemove.addAll(change.getAddedSubList()); + } + } + }); + + } + + public void addField(FieldViewModel field) { + this.fields.add(field); } public ListProperty fields() { @@ -32,4 +49,9 @@ public ObjectProperty entryType() { return this.entryType; } + public void removeField(FieldViewModel focusedItem) { + this.fields.remove(focusedItem); + + } + } diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java index e3849e3c8cd..dc74d18e4c0 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java @@ -141,6 +141,7 @@ private void setupTable() { //Here we would need to select the EasyBind.subscribe(viewModel.selectedEntryTypeProperty(), type -> { if (type != null) { + fields.itemsProperty().unbindBidirectional(type.fields()); fields.itemsProperty().bindBidirectional(type.fields()); } }); diff --git a/src/main/java/org/jabref/model/entry/BibEntryType.java b/src/main/java/org/jabref/model/entry/BibEntryType.java index 7c45b1d31ba..9415de35922 100644 --- a/src/main/java/org/jabref/model/entry/BibEntryType.java +++ b/src/main/java/org/jabref/model/entry/BibEntryType.java @@ -13,7 +13,6 @@ import org.jabref.model.entry.field.OrFields; import org.jabref.model.entry.field.StandardField; import org.jabref.model.entry.types.EntryType; -import org.jabref.model.util.LinkedHashSetEqualsUtil; public class BibEntryType implements Comparable { @@ -118,8 +117,8 @@ public boolean equals(Object o) { } BibEntryType that = (BibEntryType) o; return type.equals(that.type) && - LinkedHashSetEqualsUtil.linkedEquals(requiredFields, that.requiredFields) - && LinkedHashSetEqualsUtil.linkedEquals(fields, that.fields); + Objects.equals(requiredFields, that.requiredFields) && + Objects.equals(fields, that.fields); } From 2777455aa993194412f7301e62182548aad90833 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sat, 6 Jun 2020 20:25:29 +0200 Subject: [PATCH 14/39] check style --- .../gui/customentrytypes/CustomEntryTypeViewModel.java | 5 +++-- .../gui/customentrytypes/CustomizeEntryTypeDialogView.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java index 1a7f1e27639..419d01b3846 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java @@ -27,14 +27,12 @@ public CustomEntryTypeViewModel(BibEntryType entryType) { fields = new SimpleListProperty<>(FXCollections.observableArrayList(allFieldsForType)); fields.addListener((ListChangeListener) change -> { - while (change.next()) { if (change.wasRemoved()) { fieldsToRemove.addAll(change.getAddedSubList()); } } }); - } public void addField(FieldViewModel field) { @@ -51,7 +49,10 @@ public ObjectProperty entryType() { public void removeField(FieldViewModel focusedItem) { this.fields.remove(focusedItem); + } + public List getFieldsToRemove() { + return this.fieldsToRemove; } } diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java index dc74d18e4c0..ba105d9dc1e 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java @@ -138,7 +138,7 @@ private void setupTable() { viewModel.newFieldToAddProperty().bindBidirectional(addNewField.valueProperty()); - //Here we would need to select the + // Here we would need to select the fields EasyBind.subscribe(viewModel.selectedEntryTypeProperty(), type -> { if (type != null) { fields.itemsProperty().unbindBidirectional(type.fields()); From c2754198025e77e5140988e3006ce7f4c50d1cf4 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sun, 7 Jun 2020 17:25:26 +0200 Subject: [PATCH 15/39] simplify code and use observable list where possible --- .../CustomEntryTypeDialogViewModel.java | 29 +++++++++---------- .../CustomEntryTypeViewModel.java | 29 ++++++------------- .../CustomizeEntryTypeDialogView.java | 4 +-- .../gui/customentrytypes/FieldViewModel.java | 13 ++------- .../model/entry/field/FieldFactory.java | 16 ++++++++-- 5 files changed, 41 insertions(+), 50 deletions(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java index 918d7e2a93a..c41b5fa2342 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java @@ -51,15 +51,13 @@ public Field fromString(String string) { } }; - private final ListProperty fieldsForAdding; + private final ObservableList fieldsForAdding; private final ObjectProperty selectedEntryTypes = new SimpleObjectProperty<>(); private final ObjectProperty selectedFieldToAdd = new SimpleObjectProperty<>(); private final StringProperty entryTypeToAdd = new SimpleStringProperty(""); private final ObservableList allEntryTypes; private final ObjectProperty newFieldToAdd = new SimpleObjectProperty<>(); private final BibDatabaseMode mode; - private final List typesToRemove = new ArrayList<>(); - private final ListProperty entryTypesWithFields = new SimpleListProperty<>(FXCollections.observableArrayList()); private final PreferencesService preferencesService; @@ -77,8 +75,7 @@ public CustomEntryTypeDialogViewModel(BibDatabaseMode mode, PreferencesService p allTypes.addAll(entryTypesManager.getAllCustomTypes(mode)); allEntryTypes = FXCollections.observableArrayList(allTypes); - - fieldsForAdding = new SimpleListProperty<>(FXCollections.observableArrayList(FieldFactory.getCommonFields())); + fieldsForAdding = new SimpleListProperty<>(FXCollections.observableArrayList(FieldFactory.getStandardFielsdsWithBibTexKey())); for (BibEntryType entryType : allTypes) { CustomEntryTypeViewModel viewModel = new CustomEntryTypeViewModel(entryType); @@ -96,10 +93,14 @@ public ListProperty entryTypes() { return this.entryTypesWithFields; } - public ListProperty fields() { + public ObservableList fields() { return this.fieldsForAdding; } + public ObservableList fieldsForSelectedType() { + return this.selectedEntryTypes.getValue().fields(); + } + public enum FieldType { REQUIRED(Localization.lang("Required")), @@ -123,7 +124,7 @@ public String toString() { public void addNewField() { Field field = newFieldToAdd.getValue(); - FieldViewModel model = new FieldViewModel(field, true, FieldPriority.IMPORTANT, selectedEntryTypes.getValue().entryType().get()); + FieldViewModel model = new FieldViewModel(field, true, FieldPriority.IMPORTANT); this.selectedEntryTypes.getValue().addField(model); newFieldToAddProperty().setValue(null); } @@ -131,6 +132,8 @@ public void addNewField() { public void addNewCustomEntryType() { EntryType newentryType = new UnknownEntryType(entryTypeToAdd.getValue()); BibEntryType type = new BibEntryType(newentryType, new ArrayList<>(), Collections.emptyList()); + CustomEntryTypeViewModel viewModel = new CustomEntryTypeViewModel(type); + this.entryTypesWithFields.add(viewModel); this.allEntryTypes.add(type); this.entryTypeToAdd.setValue(""); } @@ -160,20 +163,18 @@ public ValidationStatus fieldValidationStatus() { } public void removeEntryType(CustomEntryTypeViewModel focusedItem) { - entryTypesWithFields.remove(focusedItem); + entryTypesWithFields.remove(focusedItem); } public void removeField(FieldViewModel focusedItem) { this.selectedEntryTypes.getValue().removeField(focusedItem); - - // typesWithFields.computeIfAbsent(selectedEntryTypes.getValue(), key -> FXCollections.observableArrayList()).remove(focusedItem); } public void apply() { for (var typeWithField : entryTypesWithFields) { BibEntryType type = typeWithField.entryType().getValue(); - List allFields = typeWithField.fields().getValue(); + List allFields = typeWithField.fields(); List requiredFields = allFields.stream().filter(field -> field.getFieldType() == FieldType.REQUIRED).map(FieldViewModel::getField).map(OrFields::new).collect(Collectors.toList()); List otherFields = allFields.stream().filter(field -> field.getFieldType() == FieldType.OPTIONAL).map(bibField -> new BibField(bibField.getField(), bibField.getFieldPriority())).collect(Collectors.toList()); @@ -182,13 +183,9 @@ public void apply() { entryTypesManager.addCustomOrModifiedType(newType, mode); } - for (var type : typesToRemove) { - entryTypesManager.removeCustomOrModifiedEntryType(type, mode); - } preferencesService.saveCustomEntryTypes(); // Reload types from preferences to make sure any modifications are present when reopening the dialog - entryTypesManager.addCustomOrModifiedTypes( - preferencesService.loadBibEntryTypes(BibDatabaseMode.BIBTEX), + entryTypesManager.addCustomOrModifiedTypes(preferencesService.loadBibEntryTypes(BibDatabaseMode.BIBTEX), preferencesService.loadBibEntryTypes(BibDatabaseMode.BIBLATEX)); } } diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java index 419d01b3846..0d6b3443aa8 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java @@ -1,45 +1,32 @@ package org.jabref.gui.customentrytypes; -import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; -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 javafx.collections.ListChangeListener; +import javafx.collections.ObservableList; import org.jabref.model.entry.BibEntryType; public class CustomEntryTypeViewModel { private final ObjectProperty entryType = new SimpleObjectProperty<>(); - private final ListProperty fields; - private final List fieldsToRemove = new ArrayList<>(); + private final ObservableList fields; public CustomEntryTypeViewModel(BibEntryType entryType) { this.entryType.set(entryType); - List allFieldsForType = entryType.getAllFields().stream().map(bibField -> new FieldViewModel(bibField.getField(), entryType.isRequired(bibField.getField()), bibField.getPriority(), entryType)).collect(Collectors.toList()); - - fields = new SimpleListProperty<>(FXCollections.observableArrayList(allFieldsForType)); - - fields.addListener((ListChangeListener) change -> { - while (change.next()) { - if (change.wasRemoved()) { - fieldsToRemove.addAll(change.getAddedSubList()); - } - } - }); + List allFieldsForType = entryType.getAllFields().stream().map(bibField -> new FieldViewModel(bibField.getField(), entryType.isRequired(bibField.getField()), bibField.getPriority())).collect(Collectors.toList()); + fields = FXCollections.observableArrayList(allFieldsForType); } public void addField(FieldViewModel field) { this.fields.add(field); } - public ListProperty fields() { + public ObservableList fields() { return this.fields; } @@ -51,8 +38,10 @@ public void removeField(FieldViewModel focusedItem) { this.fields.remove(focusedItem); } - public List getFieldsToRemove() { - return this.fieldsToRemove; + @Override + public String toString() { + return "CustomEntryTypeViewModel [entryType=" + entryType + ", fields=" + fields + "]"; } + } diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java index ba105d9dc1e..49ea54c5d17 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java @@ -141,8 +141,8 @@ private void setupTable() { // Here we would need to select the fields EasyBind.subscribe(viewModel.selectedEntryTypeProperty(), type -> { if (type != null) { - fields.itemsProperty().unbindBidirectional(type.fields()); - fields.itemsProperty().bindBidirectional(type.fields()); + fields.getItems().clear(); + fields.setItems(viewModel.fieldsForSelectedType()); } }); diff --git a/src/main/java/org/jabref/gui/customentrytypes/FieldViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/FieldViewModel.java index ae2f0f853fc..7cb538e4b17 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/FieldViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/FieldViewModel.java @@ -6,7 +6,6 @@ import javafx.beans.property.StringProperty; import org.jabref.gui.customentrytypes.CustomEntryTypeDialogViewModel.FieldType; -import org.jabref.model.entry.BibEntryType; import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldPriority; @@ -16,18 +15,16 @@ public class FieldViewModel { private final StringProperty fieldName = new SimpleStringProperty(""); private final Field field; private final FieldPriority fieldPriority; - private BibEntryType entryType; - public FieldViewModel(Field field, FieldType fieldType, FieldPriority fieldPriority, BibEntryType entryType) { + public FieldViewModel(Field field, FieldType fieldType, FieldPriority fieldPriority) { this.field = field; - this.entryType = entryType; this.fieldName.setValue(field.getDisplayName()); this.fieldType = new SimpleObjectProperty<>(fieldType); this.fieldPriority = fieldPriority; } - public FieldViewModel(Field field, boolean required, FieldPriority fieldPriority, BibEntryType entryType) { - this(field, required ? FieldType.REQUIRED : FieldType.OPTIONAL, fieldPriority, entryType); + public FieldViewModel(Field field, boolean required, FieldPriority fieldPriority) { + this(field, required ? FieldType.REQUIRED : FieldType.OPTIONAL, fieldPriority); } public ObjectProperty fieldType() { @@ -42,10 +39,6 @@ public Field getField() { return this.field; } - public BibEntryType getEntryType() { - return this.entryType; - } - public FieldPriority getFieldPriority() { return this.fieldPriority; } diff --git a/src/main/java/org/jabref/model/entry/field/FieldFactory.java b/src/main/java/org/jabref/model/entry/field/FieldFactory.java index f82895baa8f..5c132d1d0b3 100644 --- a/src/main/java/org/jabref/model/entry/field/FieldFactory.java +++ b/src/main/java/org/jabref/model/entry/field/FieldFactory.java @@ -95,8 +95,8 @@ public static Set getJournalNameFields() { */ public static Set getCommonFields() { EnumSet allFields = EnumSet.allOf(StandardField.class); - - LinkedHashSet publicAndInternalFields = new LinkedHashSet<>(allFields.size()); + + LinkedHashSet publicAndInternalFields = new LinkedHashSet<>(allFields.size() + 3); publicAndInternalFields.add(InternalField.INTERNAL_ALL_FIELD); publicAndInternalFields.add(InternalField.INTERNAL_ALL_TEXT_FIELDS_FIELD); publicAndInternalFields.add(InternalField.KEY_FIELD); @@ -104,6 +104,18 @@ public static Set getCommonFields() { return publicAndInternalFields; } + /** + * Returns a List with all standard fields and the bibtexkey field + */ + public static Set getStandardFielsdsWithBibTexKey() { + EnumSet allFields = EnumSet.allOf(StandardField.class); + + LinkedHashSet standardFieldsWithBibtexKey = new LinkedHashSet<>(allFields.size() + 1); + standardFieldsWithBibtexKey.add(InternalField.KEY_FIELD); + standardFieldsWithBibtexKey.addAll(allFields); + + return standardFieldsWithBibtexKey; + } public static Set getBookNameFields() { return getFieldsFiltered(field -> field.getProperties().contains(FieldProperty.BOOK_NAME)); From eaf709957e2e2d36df8693e38805835ffce727a6 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sun, 7 Jun 2020 17:57:36 +0200 Subject: [PATCH 16/39] fix checkstyle todo serialiation fixes --- .../jabref/gui/customentrytypes/CustomEntryTypeViewModel.java | 1 - src/main/java/org/jabref/model/entry/field/FieldFactory.java | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java index 0d6b3443aa8..a05f8998b1f 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java @@ -43,5 +43,4 @@ public String toString() { return "CustomEntryTypeViewModel [entryType=" + entryType + ", fields=" + fields + "]"; } - } diff --git a/src/main/java/org/jabref/model/entry/field/FieldFactory.java b/src/main/java/org/jabref/model/entry/field/FieldFactory.java index 5c132d1d0b3..a66ed9612da 100644 --- a/src/main/java/org/jabref/model/entry/field/FieldFactory.java +++ b/src/main/java/org/jabref/model/entry/field/FieldFactory.java @@ -104,6 +104,7 @@ public static Set getCommonFields() { return publicAndInternalFields; } + /** * Returns a List with all standard fields and the bibtexkey field */ From c04b2fc2d83a624fd187bdf4ecb05ea3ee4087a4 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sun, 7 Jun 2020 18:52:08 +0200 Subject: [PATCH 17/39] fix unit tests due to LinkedHashSet --- .../model/util/LinkedHashSetEqualsUtil.java | 23 ------------------- .../jabref/preferences/JabRefPreferences.java | 2 +- .../exporter/BibtexDatabaseWriterTest.java | 4 ++-- .../bibWithUserCommentAndEntryChange.bib | 4 ++-- .../resources/testbib/bibWithUserComments.bib | 4 ++-- 5 files changed, 7 insertions(+), 30 deletions(-) delete mode 100644 src/main/java/org/jabref/model/util/LinkedHashSetEqualsUtil.java diff --git a/src/main/java/org/jabref/model/util/LinkedHashSetEqualsUtil.java b/src/main/java/org/jabref/model/util/LinkedHashSetEqualsUtil.java deleted file mode 100644 index 455c76f3aa7..00000000000 --- a/src/main/java/org/jabref/model/util/LinkedHashSetEqualsUtil.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.jabref.model.util; - -import java.util.Iterator; -import java.util.LinkedHashSet; - -public class LinkedHashSetEqualsUtil { - - public static boolean linkedEquals(LinkedHashSet left, LinkedHashSet right) { - Iterator leftItr = left.iterator(); - Iterator rightItr = right.iterator(); - - while (leftItr.hasNext() && rightItr.hasNext()) { - K leftEntry = leftItr.next(); - K rightEntry = rightItr.next(); - - // AbstractList does null checks here but for sets we can assume you never get null entries - if (!leftEntry.equals(rightEntry)) { - return false; - } - } - return !(leftItr.hasNext() || rightItr.hasNext()); - } -} diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index c4c58fd87fb..086245fdfd8 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -1111,7 +1111,7 @@ public void exportPreferences(String filename) throws JabRefException { } public void exportPreferences(Path file) throws JabRefException { - LOGGER.debug(file.toAbsolutePath().toString()); + LOGGER.debug("Exporting preferences ", file.toAbsolutePath()); try (OutputStream os = Files.newOutputStream(file)) { prefs.exportSubtree(os); } catch (BackingStoreException | IOException ex) { diff --git a/src/test/java/org/jabref/logic/exporter/BibtexDatabaseWriterTest.java b/src/test/java/org/jabref/logic/exporter/BibtexDatabaseWriterTest.java index 22b4736c4a5..1e63213a582 100644 --- a/src/test/java/org/jabref/logic/exporter/BibtexDatabaseWriterTest.java +++ b/src/test/java/org/jabref/logic/exporter/BibtexDatabaseWriterTest.java @@ -286,7 +286,7 @@ void writeEntryWithCustomizedTypeAlsoWritesTypeDeclaration() throws Exception { "@Customizedtype{," + OS.NEWLINE + "}" + OS.NEWLINE + OS.NEWLINE + "@Comment{jabref-meta: databaseType:bibtex;}" + OS.NEWLINE + OS.NEWLINE - + "@Comment{jabref-entrytype: customizedtype: req[author;date;title] opt[month;publisher;year]}" + OS.NEWLINE, + + "@Comment{jabref-entrytype: customizedtype: req[title;author;date] opt[year;month;publisher]}" + OS.NEWLINE, stringWriter.toString()); } @@ -730,8 +730,8 @@ public void saveAlsoSavesSecondModification() throws Exception { "@Article{test," + OS.NEWLINE + " author = {Test}," + OS.NEWLINE + " journal = {International Journal of Something}," + OS.NEWLINE + - " note = {some note}," + OS.NEWLINE + " number = {1}," + OS.NEWLINE + + " note = {some note}," + OS.NEWLINE + "}" + OS.NEWLINE + "" + OS.NEWLINE + "@Comment{jabref-meta: databaseType:bibtex;}" + OS.NEWLINE, stringWriter.toString()); diff --git a/src/test/resources/testbib/bibWithUserCommentAndEntryChange.bib b/src/test/resources/testbib/bibWithUserCommentAndEntryChange.bib index 326c45842a3..64df3fa78b8 100644 --- a/src/test/resources/testbib/bibWithUserCommentAndEntryChange.bib +++ b/src/test/resources/testbib/bibWithUserCommentAndEntryChange.bib @@ -32,11 +32,11 @@ @Comment this @InProceedings{1137631, author = {Mr. Author}, - booktitle = {SESS '06: Proceedings of the 2006 international workshop on Software engineering for secure systems}, title = {Extending XP practices to support security requirements engineering}, + booktitle = {SESS '06: Proceedings of the 2006 international workshop on Software engineering for secure systems}, year = {2006}, - address = {New York, NY, USA}, pages = {11--18}, + address = {New York, NY, USA}, publisher = {ACM}, bdsk-url-1 = {http://doi.acm.org/10.1145/1137627.1137631}, doi = {http://doi.acm.org/10.1145/1137627.1137631}, diff --git a/src/test/resources/testbib/bibWithUserComments.bib b/src/test/resources/testbib/bibWithUserComments.bib index 90685b10eac..fa6af4fcc04 100644 --- a/src/test/resources/testbib/bibWithUserComments.bib +++ b/src/test/resources/testbib/bibWithUserComments.bib @@ -33,12 +33,12 @@ @Comment this @INPROCEEDINGS{1137631, author = {Gustav Bostr\"{o}m and Jaana W\"{a}yrynen and Marine Bod\'{e}n and Konstantin Beznosov and Philippe Kruchten}, - title = {Extending XP practices to support security requirements engineering}, booktitle = {SESS '06: Proceedings of the 2006 international workshop on Software engineering for secure systems}, + title = {Extending XP practices to support security requirements engineering}, year = {2006}, - pages = {11--18}, address = {New York, NY, USA}, + pages = {11--18}, publisher = {ACM}, bdsk-url-1 = {http://doi.acm.org/10.1145/1137627.1137631}, doi = {http://doi.acm.org/10.1145/1137627.1137631}, From 15ba840eafb9856d7413f6319ccb23c189f9e9bd Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sun, 7 Jun 2020 19:11:23 +0200 Subject: [PATCH 18/39] add extractor --- .../gui/customentrytypes/CustomEntryTypeDialogViewModel.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java index c41b5fa2342..ac9ee968c59 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java @@ -7,6 +7,7 @@ import java.util.function.Predicate; import java.util.stream.Collectors; +import javafx.beans.Observable; import javafx.beans.property.ListProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleListProperty; @@ -58,7 +59,7 @@ public Field fromString(String string) { private final ObservableList allEntryTypes; private final ObjectProperty newFieldToAdd = new SimpleObjectProperty<>(); private final BibDatabaseMode mode; - private final ListProperty entryTypesWithFields = new SimpleListProperty<>(FXCollections.observableArrayList()); + private final ListProperty entryTypesWithFields = new SimpleListProperty<>(FXCollections.observableArrayList(extractor -> new Observable[] {extractor.entryType(), extractor.fields()})); private final PreferencesService preferencesService; private final BibEntryTypesManager entryTypesManager; From 614470e2e45513c935bc196198af6394fea0537e Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Mon, 8 Jun 2020 16:50:16 +0200 Subject: [PATCH 19/39] change to observablelist --- .../gui/customentrytypes/CustomEntryTypeDialogViewModel.java | 5 ++--- .../gui/customentrytypes/CustomizeEntryTypeDialogView.java | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java index ac9ee968c59..40d0a459564 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java @@ -8,7 +8,6 @@ import java.util.stream.Collectors; import javafx.beans.Observable; -import javafx.beans.property.ListProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleListProperty; import javafx.beans.property.SimpleObjectProperty; @@ -59,7 +58,7 @@ public Field fromString(String string) { private final ObservableList allEntryTypes; private final ObjectProperty newFieldToAdd = new SimpleObjectProperty<>(); private final BibDatabaseMode mode; - private final ListProperty entryTypesWithFields = new SimpleListProperty<>(FXCollections.observableArrayList(extractor -> new Observable[] {extractor.entryType(), extractor.fields()})); + private final ObservableList entryTypesWithFields = FXCollections.observableArrayList(extractor -> new Observable[] {extractor.entryType(), extractor.fields()}); private final PreferencesService preferencesService; private final BibEntryTypesManager entryTypesManager; @@ -90,7 +89,7 @@ public CustomEntryTypeDialogViewModel(BibDatabaseMode mode, PreferencesService p ValidationMessage.error(Localization.lang("Field cannot be empty. Please enter a name."))); } - public ListProperty entryTypes() { + public ObservableList entryTypes() { return this.entryTypesWithFields; } diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java index 49ea54c5d17..21ee18f2456 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java @@ -98,7 +98,7 @@ private void setupTable() { // Table View must be editable, otherwise the change of the Radiobuttons does not propagate the commit event fields.setEditable(true); entryTypColumn.setCellValueFactory(cellData -> new ReadOnlyStringWrapper(cellData.getValue().entryType().get().getType().getDisplayName())); - entryTypes.itemsProperty().bind(viewModel.entryTypes()); + entryTypes.setItems(viewModel.entryTypes()); entryTypes.getSelectionModel().selectFirst(); entryTypeActionsColumn.setSortable(false); From e16cbda7372d0974792eb0b9eed2bf8bdb192370 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Mon, 8 Jun 2020 18:57:51 +0200 Subject: [PATCH 20/39] fix issue that items get cleared remove uncessary code --- .../CustomEntryTypeDialogViewModel.java | 20 +++------- .../CustomEntryTypeViewModel.java | 20 +++++++++- .../CustomizeEntryTypeDialogView.java | 39 +++++++++++-------- 3 files changed, 48 insertions(+), 31 deletions(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java index 40d0a459564..d78c9c8662c 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java @@ -9,7 +9,6 @@ import javafx.beans.Observable; import javafx.beans.property.ObjectProperty; -import javafx.beans.property.SimpleListProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; @@ -51,11 +50,10 @@ public Field fromString(String string) { } }; - private final ObservableList fieldsForAdding; - private final ObjectProperty selectedEntryTypes = new SimpleObjectProperty<>(); + private final ObservableList fieldsForAdding = FXCollections.observableArrayList(FieldFactory.getStandardFielsdsWithBibTexKey()); + private final ObjectProperty selectedEntryType = new SimpleObjectProperty<>(); private final ObjectProperty selectedFieldToAdd = new SimpleObjectProperty<>(); private final StringProperty entryTypeToAdd = new SimpleStringProperty(""); - private final ObservableList allEntryTypes; private final ObjectProperty newFieldToAdd = new SimpleObjectProperty<>(); private final BibDatabaseMode mode; private final ObservableList entryTypesWithFields = FXCollections.observableArrayList(extractor -> new Observable[] {extractor.entryType(), extractor.fields()}); @@ -74,8 +72,6 @@ public CustomEntryTypeDialogViewModel(BibDatabaseMode mode, PreferencesService p Collection allTypes = entryTypesManager.getAllTypes(mode); allTypes.addAll(entryTypesManager.getAllCustomTypes(mode)); - allEntryTypes = FXCollections.observableArrayList(allTypes); - fieldsForAdding = new SimpleListProperty<>(FXCollections.observableArrayList(FieldFactory.getStandardFielsdsWithBibTexKey())); for (BibEntryType entryType : allTypes) { CustomEntryTypeViewModel viewModel = new CustomEntryTypeViewModel(entryType); @@ -93,13 +89,10 @@ public ObservableList entryTypes() { return this.entryTypesWithFields; } - public ObservableList fields() { + public ObservableList fieldsForAdding() { return this.fieldsForAdding; } - public ObservableList fieldsForSelectedType() { - return this.selectedEntryTypes.getValue().fields(); - } public enum FieldType { @@ -125,7 +118,7 @@ public String toString() { public void addNewField() { Field field = newFieldToAdd.getValue(); FieldViewModel model = new FieldViewModel(field, true, FieldPriority.IMPORTANT); - this.selectedEntryTypes.getValue().addField(model); + this.selectedEntryType.getValue().addField(model); newFieldToAddProperty().setValue(null); } @@ -134,12 +127,11 @@ public void addNewCustomEntryType() { BibEntryType type = new BibEntryType(newentryType, new ArrayList<>(), Collections.emptyList()); CustomEntryTypeViewModel viewModel = new CustomEntryTypeViewModel(type); this.entryTypesWithFields.add(viewModel); - this.allEntryTypes.add(type); this.entryTypeToAdd.setValue(""); } public ObjectProperty selectedEntryTypeProperty() { - return this.selectedEntryTypes; + return this.selectedEntryType; } public ObjectProperty selectedFieldToAddProperty() { @@ -167,7 +159,7 @@ public void removeEntryType(CustomEntryTypeViewModel focusedItem) { } public void removeField(FieldViewModel focusedItem) { - this.selectedEntryTypes.getValue().removeField(focusedItem); + this.selectedEntryType.getValue().removeField(focusedItem); } public void apply() { diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java index a05f8998b1f..963666ddc6b 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java @@ -1,6 +1,7 @@ package org.jabref.gui.customentrytypes; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import javafx.beans.property.ObjectProperty; @@ -19,7 +20,24 @@ public CustomEntryTypeViewModel(BibEntryType entryType) { this.entryType.set(entryType); List allFieldsForType = entryType.getAllFields().stream().map(bibField -> new FieldViewModel(bibField.getField(), entryType.isRequired(bibField.getField()), bibField.getPriority())).collect(Collectors.toList()); - fields = FXCollections.observableArrayList(allFieldsForType); + fields = FXCollections.observableArrayList((allFieldsForType)); + } + + @Override + public int hashCode() { + return Objects.hash(entryType, fields); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof CustomEntryTypeViewModel)) { + return false; + } + CustomEntryTypeViewModel other = (CustomEntryTypeViewModel) obj; + return Objects.equals(entryType, other.entryType) && Objects.equals(fields, other.fields); } public void addField(FieldViewModel field) { diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java index 21ee18f2456..054c6c875ba 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java @@ -23,9 +23,11 @@ import javafx.scene.input.TransferMode; import org.jabref.gui.DragAndDropDataFormats; +import org.jabref.gui.StateManager; import org.jabref.gui.customentrytypes.CustomEntryTypeDialogViewModel.FieldType; import org.jabref.gui.icon.IconTheme; import org.jabref.gui.util.BaseDialog; +import org.jabref.gui.util.CustomLocalDragboard; import org.jabref.gui.util.RadioButtonCell; import org.jabref.gui.util.ValueTableCellFactory; import org.jabref.gui.util.ViewModelTableRowFactory; @@ -59,9 +61,12 @@ public class CustomizeEntryTypeDialogView extends BaseDialog { @FXML private Button addNewFieldButton; @Inject private PreferencesService preferencesService; + @Inject private StateManager stateManager; private CustomEntryTypeDialogViewModel viewModel; private final ControlsFxVisualizer visualizer = new ControlsFxVisualizer(); + private CustomLocalDragboard localDragboard; + public CustomizeEntryTypeDialogView(BibDatabaseContext bibDatabaseContext, BibEntryTypesManager entryTypesManager) { this.mode = bibDatabaseContext.getMode(); @@ -81,6 +86,9 @@ public CustomizeEntryTypeDialogView(BibDatabaseContext bibDatabaseContext, BibEn @FXML private void initialize() { + // As the state manager gets injected it's not avaiable in the constructor + this.localDragboard = stateManager.getLocalDragboard(); + viewModel = new CustomEntryTypeDialogViewModel(mode, preferencesService, entryTypesManager); setupTable(); @@ -123,7 +131,7 @@ private void setupTable() { viewModel.selectedEntryTypeProperty().bind(entryTypes.getSelectionModel().selectedItemProperty()); viewModel.entryTypeToAddProperty().bindBidirectional(addNewEntryType.textProperty()); - addNewField.setItems(viewModel.fields()); + addNewField.setItems(viewModel.fieldsForAdding()); addNewField.setConverter(viewModel.FIELD_STRING_CONVERTER); fieldTypeActionColumn.setSortable(false); @@ -141,16 +149,16 @@ private void setupTable() { // Here we would need to select the fields EasyBind.subscribe(viewModel.selectedEntryTypeProperty(), type -> { if (type != null) { - fields.getItems().clear(); - fields.setItems(viewModel.fieldsForSelectedType()); + var items = type.fields(); + fields.setItems(items); } }); new ViewModelTableRowFactory() - .setOnDragDetected(this::handleOnDragDetected) - .setOnDragDropped(this::handleOnDragDropped) - .setOnDragOver(this::handleOnDragOver) - .install(fields); + .setOnDragDetected(this::handleOnDragDetected) + .setOnDragDropped(this::handleOnDragDropped) + .setOnDragOver(this::handleOnDragOver) + .install(fields); } @@ -164,36 +172,35 @@ private void handleOnDragDetected(TableRow row, FieldViewModel f // Start drag'n'drop row.startFullDrag(); - Field field = fields.getSelectionModel().getSelectedItem().getField(); + FieldViewModel field = fields.getSelectionModel().getSelectedItem(); ClipboardContent content = new ClipboardContent(); Dragboard dragboard = fields.startDragAndDrop(TransferMode.MOVE); - content.put(DragAndDropDataFormats.FIELD, field); + content.put(DragAndDropDataFormats.FIELD, ""); + localDragboard.putValue(FieldViewModel.class, field); dragboard.setContent(content); event.consume(); } private void handleOnDragDropped(TableRow row, FieldViewModel originalItem, DragEvent event) { boolean success = false; - Dragboard dragboard = event.getDragboard(); ObservableList items = fields.itemsProperty().get(); - if (dragboard.hasContent(DragAndDropDataFormats.FIELD)) { + if (localDragboard.hasType(FieldViewModel.class)) { - Field field = (Field) dragboard.getContent(DragAndDropDataFormats.FIELD); - FieldViewModel transferedItem = null; + FieldViewModel field = localDragboard.getValue(FieldViewModel.class); int draggedIdx = 0; for (int i = 0; i < items.size(); i++) { - if (items.get(i).getField().equals(field)) { + if (items.get(i).equals(field)) { draggedIdx = i; - transferedItem = items.get(i); + field = items.get(i); break; } } int thisIdx = items.indexOf(originalItem); items.set(draggedIdx, originalItem); - items.set(thisIdx, transferedItem); + items.set(thisIdx, field); success = true; } From 70853bd80b30e39d5a6ce34cde5819f78a8387b8 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Thu, 11 Jun 2020 19:20:37 +0200 Subject: [PATCH 21/39] Add option to remove custom entr types Select newly added entrytype in list --- .../CustomEntryTypeDialogViewModel.java | 10 +++++++++- .../customentrytypes/CustomizeEntryTypeDialogView.java | 4 +++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java index d78c9c8662c..70351288bd9 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java @@ -57,6 +57,7 @@ public Field fromString(String string) { private final ObjectProperty newFieldToAdd = new SimpleObjectProperty<>(); private final BibDatabaseMode mode; private final ObservableList entryTypesWithFields = FXCollections.observableArrayList(extractor -> new Observable[] {extractor.entryType(), extractor.fields()}); + private final List entryTypesToDelete = new ArrayList<>(); private final PreferencesService preferencesService; private final BibEntryTypesManager entryTypesManager; @@ -122,12 +123,14 @@ public void addNewField() { newFieldToAddProperty().setValue(null); } - public void addNewCustomEntryType() { + public CustomEntryTypeViewModel addNewCustomEntryType() { EntryType newentryType = new UnknownEntryType(entryTypeToAdd.getValue()); BibEntryType type = new BibEntryType(newentryType, new ArrayList<>(), Collections.emptyList()); CustomEntryTypeViewModel viewModel = new CustomEntryTypeViewModel(type); this.entryTypesWithFields.add(viewModel); this.entryTypeToAdd.setValue(""); + + return viewModel; } public ObjectProperty selectedEntryTypeProperty() { @@ -156,6 +159,7 @@ public ValidationStatus fieldValidationStatus() { public void removeEntryType(CustomEntryTypeViewModel focusedItem) { entryTypesWithFields.remove(focusedItem); + this.entryTypesToDelete.add(focusedItem.entryType().getValue()); } public void removeField(FieldViewModel focusedItem) { @@ -175,6 +179,10 @@ public void apply() { entryTypesManager.addCustomOrModifiedType(newType, mode); } + for (var entryType: entryTypesToDelete) { + entryTypesManager.removeCustomOrModifiedEntryType(entryType, mode); + } + preferencesService.saveCustomEntryTypes(); // Reload types from preferences to make sure any modifications are present when reopening the dialog entryTypesManager.addCustomOrModifiedTypes(preferencesService.loadBibEntryTypes(BibDatabaseMode.BIBTEX), diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java index 054c6c875ba..7d6d44d5742 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java @@ -211,7 +211,9 @@ private void handleOnDragDropped(TableRow row, FieldViewModel or @FXML void addEntryType() { - viewModel.addNewCustomEntryType(); + CustomEntryTypeViewModel newlyAdded = viewModel.addNewCustomEntryType(); + this.entryTypes.getSelectionModel().select(newlyAdded); + this.entryTypes.scrollTo(newlyAdded); } @FXML From e38742bda5f023027d5f542ecb706deeaad5a928 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Thu, 11 Jun 2020 19:36:20 +0200 Subject: [PATCH 22/39] fix checkstyle --- .../customentrytypes/CustomEntryTypeDialogViewModel.java | 1 - .../gui/customentrytypes/CustomizeEntryTypeDialogView.java | 7 ++----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java index 70351288bd9..b6b8dbc9a0f 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java @@ -94,7 +94,6 @@ public ObservableList fieldsForAdding() { return this.fieldsForAdding; } - public enum FieldType { REQUIRED(Localization.lang("Required")), diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java index 7d6d44d5742..3cdb803fe00 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java @@ -65,8 +65,7 @@ public class CustomizeEntryTypeDialogView extends BaseDialog { private CustomEntryTypeDialogViewModel viewModel; private final ControlsFxVisualizer visualizer = new ControlsFxVisualizer(); - private CustomLocalDragboard localDragboard; - + private CustomLocalDragboard localDragboard; public CustomizeEntryTypeDialogView(BibDatabaseContext bibDatabaseContext, BibEntryTypesManager entryTypesManager) { this.mode = bibDatabaseContext.getMode(); @@ -159,8 +158,7 @@ private void setupTable() { .setOnDragDropped(this::handleOnDragDropped) .setOnDragOver(this::handleOnDragOver) .install(fields); - - } +} private void handleOnDragOver(FieldViewModel originalItem, DragEvent event) { if ((event.getGestureSource() != originalItem) && event.getDragboard().hasContent(DragAndDropDataFormats.FIELD)) { @@ -206,7 +204,6 @@ private void handleOnDragDropped(TableRow row, FieldViewModel or event.setDropCompleted(success); event.consume(); - } @FXML From 230d8dd00560d5e92f6d6e96c784bd733d692a95 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Fri, 12 Jun 2020 16:32:21 +0200 Subject: [PATCH 23/39] Fix bug with empty ghost fields on empty field collection when parsing --- .../model/entry/field/FieldFactory.java | 4 ++++ .../model/entry/BibEntryTypesManagerTest.java | 22 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/main/java/org/jabref/model/entry/field/FieldFactory.java b/src/main/java/org/jabref/model/entry/field/FieldFactory.java index a66ed9612da..b4a69fa9ccd 100644 --- a/src/main/java/org/jabref/model/entry/field/FieldFactory.java +++ b/src/main/java/org/jabref/model/entry/field/FieldFactory.java @@ -11,6 +11,7 @@ import java.util.function.Predicate; import java.util.stream.Collectors; +import org.jabref.model.strings.StringUtil; import org.jabref.model.util.OptionalUtil; public class FieldFactory { @@ -46,6 +47,7 @@ public static List getIdentifierFieldNames() { public static OrFields parseOrFields(String fieldNames) { Set fields = Arrays.stream(fieldNames.split(FieldFactory.FIELD_OR_SEPARATOR)) + .filter(StringUtil::isNotBlank) .map(FieldFactory::parseField) .collect(Collectors.toCollection(LinkedHashSet::new)); return new OrFields(fields); @@ -53,12 +55,14 @@ public static OrFields parseOrFields(String fieldNames) { public static Set parseOrFieldsList(String fieldNames) { return Arrays.stream(fieldNames.split(FieldFactory.DELIMITER)) + .filter(StringUtil::isNotBlank) .map(FieldFactory::parseOrFields) .collect(Collectors.toCollection(LinkedHashSet::new)); } public static Set parseFieldList(String fieldNames) { return Arrays.stream(fieldNames.split(FieldFactory.DELIMITER)) + .filter(StringUtil::isNotBlank) .map(FieldFactory::parseField) .collect(Collectors.toCollection(LinkedHashSet::new)); } diff --git a/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java b/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java index 6d0af169818..2f876862802 100644 --- a/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java +++ b/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java @@ -8,6 +8,7 @@ import org.jabref.model.database.BibDatabaseMode; import org.jabref.model.entry.field.BibField; import org.jabref.model.entry.field.FieldPriority; +import org.jabref.model.entry.field.OrFields; import org.jabref.model.entry.field.StandardField; import org.jabref.model.entry.types.BiblatexEntryTypeDefinitions; import org.jabref.model.entry.types.BibtexEntryTypeDefinitions; @@ -130,4 +131,25 @@ void standardTypeIsStillAccessibleIfOverwritten(BibDatabaseMode mode) { entryTypesManager.addCustomOrModifiedType(overwrittenStandardType, mode); assertFalse(entryTypesManager.isCustomType(overwrittenStandardType.getType(), mode)); } + + @ParameterizedTest + @MethodSource("mode") + void testParsingEmptyOrFieldsReturnsEmpyCollections(BibDatabaseMode mode) { + String serialized = entryTypesManager.serialize(newCustomType); + Optional type = entryTypesManager.parse(serialized); + assertEquals(Collections.emptySet(), type.get().getRequiredFields()); + } + + @ParameterizedTest + @MethodSource("mode") + void testParsingEmptyOptionalFieldsFieldsReturnsEmpyCollections(BibDatabaseMode mode) { + newCustomType = new BibEntryType( + CUSTOM_TYPE, + Collections.emptySet(), + Collections.singleton(new OrFields(StandardField.AUTHOR))); + + String serialized = entryTypesManager.serialize(newCustomType); + Optional type = entryTypesManager.parse(serialized); + assertEquals(Collections.emptySet(), type.get().getOptionalFields()); + } } From 831eb500ea249819c7ed18c032b90e7a954500a9 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Fri, 12 Jun 2020 17:45:30 +0200 Subject: [PATCH 24/39] checkstyle --- .../gui/customentrytypes/CustomEntryTypeDialogViewModel.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java index b6b8dbc9a0f..322d9cd0f13 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java @@ -73,7 +73,6 @@ public CustomEntryTypeDialogViewModel(BibDatabaseMode mode, PreferencesService p Collection allTypes = entryTypesManager.getAllTypes(mode); allTypes.addAll(entryTypesManager.getAllCustomTypes(mode)); - for (BibEntryType entryType : allTypes) { CustomEntryTypeViewModel viewModel = new CustomEntryTypeViewModel(entryType); this.entryTypesWithFields.add(viewModel); From 73bd208964a0842832c42a52c5a3cd501d25429c Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Fri, 12 Jun 2020 18:52:58 +0200 Subject: [PATCH 25/39] add reset and fix tests --- .../CustomEntryTypeDialogViewModel.java | 7 ++++++ .../CustomizeEntryTypeDialog.fxml | 1 + .../CustomizeEntryTypeDialogView.java | 19 ++++++++++++++- .../jabref/preferences/JabRefPreferences.java | 14 +++++++---- .../preferences/PreferencesService.java | 2 ++ .../logic/bibtex/BibEntryWriterTest.java | 24 +++++++++---------- 6 files changed, 50 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java index 322d9cd0f13..227e385c816 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java @@ -164,6 +164,13 @@ public void removeField(FieldViewModel focusedItem) { this.selectedEntryType.getValue().removeField(focusedItem); } + public void resetAllCustomEntryTypes() { + this.preferencesService.clearAllBibEntryTypes(); + entryTypesManager.addCustomOrModifiedTypes(preferencesService.loadBibEntryTypes(BibDatabaseMode.BIBTEX), + preferencesService.loadBibEntryTypes(BibDatabaseMode.BIBLATEX)); + } + + public void apply() { for (var typeWithField : entryTypesWithFields) { diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialog.fxml b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialog.fxml index 8e45dc99d80..700338d89af 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialog.fxml +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialog.fxml @@ -96,4 +96,5 @@ + diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java index 3cdb803fe00..59a68579ea1 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java @@ -22,11 +22,13 @@ import javafx.scene.input.MouseEvent; import javafx.scene.input.TransferMode; +import org.jabref.gui.DialogService; import org.jabref.gui.DragAndDropDataFormats; import org.jabref.gui.StateManager; import org.jabref.gui.customentrytypes.CustomEntryTypeDialogViewModel.FieldType; import org.jabref.gui.icon.IconTheme; import org.jabref.gui.util.BaseDialog; +import org.jabref.gui.util.ControlHelper; import org.jabref.gui.util.CustomLocalDragboard; import org.jabref.gui.util.RadioButtonCell; import org.jabref.gui.util.ValueTableCellFactory; @@ -57,11 +59,14 @@ public class CustomizeEntryTypeDialogView extends BaseDialog { @FXML private TableColumn fieldTypeActionColumn; @FXML private ComboBox addNewField; @FXML private ButtonType applyButton; + @FXML private ButtonType resetButton; @FXML private Button addNewEntryTypeButton; @FXML private Button addNewFieldButton; + @Inject private PreferencesService preferencesService; @Inject private StateManager stateManager; + @Inject private DialogService dialogService; private CustomEntryTypeDialogViewModel viewModel; private final ControlsFxVisualizer visualizer = new ControlsFxVisualizer(); @@ -81,11 +86,12 @@ public CustomizeEntryTypeDialogView(BibDatabaseContext bibDatabaseContext, BibEn } return null; }); + ControlHelper.setAction(resetButton, getDialogPane(), event -> this.resetEntryTypes()); } @FXML private void initialize() { - // As the state manager gets injected it's not avaiable in the constructor + // As the state manager gets injected it's not available in the constructor this.localDragboard = stateManager.getLocalDragboard(); viewModel = new CustomEntryTypeDialogViewModel(mode, preferencesService, entryTypesManager); @@ -217,4 +223,15 @@ void addEntryType() { void addNewField() { viewModel.addNewField(); } + + private void resetEntryTypes() { + boolean reset = dialogService.showConfirmationDialogAndWait( + Localization.lang("Reset entry types to defaults"), + Localization.lang("This will reset all entry types to their default values and remove all custom entry types"), + Localization.lang("Reset to default")); + if (reset) { + viewModel.resetAllCustomEntryTypes(); + } + + } } diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index 086245fdfd8..c85dafbcb42 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -1041,15 +1041,21 @@ public List loadBibEntryTypes(BibDatabaseMode bibDatabaseMode) { return storedEntryTypes; } - private void clearAllBibEntryTypes() throws BackingStoreException { + @Override + public void clearAllBibEntryTypes() { for (BibDatabaseMode mode : BibDatabaseMode.values()) { clearBibEntryTypes(mode); } } - private void clearBibEntryTypes(BibDatabaseMode mode) throws BackingStoreException { - Preferences prefsNode = getPrefsNodeForCustomizedEntryTypes(mode); - prefsNode.clear(); + private void clearBibEntryTypes(BibDatabaseMode mode) { + try { + Preferences prefsNode = getPrefsNodeForCustomizedEntryTypes(mode); + prefsNode.clear(); + + } catch (BackingStoreException e) { + LOGGER.error("Resetting customized entry types failed.", e); + } } public Map getPreferences() { diff --git a/src/main/java/org/jabref/preferences/PreferencesService.java b/src/main/java/org/jabref/preferences/PreferencesService.java index b23113bda2e..64c09581d3f 100644 --- a/src/main/java/org/jabref/preferences/PreferencesService.java +++ b/src/main/java/org/jabref/preferences/PreferencesService.java @@ -107,6 +107,8 @@ public interface PreferencesService { void saveCustomEntryTypes(); + void clearAllBibEntryTypes(); + List loadBibEntryTypes(BibDatabaseMode mode); CleanupPreferences getCleanupPreferences(JournalAbbreviationRepository repository); diff --git a/src/test/java/org/jabref/logic/bibtex/BibEntryWriterTest.java b/src/test/java/org/jabref/logic/bibtex/BibEntryWriterTest.java index 5ebca3902d5..1981e2df94e 100644 --- a/src/test/java/org/jabref/logic/bibtex/BibEntryWriterTest.java +++ b/src/test/java/org/jabref/logic/bibtex/BibEntryWriterTest.java @@ -63,8 +63,8 @@ void testSerialization() throws IOException { String expected = OS.NEWLINE + "@Article{," + OS.NEWLINE + " author = {Foo Bar}," + OS.NEWLINE + " journal = {International Journal of Something}," + OS.NEWLINE + - " note = {some note}," + OS.NEWLINE + " number = {1}," + OS.NEWLINE + + " note = {some note}," + OS.NEWLINE + "}" + OS.NEWLINE; // @formatter:on @@ -125,8 +125,8 @@ void writeEntryWithOrField() throws Exception { // @formatter:off String expected = OS.NEWLINE + "@InBook{," + OS.NEWLINE + " editor = {Foo Bar}," + OS.NEWLINE + - " note = {some note}," + OS.NEWLINE + " number = {1}," + OS.NEWLINE + + " note = {some note}," + OS.NEWLINE + " journal = {International Journal of Something}," + OS.NEWLINE + "}" + OS.NEWLINE; // @formatter:on @@ -155,8 +155,8 @@ void writeEntryWithOrFieldBothFieldsPresent() throws Exception { String expected = OS.NEWLINE + "@InBook{," + OS.NEWLINE + " author = {Foo Thor}," + OS.NEWLINE + " editor = {Edi Bar}," + OS.NEWLINE + - " note = {some note}," + OS.NEWLINE + " number = {1}," + OS.NEWLINE + + " note = {some note}," + OS.NEWLINE + " journal = {International Journal of Something}," + OS.NEWLINE + "}" + OS.NEWLINE; // @formatter:on @@ -259,8 +259,8 @@ void roundTripWithModification() throws IOException { String expected = OS.NEWLINE + "@Article{test," + OS.NEWLINE + " author = {BlaBla}," + OS.NEWLINE + " journal = {International Journal of Something}," + OS.NEWLINE + - " note = {some note}," + OS.NEWLINE + " number = {1}," + OS.NEWLINE + + " note = {some note}," + OS.NEWLINE + "}" + OS.NEWLINE; // @formatter:on assertEquals(expected, actual); @@ -272,8 +272,8 @@ void roundTripWithCamelCasingInTheOriginalEntryAndResultInLowerCase() throws IOE String bibtexEntry = OS.NEWLINE + "@Article{test," + OS.NEWLINE + " Author = {Foo Bar}," + OS.NEWLINE + " Journal = {International Journal of Something}," + OS.NEWLINE + - " Note = {some note}," + OS.NEWLINE + " Number = {1}," + OS.NEWLINE + + " Note = {some note}," + OS.NEWLINE + " HowPublished = {asdf}," + OS.NEWLINE + "}"; // @formatter:on @@ -295,8 +295,8 @@ void roundTripWithCamelCasingInTheOriginalEntryAndResultInLowerCase() throws IOE String expected = OS.NEWLINE + "@Article{test," + OS.NEWLINE + " author = {BlaBla}," + OS.NEWLINE + " journal = {International Journal of Something}," + OS.NEWLINE + - " note = {some note}," + OS.NEWLINE + " number = {1}," + OS.NEWLINE + + " note = {some note}," + OS.NEWLINE + " howpublished = {asdf}," + OS.NEWLINE + "}" + OS.NEWLINE; // @formatter:on @@ -331,8 +331,8 @@ void testEntryTypeChange() throws IOException { // @formatter:off String expectedNewEntry = OS.NEWLINE + "@InProceedings{test," + OS.NEWLINE + " author = {BlaBla}," + OS.NEWLINE + - " note = {some note}," + OS.NEWLINE + " number = {1}," + OS.NEWLINE + + " note = {some note}," + OS.NEWLINE + " howpublished = {asdf}," + OS.NEWLINE + " journal = {International Journal of Something}," + OS.NEWLINE + "}" + OS.NEWLINE; @@ -346,8 +346,8 @@ void roundTripWithAppendedNewlines() throws IOException { String bibtexEntry = "@Article{test," + OS.NEWLINE + " Author = {Foo Bar}," + OS.NEWLINE + " Journal = {International Journal of Something}," + OS.NEWLINE + - " Note = {some note}," + OS.NEWLINE + " Number = {1}" + OS.NEWLINE + + " Note = {some note}," + OS.NEWLINE + "}\n\n"; // @formatter:on @@ -488,8 +488,8 @@ void addFieldWithLongerLength() throws IOException { String expected = OS.NEWLINE + "@Article{test," + OS.NEWLINE + " author = {BlaBla}," + OS.NEWLINE + " journal = {International Journal of Something}," + OS.NEWLINE + - " note = {some note}," + OS.NEWLINE + " number = {1}," + OS.NEWLINE + + " note = {some note}," + OS.NEWLINE + " howpublished = {asdf}," + OS.NEWLINE + "}" + OS.NEWLINE; // @formatter:on @@ -557,8 +557,8 @@ void roundTripWithPrecedingCommentAndModificationTest() throws IOException { "@Article{test," + OS.NEWLINE + " Author = {Foo Bar}," + OS.NEWLINE + " Journal = {International Journal of Something}," + OS.NEWLINE + - " Note = {some note}," + OS.NEWLINE + " Number = {1}" + OS.NEWLINE + + " Note = {some note}," + OS.NEWLINE + "}"; // @formatter:on @@ -579,8 +579,8 @@ void roundTripWithPrecedingCommentAndModificationTest() throws IOException { "@Article{test," + OS.NEWLINE + " author = {John Doe}," + OS.NEWLINE + " journal = {International Journal of Something}," + OS.NEWLINE + - " note = {some note}," + OS.NEWLINE + " number = {1}," + OS.NEWLINE + + " note = {some note}," + OS.NEWLINE + "}" + OS.NEWLINE; // @formatter:on @@ -614,8 +614,8 @@ void alphabeticSerialization() throws IOException { " date = {2019-10-16}," + OS.NEWLINE + " journaltitle = {International Journal of Something}," + OS.NEWLINE + " title = {Title}," + OS.NEWLINE + - " note = {some note}," + OS.NEWLINE + " number = {1}," + OS.NEWLINE + + " note = {some note}," + OS.NEWLINE + " chapter = {chapter}," + OS.NEWLINE + " year = {2019}," + OS.NEWLINE + "}" + OS.NEWLINE; From ada2a879025ba4b658128720fb597e2831165aea Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Fri, 12 Jun 2020 18:56:33 +0200 Subject: [PATCH 26/39] fix fcking checkstyle again --- .../gui/customentrytypes/CustomEntryTypeDialogViewModel.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java index 227e385c816..a705a6aca39 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java @@ -170,7 +170,6 @@ public void resetAllCustomEntryTypes() { preferencesService.loadBibEntryTypes(BibDatabaseMode.BIBLATEX)); } - public void apply() { for (var typeWithField : entryTypesWithFields) { From e2e6fbd3b48ff6e6c9650975571e13e5007414aa Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Fri, 12 Jun 2020 19:20:48 +0200 Subject: [PATCH 27/39] fix tests disable control helper button for the moment --- .../gui/customentrytypes/CustomizeEntryTypeDialogView.java | 3 +-- .../java/org/jabref/model/entry/field/FieldFactory.java | 7 +++---- .../java/org/jabref/logic/bibtex/BibEntryWriterTest.java | 6 ++++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java index 59a68579ea1..02b2751e689 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java @@ -28,7 +28,6 @@ import org.jabref.gui.customentrytypes.CustomEntryTypeDialogViewModel.FieldType; import org.jabref.gui.icon.IconTheme; import org.jabref.gui.util.BaseDialog; -import org.jabref.gui.util.ControlHelper; import org.jabref.gui.util.CustomLocalDragboard; import org.jabref.gui.util.RadioButtonCell; import org.jabref.gui.util.ValueTableCellFactory; @@ -86,7 +85,7 @@ public CustomizeEntryTypeDialogView(BibDatabaseContext bibDatabaseContext, BibEn } return null; }); - ControlHelper.setAction(resetButton, getDialogPane(), event -> this.resetEntryTypes()); + // ControlHelper.setAction(resetButton, getDialogPane(), event -> this.resetEntryTypes()); } @FXML diff --git a/src/main/java/org/jabref/model/entry/field/FieldFactory.java b/src/main/java/org/jabref/model/entry/field/FieldFactory.java index b4a69fa9ccd..846c27379f9 100644 --- a/src/main/java/org/jabref/model/entry/field/FieldFactory.java +++ b/src/main/java/org/jabref/model/entry/field/FieldFactory.java @@ -11,7 +11,6 @@ import java.util.function.Predicate; import java.util.stream.Collectors; -import org.jabref.model.strings.StringUtil; import org.jabref.model.util.OptionalUtil; public class FieldFactory { @@ -47,7 +46,7 @@ public static List getIdentifierFieldNames() { public static OrFields parseOrFields(String fieldNames) { Set fields = Arrays.stream(fieldNames.split(FieldFactory.FIELD_OR_SEPARATOR)) - .filter(StringUtil::isNotBlank) + //.filter(StringUtil::isNotBlank) .map(FieldFactory::parseField) .collect(Collectors.toCollection(LinkedHashSet::new)); return new OrFields(fields); @@ -55,14 +54,14 @@ public static OrFields parseOrFields(String fieldNames) { public static Set parseOrFieldsList(String fieldNames) { return Arrays.stream(fieldNames.split(FieldFactory.DELIMITER)) - .filter(StringUtil::isNotBlank) + //.filter(StringUtil::isNotBlank) .map(FieldFactory::parseOrFields) .collect(Collectors.toCollection(LinkedHashSet::new)); } public static Set parseFieldList(String fieldNames) { return Arrays.stream(fieldNames.split(FieldFactory.DELIMITER)) - .filter(StringUtil::isNotBlank) + // .filter(StringUtil::isNotBlank) .map(FieldFactory::parseField) .collect(Collectors.toCollection(LinkedHashSet::new)); } diff --git a/src/test/java/org/jabref/logic/bibtex/BibEntryWriterTest.java b/src/test/java/org/jabref/logic/bibtex/BibEntryWriterTest.java index 1981e2df94e..213b74f7e05 100644 --- a/src/test/java/org/jabref/logic/bibtex/BibEntryWriterTest.java +++ b/src/test/java/org/jabref/logic/bibtex/BibEntryWriterTest.java @@ -22,6 +22,7 @@ import org.jabref.model.util.FileUpdateMonitor; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.mockito.Answers; @@ -557,8 +558,8 @@ void roundTripWithPrecedingCommentAndModificationTest() throws IOException { "@Article{test," + OS.NEWLINE + " Author = {Foo Bar}," + OS.NEWLINE + " Journal = {International Journal of Something}," + OS.NEWLINE + - " Number = {1}" + OS.NEWLINE + - " Note = {some note}," + OS.NEWLINE + + " Number = {1}," + OS.NEWLINE + + " Note = {some note}" + OS.NEWLINE + "}"; // @formatter:on @@ -587,6 +588,7 @@ void roundTripWithPrecedingCommentAndModificationTest() throws IOException { assertEquals(expected, actual); } + @Disabled("We don't have alphabetic serialization anylonger TODO") @Test void alphabeticSerialization() throws IOException { StringWriter stringWriter = new StringWriter(); From c093a053d098ff85ef8d491424536c7761455840 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Fri, 12 Jun 2020 19:44:02 +0200 Subject: [PATCH 28/39] reenable filter --- .../java/org/jabref/model/entry/field/FieldFactory.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jabref/model/entry/field/FieldFactory.java b/src/main/java/org/jabref/model/entry/field/FieldFactory.java index 846c27379f9..b4a69fa9ccd 100644 --- a/src/main/java/org/jabref/model/entry/field/FieldFactory.java +++ b/src/main/java/org/jabref/model/entry/field/FieldFactory.java @@ -11,6 +11,7 @@ import java.util.function.Predicate; import java.util.stream.Collectors; +import org.jabref.model.strings.StringUtil; import org.jabref.model.util.OptionalUtil; public class FieldFactory { @@ -46,7 +47,7 @@ public static List getIdentifierFieldNames() { public static OrFields parseOrFields(String fieldNames) { Set fields = Arrays.stream(fieldNames.split(FieldFactory.FIELD_OR_SEPARATOR)) - //.filter(StringUtil::isNotBlank) + .filter(StringUtil::isNotBlank) .map(FieldFactory::parseField) .collect(Collectors.toCollection(LinkedHashSet::new)); return new OrFields(fields); @@ -54,14 +55,14 @@ public static OrFields parseOrFields(String fieldNames) { public static Set parseOrFieldsList(String fieldNames) { return Arrays.stream(fieldNames.split(FieldFactory.DELIMITER)) - //.filter(StringUtil::isNotBlank) + .filter(StringUtil::isNotBlank) .map(FieldFactory::parseOrFields) .collect(Collectors.toCollection(LinkedHashSet::new)); } public static Set parseFieldList(String fieldNames) { return Arrays.stream(fieldNames.split(FieldFactory.DELIMITER)) - // .filter(StringUtil::isNotBlank) + .filter(StringUtil::isNotBlank) .map(FieldFactory::parseField) .collect(Collectors.toCollection(LinkedHashSet::new)); } From ffa35d460db72ae7345d975793c5ef03c3a8294b Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Fri, 12 Jun 2020 20:08:06 +0200 Subject: [PATCH 29/39] fix comma error --- src/test/java/org/jabref/logic/bibtex/BibEntryWriterTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/jabref/logic/bibtex/BibEntryWriterTest.java b/src/test/java/org/jabref/logic/bibtex/BibEntryWriterTest.java index 213b74f7e05..5f402dc9b87 100644 --- a/src/test/java/org/jabref/logic/bibtex/BibEntryWriterTest.java +++ b/src/test/java/org/jabref/logic/bibtex/BibEntryWriterTest.java @@ -347,8 +347,8 @@ void roundTripWithAppendedNewlines() throws IOException { String bibtexEntry = "@Article{test," + OS.NEWLINE + " Author = {Foo Bar}," + OS.NEWLINE + " Journal = {International Journal of Something}," + OS.NEWLINE + - " Number = {1}" + OS.NEWLINE + - " Note = {some note}," + OS.NEWLINE + + " Number = {1}," + OS.NEWLINE + + " Note = {some note}" + OS.NEWLINE + "}\n\n"; // @formatter:on From 46f01929d467d0797059347a3efdb31203e14d89 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Fri, 12 Jun 2020 20:09:33 +0200 Subject: [PATCH 30/39] add l10n --- src/main/resources/l10n/JabRef_en.properties | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 56b4bc677ba..7b92904d128 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -2249,3 +2249,5 @@ Close\ all\ libraries=Close all libraries Close\ other\ libraries=Close other libraries Close\ others=Close others Reveal\ in\ file\ explorer=Reveal in file explorer + +This will reset all entry types to their default values and remove all custom entry types=This will reset all entry types to their default values and remove all custom entry types \ No newline at end of file From 66995a3a55332f9bacbeeb3e8677b9566b726fe8 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Fri, 12 Jun 2020 20:10:48 +0200 Subject: [PATCH 31/39] l10n --- src/main/resources/l10n/JabRef_en.properties | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 7b92904d128..230aeaef6ac 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -2250,4 +2250,6 @@ Close\ other\ libraries=Close other libraries Close\ others=Close others Reveal\ in\ file\ explorer=Reveal in file explorer -This will reset all entry types to their default values and remove all custom entry types=This will reset all entry types to their default values and remove all custom entry types \ No newline at end of file +Reset=Reset +Reset\ entry\ types\ to\ defaults=Reset entry types to defaults +This\ will\ reset\ all\ entry\ types\ to\ their\ default\ values\ and\ remove\ all\ custom\ entry\ types=This will reset all entry types to their default values and remove all custom entry types From e5dd9c69278456ad2e20b0c6d089807c664de76d Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sat, 20 Jun 2020 18:11:40 +0200 Subject: [PATCH 32/39] revert booktitle order and pages order clean empty lines --- .../gui/customentrytypes/CustomizeEntryTypeDialogView.java | 4 ---- src/test/resources/testbib/bibWithUserComments.bib | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java index 02b2751e689..f734d058b8b 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java @@ -150,7 +150,6 @@ private void setupTable() { viewModel.newFieldToAddProperty().bindBidirectional(addNewField.valueProperty()); - // Here we would need to select the fields EasyBind.subscribe(viewModel.selectedEntryTypeProperty(), type -> { if (type != null) { var items = type.fields(); @@ -172,9 +171,7 @@ private void handleOnDragOver(FieldViewModel originalItem, DragEvent event) { } private void handleOnDragDetected(TableRow row, FieldViewModel fieldViewModel, MouseEvent event) { - // Start drag'n'drop row.startFullDrag(); - FieldViewModel field = fields.getSelectionModel().getSelectedItem(); ClipboardContent content = new ClipboardContent(); @@ -191,7 +188,6 @@ private void handleOnDragDropped(TableRow row, FieldViewModel or ObservableList items = fields.itemsProperty().get(); if (localDragboard.hasType(FieldViewModel.class)) { - FieldViewModel field = localDragboard.getValue(FieldViewModel.class); int draggedIdx = 0; for (int i = 0; i < items.size(); i++) { diff --git a/src/test/resources/testbib/bibWithUserComments.bib b/src/test/resources/testbib/bibWithUserComments.bib index fa6af4fcc04..90685b10eac 100644 --- a/src/test/resources/testbib/bibWithUserComments.bib +++ b/src/test/resources/testbib/bibWithUserComments.bib @@ -33,12 +33,12 @@ @Comment this @INPROCEEDINGS{1137631, author = {Gustav Bostr\"{o}m and Jaana W\"{a}yrynen and Marine Bod\'{e}n and Konstantin Beznosov and Philippe Kruchten}, + title = {Extending XP practices to support security requirements engineering}, booktitle = {SESS '06: Proceedings of the 2006 international workshop on Software engineering for secure systems}, - title = {Extending XP practices to support security requirements engineering}, year = {2006}, - address = {New York, NY, USA}, pages = {11--18}, + address = {New York, NY, USA}, publisher = {ACM}, bdsk-url-1 = {http://doi.acm.org/10.1145/1137627.1137631}, doi = {http://doi.acm.org/10.1145/1137627.1137631}, From 5a6fc22a772bd0bd7d10f55065c6d61d33793f9d Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Tue, 23 Jun 2020 09:00:51 +0200 Subject: [PATCH 33/39] try to add test for use case --- .../model/entry/BibEntryTypesManagerTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java b/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java index 2f876862802..2b93fa52b15 100644 --- a/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java +++ b/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java @@ -1,8 +1,10 @@ package org.jabref.model.entry; import java.util.Collections; +import java.util.List; import java.util.Optional; import java.util.TreeSet; +import java.util.stream.Collectors; import java.util.stream.Stream; import org.jabref.model.database.BibDatabaseMode; @@ -10,6 +12,7 @@ import org.jabref.model.entry.field.FieldPriority; import org.jabref.model.entry.field.OrFields; import org.jabref.model.entry.field.StandardField; +import org.jabref.model.entry.field.UnknownField; import org.jabref.model.entry.types.BiblatexEntryTypeDefinitions; import org.jabref.model.entry.types.BibtexEntryTypeDefinitions; import org.jabref.model.entry.types.EntryType; @@ -152,4 +155,20 @@ void testParsingEmptyOptionalFieldsFieldsReturnsEmpyCollections(BibDatabaseMode Optional type = entryTypesManager.parse(serialized); assertEquals(Collections.emptySet(), type.get().getOptionalFields()); } + + @ParameterizedTest + @MethodSource("mode") + void testsModifiyngArticle(BibDatabaseMode mode) { + + overwrittenStandardType = new BibEntryType( + StandardEntryType.Article, + List.of(new BibField(StandardField.TITLE, FieldPriority.IMPORTANT), + new BibField(new UnknownField("langid"), FieldPriority.IMPORTANT)), + Collections.emptySet()); + + entryTypesManager.addCustomOrModifiedType(overwrittenStandardType, mode); + assertEquals(Collections.emptyList(), entryTypesManager.getAllTypes(mode).stream().filter(t->t.getType().getName().equals("Article")).collect(Collectors.toList())); + } + + } From 6846297473df0518e307f00d93d2ff7e8dcacac7 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Tue, 23 Jun 2020 15:20:51 +0200 Subject: [PATCH 34/39] pass entry types manager as parameter add test --- .../CustomEntryTypeDialogViewModel.java | 3 +-- ...ImportCustomEntryTypesDialogViewModel.java | 4 +-- .../CustomEntryTypePreferenceMigration.java | 2 +- .../jabref/preferences/JabRefPreferences.java | 15 +++++------ .../preferences/PreferencesService.java | 4 ++- .../model/entry/BibEntryTypesManagerTest.java | 25 ++++++++++++++++--- 6 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java index a705a6aca39..9c423250d54 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java @@ -71,7 +71,6 @@ public CustomEntryTypeDialogViewModel(BibDatabaseMode mode, PreferencesService p this.entryTypesManager = entryTypesManager; Collection allTypes = entryTypesManager.getAllTypes(mode); - allTypes.addAll(entryTypesManager.getAllCustomTypes(mode)); for (BibEntryType entryType : allTypes) { CustomEntryTypeViewModel viewModel = new CustomEntryTypeViewModel(entryType); @@ -187,7 +186,7 @@ public void apply() { entryTypesManager.removeCustomOrModifiedEntryType(entryType, mode); } - preferencesService.saveCustomEntryTypes(); + preferencesService.saveCustomEntryTypes(entryTypesManager); // Reload types from preferences to make sure any modifications are present when reopening the dialog entryTypesManager.addCustomOrModifiedTypes(preferencesService.loadBibEntryTypes(BibDatabaseMode.BIBTEX), preferencesService.loadBibEntryTypes(BibDatabaseMode.BIBLATEX)); diff --git a/src/main/java/org/jabref/gui/importer/ImportCustomEntryTypesDialogViewModel.java b/src/main/java/org/jabref/gui/importer/ImportCustomEntryTypesDialogViewModel.java index ae8a634d729..c6f2f5f2b3b 100644 --- a/src/main/java/org/jabref/gui/importer/ImportCustomEntryTypesDialogViewModel.java +++ b/src/main/java/org/jabref/gui/importer/ImportCustomEntryTypesDialogViewModel.java @@ -47,11 +47,11 @@ public ObservableList differentCustomizations() { public void importBibEntryTypes(List checkedUnknownEntryTypes, List checkedDifferentEntryTypes) { if (!checkedUnknownEntryTypes.isEmpty()) { checkedUnknownEntryTypes.forEach(type -> Globals.entryTypesManager.addCustomOrModifiedType(type, mode)); - preferencesService.saveCustomEntryTypes(); + preferencesService.saveCustomEntryTypes(Globals.entryTypesManager); } if (!checkedDifferentEntryTypes.isEmpty()) { checkedUnknownEntryTypes.forEach(type -> Globals.entryTypesManager.addCustomOrModifiedType(type, mode)); - preferencesService.saveCustomEntryTypes(); + preferencesService.saveCustomEntryTypes(Globals.entryTypesManager); } } } diff --git a/src/main/java/org/jabref/migrations/CustomEntryTypePreferenceMigration.java b/src/main/java/org/jabref/migrations/CustomEntryTypePreferenceMigration.java index 9abb740cd7c..c9e669bb402 100644 --- a/src/main/java/org/jabref/migrations/CustomEntryTypePreferenceMigration.java +++ b/src/main/java/org/jabref/migrations/CustomEntryTypePreferenceMigration.java @@ -37,7 +37,7 @@ static void upgradeStoredBibEntryTypes(BibDatabaseMode defaultBibDatabaseMode) { number++; } - prefs.saveCustomEntryTypes(); + prefs.saveCustomEntryTypes(Globals.entryTypesManager); } /** diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index c85dafbcb42..5b589bfb204 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -14,6 +14,7 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; @@ -1010,7 +1011,7 @@ public void flush() { } } - public void storeBibEntryTypes(List BibEntryTypes, BibDatabaseMode bibDatabaseMode) { + public void storeBibEntryTypes(Collection bibEntryTypes, BibDatabaseMode bibDatabaseMode) { Preferences prefsNode = getPrefsNodeForCustomizedEntryTypes(bibDatabaseMode); try { @@ -1018,7 +1019,7 @@ public void storeBibEntryTypes(List BibEntryTypes, BibDatabaseMode clearBibEntryTypes(bibDatabaseMode); // store current custom types - BibEntryTypes.forEach(type -> prefsNode.put(type.getType().getName(), BibEntryTypesManager.serialize(type))); + bibEntryTypes.forEach(type -> prefsNode.put(type.getType().getName(), BibEntryTypesManager.serialize(type))); prefsNode.flush(); } catch (BackingStoreException e) { @@ -1640,13 +1641,13 @@ public void setShouldWarnAboutDuplicatesForImport(boolean value) { } @Override - public void saveCustomEntryTypes() { - saveCustomEntryTypes(BibDatabaseMode.BIBTEX); - saveCustomEntryTypes(BibDatabaseMode.BIBLATEX); + public void saveCustomEntryTypes(BibEntryTypesManager entryTypesManager) { + saveCustomEntryTypes(BibDatabaseMode.BIBTEX, entryTypesManager); + saveCustomEntryTypes(BibDatabaseMode.BIBLATEX, entryTypesManager); } - private void saveCustomEntryTypes(BibDatabaseMode bibDatabaseMode) { - List customBiblatexBibTexTypes = new ArrayList<>(Globals.entryTypesManager.getAllTypes(bibDatabaseMode)); + private void saveCustomEntryTypes(BibDatabaseMode bibDatabaseMode, BibEntryTypesManager entryTypesManager) { + Collection customBiblatexBibTexTypes = entryTypesManager.getAllTypes(bibDatabaseMode); storeBibEntryTypes(customBiblatexBibTexTypes, bibDatabaseMode); } diff --git a/src/main/java/org/jabref/preferences/PreferencesService.java b/src/main/java/org/jabref/preferences/PreferencesService.java index 64c09581d3f..2f52244f705 100644 --- a/src/main/java/org/jabref/preferences/PreferencesService.java +++ b/src/main/java/org/jabref/preferences/PreferencesService.java @@ -37,6 +37,7 @@ import org.jabref.model.bibtexkeypattern.GlobalCitationKeyPattern; import org.jabref.model.database.BibDatabaseMode; import org.jabref.model.entry.BibEntryType; +import org.jabref.model.entry.BibEntryTypesManager; import org.jabref.model.entry.field.Field; import org.jabref.model.metadata.FilePreferences; import org.jabref.model.metadata.SaveOrderConfig; @@ -105,7 +106,7 @@ public interface PreferencesService { void setShouldWarnAboutDuplicatesForImport(boolean value); - void saveCustomEntryTypes(); + void saveCustomEntryTypes(BibEntryTypesManager entryTypesManager); void clearAllBibEntryTypes(); @@ -238,4 +239,5 @@ public interface PreferencesService { SpecialFieldsPreferences getSpecialFieldsPreferences(); void storeSpecialFieldsPreferences(SpecialFieldsPreferences specialFieldsPreferences); + } diff --git a/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java b/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java index 2b93fa52b15..3509b353ca1 100644 --- a/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java +++ b/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java @@ -158,17 +158,36 @@ void testParsingEmptyOptionalFieldsFieldsReturnsEmpyCollections(BibDatabaseMode @ParameterizedTest @MethodSource("mode") - void testsModifiyngArticle(BibDatabaseMode mode) { + void testsModifyingArticle(BibDatabaseMode mode) { overwrittenStandardType = new BibEntryType( StandardEntryType.Article, List.of(new BibField(StandardField.TITLE, FieldPriority.IMPORTANT), - new BibField(new UnknownField("langid"), FieldPriority.IMPORTANT)), + new BibField(StandardField.NUMBER, FieldPriority.IMPORTANT), + new BibField(new UnknownField("langid"), FieldPriority.IMPORTANT), + new BibField(StandardField.COMMENT, FieldPriority.IMPORTANT)), Collections.emptySet()); entryTypesManager.addCustomOrModifiedType(overwrittenStandardType, mode); - assertEquals(Collections.emptyList(), entryTypesManager.getAllTypes(mode).stream().filter(t->t.getType().getName().equals("Article")).collect(Collectors.toList())); + assertEquals(Collections.singletonList(overwrittenStandardType), entryTypesManager.getAllTypes(mode).stream().filter(t->t.getType().getName().equals("article")).collect(Collectors.toList())); } + @ParameterizedTest + @MethodSource("mode") + void testsModifyingArticleWithParsing(BibDatabaseMode mode) { + overwrittenStandardType = new BibEntryType( + StandardEntryType.Article, + List.of(new BibField(StandardField.TITLE, FieldPriority.IMPORTANT), + new BibField(StandardField.NUMBER, FieldPriority.IMPORTANT), + new BibField(new UnknownField("langid"), FieldPriority.IMPORTANT), + new BibField(StandardField.COMMENT, FieldPriority.IMPORTANT)), + Collections.emptySet()); + + entryTypesManager.addCustomOrModifiedType(overwrittenStandardType, mode); + String serialized = entryTypesManager.serialize(overwrittenStandardType); + Optional type = entryTypesManager.parse(serialized); + + assertEquals(Optional.of(overwrittenStandardType), type); + } } From 298a83271af5fed122e793898c3abce4043ab8d9 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sat, 27 Jun 2020 22:24:22 +0200 Subject: [PATCH 35/39] Fix issue with wrong order after using BibEntryType Builder Change EntryEditor to LInkedHashSet as well --- .../CustomEntryTypeViewModel.java | 2 +- .../gui/entryeditor/DeprecatedFieldsTab.java | 15 ++++-------- .../gui/entryeditor/OptionalFieldsTab.java | 12 ++++------ .../gui/entryeditor/OtherFieldsTab.java | 12 ++++------ .../gui/entryeditor/UserDefinedFieldsTab.java | 11 ++++----- .../logic/integrity/NoBibtexFieldChecker.java | 4 ++-- .../org/jabref/model/entry/BibEntryType.java | 12 +++++++--- .../model/entry/BibEntryTypeBuilder.java | 7 +++--- .../model/entry/BibEntryTypesManagerTest.java | 23 +++++++++++++++++-- 9 files changed, 55 insertions(+), 43 deletions(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java index 963666ddc6b..4c9de9f9416 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeViewModel.java @@ -19,7 +19,7 @@ public class CustomEntryTypeViewModel { public CustomEntryTypeViewModel(BibEntryType entryType) { this.entryType.set(entryType); - List allFieldsForType = entryType.getAllFields().stream().map(bibField -> new FieldViewModel(bibField.getField(), entryType.isRequired(bibField.getField()), bibField.getPriority())).collect(Collectors.toList()); + List allFieldsForType = entryType.getAllBibFields().stream().map(bibField -> new FieldViewModel(bibField.getField(), entryType.isRequired(bibField.getField()), bibField.getPriority())).collect(Collectors.toList()); fields = FXCollections.observableArrayList((allFieldsForType)); } diff --git a/src/main/java/org/jabref/gui/entryeditor/DeprecatedFieldsTab.java b/src/main/java/org/jabref/gui/entryeditor/DeprecatedFieldsTab.java index af274875217..883bc98da1e 100644 --- a/src/main/java/org/jabref/gui/entryeditor/DeprecatedFieldsTab.java +++ b/src/main/java/org/jabref/gui/entryeditor/DeprecatedFieldsTab.java @@ -1,11 +1,8 @@ package org.jabref.gui.entryeditor; import java.util.Collections; -import java.util.Comparator; import java.util.Optional; -import java.util.SortedSet; -import java.util.TreeSet; -import java.util.stream.Collectors; +import java.util.Set; import javax.swing.undo.UndoManager; @@ -39,16 +36,14 @@ public DeprecatedFieldsTab(BibDatabaseContext databaseContext, SuggestionProvide } @Override - protected SortedSet determineFieldsToShow(BibEntry entry) { + protected Set determineFieldsToShow(BibEntry entry) { Optional entryType = entryTypesManager.enrich(entry.getType(), databaseContext.getMode()); if (entryType.isPresent()) { - return entryType.get().getDeprecatedFields() - .stream() - .filter(entry::hasField) - .collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Field::getName)))); + return entryType.get().getDeprecatedFields(); + } else { // Entry type unknown -> treat all fields as required - return Collections.emptySortedSet(); + return Collections.emptySet(); } } } diff --git a/src/main/java/org/jabref/gui/entryeditor/OptionalFieldsTab.java b/src/main/java/org/jabref/gui/entryeditor/OptionalFieldsTab.java index 7ea9364fdc4..38bdf973bb9 100644 --- a/src/main/java/org/jabref/gui/entryeditor/OptionalFieldsTab.java +++ b/src/main/java/org/jabref/gui/entryeditor/OptionalFieldsTab.java @@ -1,11 +1,8 @@ package org.jabref.gui.entryeditor; import java.util.Collections; -import java.util.Comparator; import java.util.Optional; -import java.util.SortedSet; -import java.util.TreeSet; -import java.util.stream.Collectors; +import java.util.Set; import javax.swing.undo.UndoManager; @@ -22,7 +19,6 @@ import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.BibEntryType; import org.jabref.model.entry.BibEntryTypesManager; -import org.jabref.model.entry.field.BibField; import org.jabref.model.entry.field.Field; import org.jabref.preferences.JabRefPreferences; @@ -39,13 +35,13 @@ public OptionalFieldsTab(BibDatabaseContext databaseContext, SuggestionProviders } @Override - protected SortedSet determineFieldsToShow(BibEntry entry) { + protected Set determineFieldsToShow(BibEntry entry) { Optional entryType = entryTypesManager.enrich(entry.getType(), databaseContext.getMode()); if (entryType.isPresent()) { - return entryType.get().getPrimaryOptionalFields().stream().map(BibField::getField).collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Field::getName)))); + return entryType.get().getPrimaryOptionalFields(); } else { // Entry type unknown -> treat all fields as required - return Collections.emptySortedSet(); + return Collections.emptySet(); } } } diff --git a/src/main/java/org/jabref/gui/entryeditor/OtherFieldsTab.java b/src/main/java/org/jabref/gui/entryeditor/OtherFieldsTab.java index 7dc924f68cf..0841a7bbd0f 100644 --- a/src/main/java/org/jabref/gui/entryeditor/OtherFieldsTab.java +++ b/src/main/java/org/jabref/gui/entryeditor/OtherFieldsTab.java @@ -1,12 +1,10 @@ package org.jabref.gui.entryeditor; import java.util.Collections; -import java.util.Comparator; +import java.util.LinkedHashSet; import java.util.List; import java.util.Optional; import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; import java.util.stream.Collectors; import javax.swing.undo.UndoManager; @@ -62,11 +60,11 @@ public OtherFieldsTab(BibDatabaseContext databaseContext, } @Override - protected SortedSet determineFieldsToShow(BibEntry entry) { + protected Set determineFieldsToShow(BibEntry entry) { Optional entryType = entryTypesManager.enrich(entry.getType(), databaseContext.getMode()); if (entryType.isPresent()) { - Set allKnownFields = entryType.get().getAllFields().stream().map(BibField::getField).collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Field::getName)))); - SortedSet otherFields = entry.getFields().stream().filter(field -> !allKnownFields.contains(field)).collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Field::getName)))); + Set allKnownFields = entryType.get().getAllFields(); + Set otherFields = entry.getFields().stream().filter(field -> !allKnownFields.contains(field)).collect(Collectors.toCollection(LinkedHashSet::new)); otherFields.removeAll(entryType.get().getDeprecatedFields()); otherFields.removeAll(entryType.get().getOptionalFields().stream().map(BibField::getField).collect(Collectors.toSet())); @@ -75,7 +73,7 @@ protected SortedSet determineFieldsToShow(BibEntry entry) { return otherFields; } else { // Entry type unknown -> treat all fields as required - return Collections.emptySortedSet(); + return Collections.emptySet(); } } } diff --git a/src/main/java/org/jabref/gui/entryeditor/UserDefinedFieldsTab.java b/src/main/java/org/jabref/gui/entryeditor/UserDefinedFieldsTab.java index 3e49477d0e2..634927777be 100644 --- a/src/main/java/org/jabref/gui/entryeditor/UserDefinedFieldsTab.java +++ b/src/main/java/org/jabref/gui/entryeditor/UserDefinedFieldsTab.java @@ -1,9 +1,7 @@ package org.jabref.gui.entryeditor; -import java.util.Comparator; +import java.util.LinkedHashSet; import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; import javax.swing.undo.UndoManager; @@ -20,20 +18,19 @@ import org.jabref.preferences.JabRefPreferences; public class UserDefinedFieldsTab extends FieldsEditorTab { - private final SortedSet fields; + private final LinkedHashSet fields; public UserDefinedFieldsTab(String name, Set fields, BibDatabaseContext databaseContext, SuggestionProviders suggestionProviders, UndoManager undoManager, DialogService dialogService, JabRefPreferences preferences, BibEntryTypesManager entryTypesManager, ExternalFileTypes externalFileTypes, TaskExecutor taskExecutor, JournalAbbreviationRepository journalAbbreviationRepository) { super(false, databaseContext, suggestionProviders, undoManager, dialogService, preferences, externalFileTypes, taskExecutor, journalAbbreviationRepository); - this.fields = new TreeSet<>(Comparator.comparing(Field::getName)); - this.fields.addAll(fields); + this.fields = new LinkedHashSet<>(fields); setText(name); setGraphic(IconTheme.JabRefIcons.OPTIONAL.getGraphicNode()); } @Override - protected SortedSet determineFieldsToShow(BibEntry entry) { + protected Set determineFieldsToShow(BibEntry entry) { return fields; } } diff --git a/src/main/java/org/jabref/logic/integrity/NoBibtexFieldChecker.java b/src/main/java/org/jabref/logic/integrity/NoBibtexFieldChecker.java index c822a231a0a..7d46cb42052 100644 --- a/src/main/java/org/jabref/logic/integrity/NoBibtexFieldChecker.java +++ b/src/main/java/org/jabref/logic/integrity/NoBibtexFieldChecker.java @@ -18,9 +18,9 @@ public class NoBibtexFieldChecker implements EntryChecker { private Set getAllBiblatexOnlyFields() { - Set allBibtexFields = BibtexEntryTypeDefinitions.ALL.stream().flatMap(type -> type.getAllFields().stream()).collect(Collectors.toSet()); + Set allBibtexFields = BibtexEntryTypeDefinitions.ALL.stream().flatMap(type -> type.getAllBibFields().stream()).collect(Collectors.toSet()); return BiblatexEntryTypeDefinitions.ALL.stream() - .flatMap(type -> type.getAllFields().stream()) + .flatMap(type -> type.getAllBibFields().stream()) .filter(field -> !allBibtexFields.contains(field)) .map(BibField::getField) // these fields are displayed by JabRef as default diff --git a/src/main/java/org/jabref/model/entry/BibEntryType.java b/src/main/java/org/jabref/model/entry/BibEntryType.java index 9415de35922..5916712aa25 100644 --- a/src/main/java/org/jabref/model/entry/BibEntryType.java +++ b/src/main/java/org/jabref/model/entry/BibEntryType.java @@ -36,7 +36,7 @@ public EntryType getType() { * @return a List of optional field name Strings */ public Set getOptionalFields() { - return getAllFields().stream() + return getAllBibFields().stream() .filter(field -> !isRequired(field.getField())) .collect(Collectors.toCollection(LinkedHashSet::new)); } @@ -60,13 +60,19 @@ public Set getRequiredFields() { /** * Returns all defined fields. */ - public Set getAllFields() { + public Set getAllBibFields() { return Collections.unmodifiableSet(fields); } - public Set getPrimaryOptionalFields() { + public Set getAllFields() { + return fields.stream().map(BibField::getField).collect(Collectors.toCollection(LinkedHashSet::new)); + } + + + public Set getPrimaryOptionalFields() { return getOptionalFields().stream() .filter(field -> field.getPriority() == FieldPriority.IMPORTANT) + .map(BibField::getField) .collect(Collectors.toCollection(LinkedHashSet::new)); } diff --git a/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java b/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java index 2b6ed00dcfc..08f294bc3e1 100644 --- a/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java +++ b/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java @@ -18,6 +18,7 @@ import com.google.common.collect.Streams; public class BibEntryTypeBuilder { + private EntryType type = StandardEntryType.Misc; private Set fields = new LinkedHashSet<>(); private Set requiredFields = new LinkedHashSet<>(); @@ -28,12 +29,12 @@ public BibEntryTypeBuilder withType(EntryType type) { } public BibEntryTypeBuilder withImportantFields(Set newFields) { - return withImportantFields(newFields.stream().map(BibField::getField).collect(Collectors.toSet())); + return withImportantFields(newFields.stream().map(BibField::getField).collect(Collectors.toCollection(LinkedHashSet::new))); } public BibEntryTypeBuilder withImportantFields(Collection newFields) { this.fields = Streams.concat(fields.stream(), newFields.stream().map(field -> new BibField(field, FieldPriority.IMPORTANT))) - .collect(Collectors.toSet()); + .collect(Collectors.toCollection(LinkedHashSet::new)); return this; } @@ -43,7 +44,7 @@ public BibEntryTypeBuilder withImportantFields(Field... newFields) { public BibEntryTypeBuilder withDetailFields(Collection newFields) { this.fields = Streams.concat(fields.stream(), newFields.stream().map(field -> new BibField(field, FieldPriority.DETAIL))) - .collect(Collectors.toSet()); + .collect(Collectors.toCollection(LinkedHashSet::new)); return this; } diff --git a/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java b/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java index 3509b353ca1..83f9938e427 100644 --- a/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java +++ b/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java @@ -45,11 +45,11 @@ private static Stream mode() { void setUp() { newCustomType = new BibEntryType( CUSTOM_TYPE, - Collections.singleton(new BibField(StandardField.AUTHOR, FieldPriority.IMPORTANT)), + List.of(new BibField(StandardField.AUTHOR, FieldPriority.IMPORTANT)), Collections.emptySet()); overwrittenStandardType = new BibEntryType( StandardEntryType.Article, - Collections.singleton(new BibField(StandardField.TITLE, FieldPriority.IMPORTANT)), + List.of(new BibField(StandardField.TITLE, FieldPriority.IMPORTANT)), Collections.emptySet()); entryTypesManager = new BibEntryTypesManager(); } @@ -190,4 +190,23 @@ void testsModifyingArticleWithParsing(BibDatabaseMode mode) { assertEquals(Optional.of(overwrittenStandardType), type); } + + @ParameterizedTest + @MethodSource("mode") + void testsModifyingArticleWithParsingKeepsListOrder(BibDatabaseMode mode) { + + overwrittenStandardType = new BibEntryType( + StandardEntryType.Article, + List.of(new BibField(StandardField.TITLE, FieldPriority.IMPORTANT), + new BibField(StandardField.NUMBER, FieldPriority.IMPORTANT), + new BibField(new UnknownField("langid"), FieldPriority.IMPORTANT), + new BibField(StandardField.COMMENT, FieldPriority.IMPORTANT)), + Collections.emptySet()); + + entryTypesManager.addCustomOrModifiedType(overwrittenStandardType, mode); + String serialized = entryTypesManager.serialize(overwrittenStandardType); + Optional type = entryTypesManager.parse(serialized); + + assertEquals(overwrittenStandardType.getOptionalFields(), type.get().getOptionalFields()); + } } From 16b536633691dd5fd88006a79f6ccbca996b1c88 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sat, 27 Jun 2020 22:33:35 +0200 Subject: [PATCH 36/39] checkstyle --- src/main/java/org/jabref/model/entry/BibEntryType.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/jabref/model/entry/BibEntryType.java b/src/main/java/org/jabref/model/entry/BibEntryType.java index 5916712aa25..2f59f62cbb2 100644 --- a/src/main/java/org/jabref/model/entry/BibEntryType.java +++ b/src/main/java/org/jabref/model/entry/BibEntryType.java @@ -68,7 +68,6 @@ public Set getAllFields() { return fields.stream().map(BibField::getField).collect(Collectors.toCollection(LinkedHashSet::new)); } - public Set getPrimaryOptionalFields() { return getOptionalFields().stream() .filter(field -> field.getPriority() == FieldPriority.IMPORTANT) From 0e8803a7e3ec6687bbbd5f48a71af9332a63fbce Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sun, 28 Jun 2020 19:06:19 +0200 Subject: [PATCH 37/39] implement reset --- .../CustomEntryTypeDialogViewModel.java | 28 ++++++++++++------- .../CustomizeEntryTypeDialogView.java | 5 +++- .../model/entry/BibEntryTypesManager.java | 12 ++++++++ .../jabref/preferences/JabRefPreferences.java | 6 ++-- .../preferences/PreferencesService.java | 2 +- 5 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java index 9c423250d54..2e91b67a4b7 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomEntryTypeDialogViewModel.java @@ -70,12 +70,7 @@ public CustomEntryTypeDialogViewModel(BibDatabaseMode mode, PreferencesService p this.preferencesService = preferencesService; this.entryTypesManager = entryTypesManager; - Collection allTypes = entryTypesManager.getAllTypes(mode); - - for (BibEntryType entryType : allTypes) { - CustomEntryTypeViewModel viewModel = new CustomEntryTypeViewModel(entryType); - this.entryTypesWithFields.add(viewModel); - } + addAllTypes(); Predicate notEmpty = input -> (input != null) && !input.trim().isEmpty(); entryTypeValidator = new FunctionBasedValidator<>(entryTypeToAdd, notEmpty, ValidationMessage.error(Localization.lang("Entry type cannot be empty. Please enter a name."))); @@ -84,6 +79,18 @@ public CustomEntryTypeDialogViewModel(BibDatabaseMode mode, PreferencesService p ValidationMessage.error(Localization.lang("Field cannot be empty. Please enter a name."))); } + public void addAllTypes() { + if (this.entryTypesWithFields.size() > 0) { + this.entryTypesWithFields.clear(); + } + Collection allTypes = entryTypesManager.getAllTypes(mode); + + for (BibEntryType entryType : allTypes) { + CustomEntryTypeViewModel viewModel = new CustomEntryTypeViewModel(entryType); + this.entryTypesWithFields.add(viewModel); + } + } + public ObservableList entryTypes() { return this.entryTypesWithFields; } @@ -156,15 +163,16 @@ public ValidationStatus fieldValidationStatus() { public void removeEntryType(CustomEntryTypeViewModel focusedItem) { entryTypesWithFields.remove(focusedItem); - this.entryTypesToDelete.add(focusedItem.entryType().getValue()); + entryTypesToDelete.add(focusedItem.entryType().getValue()); } public void removeField(FieldViewModel focusedItem) { - this.selectedEntryType.getValue().removeField(focusedItem); + selectedEntryType.getValue().removeField(focusedItem); } public void resetAllCustomEntryTypes() { - this.preferencesService.clearAllBibEntryTypes(); + entryTypesManager.clearAllCustomEntryTypes(mode); + preferencesService.clearBibEntryTypes(mode); entryTypesManager.addCustomOrModifiedTypes(preferencesService.loadBibEntryTypes(BibDatabaseMode.BIBTEX), preferencesService.loadBibEntryTypes(BibDatabaseMode.BIBLATEX)); } @@ -182,7 +190,7 @@ public void apply() { entryTypesManager.addCustomOrModifiedType(newType, mode); } - for (var entryType: entryTypesToDelete) { + for (var entryType : entryTypesToDelete) { entryTypesManager.removeCustomOrModifiedEntryType(entryType, mode); } diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java index f734d058b8b..e634d865624 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java @@ -28,6 +28,7 @@ import org.jabref.gui.customentrytypes.CustomEntryTypeDialogViewModel.FieldType; import org.jabref.gui.icon.IconTheme; import org.jabref.gui.util.BaseDialog; +import org.jabref.gui.util.ControlHelper; import org.jabref.gui.util.CustomLocalDragboard; import org.jabref.gui.util.RadioButtonCell; import org.jabref.gui.util.ValueTableCellFactory; @@ -85,7 +86,7 @@ public CustomizeEntryTypeDialogView(BibDatabaseContext bibDatabaseContext, BibEn } return null; }); - // ControlHelper.setAction(resetButton, getDialogPane(), event -> this.resetEntryTypes()); + ControlHelper.setAction(resetButton, getDialogPane(), event -> this.resetEntryTypes()); } @FXML @@ -226,6 +227,8 @@ private void resetEntryTypes() { Localization.lang("Reset to default")); if (reset) { viewModel.resetAllCustomEntryTypes(); + viewModel.addAllTypes(); + this.entryTypes.refresh(); } } diff --git a/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java b/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java index 2dc1bf8c9c9..f56230a110a 100644 --- a/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java +++ b/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java @@ -117,6 +117,14 @@ public void removeCustomOrModifiedEntryType(BibEntryType entryType, BibDatabaseM } } + public void clearAllCustomEntryTypes(BibDatabaseMode mode) { + if (BibDatabaseMode.BIBLATEX == mode) { + BIBLATEX.clearAllCustomEntryTypes(); + } else if (BibDatabaseMode.BIBTEX == mode) { + BIBTEX.clearAllCustomEntryTypes(); + } + } + public Collection getAllTypes(BibDatabaseMode type) { return type == BibDatabaseMode.BIBLATEX ? BIBLATEX.getAllTypes() : BIBTEX.getAllTypes(); } @@ -180,6 +188,10 @@ private void removeCustomOrModifiedEntryType(BibEntryType type) { customOrModifiedType.remove(type); } + private void clearAllCustomEntryTypes() { + customOrModifiedType.clear(); + } + public SortedSet getAllTypes() { SortedSet allTypes = new TreeSet<>(customOrModifiedType); allTypes.addAll(standardTypes); diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index 5b589bfb204..08017cc0658 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -1042,17 +1042,19 @@ public List loadBibEntryTypes(BibDatabaseMode bibDatabaseMode) { return storedEntryTypes; } - @Override public void clearAllBibEntryTypes() { for (BibDatabaseMode mode : BibDatabaseMode.values()) { clearBibEntryTypes(mode); } } - private void clearBibEntryTypes(BibDatabaseMode mode) { + @Override + public void clearBibEntryTypes(BibDatabaseMode mode) { try { Preferences prefsNode = getPrefsNodeForCustomizedEntryTypes(mode); prefsNode.clear(); + prefsNode.flush(); + } catch (BackingStoreException e) { LOGGER.error("Resetting customized entry types failed.", e); diff --git a/src/main/java/org/jabref/preferences/PreferencesService.java b/src/main/java/org/jabref/preferences/PreferencesService.java index 2f52244f705..76b49fa5fc1 100644 --- a/src/main/java/org/jabref/preferences/PreferencesService.java +++ b/src/main/java/org/jabref/preferences/PreferencesService.java @@ -108,7 +108,7 @@ public interface PreferencesService { void saveCustomEntryTypes(BibEntryTypesManager entryTypesManager); - void clearAllBibEntryTypes(); + void clearBibEntryTypes(BibDatabaseMode mode); List loadBibEntryTypes(BibDatabaseMode mode); From 07d598392b08f408661f57105b7f2247abee6085 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sun, 28 Jun 2020 19:08:58 +0200 Subject: [PATCH 38/39] make dialogmessage more specific --- .../gui/customentrytypes/CustomizeEntryTypeDialogView.java | 2 +- src/main/resources/l10n/JabRef_en.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java index e634d865624..38ecf48af78 100644 --- a/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java +++ b/src/main/java/org/jabref/gui/customentrytypes/CustomizeEntryTypeDialogView.java @@ -222,7 +222,7 @@ void addNewField() { private void resetEntryTypes() { boolean reset = dialogService.showConfirmationDialogAndWait( - Localization.lang("Reset entry types to defaults"), + Localization.lang("Reset entry types and fields to defaults"), Localization.lang("This will reset all entry types to their default values and remove all custom entry types"), Localization.lang("Reset to default")); if (reset) { diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 547d6b8ada0..396a11793b5 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -2252,5 +2252,5 @@ Close\ others=Close others Reveal\ in\ file\ explorer=Reveal in file explorer Reset=Reset -Reset\ entry\ types\ to\ defaults=Reset entry types to defaults +Reset\ entry\ types\ and\ fields\ to\ defaults=Reset entry types and fields to defaults This\ will\ reset\ all\ entry\ types\ to\ their\ default\ values\ and\ remove\ all\ custom\ entry\ types=This will reset all entry types to their default values and remove all custom entry types From d1f4d9969a4a4478b75a22c03a062eb7c1e7d6b8 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sun, 28 Jun 2020 20:14:38 +0200 Subject: [PATCH 39/39] checkstyle --- src/main/java/org/jabref/preferences/JabRefPreferences.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index 08017cc0658..7882c949c7d 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -1054,8 +1054,6 @@ public void clearBibEntryTypes(BibDatabaseMode mode) { Preferences prefsNode = getPrefsNodeForCustomizedEntryTypes(mode); prefsNode.clear(); prefsNode.flush(); - - } catch (BackingStoreException e) { LOGGER.error("Resetting customized entry types failed.", e); }