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)
private final Map<String, JCheckBox> devicesMap = new HashMap<>();
/**
* Listens to ingest events to enable refresh button
*/
private final PropertyChangeListener ingestListener;
private final ItemListener validationListener;
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",
"applyText=Apply"})
public FiltersPanel() {
@ -93,15 +102,7 @@ final public class FiltersPanel extends javax.swing.JPanel {
);
updateTimeZone();
validationListener = itemEvent -> {
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);
};
validationListener = itemEvent -> validateFilters();
updateFilters();
setAllDevicesSelected(true);
@ -116,7 +117,7 @@ final public class FiltersPanel extends javax.swing.JPanel {
if (eventType.equals(DATA_ADDED.toString())) {
updateFilters();
needsRefresh = true;
refreshButton.setEnabled(true);
validateFilters();
}
};
@ -124,6 +125,24 @@ final public class FiltersPanel extends javax.swing.JPanel {
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.
*/
@ -473,7 +492,7 @@ final public class FiltersPanel extends javax.swing.JPanel {
}
needsRefresh = false;
refreshButton.setEnabled(false);
validateFilters();
}
/**
@ -496,9 +515,11 @@ final public class FiltersPanel extends javax.swing.JPanel {
* @return an AccountTypeFilter
*/
private AccountTypeFilter getAccountTypeFilter() {
AccountTypeFilter accountTypeFilter = new AccountTypeFilter(accountTypeMap.entrySet().stream()
.filter(entry -> entry.getValue().isSelected())
.map(entry -> entry.getKey()).collect(Collectors.toSet()));
AccountTypeFilter accountTypeFilter = new AccountTypeFilter(
accountTypeMap.entrySet().stream()
.filter(entry -> entry.getValue().isSelected())
.map(entry -> entry.getKey())
.collect(Collectors.toSet()));
return accountTypeFilter;
}