Skip to content

Commit 373b9f5

Browse files
calixtustobiasdiez
authored andcommitted
Conversion of Preferences/TableColumnsTab to mvvm (#5185)
* Initial * Added contents of the list and bindings * Initial * Added contents of the list and bindings * Refactored specialFields * Added checking, storing and specialFields * Added add and remove custom column, refactor * Fixes unintentional sorting, added moving columns up and down * Refactoring, added update of MainTable * Refactored to TableView, Added ComboBox * Fixed bug in ui update * Refactor and rewording to clean up * Changed table order reload icon * Refactor to save special fields column order, rewording * Refactor mvvm * Removed now superfluous restart message * l10n * Refactor for order * Added validation, cleanup, and minor fix * Refactored FieldsUtil for reuse * Refactored FieldsUtil for reuse * Fixes and cleanups * Refactor and cleanups * Refactor to streams * l10n * l10n again * Cleanups * Fix sorting bug
1 parent 8bb6380 commit 373b9f5

14 files changed

+733
-744
lines changed

src/main/java/org/jabref/gui/BasePanel.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,12 +121,12 @@ public class BasePanel extends StackPane {
121121
// Keeps track of the string dialog if it is open.
122122
private final Map<Actions, BaseAction> actions = new HashMap<>();
123123
private final SidePaneManager sidePaneManager;
124-
private final BasePanelPreferences preferences;
125124
private final ExternalFileTypes externalFileTypes;
126125

127126
private final EntryEditor entryEditor;
128127
private final DialogService dialogService;
129128
private MainTable mainTable;
129+
private BasePanelPreferences preferences;
130130
// To contain instantiated entry editors. This is to save time
131131
// As most enums, this must not be null
132132
private BasePanelMode mode = BasePanelMode.SHOWING_NOTHING;
@@ -727,6 +727,8 @@ public void actionPerformed(ActionEvent e) {
727727
}
728728

729729
public void setupMainPanel() {
730+
preferences = BasePanelPreferences.from(Globals.prefs);
731+
730732
splitPane = new SplitPane();
731733
splitPane.setOrientation(Orientation.VERTICAL);
732734
adjustSplitter(); // restore last splitting state (before mainTable is created as creation affects the stored size of the entryEditors)

src/main/java/org/jabref/gui/JabRefFrame.java

Lines changed: 10 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -694,41 +694,17 @@ private MenuBar createMenu() {
694694
);
695695

696696
if (Globals.prefs.getBoolean(JabRefPreferences.SPECIALFIELDSENABLED)) {
697-
boolean menuItemAdded = false;
698-
if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_RANKING)) {
699-
edit.getItems().add(SpecialFieldMenuItemFactory.createSpecialFieldMenuForActiveDatabase(SpecialField.RANKING, factory, undoManager));
700-
menuItemAdded = true;
701-
}
702-
703-
if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_RELEVANCE)) {
704-
edit.getItems().add(SpecialFieldMenuItemFactory.getSpecialFieldSingleItemForActiveDatabase(SpecialField.RELEVANCE, factory));
705-
menuItemAdded = true;
706-
}
707-
708-
if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_QUALITY)) {
709-
edit.getItems().add(SpecialFieldMenuItemFactory.getSpecialFieldSingleItemForActiveDatabase(SpecialField.QUALITY, factory));
710-
menuItemAdded = true;
711-
}
712-
713-
if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_PRINTED)) {
714-
edit.getItems().add(SpecialFieldMenuItemFactory.getSpecialFieldSingleItemForActiveDatabase(SpecialField.PRINTED, factory));
715-
menuItemAdded = true;
716-
}
717-
718-
if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_PRIORITY)) {
719-
edit.getItems().add(SpecialFieldMenuItemFactory.createSpecialFieldMenuForActiveDatabase(SpecialField.PRIORITY, factory, undoManager));
720-
menuItemAdded = true;
721-
}
722-
723-
if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_READ)) {
724-
edit.getItems().add(SpecialFieldMenuItemFactory.createSpecialFieldMenuForActiveDatabase(SpecialField.READ_STATUS, factory, undoManager));
725-
menuItemAdded = true;
726-
}
727-
728-
if (menuItemAdded) {
729-
edit.getItems().add(new SeparatorMenuItem());
730-
}
697+
edit.getItems().addAll(
698+
SpecialFieldMenuItemFactory.createSpecialFieldMenuForActiveDatabase(SpecialField.RANKING, factory, undoManager),
699+
SpecialFieldMenuItemFactory.getSpecialFieldSingleItemForActiveDatabase(SpecialField.RELEVANCE, factory),
700+
SpecialFieldMenuItemFactory.getSpecialFieldSingleItemForActiveDatabase(SpecialField.QUALITY, factory),
701+
SpecialFieldMenuItemFactory.getSpecialFieldSingleItemForActiveDatabase(SpecialField.PRINTED, factory),
702+
SpecialFieldMenuItemFactory.createSpecialFieldMenuForActiveDatabase(SpecialField.PRIORITY, factory, undoManager),
703+
SpecialFieldMenuItemFactory.createSpecialFieldMenuForActiveDatabase(SpecialField.READ_STATUS, factory, undoManager),
704+
new SeparatorMenuItem()
705+
);
731706
}
707+
732708
//@formatter:off
733709
library.getItems().addAll(
734710
factory.createMenuItem(StandardActions.NEW_ENTRY, new NewEntryAction(this, dialogService, Globals.prefs, stateManager)),

src/main/java/org/jabref/gui/maintable/ColumnPreferences.java

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,31 @@
55

66
import javafx.scene.control.TableColumn.SortType;
77

8-
import org.jabref.model.entry.field.SpecialField;
9-
108
public class ColumnPreferences {
119

1210
public static final double DEFAULT_FIELD_LENGTH = 100;
1311
private final boolean showFileColumn;
1412
private final boolean showUrlColumn;
1513
private final boolean preferDoiOverUrl;
16-
private final boolean showEprintColumn;
17-
private final List<String> normalColumns;
18-
private final List<SpecialField> specialFieldColumns;
19-
private final List<String> extraFileColumns;
14+
private final boolean showEPrintColumn;
15+
private final List<String> columnNames;
16+
private final boolean specialFieldsEnabled;
17+
private final boolean autoSyncSpecialFieldsToKeyWords;
18+
private final boolean serializeSpecialFields;
19+
private final boolean extraFileColumnsEnabled;
2020
private final Map<String, Double> columnWidths;
2121
private final Map<String, SortType> columnSortType;
2222

23-
public ColumnPreferences(boolean showFileColumn, boolean showUrlColumn, boolean preferDoiOverUrl, boolean showEprintColumn, List<String> normalColumns, List<SpecialField> specialFieldColumns, List<String> extraFileColumns, Map<String, Double> columnWidths, Map<String, SortType> columnSortType) {
23+
public ColumnPreferences(boolean showFileColumn, boolean showUrlColumn, boolean preferDoiOverUrl, boolean showEPrintColumn, List<String> columnNames, boolean specialFieldsEnabled, boolean autoSyncSpecialFieldsToKeyWords, boolean serializeSpecialFields, boolean extraFileColumnsEnabled, Map<String, Double> columnWidths, Map<String, SortType> columnSortType) {
2424
this.showFileColumn = showFileColumn;
2525
this.showUrlColumn = showUrlColumn;
2626
this.preferDoiOverUrl = preferDoiOverUrl;
27-
this.showEprintColumn = showEprintColumn;
28-
this.normalColumns = normalColumns;
29-
this.specialFieldColumns = specialFieldColumns;
30-
this.extraFileColumns = extraFileColumns;
27+
this.showEPrintColumn = showEPrintColumn;
28+
this.columnNames = columnNames;
29+
this.specialFieldsEnabled = specialFieldsEnabled;
30+
this.autoSyncSpecialFieldsToKeyWords = autoSyncSpecialFieldsToKeyWords;
31+
this.serializeSpecialFields = serializeSpecialFields;
32+
this.extraFileColumnsEnabled = extraFileColumnsEnabled;
3133
this.columnWidths = columnWidths;
3234
this.columnSortType = columnSortType;
3335
}
@@ -45,22 +47,30 @@ public boolean preferDoiOverUrl() {
4547
}
4648

4749
public boolean showEprintColumn() {
48-
return showEprintColumn;
50+
return showEPrintColumn;
4951
}
5052

51-
public List<String> getExtraFileColumns() {
52-
return extraFileColumns;
53+
public boolean getSpecialFieldsEnabled() { return specialFieldsEnabled; }
54+
55+
public boolean getAutoSyncSpecialFieldsToKeyWords() {
56+
return autoSyncSpecialFieldsToKeyWords;
5357
}
5458

55-
public List<SpecialField> getSpecialFieldColumns() {
56-
return specialFieldColumns;
59+
public boolean getSerializeSpecialFields() {
60+
return serializeSpecialFields;
61+
}
62+
63+
public boolean getExtraFileColumnsEnabled() { return extraFileColumnsEnabled; }
64+
65+
public List<String> getColumnNames() {
66+
return columnNames;
5767
}
5868

59-
public List<String> getNormalColumns() {
60-
return normalColumns;
69+
public Map<String, Double> getColumnWidths() {
70+
return columnWidths;
6171
}
6272

63-
public double getPrefColumnWidth(String columnName) {
73+
public double getColumnWidth(String columnName) {
6474
return columnWidths.getOrDefault(columnName, DEFAULT_FIELD_LENGTH);
6575
}
6676

src/main/java/org/jabref/gui/maintable/MainTableColumnFactory.java

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.jabref.gui.icon.JabRefIcon;
3434
import org.jabref.gui.specialfields.SpecialFieldValueViewModel;
3535
import org.jabref.gui.specialfields.SpecialFieldViewModel;
36+
import org.jabref.gui.util.FieldsUtil;
3637
import org.jabref.gui.util.OptionalValueTableCellFactory;
3738
import org.jabref.gui.util.ValueTableCellFactory;
3839
import org.jabref.gui.util.comparator.RankingFieldComparator;
@@ -81,12 +82,11 @@ public MainTableColumnFactory(BibDatabaseContext database, ColumnPreferences pre
8182
public List<TableColumn<BibEntryTableViewModel, ?>> createColumns() {
8283
List<TableColumn<BibEntryTableViewModel, ?>> columns = new ArrayList<>();
8384
columns.add(createGroupColumn());
84-
// Add column for linked files
85+
8586
if (preferences.showFileColumn()) {
8687
columns.add(createFileColumn());
8788
}
8889

89-
// Add column for DOI/URL
9090
if (preferences.showUrlColumn()) {
9191
if (preferences.preferDoiOverUrl()) {
9292
columns.add(createUrlOrDoiColumn(IconTheme.JabRefIcons.DOI, StandardField.DOI, StandardField.URL));
@@ -95,21 +95,19 @@ public MainTableColumnFactory(BibDatabaseContext database, ColumnPreferences pre
9595
}
9696
}
9797

98-
// Add column for eprints
9998
if (preferences.showEprintColumn()) {
10099
columns.add(createEprintColumn(IconTheme.JabRefIcons.WWW, StandardField.EPRINT));
101100
}
102101

103-
// Add columns for other file types
104-
columns.addAll(preferences.getExtraFileColumns().stream().map(this::createExtraFileColumn).collect(Collectors.toList()));
105-
106-
// Add 'normal' bibtex fields as configured in the preferences
107-
columns.addAll(createNormalColumns());
108-
109-
// Add the "special" icon columns (e.g., ranking, file, ...) that are enabled in preferences
110-
for (SpecialField field : preferences.getSpecialFieldColumns()) {
111-
columns.add(createSpecialFieldColumn((field)));
112-
}
102+
preferences.getColumnNames().stream().map(FieldFactory::parseField).forEach(field -> {
103+
if (field instanceof FieldsUtil.ExtraFilePseudoField) {
104+
columns.add(createExtraFileColumn(field.getName()));
105+
} else if (field instanceof SpecialField) {
106+
columns.add(createSpecialFieldColumn((SpecialField) field));
107+
} else {
108+
columns.add(createNormalColumn(field));
109+
}
110+
});
113111

114112
return columns;
115113
}
@@ -163,20 +161,15 @@ private Node createGroupColorRegion(BibEntryTableViewModel entry, List<AbstractG
163161
return new Pane();
164162
}
165163

166-
private List<TableColumn<BibEntryTableViewModel, ?>> createNormalColumns() {
167-
List<TableColumn<BibEntryTableViewModel, ?>> columns = new ArrayList<>();
168-
169-
// Read table columns from preferences
170-
for (String columnName : preferences.getNormalColumns()) {
171-
NormalTableColumn column = new NormalTableColumn(columnName, FieldFactory.parseOrFields(columnName), database.getDatabase());
164+
private TableColumn<BibEntryTableViewModel, ?> createNormalColumn(Field field) {
165+
String columnName = field.getName();
166+
NormalTableColumn column = new NormalTableColumn(columnName, FieldFactory.parseOrFields(columnName), database.getDatabase());
172167
new ValueTableCellFactory<BibEntryTableViewModel, String>()
173168
.withText(text -> text)
174169
.install(column);
175170
column.setSortable(true);
176-
column.setPrefWidth(preferences.getPrefColumnWidth(columnName));
177-
columns.add(column);
178-
}
179-
return columns;
171+
column.setPrefWidth(preferences.getColumnWidth(columnName));
172+
return column;
180173
}
181174

182175
private TableColumn<BibEntryTableViewModel, Optional<SpecialFieldValueViewModel>> createSpecialFieldColumn(SpecialField specialField) {

src/main/java/org/jabref/gui/maintable/RightClickMenu.java

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -48,29 +48,12 @@ public static ContextMenu create(BibEntryTableViewModel entry, KeyBindingReposit
4848
contextMenu.getItems().add(new SeparatorMenuItem());
4949

5050
if (Globals.prefs.getBoolean(JabRefPreferences.SPECIALFIELDSENABLED)) {
51-
if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_RANKING)) {
52-
contextMenu.getItems().add(SpecialFieldMenuItemFactory.createSpecialFieldMenu(SpecialField.RANKING, factory, panel));
53-
}
54-
55-
if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_RELEVANCE)) {
56-
contextMenu.getItems().add(SpecialFieldMenuItemFactory.getSpecialFieldSingleItem(SpecialField.RELEVANCE, factory, panel));
57-
}
58-
59-
if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_QUALITY)) {
60-
contextMenu.getItems().add(SpecialFieldMenuItemFactory.getSpecialFieldSingleItem(SpecialField.QUALITY, factory, panel));
61-
}
62-
63-
if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_PRINTED)) {
64-
contextMenu.getItems().add(SpecialFieldMenuItemFactory.getSpecialFieldSingleItem(SpecialField.PRINTED, factory, panel));
65-
}
66-
67-
if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_PRIORITY)) {
68-
contextMenu.getItems().add(SpecialFieldMenuItemFactory.createSpecialFieldMenu(SpecialField.PRIORITY, factory, panel));
69-
}
70-
71-
if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_READ)) {
72-
contextMenu.getItems().add(SpecialFieldMenuItemFactory.createSpecialFieldMenu(SpecialField.READ_STATUS, factory, panel));
73-
}
51+
contextMenu.getItems().add(SpecialFieldMenuItemFactory.createSpecialFieldMenu(SpecialField.RANKING, factory, panel));
52+
contextMenu.getItems().add(SpecialFieldMenuItemFactory.getSpecialFieldSingleItem(SpecialField.RELEVANCE, factory, panel));
53+
contextMenu.getItems().add(SpecialFieldMenuItemFactory.getSpecialFieldSingleItem(SpecialField.QUALITY, factory, panel));
54+
contextMenu.getItems().add(SpecialFieldMenuItemFactory.getSpecialFieldSingleItem(SpecialField.PRINTED, factory, panel));
55+
contextMenu.getItems().add(SpecialFieldMenuItemFactory.createSpecialFieldMenu(SpecialField.PRIORITY, factory, panel));
56+
contextMenu.getItems().add(SpecialFieldMenuItemFactory.createSpecialFieldMenu(SpecialField.READ_STATUS, factory, panel));
7457
}
7558

7659
contextMenu.getItems().add(new SeparatorMenuItem());

src/main/java/org/jabref/gui/preferences/PreferencesDialogViewModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public PreferencesDialogViewModel(DialogService dialogService, TaskExecutor task
4949
new GeneralTabView(prefs),
5050
new FileTabView(prefs),
5151
new TablePrefsTab(prefs),
52-
new TableColumnsTab(prefs, frame),
52+
new TableColumnsTabView(prefs),
5353
new PreviewTabView(prefs),
5454
new ExternalTabView(prefs, frame),
5555
new GroupsTabView(prefs),
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package org.jabref.gui.preferences;
2+
3+
import java.util.Objects;
4+
5+
import javafx.beans.property.BooleanProperty;
6+
import javafx.beans.property.DoubleProperty;
7+
import javafx.beans.property.ObjectProperty;
8+
import javafx.beans.property.ReadOnlyBooleanProperty;
9+
import javafx.beans.property.SimpleBooleanProperty;
10+
import javafx.beans.property.SimpleDoubleProperty;
11+
import javafx.beans.property.SimpleObjectProperty;
12+
import javafx.beans.property.SimpleStringProperty;
13+
import javafx.beans.property.StringProperty;
14+
import javafx.beans.value.ObservableValue;
15+
16+
import org.jabref.gui.maintable.ColumnPreferences;
17+
import org.jabref.logic.l10n.Localization;
18+
import org.jabref.model.entry.field.Field;
19+
import org.jabref.model.entry.field.UnknownField;
20+
21+
public class TableColumnsItemModel {
22+
23+
private final ObjectProperty<Field> field;
24+
private final StringProperty name = new SimpleStringProperty("");
25+
private final DoubleProperty length = new SimpleDoubleProperty(ColumnPreferences.DEFAULT_FIELD_LENGTH);
26+
private final BooleanProperty editableProperty = new SimpleBooleanProperty(true);
27+
28+
public TableColumnsItemModel() {
29+
this.field = new SimpleObjectProperty<>(new UnknownField(Localization.lang("New column")));
30+
}
31+
32+
public TableColumnsItemModel(Field field) {
33+
this.field = new SimpleObjectProperty<>(field);
34+
this.editableProperty.setValue(this.field.get() instanceof UnknownField);
35+
}
36+
37+
public TableColumnsItemModel(Field field, double length) {
38+
this.field = new SimpleObjectProperty<>(field);
39+
this.length.setValue(length);
40+
this.editableProperty.setValue(this.field.get() instanceof UnknownField);
41+
}
42+
43+
public void setField(Field field) {
44+
this.field.set(field);
45+
}
46+
47+
public Field getField() {
48+
return field.get();
49+
}
50+
51+
public ObservableValue<Field> fieldProperty() { return this.field; }
52+
53+
public void setName(String name) {
54+
if (editableProperty.get()) {
55+
field.setValue(new UnknownField(name));
56+
}
57+
}
58+
59+
public String getName() {
60+
return field.get().getName();
61+
}
62+
63+
public StringProperty nameProperty() { return this.name; }
64+
65+
public void setLength(double length) {
66+
this.length.set(length);
67+
}
68+
69+
public double getLength() {
70+
return length.get();
71+
}
72+
73+
public DoubleProperty lengthProperty() { return this.length; }
74+
75+
public ReadOnlyBooleanProperty editableProperty() { return editableProperty; }
76+
77+
@Override
78+
public int hashCode() {
79+
return Objects.hash(field);
80+
}
81+
82+
@Override
83+
public boolean equals(Object obj) {
84+
if (obj instanceof TableColumnsItemModel) {
85+
return Objects.equals(this.field, ((TableColumnsItemModel) obj).field);
86+
} else {
87+
return false;
88+
}
89+
}
90+
}

0 commit comments

Comments
 (0)