mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-17 10:17:41 +00:00
sync all filters with data from case
This commit is contained in:
parent
b108c86195
commit
e9bb6ed8f1
@ -32,16 +32,13 @@ import java.util.Set;
|
|||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javafx.beans.Observable;
|
import javafx.beans.InvalidationListener;
|
||||||
import javafx.beans.property.ReadOnlyObjectProperty;
|
import javafx.beans.property.ReadOnlyObjectProperty;
|
||||||
import javafx.beans.property.ReadOnlyObjectWrapper;
|
import javafx.beans.property.ReadOnlyObjectWrapper;
|
||||||
import javafx.collections.FXCollections;
|
import javafx.collections.FXCollections;
|
||||||
import javafx.collections.ListChangeListener;
|
|
||||||
import javafx.collections.MapChangeListener;
|
|
||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
import javafx.collections.ObservableMap;
|
import javafx.collections.ObservableMap;
|
||||||
import javafx.collections.ObservableSet;
|
import javafx.collections.ObservableSet;
|
||||||
import javafx.collections.SetChangeListener;
|
|
||||||
import static org.apache.commons.lang3.StringUtils.isBlank;
|
import static org.apache.commons.lang3.StringUtils.isBlank;
|
||||||
import org.joda.time.DateTimeZone;
|
import org.joda.time.DateTimeZone;
|
||||||
import org.joda.time.Interval;
|
import org.joda.time.Interval;
|
||||||
@ -159,26 +156,19 @@ public final class FilteredEventsModel {
|
|||||||
minCache = CacheBuilder.newBuilder()
|
minCache = CacheBuilder.newBuilder()
|
||||||
.build(new CacheLoaderImpl<>(ignored -> eventManager.getMinTime()));
|
.build(new CacheLoaderImpl<>(ignored -> eventManager.getMinTime()));
|
||||||
|
|
||||||
datasourcesMap.addListener((MapChangeListener.Change<? extends Long, ? extends DataSource> change) -> {
|
InvalidationListener filterSyncListener = observable -> {
|
||||||
DataSourceFilter dataSourceFilter = new DataSourceFilter(change.getValueAdded().getName(), change.getKey());
|
|
||||||
RootFilterState rootFilter = filterProperty().get().copyOf();
|
|
||||||
rootFilter.getDataSourcesFilterState().getFilter().addSubFilter(dataSourceFilter);
|
|
||||||
requestedFilter.set(rootFilter);
|
|
||||||
});
|
|
||||||
hashSets.addListener((SetChangeListener.Change< ? extends String> change) -> {
|
|
||||||
HashSetFilter hashSetFilter = new HashSetFilter(change.getElementAdded());
|
|
||||||
RootFilterState rootFilter = filterProperty().get();
|
RootFilterState rootFilter = filterProperty().get();
|
||||||
rootFilter.getHashHitsFilterState().getFilter().addSubFilter(hashSetFilter);
|
syncFilters(rootFilter);
|
||||||
requestedFilter.set(rootFilter);
|
requestedFilter.set(rootFilter);
|
||||||
});
|
};
|
||||||
tagNames.addListener((ListChangeListener.Change<? extends TagName> change) -> {
|
|
||||||
RootFilterState rootFilter = filterProperty().get();
|
datasourcesMap.addListener(filterSyncListener);
|
||||||
syncTagsFilter(rootFilter);
|
getHashSets().addListener(filterSyncListener);
|
||||||
requestedFilter.set(rootFilter);
|
getTagNames().addListener(filterSyncListener);
|
||||||
});
|
|
||||||
requestedFilter.set(getDefaultFilter());
|
requestedFilter.set(getDefaultFilter());
|
||||||
|
|
||||||
requestedZoomState.addListener((Observable observable) -> {
|
requestedZoomState.addListener(observable -> {
|
||||||
final ZoomState zoomState = requestedZoomState.get();
|
final ZoomState zoomState = requestedZoomState.get();
|
||||||
|
|
||||||
if (zoomState != null) {
|
if (zoomState != null) {
|
||||||
@ -269,9 +259,10 @@ public final class FilteredEventsModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* "sync" the given tags filter with the tagnames in use: Disable filters
|
* "sync" the given root filter with the state of the casee: Disable filters
|
||||||
* for tags that are not in use in the case, and add new filters for tags
|
* for tags that are not in use in the case, and add new filters for tags,
|
||||||
* that don't have them. New filters are selected by default.
|
* hashsets, and datasources. that don't have them. New filters are selected
|
||||||
|
* by default.
|
||||||
*
|
*
|
||||||
* @param rootFilterState the filter state to modify so it is consistent
|
* @param rootFilterState the filter state to modify so it is consistent
|
||||||
* with the tags in use in the case
|
* with the tags in use in the case
|
||||||
@ -281,7 +272,17 @@ public final class FilteredEventsModel {
|
|||||||
rootFilterState.getTagsFilterState().getFilter().addSubFilter(new TagNameFilter(tagName));
|
rootFilterState.getTagsFilterState().getFilter().addSubFilter(new TagNameFilter(tagName));
|
||||||
});
|
});
|
||||||
for (FilterState<? extends TagNameFilter> filterState : rootFilterState.getTagsFilterState().getSubFilterStates()) {
|
for (FilterState<? extends TagNameFilter> filterState : rootFilterState.getTagsFilterState().getSubFilterStates()) {
|
||||||
filterState.setDisabled(tagNames.contains(filterState.getFilter().getTagName()) == false);
|
tagFilterState.setDisabled(tagNames.contains(tagFilterState.getFilter().getTagName()) == false);
|
||||||
|
}
|
||||||
|
|
||||||
|
DataSourcesFilter dataSourcesFilter = rootFilter.getDataSourcesFilterState().getFilter();
|
||||||
|
for (Map.Entry<Long, DataSource> entry : datasourcesMap.entrySet()) {
|
||||||
|
dataSourcesFilter.addSubFilter(new DataSourceFilter(entry.getValue().getName(), entry.getKey()));
|
||||||
|
}
|
||||||
|
|
||||||
|
HashHitsFilter hashSetsFilter = rootFilter.getHashHitsFilterState().getFilter();
|
||||||
|
for (String hashSet : getHashSets()) {
|
||||||
|
hashSetsFilter.addSubFilter(new HashSetFilter(hashSet));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -285,7 +285,7 @@ public class TimeLineController {
|
|||||||
*/
|
*/
|
||||||
historyManager.currentState().addListener(( observable, oldState, newState) -> {
|
historyManager.currentState().addListener(( observable, oldState, newState) -> {
|
||||||
ZoomState historyManagerState = newState;
|
ZoomState historyManagerState = newState;
|
||||||
filteredEvents.syncTagsFilter(historyManagerState.getFilterState());
|
filteredEvents.syncFilters(historyManagerState.getFilterState());
|
||||||
currentParams.set(historyManagerState);
|
currentParams.set(historyManagerState);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -21,10 +21,8 @@ package org.sleuthkit.autopsy.timeline.ui.filtering;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
import javafx.beans.InvalidationListener;
|
import javafx.beans.InvalidationListener;
|
||||||
import javafx.beans.Observable;
|
|
||||||
import javafx.beans.binding.Bindings;
|
import javafx.beans.binding.Bindings;
|
||||||
import javafx.beans.value.ChangeListener;
|
import javafx.beans.binding.BooleanBinding;
|
||||||
import javafx.beans.value.ObservableValue;
|
|
||||||
import javafx.collections.FXCollections;
|
import javafx.collections.FXCollections;
|
||||||
import javafx.collections.ObservableMap;
|
import javafx.collections.ObservableMap;
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
@ -46,6 +44,7 @@ import org.sleuthkit.autopsy.timeline.FXMLConstructor;
|
|||||||
import org.sleuthkit.autopsy.timeline.FilteredEventsModel;
|
import org.sleuthkit.autopsy.timeline.FilteredEventsModel;
|
||||||
import org.sleuthkit.autopsy.timeline.TimeLineController;
|
import org.sleuthkit.autopsy.timeline.TimeLineController;
|
||||||
import org.sleuthkit.autopsy.timeline.actions.ResetFilters;
|
import org.sleuthkit.autopsy.timeline.actions.ResetFilters;
|
||||||
|
import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.CompoundFilterState;
|
||||||
import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.FilterState;
|
import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.FilterState;
|
||||||
import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.RootFilterState;
|
import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.RootFilterState;
|
||||||
import org.sleuthkit.datamodel.timeline.TimelineFilter;
|
import org.sleuthkit.datamodel.timeline.TimelineFilter;
|
||||||
@ -119,8 +118,8 @@ final public class FilterSetPanel extends BorderPane {
|
|||||||
legendColumn.setCellFactory(col -> new LegendCell(this.controller));
|
legendColumn.setCellFactory(col -> new LegendCell(this.controller));
|
||||||
|
|
||||||
//type is the only filter expanded initialy
|
//type is the only filter expanded initialy
|
||||||
expansionMap.put(controller.getEventsModel().getFilterState().getFilter(), true);
|
expansionMap.put(filteredEvents.getFilterState().getFilter(), true);
|
||||||
expansionMap.put(controller.getEventsModel().getFilterState().getEventTypeFilterState().getFilter(), true);
|
expansionMap.put(filteredEvents.getFilterState().getEventTypeFilterState().getFilter(), true);
|
||||||
|
|
||||||
InvalidationListener applyFiltersListener = observable -> applyFilters();
|
InvalidationListener applyFiltersListener = observable -> applyFilters();
|
||||||
|
|
||||||
@ -128,12 +127,7 @@ final public class FilterSetPanel extends BorderPane {
|
|||||||
filteredEvents.descriptionLODProperty().addListener(applyFiltersListener);
|
filteredEvents.descriptionLODProperty().addListener(applyFiltersListener);
|
||||||
filteredEvents.timeRangeProperty().addListener(applyFiltersListener);
|
filteredEvents.timeRangeProperty().addListener(applyFiltersListener);
|
||||||
|
|
||||||
filteredEvents.filterProperty().addListener(new InvalidationListener() {
|
filteredEvents.filterProperty().addListener(observable -> refresh());
|
||||||
@Override
|
|
||||||
public void invalidated(Observable observable) {
|
|
||||||
refresh();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
refresh();
|
refresh();
|
||||||
|
|
||||||
hiddenDescriptionsListView.setItems(controller.getQuickHideFilters());
|
hiddenDescriptionsListView.setItems(controller.getQuickHideFilters());
|
||||||
@ -173,7 +167,7 @@ final public class FilterSetPanel extends BorderPane {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void refresh() {
|
private void refresh() {
|
||||||
FilterTreeItem filterTreeItem = new FilterTreeItem(filteredEvents.getFilterState().copyOf(), expansionMap);
|
FilterTreeItem filterTreeItem = new FilterTreeItem(filteredEvents.filterProperty().getValue(), expansionMap);
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
filterTreeTable.setRoot(filterTreeItem);
|
filterTreeTable.setRoot(filterTreeItem);
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user