package org.jabref.gui.preftabs;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.util.List;
import java.util.Objects;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import org.jabref.gui.JabRefDialog;
import org.jabref.gui.WrapLayout;
import org.jabref.logic.l10n.Localization;
import org.jabref.preferences.JabRefPreferencesFilter;
class PreferencesFilterDialog extends JabRefDialog {
private final JabRefPreferencesFilter preferencesFilter;
private final JTable table;
private final JCheckBox showOnlyDeviatingPreferenceOptions;
private final JLabel count;
public PreferencesFilterDialog(JabRefPreferencesFilter preferencesFilter, JFrame frame) {
super(frame, true, PreferencesFilterDialog.class); // is modal
this.preferencesFilter = Objects.requireNonNull(preferencesFilter);
this.setTitle(Localization.lang("Preferences"));
this.setSize(new Dimension(800, 600));
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
JPanel northPanel = new JPanel();
northPanel.setLayout(new WrapLayout(FlowLayout.LEFT));
showOnlyDeviatingPreferenceOptions = new JCheckBox(Localization.lang("Show only preferences deviating from their default value"), false);
showOnlyDeviatingPreferenceOptions.addChangeListener(x -> updateModel());
northPanel.add(showOnlyDeviatingPreferenceOptions);
count = new JLabel();
northPanel.add(count);
panel.add(northPanel, BorderLayout.NORTH);
table = new JTable();
table.setAutoCreateRowSorter(true);
updateModel();
panel.add(new JScrollPane(table), BorderLayout.CENTER);
this.getContentPane().add(panel);
}
private void updateModel() {
List<JabRefPreferencesFilter.PreferenceOption> preferenceOptions;
if (showOnlyDeviatingPreferenceOptions.isSelected()) {
preferenceOptions = preferencesFilter.getDeviatingPreferences();
} else {
preferenceOptions = preferencesFilter.getPreferenceOptions();
}
table.setModel(new PreferencesTableModel(preferenceOptions));
count.setText(String.format("(%d)", preferenceOptions.size()));
}
private static class PreferencesTableModel extends AbstractTableModel {
private final List<JabRefPreferencesFilter.PreferenceOption> preferences;
public PreferencesTableModel(List<JabRefPreferencesFilter.PreferenceOption> preferences) {
this.preferences = Objects.requireNonNull(preferences);
}
@Override
public String getColumnName(int column) {
if (column == 0) {
return Localization.lang("type");
} else if (column == 1) {
return Localization.lang("key");
} else if (column == 2) {
return Localization.lang("value");
} else if (column == 3) {
return Localization.lang("default");
} else {
return "n/a";
}
}
@Override
public int getRowCount() {
return preferences.size();
}
@Override
public int getColumnCount() {
return 4;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if ((rowIndex < 0) || ((rowIndex - 1) > preferences.size())) {
return "n/a";
}
JabRefPreferencesFilter.PreferenceOption preferenceOption = preferences.get(rowIndex);
if (columnIndex == 0) {
return preferenceOption.getType();
} else if (columnIndex == 1) {
return preferenceOption.getKey();
} else if (columnIndex == 2) {
return preferenceOption.getValue();
} else if (columnIndex == 3) {
return preferenceOption.getDefaultValue().orElse("NULL");
} else {
return "n/a";
}
}
}
}