refactor validation listener

This commit is contained in:
millmanorama 2017-12-08 12:45:49 +01:00
parent e3c5264b2d
commit 60ba9f5fe8

View File

@ -69,10 +69,19 @@ final public class FiltersPanel extends javax.swing.JPanel {
@ThreadConfined(type = ThreadConfined.ThreadType.AWT) @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
private final Map<String, JCheckBox> devicesMap = new HashMap<>(); private final Map<String, JCheckBox> devicesMap = new HashMap<>();
/**
* Listens to ingest events to enable refresh button
*/
private final PropertyChangeListener ingestListener; private final PropertyChangeListener ingestListener;
private final ItemListener validationListener;
private boolean needsRefresh; private boolean needsRefresh;
/**
* Listen to check box state changes and validates that at least one box is
* selected for device and account type ( other wise there will be no
* results)
*/
private final ItemListener validationListener;
@NbBundle.Messages({"refreshText=Refresh Results", @NbBundle.Messages({"refreshText=Refresh Results",
"applyText=Apply"}) "applyText=Apply"})
public FiltersPanel() { public FiltersPanel() {
@ -93,15 +102,7 @@ final public class FiltersPanel extends javax.swing.JPanel {
); );
updateTimeZone(); updateTimeZone();
validationListener = itemEvent -> { validationListener = itemEvent -> validateFilters();
boolean someDevice = devicesMap.values().stream().anyMatch(JCheckBox::isSelected);
boolean someAccountType = accountTypeMap.values().stream().anyMatch(JCheckBox::isSelected);
deviceRequiredLabel.setVisible(someDevice == false);
accountTypeRequiredLabel.setVisible(someAccountType == false);
applyFiltersButton.setEnabled(someDevice && someAccountType);
refreshButton.setEnabled(someDevice && someAccountType && needsRefresh);
};
updateFilters(); updateFilters();
setAllDevicesSelected(true); setAllDevicesSelected(true);
@ -116,7 +117,7 @@ final public class FiltersPanel extends javax.swing.JPanel {
if (eventType.equals(DATA_ADDED.toString())) { if (eventType.equals(DATA_ADDED.toString())) {
updateFilters(); updateFilters();
needsRefresh = true; needsRefresh = true;
refreshButton.setEnabled(true); validateFilters();
} }
}; };
@ -124,6 +125,24 @@ final public class FiltersPanel extends javax.swing.JPanel {
refreshButton.addActionListener(e -> applyFilters()); refreshButton.addActionListener(e -> applyFilters());
} }
/**
* Validate that filters are in a consistent state and will result in some
* results. Checks that at least one device and at least one account type is
* selected. Disables the apply and refresh button and shows warnings if the
* filters are not valid.
*/
private void validateFilters() {
boolean someDevice = devicesMap.values().stream().anyMatch(JCheckBox::isSelected);
boolean someAccountType = accountTypeMap.values().stream().anyMatch(JCheckBox::isSelected);
deviceRequiredLabel.setVisible(someDevice == false);
accountTypeRequiredLabel.setVisible(someAccountType == false);
applyFiltersButton.setEnabled(someDevice && someAccountType);
refreshButton.setEnabled(someDevice && someAccountType && needsRefresh);
}
/** /**
* Update the filter widgets, and apply them. * Update the filter widgets, and apply them.
*/ */
@ -473,7 +492,7 @@ final public class FiltersPanel extends javax.swing.JPanel {
} }
needsRefresh = false; needsRefresh = false;
refreshButton.setEnabled(false); validateFilters();
} }
/** /**
@ -496,9 +515,11 @@ final public class FiltersPanel extends javax.swing.JPanel {
* @return an AccountTypeFilter * @return an AccountTypeFilter
*/ */
private AccountTypeFilter getAccountTypeFilter() { private AccountTypeFilter getAccountTypeFilter() {
AccountTypeFilter accountTypeFilter = new AccountTypeFilter(accountTypeMap.entrySet().stream() AccountTypeFilter accountTypeFilter = new AccountTypeFilter(
accountTypeMap.entrySet().stream()
.filter(entry -> entry.getValue().isSelected()) .filter(entry -> entry.getValue().isSelected())
.map(entry -> entry.getKey()).collect(Collectors.toSet())); .map(entry -> entry.getKey())
.collect(Collectors.toSet()));
return accountTypeFilter; return accountTypeFilter;
} }