Skip to content

Commit cd979c5

Browse files
CaptainDaVincitobiasdiez
authored andcommitted
Feature: implement search filter in show preferences (#4759)
* Feature: implement search filter in show preferences Add a search box in show preferences window to allow users to filter preference options. Resolves #1019 * Add Locale.ROOT when converting to lower case * Fixed indentation for fxml * Added Locale.ROOT when converting to lower case * Using FilteredList to filter options on search * set the count label text, which was accidently removed * Moved checkbox to the top * Bind count label to table size property
1 parent 7ed15bc commit cd979c5

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

src/main/java/org/jabref/gui/preferences/PreferencesFilterDialog.fxml

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,30 @@
77
<?import javafx.scene.control.Label?>
88
<?import javafx.scene.control.TableColumn?>
99
<?import javafx.scene.control.TableView?>
10+
<?import javafx.scene.control.TextField?>
1011
<?import javafx.scene.layout.BorderPane?>
1112
<?import javafx.scene.layout.HBox?>
13+
<?import javafx.scene.layout.VBox?>
1214
<DialogPane xmlns:fx="http://javafx.com/fxml/1" prefHeight="600.0" prefWidth="950.0"
1315
xmlns="http://javafx.com/javafx/8.0.121" fx:controller="org.jabref.gui.preferences.PreferencesFilterDialog">
1416

1517
<content>
1618
<BorderPane>
1719
<bottom>
18-
<HBox>
19-
<CheckBox fx:id="showOnlyDeviatingPreferenceOptions"
20-
text="%Show only preferences deviating from their default value"/>
21-
<HBox HBox.hgrow="ALWAYS"/>
20+
<HBox alignment="BOTTOM_RIGHT">
2221
<Label fx:id="count"/>
2322
</HBox>
2423
</bottom>
24+
<top>
25+
<HBox spacing="20">
26+
<TextField fx:id="searchField" promptText="%Search"/>
27+
<VBox alignment="CENTER">
28+
<CheckBox fx:id="showOnlyDeviatingPreferenceOptions"
29+
text="%Show only preferences deviating from their default value" alignment="bottom_right"/>
30+
</VBox>
31+
<HBox HBox.hgrow="ALWAYS"/>
32+
</HBox>
33+
</top>
2534
<center>
2635
<TableView fx:id="table">
2736
<columns>

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
package org.jabref.gui.preferences;
22

3+
import java.util.Locale;
34
import java.util.Objects;
45

6+
import javafx.beans.binding.Bindings;
57
import javafx.beans.property.ReadOnlyObjectWrapper;
68
import javafx.beans.property.ReadOnlyStringWrapper;
79
import javafx.collections.FXCollections;
810
import javafx.collections.ObservableList;
11+
import javafx.collections.transformation.FilteredList;
912
import javafx.fxml.FXML;
1013
import javafx.scene.control.CheckBox;
1114
import javafx.scene.control.Label;
1215
import javafx.scene.control.TableColumn;
1316
import javafx.scene.control.TableView;
17+
import javafx.scene.control.TextField;
1418

1519
import org.jabref.gui.util.BaseDialog;
1620
import org.jabref.logic.l10n.Localization;
@@ -22,6 +26,7 @@ public class PreferencesFilterDialog extends BaseDialog<Void> {
2226

2327
private final JabRefPreferencesFilter preferencesFilter;
2428
private final ObservableList<JabRefPreferencesFilter.PreferenceOption> preferenceOptions;
29+
private final FilteredList<JabRefPreferencesFilter.PreferenceOption> filteredOptions;
2530

2631
@FXML private TableView<JabRefPreferencesFilter.PreferenceOption> table;
2732
@FXML private TableColumn<JabRefPreferencesFilter.PreferenceOption, JabRefPreferencesFilter.PreferenceType> columnType;
@@ -30,10 +35,12 @@ public class PreferencesFilterDialog extends BaseDialog<Void> {
3035
@FXML private TableColumn<JabRefPreferencesFilter.PreferenceOption, Object> columnDefaultValue;
3136
@FXML private CheckBox showOnlyDeviatingPreferenceOptions;
3237
@FXML private Label count;
38+
@FXML private TextField searchField;
3339

3440
public PreferencesFilterDialog(JabRefPreferencesFilter preferencesFilter) {
3541
this.preferencesFilter = Objects.requireNonNull(preferencesFilter);
3642
this.preferenceOptions = FXCollections.observableArrayList();
43+
this.filteredOptions = new FilteredList<>(this.preferenceOptions);
3744

3845
ViewLoader.view(this)
3946
.load()
@@ -45,11 +52,20 @@ public PreferencesFilterDialog(JabRefPreferencesFilter preferencesFilter) {
4552
@FXML
4653
private void initialize() {
4754
showOnlyDeviatingPreferenceOptions.setOnAction(event -> updateModel());
55+
filteredOptions.predicateProperty().bind(Bindings.createObjectBinding(() -> {
56+
String searchText = searchField.getText();
57+
if ((searchText == null) || searchText.isEmpty()) {
58+
return null;
59+
}
60+
String lowerCaseSearchText = searchText.toLowerCase(Locale.ROOT);
61+
return (option) -> option.getKey().toLowerCase(Locale.ROOT).contains(lowerCaseSearchText);
62+
}, searchField.textProperty()));
4863
columnType.setCellValueFactory(data -> new ReadOnlyObjectWrapper<>(data.getValue().getType()));
4964
columnKey.setCellValueFactory(data -> new ReadOnlyStringWrapper(data.getValue().getKey()));
5065
columnValue.setCellValueFactory(data -> new ReadOnlyObjectWrapper<>(data.getValue().getValue()));
5166
columnDefaultValue.setCellValueFactory(data -> new ReadOnlyObjectWrapper<>(data.getValue().getDefaultValue().orElse("")));
52-
table.setItems(preferenceOptions);
67+
table.setItems(filteredOptions);
68+
count.textProperty().bind(Bindings.size(table.getItems()).asString("(%d)"));
5369
updateModel();
5470
}
5571

@@ -59,6 +75,6 @@ private void updateModel() {
5975
} else {
6076
preferenceOptions.setAll(preferencesFilter.getPreferenceOptions());
6177
}
62-
count.setText(String.format("(%d)", preferenceOptions.size()));
6378
}
79+
6480
}

0 commit comments

Comments
 (0)