diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/AbstractFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/AbstractFilter.java index c5871454d8..c51b3a82ed 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/filters/AbstractFilter.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/filters/AbstractFilter.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.timeline.filters; import javafx.beans.binding.Bindings; import javafx.beans.binding.BooleanBinding; import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.value.ObservableBooleanValue; /** * Base implementation of a {@link Filter}. Implements active property. @@ -38,7 +39,7 @@ public abstract class AbstractFilter implements Filter { } @Override - public SimpleBooleanProperty getDisabledProperty() { + public ObservableBooleanValue disabledProperty() { return disabled; } @@ -67,11 +68,11 @@ public abstract class AbstractFilter implements Filter { return "[" + (isSelected() ? "x" : " ") + "]"; // NON-NLS } - public final boolean isActive() { + public boolean isActive() { return activeProperty.get(); } - public final BooleanBinding activeProperty() { + public BooleanBinding activeProperty() { return activeProperty; } } diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/CompoundFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/CompoundFilter.java index bf4c6a1b07..dff26b1e61 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/filters/CompoundFilter.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/filters/CompoundFilter.java @@ -67,6 +67,13 @@ public abstract class CompoundFilter extends Abstr } }); this.subFilters.setAll(subFilters); + + this.selectedProperty().addListener(activeProperty -> { + getSubFilters().forEach(subFilter -> subFilter.setDisabled(isActive() == false)); + }); + this.disabledProperty().addListener(activeProperty -> { + getSubFilters().forEach(subFilter -> subFilter.setDisabled(isActive() == false)); + }); } private void addSubFilterListeners(List newSubfilters) { diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/DataSourcesFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/DataSourcesFilter.java index 06198052af..02318310f1 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/filters/DataSourcesFilter.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/filters/DataSourcesFilter.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.timeline.filters; import java.util.Comparator; import java.util.stream.Collectors; import javafx.beans.binding.Bindings; +import javafx.beans.value.ObservableBooleanValue; import org.openide.util.NbBundle; /** @@ -29,7 +30,6 @@ import org.openide.util.NbBundle; public class DataSourcesFilter extends UnionFilter { public DataSourcesFilter() { - getDisabledProperty().bind(Bindings.size(getSubFilters()).lessThanOrEqualTo(1)); setSelected(false); } @@ -69,7 +69,6 @@ public class DataSourcesFilter extends UnionFilter { .map(DataSourceFilter::getDataSourceID) .filter(t -> t == dataSourceFilter.getDataSourceID()) .findAny().isPresent() == false) { - dataSourceFilter.getDisabledProperty().bind(getDisabledProperty()); getSubFilters().add(dataSourceFilter); getSubFilters().sort(Comparator.comparing(DataSourceFilter::getDisplayName)); } @@ -100,4 +99,10 @@ public class DataSourcesFilter extends UnionFilter { public int hashCode() { return 9; } + + @Override + public ObservableBooleanValue disabledProperty() { + return Bindings.or(super.disabledProperty(), Bindings.size(getSubFilters()).lessThanOrEqualTo(1)); + } + } diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/Filter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/Filter.java index dc44c8912b..435998a183 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/filters/Filter.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/filters/Filter.java @@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.timeline.filters; import javafx.beans.binding.BooleanBinding; import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.value.ObservableBooleanValue; import javafx.collections.FXCollections; import javafx.collections.ObservableList; @@ -77,7 +78,7 @@ public interface Filter { */ void setDisabled(Boolean act); - SimpleBooleanProperty getDisabledProperty(); + ObservableBooleanValue disabledProperty(); boolean isDisabled(); diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/HashHitsFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/HashHitsFilter.java index 838144fadd..b7a13184f7 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/filters/HashHitsFilter.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/filters/HashHitsFilter.java @@ -8,6 +8,7 @@ package org.sleuthkit.autopsy.timeline.filters; import java.util.Comparator; import java.util.stream.Collectors; import javafx.beans.binding.Bindings; +import javafx.beans.value.ObservableBooleanValue; import org.openide.util.NbBundle; /** @@ -22,7 +23,6 @@ public class HashHitsFilter extends UnionFilter { } public HashHitsFilter() { - getDisabledProperty().bind(Bindings.size(getSubFilters()).lessThan(1)); setSelected(false); } @@ -81,4 +81,9 @@ public class HashHitsFilter extends UnionFilter { getSubFilters().sort(Comparator.comparing(HashSetFilter::getDisplayName)); } } + + @Override + public ObservableBooleanValue disabledProperty() { + return Bindings.or(super.disabledProperty(), Bindings.isEmpty(getSubFilters())); + } } diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/RootFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/RootFilter.java index 9034810ed7..2b31978d7b 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/filters/RootFilter.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/filters/RootFilter.java @@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.timeline.filters; import java.util.Set; import java.util.stream.Collectors; +import javafx.beans.binding.BooleanBinding; import javafx.collections.FXCollections; /** @@ -70,7 +71,7 @@ public class RootFilter extends IntersectionFilter { public RootFilter copyOf() { Set annonymousSubFilters = getSubFilters().stream() .filter(subFilter -> - !(subFilter.equals(knownFilter) + !(subFilter.equals(knownFilter) || subFilter.equals(tagsFilter) || subFilter.equals(hashFilter) || subFilter.equals(typeFilter) @@ -108,4 +109,17 @@ public class RootFilter extends IntersectionFilter { } return areSubFiltersEqual(this, (CompoundFilter) obj); } + + public boolean isActive() { + return true; + } + + public BooleanBinding activeProperty() { + return new BooleanBinding() { + @Override + protected boolean computeValue() { + return true; + } + }; + } } diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/TagsFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/TagsFilter.java index 6d90482157..1ab69a3909 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/filters/TagsFilter.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/filters/TagsFilter.java @@ -8,6 +8,7 @@ package org.sleuthkit.autopsy.timeline.filters; import java.util.Comparator; import java.util.stream.Collectors; import javafx.beans.binding.Bindings; +import javafx.beans.value.ObservableBooleanValue; import org.openide.util.NbBundle; import org.sleuthkit.datamodel.TagName; @@ -23,7 +24,6 @@ public class TagsFilter extends UnionFilter { } public TagsFilter() { - getDisabledProperty().bind(Bindings.size(getSubFilters()).lessThan(1)); setSelected(false); } @@ -89,5 +89,8 @@ public class TagsFilter extends UnionFilter { getSubFilters().sort(Comparator.comparing(TagNameFilter::getDisplayName)); } - + @Override + public ObservableBooleanValue disabledProperty() { + return Bindings.or(super.disabledProperty(), Bindings.isEmpty(getSubFilters())); + } } diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterCheckBoxCellFactory.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterCheckBoxCellFactory.java index 535289c6aa..689bb47702 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterCheckBoxCellFactory.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterCheckBoxCellFactory.java @@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.timeline.ui.filtering; import java.util.function.Supplier; import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.value.ObservableBooleanValue; import javafx.scene.control.CheckBox; import javafx.scene.control.IndexedCell; import org.sleuthkit.autopsy.timeline.filters.AbstractFilter; @@ -29,7 +30,7 @@ class FilterCheckBoxCellFactory extends AbstractFXCell private final CheckBox checkBox = new CheckBox(); private SimpleBooleanProperty selectedProperty; - private SimpleBooleanProperty disabledProperty; + private ObservableBooleanValue disabledProperty; @Override protected void configureCell(IndexedCell cell, X item, boolean empty, Supplier supplier) { @@ -37,18 +38,17 @@ class FilterCheckBoxCellFactory extends AbstractFXCell checkBox.selectedProperty().unbindBidirectional(selectedProperty); } if (disabledProperty != null) { - checkBox.disableProperty().unbindBidirectional(disabledProperty); + checkBox.disableProperty().unbind();//disabledProperty); } if (item == null) { - cell.setText(null); cell.setGraphic(null); } else { - cell.setText(item.getDisplayName()); + checkBox.setText(item.getDisplayName()); selectedProperty = item.selectedProperty(); checkBox.selectedProperty().bindBidirectional(selectedProperty); - disabledProperty = item.getDisabledProperty(); - checkBox.disableProperty().bindBidirectional(disabledProperty); + disabledProperty = item.disabledProperty(); + checkBox.disableProperty().bind(disabledProperty); cell.setGraphic(checkBox); } }