From 2948e6d78c7e1e7a16348e2fdb993a0b65a9dde0 Mon Sep 17 00:00:00 2001 From: Christoph Date: Mon, 29 Mar 2021 20:49:51 +0200 Subject: [PATCH] Fix column sort order gets overwritten (#7573) Co-authored-by: Carl Christian Snethlage --- CHANGELOG.md | 1 + .../gui/maintable/MainTableColumnModel.java | 4 +-- .../PersistenceVisualStateTable.java | 25 +++++++++++++------ .../model/metadata/SaveOrderConfig.java | 5 ++++ .../jabref/preferences/JabRefPreferences.java | 9 ++++--- 5 files changed, 31 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe617739c7c..4aa0904cda6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve ### Fixed +- We fixed an issue where the table column sort order was not properly stored and resulted in unsorted eports [#7524](https://github.com/JabRef/jabref/issues/7524) - We fixed an issue where the value of the field `school` or `institution` would be printed twice in the HTML Export [forum#2634](https://discourse.jabref.org/t/problem-with-exporting-techreport-phdthesis-mastersthesis-to-html/2634) - We fixed an issue preventing to connect to a shared database. [#7570](https://github.com/JabRef/jabref/pull/7570) - We fixed an issue preventing files from being dragged & dropped into an empty library. [#6851](https://github.com/JabRef/jabref/issues/6851) diff --git a/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java b/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java index 0edf1dbde17..72890141023 100644 --- a/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java +++ b/src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java @@ -40,8 +40,8 @@ public enum Type { public static final EnumSet ICON_COLUMNS = EnumSet.of(EXTRAFILE, FILES, GROUPS, LINKED_IDENTIFIER); - private String name; - private String displayName; + private final String name; + private final String displayName; Type(String name) { this.name = name; diff --git a/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java b/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java index 6b695be291d..092f5c02820 100644 --- a/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java +++ b/src/main/java/org/jabref/gui/maintable/PersistenceVisualStateTable.java @@ -19,28 +19,37 @@ public PersistenceVisualStateTable(final MainTable mainTable, PreferencesService this.mainTable = mainTable; this.preferences = preferences; - mainTable.getColumns().addListener((InvalidationListener) obs -> updateColumnPreferences()); - mainTable.getSortOrder().addListener((InvalidationListener) obs -> updateColumnPreferences()); + mainTable.getColumns().addListener((InvalidationListener) obs -> updateColumns()); + mainTable.getSortOrder().addListener((InvalidationListener) obs -> updateSortOrder()); // As we store the ColumnModels of the MainTable, we need to add the listener to the ColumnModel properties, // since the value is bound to the model after the listener to the column itself is called. mainTable.getColumns().forEach(col -> - ((MainTableColumn) col).getModel().widthProperty().addListener(obs -> updateColumnPreferences())); + ((MainTableColumn) col).getModel().widthProperty().addListener(obs -> updateColumns())); mainTable.getColumns().forEach(col -> - ((MainTableColumn) col).getModel().sortTypeProperty().addListener(obs -> updateColumnPreferences())); + ((MainTableColumn) col).getModel().sortTypeProperty().addListener(obs -> updateColumns())); } /** - * Store shown columns, their width and their sortType in preferences. + * Stores shown columns, their width and their sortType in preferences. */ - private void updateColumnPreferences() { + private void updateColumns() { preferences.storeColumnPreferences(new ColumnPreferences( mainTable.getColumns().stream() .map(column -> ((MainTableColumn) column).getModel()) .collect(Collectors.toList()), + preferences.getColumnPreferences().getColumnSortOrder())); + } + + /** + * Stores the SortOrder of the the Table in the preferences. Cannot be combined with updateColumns, because JavaFX + * would provide just an empty list for the sort order on other changes. + */ + private void updateSortOrder() { + preferences.storeColumnPreferences(new ColumnPreferences( + preferences.getColumnPreferences().getColumns(), mainTable.getSortOrder().stream() .map(column -> ((MainTableColumn) column).getModel()) - .collect(Collectors.toList()) - )); + .collect(Collectors.toList()))); } } diff --git a/src/main/java/org/jabref/model/metadata/SaveOrderConfig.java b/src/main/java/org/jabref/model/metadata/SaveOrderConfig.java index c2590e398e2..a444e12a5c0 100644 --- a/src/main/java/org/jabref/model/metadata/SaveOrderConfig.java +++ b/src/main/java/org/jabref/model/metadata/SaveOrderConfig.java @@ -135,6 +135,11 @@ public static class SortCriterion { public boolean descending; + /** + * + * @param field The field + * @param descending Must be a boolean value as string, e.g. "true", "false" + */ public SortCriterion(Field field, String descending) { this.field = field; this.descending = Boolean.parseBoolean(descending); diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index cec0984686a..c146effc262 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -1152,9 +1152,12 @@ private SaveOrderConfig loadTableSaveOrder() { updateMainTableColumns(); List sortOrder = createMainTableColumnSortOrder(); - sortOrder.forEach(column -> config.getSortCriteria().add(new SaveOrderConfig.SortCriterion( - FieldFactory.parseField(column.getQualifier()), - column.getSortType().toString()))); + for (var column : sortOrder) { + boolean descending = (column.getSortType() == SortType.DESCENDING); + config.getSortCriteria().add(new SaveOrderConfig.SortCriterion( + FieldFactory.parseField(column.getQualifier()), + descending)); + } return config; }