mirror of
https://github.com/elisspace/autopsy.git
synced 2026-10-04 16:26:16 +00:00
minor cleanup
- improve comments - rename DescriptionLOD to DescriptionLoD - use new isActive proprty - rename quick hide mask to quick hide filter - remove un used class FiltersChangedEvent
This commit is contained in:
@@ -80,7 +80,7 @@ import org.sleuthkit.autopsy.timeline.filters.DescriptionFilter;
|
||||
import org.sleuthkit.autopsy.timeline.filters.RootFilter;
|
||||
import org.sleuthkit.autopsy.timeline.filters.TypeFilter;
|
||||
import org.sleuthkit.autopsy.timeline.utils.IntervalUtils;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.EventTypeZoomLevel;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.ZoomParams;
|
||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||
@@ -138,10 +138,10 @@ public class TimeLineController {
|
||||
private final Case autoCase;
|
||||
|
||||
@ThreadConfined(type = ThreadConfined.ThreadType.JFX)
|
||||
private final ObservableList<DescriptionFilter> quickHideMasks = FXCollections.observableArrayList();
|
||||
private final ObservableList<DescriptionFilter> quickHideMaskFilters = FXCollections.observableArrayList();
|
||||
|
||||
public ObservableList<DescriptionFilter> getQuickHideMasks() {
|
||||
return quickHideMasks;
|
||||
public ObservableList<DescriptionFilter> getQuickHideFilters() {
|
||||
return quickHideMaskFilters;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -264,7 +264,7 @@ public class TimeLineController {
|
||||
InitialZoomState = new ZoomParams(filteredEvents.getSpanningInterval(),
|
||||
EventTypeZoomLevel.BASE_TYPE,
|
||||
filteredEvents.filterProperty().get(),
|
||||
DescriptionLOD.SHORT);
|
||||
DescriptionLoD.SHORT);
|
||||
historyManager.advance(InitialZoomState);
|
||||
}
|
||||
|
||||
@@ -564,12 +564,12 @@ public class TimeLineController {
|
||||
@NbBundle.Messages({"# {0} - the number of events",
|
||||
"Timeline.pushDescrLOD.confdlg.msg=You are about to show details for {0} events."
|
||||
+ " This might be very slow or even crash Autopsy.\n\nDo you want to continue?"})
|
||||
synchronized public boolean pushDescrLOD(DescriptionLOD newLOD) {
|
||||
synchronized public boolean pushDescrLOD(DescriptionLoD newLOD) {
|
||||
Map<EventType, Long> eventCounts = filteredEvents.getEventCounts(filteredEvents.zoomParametersProperty().get().getTimeRange());
|
||||
final Long count = eventCounts.values().stream().reduce(0l, Long::sum);
|
||||
|
||||
boolean shouldContinue = true;
|
||||
if (newLOD == DescriptionLOD.FULL && count > 10_000) {
|
||||
if (newLOD == DescriptionLoD.FULL && count > 10_000) {
|
||||
String format = NumberFormat.getInstance().format(count);
|
||||
|
||||
int showConfirmDialog = JOptionPane.showConfirmDialog(mainFrame,
|
||||
|
||||
@@ -22,7 +22,7 @@ import com.google.common.collect.Range;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -31,7 +31,7 @@ public interface EventBundle {
|
||||
|
||||
String getDescription();
|
||||
|
||||
DescriptionLOD getDescriptionLoD();
|
||||
DescriptionLoD getDescriptionLoD();
|
||||
|
||||
Set<Long> getEventIDs();
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ import javax.annotation.concurrent.Immutable;
|
||||
import org.joda.time.Interval;
|
||||
import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
|
||||
import org.sleuthkit.autopsy.timeline.utils.IntervalUtils;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
|
||||
|
||||
/**
|
||||
* Represents a set of other (TimeLineEvent) events clustered together. All the
|
||||
@@ -39,13 +39,13 @@ import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
|
||||
public class EventCluster implements EventBundle {
|
||||
|
||||
/**
|
||||
* merge two aggregate events into one new aggregate event.
|
||||
* merge two event clusters into one new event cluster.
|
||||
*
|
||||
* @param cluster1
|
||||
* @param cluster2
|
||||
*
|
||||
* @return a new aggregate event that is the result of merging the given
|
||||
* events
|
||||
* @return a new event cluster that is the result of merging the given
|
||||
* events clusters
|
||||
*/
|
||||
public static EventCluster merge(EventCluster cluster1, EventCluster cluster2) {
|
||||
if (cluster1.getEventType() != cluster2.getEventType()) {
|
||||
@@ -82,7 +82,7 @@ public class EventCluster implements EventBundle {
|
||||
/**
|
||||
* the description level of detail that the events were clustered at.
|
||||
*/
|
||||
private final DescriptionLOD lod;
|
||||
private final DescriptionLoD lod;
|
||||
|
||||
/**
|
||||
* the set of ids of the clustered events
|
||||
@@ -101,7 +101,7 @@ public class EventCluster implements EventBundle {
|
||||
*/
|
||||
private final Set<Long> hashHits;
|
||||
|
||||
private EventCluster(Interval spanningInterval, EventType type, Set<Long> eventIDs, Set<Long> hashHits, Set<Long> tagged, String description, DescriptionLOD lod, EventBundle parent) {
|
||||
private EventCluster(Interval spanningInterval, EventType type, Set<Long> eventIDs, Set<Long> hashHits, Set<Long> tagged, String description, DescriptionLoD lod, EventBundle parent) {
|
||||
|
||||
this.span = spanningInterval;
|
||||
this.type = type;
|
||||
@@ -113,7 +113,7 @@ public class EventCluster implements EventBundle {
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
public EventCluster(Interval spanningInterval, EventType type, Set<Long> eventIDs, Set<Long> hashHits, Set<Long> tagged, String description, DescriptionLOD lod) {
|
||||
public EventCluster(Interval spanningInterval, EventType type, Set<Long> eventIDs, Set<Long> hashHits, Set<Long> tagged, String description, DescriptionLoD lod) {
|
||||
this(spanningInterval, type, eventIDs, hashHits, tagged, description, lod, null);
|
||||
}
|
||||
|
||||
@@ -162,7 +162,7 @@ public class EventCluster implements EventBundle {
|
||||
}
|
||||
|
||||
@Override
|
||||
public DescriptionLOD getDescriptionLoD() {
|
||||
public DescriptionLoD getDescriptionLoD() {
|
||||
return lod;
|
||||
}
|
||||
|
||||
@@ -195,5 +195,4 @@ public class EventCluster implements EventBundle {
|
||||
return new EventCluster(span, type, eventIDs, hashHits, tagged, description, lod, parent);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ import java.util.Set;
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
import org.python.google.common.base.Objects;
|
||||
import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
|
||||
|
||||
/**
|
||||
* A 'collection' of {@link EventCluster}s, all having the same type,
|
||||
@@ -55,7 +55,7 @@ public final class EventStripe implements EventBundle {
|
||||
/**
|
||||
* the description level of detail that the events were clustered at.
|
||||
*/
|
||||
private final DescriptionLOD lod;
|
||||
private final DescriptionLoD lod;
|
||||
|
||||
/**
|
||||
* the set of ids of the events
|
||||
@@ -118,7 +118,7 @@ public final class EventStripe implements EventBundle {
|
||||
}
|
||||
|
||||
@Override
|
||||
public DescriptionLOD getDescriptionLoD() {
|
||||
public DescriptionLoD getDescriptionLoD() {
|
||||
return lod;
|
||||
}
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@ import org.sleuthkit.autopsy.timeline.filters.TagNameFilter;
|
||||
import org.sleuthkit.autopsy.timeline.filters.TagsFilter;
|
||||
import org.sleuthkit.autopsy.timeline.filters.TextFilter;
|
||||
import org.sleuthkit.autopsy.timeline.filters.TypeFilter;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.EventTypeZoomLevel;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.ZoomParams;
|
||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||
@@ -105,7 +105,7 @@ public final class FilteredEventsModel {
|
||||
private final ReadOnlyObjectWrapper< EventTypeZoomLevel> requestedTypeZoom = new ReadOnlyObjectWrapper<>(EventTypeZoomLevel.BASE_TYPE);
|
||||
|
||||
@GuardedBy("this")
|
||||
private final ReadOnlyObjectWrapper< DescriptionLOD> requestedLOD = new ReadOnlyObjectWrapper<>(DescriptionLOD.SHORT);
|
||||
private final ReadOnlyObjectWrapper< DescriptionLoD> requestedLOD = new ReadOnlyObjectWrapper<>(DescriptionLoD.SHORT);
|
||||
|
||||
@GuardedBy("this")
|
||||
private final ReadOnlyObjectWrapper<ZoomParams> requestedZoomParamters = new ReadOnlyObjectWrapper<>();
|
||||
@@ -180,7 +180,7 @@ public final class FilteredEventsModel {
|
||||
return requestedTimeRange.getReadOnlyProperty();
|
||||
}
|
||||
|
||||
synchronized public ReadOnlyObjectProperty<DescriptionLOD> descriptionLODProperty() {
|
||||
synchronized public ReadOnlyObjectProperty<DescriptionLoD> descriptionLODProperty() {
|
||||
return requestedLOD.getReadOnlyProperty();
|
||||
}
|
||||
|
||||
@@ -192,7 +192,7 @@ public final class FilteredEventsModel {
|
||||
return requestedTypeZoom.getReadOnlyProperty();
|
||||
}
|
||||
|
||||
synchronized public DescriptionLOD getDescriptionLOD() {
|
||||
synchronized public DescriptionLoD getDescriptionLOD() {
|
||||
return requestedLOD.get();
|
||||
}
|
||||
|
||||
@@ -322,17 +322,15 @@ public final class FilteredEventsModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param aggregation
|
||||
*
|
||||
* @return a list of aggregated events that are within the requested time
|
||||
* range and pass the requested filter, using the given aggregation
|
||||
* to control the grouping of events
|
||||
* @return a list of event clusters at the requested zoom levels that are
|
||||
* within the requested time range and pass the requested filter
|
||||
*/
|
||||
public List<EventCluster> getEventClusters() {
|
||||
final Interval range;
|
||||
final RootFilter filter;
|
||||
final EventTypeZoomLevel zoom;
|
||||
final DescriptionLOD lod;
|
||||
final DescriptionLoD lod;
|
||||
synchronized (this) {
|
||||
range = requestedTimeRange.get();
|
||||
filter = requestedFilter.get();
|
||||
|
||||
@@ -22,7 +22,7 @@ import com.google.common.collect.ImmutableMap;
|
||||
import javax.annotation.Nullable;
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
|
||||
import org.sleuthkit.datamodel.TskData;
|
||||
|
||||
/**
|
||||
@@ -38,7 +38,7 @@ public class TimeLineEvent {
|
||||
|
||||
private final long time;
|
||||
private final EventType subType;
|
||||
private final ImmutableMap<DescriptionLOD, String> descriptions;
|
||||
private final ImmutableMap<DescriptionLoD, String> descriptions;
|
||||
|
||||
private final TskData.FileKnown known;
|
||||
private final boolean hashHit;
|
||||
@@ -50,10 +50,9 @@ public class TimeLineEvent {
|
||||
this.artifactID = artifactID == 0 ? null : artifactID;
|
||||
this.time = time;
|
||||
this.subType = type;
|
||||
descriptions = ImmutableMap.<DescriptionLOD, String>of(
|
||||
DescriptionLOD.FULL, fullDescription,
|
||||
DescriptionLOD.MEDIUM, medDescription,
|
||||
DescriptionLOD.SHORT, shortDescription);
|
||||
descriptions = ImmutableMap.<DescriptionLoD, String>of(DescriptionLoD.FULL, fullDescription,
|
||||
DescriptionLoD.MEDIUM, medDescription,
|
||||
DescriptionLoD.SHORT, shortDescription);
|
||||
|
||||
this.known = known;
|
||||
this.hashHit = hashHit;
|
||||
@@ -94,22 +93,22 @@ public class TimeLineEvent {
|
||||
}
|
||||
|
||||
public String getFullDescription() {
|
||||
return getDescription(DescriptionLOD.FULL);
|
||||
return getDescription(DescriptionLoD.FULL);
|
||||
}
|
||||
|
||||
public String getMedDescription() {
|
||||
return getDescription(DescriptionLOD.MEDIUM);
|
||||
return getDescription(DescriptionLoD.MEDIUM);
|
||||
}
|
||||
|
||||
public String getShortDescription() {
|
||||
return getDescription(DescriptionLOD.SHORT);
|
||||
return getDescription(DescriptionLoD.SHORT);
|
||||
}
|
||||
|
||||
public TskData.FileKnown getKnown() {
|
||||
return known;
|
||||
}
|
||||
|
||||
public String getDescription(DescriptionLOD lod) {
|
||||
public String getDescription(DescriptionLoD lod) {
|
||||
return descriptions.get(lod);
|
||||
}
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ import static org.sleuthkit.autopsy.timeline.db.SQLHelper.useTagTablesHelper;
|
||||
import org.sleuthkit.autopsy.timeline.filters.RootFilter;
|
||||
import org.sleuthkit.autopsy.timeline.filters.TagsFilter;
|
||||
import org.sleuthkit.autopsy.timeline.utils.RangeDivisionInfo;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.EventTypeZoomLevel;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.ZoomParams;
|
||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||
@@ -1046,7 +1046,7 @@ public class EventDB {
|
||||
//unpack params
|
||||
Interval timeRange = params.getTimeRange();
|
||||
RootFilter filter = params.getFilter();
|
||||
DescriptionLOD descriptionLOD = params.getDescriptionLOD();
|
||||
DescriptionLoD descriptionLOD = params.getDescriptionLOD();
|
||||
EventTypeZoomLevel typeZoomLevel = params.getTypeZoomLevel();
|
||||
|
||||
//ensure length of querried interval is not 0
|
||||
@@ -1109,7 +1109,7 @@ public class EventDB {
|
||||
*
|
||||
* @throws SQLException
|
||||
*/
|
||||
private EventCluster eventClusterHelper(ResultSet rs, boolean useSubTypes, DescriptionLOD descriptionLOD, TagsFilter filter) throws SQLException {
|
||||
private EventCluster eventClusterHelper(ResultSet rs, boolean useSubTypes, DescriptionLoD descriptionLOD, TagsFilter filter) throws SQLException {
|
||||
Interval interval = new Interval(rs.getLong("min(time)") * 1000, rs.getLong("max(time)") * 1000, TimeLineController.getJodaTimeZone());// NON-NLS
|
||||
String eventIDsString = rs.getString("event_ids");// NON-NLS
|
||||
Set<Long> eventIDs = SQLHelper.unGroupConcat(eventIDsString, Long::valueOf);
|
||||
|
||||
@@ -43,9 +43,9 @@ import org.sleuthkit.autopsy.timeline.filters.TextFilter;
|
||||
import org.sleuthkit.autopsy.timeline.filters.TypeFilter;
|
||||
import org.sleuthkit.autopsy.timeline.filters.UnionFilter;
|
||||
import org.sleuthkit.autopsy.timeline.utils.RangeDivisionInfo;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
|
||||
import static org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD.FULL;
|
||||
import static org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD.MEDIUM;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
|
||||
import static org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD.FULL;
|
||||
import static org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD.MEDIUM;
|
||||
import static org.sleuthkit.autopsy.timeline.zooming.TimeUnits.DAYS;
|
||||
import static org.sleuthkit.autopsy.timeline.zooming.TimeUnits.HOURS;
|
||||
import static org.sleuthkit.autopsy.timeline.zooming.TimeUnits.MINUTES;
|
||||
@@ -62,12 +62,12 @@ class SQLHelper {
|
||||
|
||||
static String useHashHitTablesHelper(RootFilter filter) {
|
||||
HashHitsFilter hashHitFilter = filter.getHashHitsFilter();
|
||||
return hashHitFilter.isSelected() && false == hashHitFilter.isDisabled() ? " LEFT JOIN hash_set_hits " : " ";
|
||||
return hashHitFilter.isActive() ? " LEFT JOIN hash_set_hits " : " ";
|
||||
}
|
||||
|
||||
static String useTagTablesHelper(RootFilter filter) {
|
||||
TagsFilter tagsFilter = filter.getTagsFilter();
|
||||
return tagsFilter.isSelected() && false == tagsFilter.isDisabled() ? " LEFT JOIN tags " : " ";
|
||||
return tagsFilter.isActive() ? " LEFT JOIN tags " : " ";
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -149,7 +149,7 @@ class SQLHelper {
|
||||
}
|
||||
|
||||
private static String getSQLWhere(HideKnownFilter filter) {
|
||||
if (filter.isSelected()) {
|
||||
if (filter.isActive()) {
|
||||
return "(known_state IS NOT '" + TskData.FileKnown.KNOWN.getFileKnownValue() + "')"; // NON-NLS
|
||||
} else {
|
||||
return "1";
|
||||
@@ -157,16 +157,16 @@ class SQLHelper {
|
||||
}
|
||||
|
||||
private static String getSQLWhere(DescriptionFilter filter) {
|
||||
if (filter.isSelected() && (false == filter.isDisabled())) {
|
||||
return "(" + getDescriptionColumn(filter.getDescriptionLoD()) + (filter.getFilterMode() == DescriptionFilter.FilterMode.INCLUDE ? "" : " NOT") + " LIKE '" + filter.getDescription() + "' )"; // NON-NLS
|
||||
if (filter.isActive()) {
|
||||
String likeOrNotLike = (filter.getFilterMode() == DescriptionFilter.FilterMode.INCLUDE ? "" : " NOT") + " LIKE '";
|
||||
return "(" + getDescriptionColumn(filter.getDescriptionLoD()) + likeOrNotLike + filter.getDescription() + "' )"; // NON-NLS
|
||||
} else {
|
||||
return "1";
|
||||
}
|
||||
}
|
||||
|
||||
private static String getSQLWhere(TagsFilter filter) {
|
||||
if (filter.isSelected()
|
||||
&& (false == filter.isDisabled())
|
||||
if (filter.isActive()
|
||||
&& (filter.getSubFilters().isEmpty() == false)) {
|
||||
String tagNameIDs = filter.getSubFilters().stream()
|
||||
.filter((TagNameFilter t) -> t.isSelected() && !t.isDisabled())
|
||||
@@ -181,8 +181,7 @@ class SQLHelper {
|
||||
}
|
||||
|
||||
private static String getSQLWhere(HashHitsFilter filter) {
|
||||
if (filter.isSelected()
|
||||
&& (false == filter.isDisabled())
|
||||
if (filter.isActive()
|
||||
&& (filter.getSubFilters().isEmpty() == false)) {
|
||||
String hashSetIDs = filter.getSubFilters().stream()
|
||||
.filter((HashSetFilter t) -> t.isSelected() && !t.isDisabled())
|
||||
@@ -195,7 +194,7 @@ class SQLHelper {
|
||||
}
|
||||
|
||||
private static String getSQLWhere(DataSourceFilter filter) {
|
||||
if (filter.isSelected()) {
|
||||
if (filter.isActive()) {
|
||||
return "(datasource_id = '" + filter.getDataSourceID() + "')";
|
||||
} else {
|
||||
return "1";
|
||||
@@ -203,15 +202,15 @@ class SQLHelper {
|
||||
}
|
||||
|
||||
private static String getSQLWhere(DataSourcesFilter filter) {
|
||||
return (filter.isSelected()) ? "(datasource_id in ("
|
||||
return (filter.isActive()) ? "(datasource_id in ("
|
||||
+ filter.getSubFilters().stream()
|
||||
.filter(AbstractFilter::isSelected)
|
||||
.filter(AbstractFilter::isActive)
|
||||
.map((dataSourceFilter) -> String.valueOf(dataSourceFilter.getDataSourceID()))
|
||||
.collect(Collectors.joining(", ")) + "))" : "1";
|
||||
}
|
||||
|
||||
private static String getSQLWhere(TextFilter filter) {
|
||||
if (filter.isSelected()) {
|
||||
if (filter.isActive()) {
|
||||
if (StringUtils.isBlank(filter.getText())) {
|
||||
return "1";
|
||||
}
|
||||
@@ -237,7 +236,7 @@ class SQLHelper {
|
||||
return "0";
|
||||
} else if (typeFilter.getEventType() instanceof RootEventType) {
|
||||
if (typeFilter.getSubFilters().stream()
|
||||
.allMatch(subFilter -> subFilter.isSelected() && subFilter.getSubFilters().stream().allMatch(Filter::isSelected))) {
|
||||
.allMatch(subFilter -> subFilter.isActive() && subFilter.getSubFilters().stream().allMatch(Filter::isActive))) {
|
||||
return "1"; //then collapse clause to true
|
||||
}
|
||||
}
|
||||
@@ -245,7 +244,7 @@ class SQLHelper {
|
||||
}
|
||||
|
||||
private static List<Integer> getActiveSubTypes(TypeFilter filter) {
|
||||
if (filter.isSelected()) {
|
||||
if (filter.isActive()) {
|
||||
if (filter.getSubFilters().isEmpty()) {
|
||||
return Collections.singletonList(RootEventType.allTypes.indexOf(filter.getEventType()));
|
||||
} else {
|
||||
@@ -285,7 +284,7 @@ class SQLHelper {
|
||||
}
|
||||
}
|
||||
|
||||
static String getDescriptionColumn(DescriptionLOD lod) {
|
||||
static String getDescriptionColumn(DescriptionLoD lod) {
|
||||
switch (lod) {
|
||||
case FULL:
|
||||
return "full_description";
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
package org.sleuthkit.autopsy.timeline.events;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public class FiltersChangedEvent {
|
||||
|
||||
}
|
||||
@@ -19,11 +19,11 @@
|
||||
package org.sleuthkit.autopsy.timeline.filters;
|
||||
|
||||
import java.util.Objects;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
|
||||
|
||||
public class DescriptionFilter extends AbstractFilter {
|
||||
|
||||
private final DescriptionLOD descriptionLoD;
|
||||
private final DescriptionLoD descriptionLoD;
|
||||
private final String description;
|
||||
private final FilterMode filterMode;
|
||||
|
||||
@@ -31,7 +31,7 @@ public class DescriptionFilter extends AbstractFilter {
|
||||
return filterMode;
|
||||
}
|
||||
|
||||
public DescriptionFilter(DescriptionLOD descriptionLoD, String description, FilterMode filterMode) {
|
||||
public DescriptionFilter(DescriptionLoD descriptionLoD, String description, FilterMode filterMode) {
|
||||
this.descriptionLoD = descriptionLoD;
|
||||
this.description = description;
|
||||
this.filterMode = filterMode;
|
||||
@@ -58,7 +58,7 @@ public class DescriptionFilter extends AbstractFilter {
|
||||
/**
|
||||
* @return the descriptionLoD
|
||||
*/
|
||||
public DescriptionLOD getDescriptionLoD() {
|
||||
public DescriptionLoD getDescriptionLoD() {
|
||||
return descriptionLoD;
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.timeline.filters;
|
||||
|
||||
import javafx.beans.binding.BooleanBinding;
|
||||
import javafx.beans.property.SimpleBooleanProperty;
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
@@ -79,4 +80,8 @@ public interface Filter {
|
||||
SimpleBooleanProperty getDisabledProperty();
|
||||
|
||||
boolean isDisabled();
|
||||
|
||||
boolean isActive();
|
||||
|
||||
BooleanBinding activeProperty();
|
||||
}
|
||||
|
||||
@@ -1,14 +1,20 @@
|
||||
/**
|
||||
* *************************************************************************
|
||||
** This data and information is proprietary to, and a valuable trade secret *
|
||||
* of, Basis Technology Corp. It is given in confidence by Basis Technology *
|
||||
* and may only be used as permitted under the license agreement under which *
|
||||
* it has been distributed, and in no other way. * * Copyright (c) 2014 Basis
|
||||
* Technology Corp. All rights reserved. * * The technical data and information
|
||||
* provided herein are provided with * `limited rights', and the computer
|
||||
* software provided herein is provided * with `restricted rights' as those
|
||||
* terms are defined in DAR and ASPR * 7-104.9(a).
|
||||
* *************************************************************************
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.sleuthkit.autopsy.timeline.ui;
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ import org.sleuthkit.autopsy.timeline.datamodel.FilteredEventsModel;
|
||||
import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
|
||||
import org.sleuthkit.autopsy.timeline.ui.AbstractVisualization;
|
||||
import org.sleuthkit.autopsy.timeline.utils.RangeDivisionInfo;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
|
||||
|
||||
/**
|
||||
* Controller class for a {@link EventDetailChart} based implementation of a
|
||||
@@ -468,11 +468,11 @@ public class DetailViewPane extends AbstractVisualization<DateTime, EventCluster
|
||||
}
|
||||
}
|
||||
|
||||
public Action newUnhideDescriptionAction(String description, DescriptionLOD descriptionLoD) {
|
||||
public Action newUnhideDescriptionAction(String description, DescriptionLoD descriptionLoD) {
|
||||
return chart.new UnhideDescriptionAction(description, descriptionLoD);
|
||||
}
|
||||
|
||||
public Action newHideDescriptionAction(String description, DescriptionLOD descriptionLoD) {
|
||||
public Action newHideDescriptionAction(String description, DescriptionLoD descriptionLoD) {
|
||||
return chart.new HideDescriptionAction(description, descriptionLoD);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,77 +6,81 @@
|
||||
<?import javafx.scene.layout.*?>
|
||||
|
||||
<fx:root alignment="CENTER_LEFT" spacing="5.0" type="javafx.scene.layout.HBox" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
|
||||
<children>
|
||||
<MenuButton fx:id="advancedLayoutOptionsButtonLabel" mnemonicParsing="false">
|
||||
<items>
|
||||
<CustomMenuItem fx:id="bandByTypeBoxMenuItem" hideOnClick="false" mnemonicParsing="false">
|
||||
<content>
|
||||
<CheckBox fx:id="bandByTypeBox" mnemonicParsing="false">
|
||||
<padding>
|
||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||
</padding></CheckBox>
|
||||
</content>
|
||||
</CustomMenuItem>
|
||||
<CustomMenuItem fx:id="oneEventPerRowBoxMenuItem" hideOnClick="false" mnemonicParsing="false">
|
||||
<content>
|
||||
<CheckBox fx:id="oneEventPerRowBox" mnemonicParsing="false">
|
||||
<padding>
|
||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||
</padding></CheckBox>
|
||||
</content>
|
||||
</CustomMenuItem>
|
||||
<SeparatorMenuItem mnemonicParsing="false" />
|
||||
<CustomMenuItem fx:id="truncateAllBoxMenuItem" hideOnClick="false" mnemonicParsing="false">
|
||||
<content>
|
||||
<CheckBox fx:id="truncateAllBox" mnemonicParsing="false">
|
||||
<padding>
|
||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||
</padding></CheckBox>
|
||||
</content>
|
||||
</CustomMenuItem>
|
||||
<CustomMenuItem fx:id="truncateSliderLabelMenuItem" hideOnClick="false" mnemonicParsing="false">
|
||||
<content>
|
||||
<Label fx:id="truncateSliderLabel" contentDisplay="BOTTOM">
|
||||
<graphic>
|
||||
<Slider id="truncateAllSlider" fx:id="truncateWidthSlider" blockIncrement="50.0" disable="false" majorTickUnit="150.0" max="500.0" min="50.0" minorTickCount="0" prefHeight="33.0" prefWidth="150.0" showTickLabels="true" showTickMarks="false" value="200.0" />
|
||||
</graphic>
|
||||
</Label>
|
||||
</content>
|
||||
</CustomMenuItem>
|
||||
<SeparatorMenuItem fx:id="descVisibilitySeparatorMenuItem" mnemonicParsing="false" />
|
||||
<CustomMenuItem fx:id="showRadioMenuItem" hideOnClick="false" mnemonicParsing="false">
|
||||
<content>
|
||||
<RadioButton fx:id="showRadio" mnemonicParsing="false" selected="true">
|
||||
<toggleGroup>
|
||||
<ToggleGroup fx:id="descrVisibility" />
|
||||
</toggleGroup>
|
||||
<padding>
|
||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||
</padding>
|
||||
</RadioButton>
|
||||
</content>
|
||||
</CustomMenuItem>
|
||||
<CustomMenuItem fx:id="countsRadioMenuItem" hideOnClick="false" mnemonicParsing="false">
|
||||
<content>
|
||||
<RadioButton fx:id="countsRadio" mnemonicParsing="false" toggleGroup="$descrVisibility">
|
||||
<padding>
|
||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||
</padding></RadioButton>
|
||||
</content>
|
||||
</CustomMenuItem>
|
||||
<CustomMenuItem fx:id="hiddenRadioMenuItem" hideOnClick="false" mnemonicParsing="false">
|
||||
<content>
|
||||
<RadioButton fx:id="hiddenRadio" mnemonicParsing="false" toggleGroup="$descrVisibility">
|
||||
<padding>
|
||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||
</padding></RadioButton>
|
||||
</content>
|
||||
</CustomMenuItem>
|
||||
</items>
|
||||
</MenuButton>
|
||||
<ToggleButton fx:id="testToggle" mnemonicParsing="false" selected="true" text="Test" />
|
||||
</children>
|
||||
<padding>
|
||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||
</padding>
|
||||
<children>
|
||||
<MenuButton fx:id="advancedLayoutOptionsButtonLabel" mnemonicParsing="false">
|
||||
<items>
|
||||
<CustomMenuItem fx:id="bandByTypeBoxMenuItem" hideOnClick="false" mnemonicParsing="false">
|
||||
<content>
|
||||
<CheckBox fx:id="bandByTypeBox" mnemonicParsing="false">
|
||||
<padding>
|
||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||
</padding>
|
||||
</CheckBox>
|
||||
</content>
|
||||
</CustomMenuItem>
|
||||
<CustomMenuItem fx:id="oneEventPerRowBoxMenuItem" hideOnClick="false" mnemonicParsing="false">
|
||||
<content>
|
||||
<CheckBox fx:id="oneEventPerRowBox" mnemonicParsing="false">
|
||||
<padding>
|
||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||
</padding>
|
||||
</CheckBox>
|
||||
</content>
|
||||
</CustomMenuItem>
|
||||
<SeparatorMenuItem mnemonicParsing="false" />
|
||||
<CustomMenuItem fx:id="truncateAllBoxMenuItem" hideOnClick="false" mnemonicParsing="false">
|
||||
<content>
|
||||
<CheckBox fx:id="truncateAllBox" mnemonicParsing="false">
|
||||
<padding>
|
||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||
</padding>
|
||||
</CheckBox>
|
||||
</content>
|
||||
</CustomMenuItem>
|
||||
<CustomMenuItem fx:id="truncateSliderLabelMenuItem" hideOnClick="false" mnemonicParsing="false">
|
||||
<content>
|
||||
<Label fx:id="truncateSliderLabel" contentDisplay="BOTTOM">
|
||||
<graphic>
|
||||
<Slider id="truncateAllSlider" fx:id="truncateWidthSlider" blockIncrement="50.0" disable="false" majorTickUnit="150.0" max="500.0" min="50.0" minorTickCount="0" prefHeight="33.0" prefWidth="150.0" showTickLabels="true" showTickMarks="false" value="200.0" />
|
||||
</graphic>
|
||||
</Label>
|
||||
</content>
|
||||
</CustomMenuItem>
|
||||
<SeparatorMenuItem fx:id="descVisibilitySeparatorMenuItem" mnemonicParsing="false" />
|
||||
<CustomMenuItem fx:id="showRadioMenuItem" hideOnClick="false" mnemonicParsing="false">
|
||||
<content>
|
||||
<RadioButton fx:id="showRadio" mnemonicParsing="false" selected="true">
|
||||
<toggleGroup>
|
||||
<ToggleGroup fx:id="descrVisibility" />
|
||||
</toggleGroup>
|
||||
<padding>
|
||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||
</padding>
|
||||
</RadioButton>
|
||||
</content>
|
||||
</CustomMenuItem>
|
||||
<CustomMenuItem fx:id="countsRadioMenuItem" hideOnClick="false" mnemonicParsing="false">
|
||||
<content>
|
||||
<RadioButton fx:id="countsRadio" mnemonicParsing="false" toggleGroup="$descrVisibility">
|
||||
<padding>
|
||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||
</padding>
|
||||
</RadioButton>
|
||||
</content>
|
||||
</CustomMenuItem>
|
||||
<CustomMenuItem fx:id="hiddenRadioMenuItem" hideOnClick="false" mnemonicParsing="false">
|
||||
<content>
|
||||
<RadioButton fx:id="hiddenRadio" mnemonicParsing="false" toggleGroup="$descrVisibility">
|
||||
<padding>
|
||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||
</padding>
|
||||
</RadioButton>
|
||||
</content>
|
||||
</CustomMenuItem>
|
||||
</items>
|
||||
</MenuButton>
|
||||
</children>
|
||||
<padding>
|
||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||
</padding>
|
||||
</fx:root>
|
||||
|
||||
@@ -82,7 +82,7 @@ import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
|
||||
import org.sleuthkit.autopsy.timeline.filters.AbstractFilter;
|
||||
import org.sleuthkit.autopsy.timeline.filters.DescriptionFilter;
|
||||
import org.sleuthkit.autopsy.timeline.ui.TimeLineChart;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
|
||||
|
||||
/**
|
||||
* Custom implementation of {@link XYChart} to graph events on a horizontal
|
||||
@@ -326,7 +326,7 @@ public final class EventDetailChart extends XYChart<DateTime, EventCluster> impl
|
||||
public synchronized void setController(TimeLineController controller) {
|
||||
this.controller = controller;
|
||||
setModel(this.controller.getEventsModel());
|
||||
getController().getQuickHideMasks().addListener(layoutInvalidationListener);
|
||||
getController().getQuickHideFilters().addListener(layoutInvalidationListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -478,18 +478,18 @@ public final class EventDetailChart extends XYChart<DateTime, EventCluster> impl
|
||||
double minY = 0;
|
||||
for (Series<DateTime, EventCluster> series : sortedSeriesList) {
|
||||
hiddenPartition = series.getData().stream().map(Data::getNode).map(EventStripeNode.class::cast)
|
||||
.collect(Collectors.partitioningBy(node -> getController().getQuickHideMasks().stream()
|
||||
.collect(Collectors.partitioningBy(node -> getController().getQuickHideFilters().stream()
|
||||
.filter(AbstractFilter::isActive)
|
||||
.anyMatch(mask -> mask.getDescription().equals(node.getDescription()))));
|
||||
.anyMatch(filter -> filter.getDescription().equals(node.getDescription()))));
|
||||
|
||||
layoutNodesHelper(hiddenPartition.get(true), hiddenPartition.get(false), minY, 0);
|
||||
minY = maxY.get();
|
||||
}
|
||||
} else {
|
||||
hiddenPartition = stripeNodeMap.values().stream()
|
||||
.collect(Collectors.partitioningBy(node -> getController().getQuickHideMasks().stream()
|
||||
.collect(Collectors.partitioningBy(node -> getController().getQuickHideFilters().stream()
|
||||
.filter(AbstractFilter::isActive)
|
||||
.anyMatch(mask -> mask.getDescription().equals(node.getDescription()))));
|
||||
.anyMatch(filter -> filter.getDescription().equals(node.getDescription()))));
|
||||
layoutNodesHelper(hiddenPartition.get(true), hiddenPartition.get(false), 0, 0);
|
||||
}
|
||||
setCursor(null);
|
||||
@@ -607,8 +607,9 @@ public final class EventDetailChart extends XYChart<DateTime, EventCluster> impl
|
||||
List<EventStripeNode> subNodes = stripeNode.getSubNodes();
|
||||
if (subNodes.isEmpty() == false) {
|
||||
Map<Boolean, List<EventStripeNode>> hiddenPartition = subNodes.stream()
|
||||
.collect(Collectors.partitioningBy(testNode -> getController().getQuickHideMasks().stream()
|
||||
.anyMatch(mask -> mask.getDescription().equals(testNode.getDescription()))));
|
||||
.collect(Collectors.partitioningBy(testNode -> getController().getQuickHideFilters().stream()
|
||||
.filter(AbstractFilter::isActive)
|
||||
.anyMatch(filter -> filter.getDescription().equals(testNode.getDescription()))));
|
||||
|
||||
layoutNodesResultHeight = layoutNodesHelper(hiddenPartition.get(true), hiddenPartition.get(false), minY, rawDisplayPosition);
|
||||
}
|
||||
@@ -730,8 +731,6 @@ public final class EventDetailChart extends XYChart<DateTime, EventCluster> impl
|
||||
return alternateLayout;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static private class DetailIntervalSelector extends IntervalSelector<DateTime> {
|
||||
|
||||
DetailIntervalSelector(double x, double height, Axis<DateTime> axis, TimeLineController controller) {
|
||||
@@ -781,7 +780,7 @@ public final class EventDetailChart extends XYChart<DateTime, EventCluster> impl
|
||||
|
||||
class HideDescriptionAction extends Action {
|
||||
|
||||
HideDescriptionAction(String description, DescriptionLOD descriptionLoD) {
|
||||
HideDescriptionAction(String description, DescriptionLoD descriptionLoD) {
|
||||
super("Hide");
|
||||
setGraphic(new ImageView(HIDE));
|
||||
setEventHandler((ActionEvent t) -> {
|
||||
@@ -790,11 +789,11 @@ public final class EventDetailChart extends XYChart<DateTime, EventCluster> impl
|
||||
description,
|
||||
DescriptionFilter.FilterMode.EXCLUDE);
|
||||
|
||||
DescriptionFilter descriptionFilter = getController().getQuickHideMasks().stream()
|
||||
DescriptionFilter descriptionFilter = getController().getQuickHideFilters().stream()
|
||||
.filter(testFilter::equals)
|
||||
.findFirst().orElseGet(() -> {
|
||||
testFilter.selectedProperty().addListener(layoutInvalidationListener);
|
||||
getController().getQuickHideMasks().add(testFilter);
|
||||
getController().getQuickHideFilters().add(testFilter);
|
||||
return testFilter;
|
||||
});
|
||||
descriptionFilter.setSelected(true);
|
||||
@@ -805,12 +804,12 @@ public final class EventDetailChart extends XYChart<DateTime, EventCluster> impl
|
||||
|
||||
class UnhideDescriptionAction extends Action {
|
||||
|
||||
UnhideDescriptionAction(String description, DescriptionLOD descriptionLoD) {
|
||||
UnhideDescriptionAction(String description, DescriptionLoD descriptionLoD) {
|
||||
|
||||
super("Unhide");
|
||||
setGraphic(new ImageView(SHOW));
|
||||
setEventHandler((ActionEvent t) ->
|
||||
getController().getQuickHideMasks().stream()
|
||||
getController().getQuickHideFilters().stream()
|
||||
.filter(descriptionFilter -> descriptionFilter.getDescriptionLoD().equals(descriptionLoD)
|
||||
&& descriptionFilter.getDescription().equals(description))
|
||||
.forEach(descriptionfilter -> descriptionfilter.setSelected(false))
|
||||
|
||||
@@ -81,7 +81,7 @@ import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
|
||||
import org.sleuthkit.autopsy.timeline.filters.DescriptionFilter;
|
||||
import org.sleuthkit.autopsy.timeline.filters.RootFilter;
|
||||
import org.sleuthkit.autopsy.timeline.filters.TypeFilter;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.EventTypeZoomLevel;
|
||||
import org.sleuthkit.autopsy.timeline.zooming.ZoomParams;
|
||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||
@@ -116,7 +116,7 @@ final public class EventStripeNode extends StackPane {
|
||||
b.setManaged(show);
|
||||
}
|
||||
|
||||
private final SimpleObjectProperty<DescriptionLOD> descLOD = new SimpleObjectProperty<>();
|
||||
private final SimpleObjectProperty<DescriptionLoD> descLOD = new SimpleObjectProperty<>();
|
||||
private DescriptionVisibility descrVis;
|
||||
private Tooltip tooltip;
|
||||
|
||||
@@ -398,7 +398,7 @@ final public class EventStripeNode extends StackPane {
|
||||
}
|
||||
}
|
||||
|
||||
private DescriptionLOD getDescriptionLoD() {
|
||||
private DescriptionLoD getDescriptionLoD() {
|
||||
return descLOD.get();
|
||||
}
|
||||
|
||||
@@ -409,7 +409,7 @@ final public class EventStripeNode extends StackPane {
|
||||
* @param expand
|
||||
*/
|
||||
@NbBundle.Messages(value = "EventStripeNode.loggedTask.name=Load sub clusters")
|
||||
private synchronized void loadSubBundles(DescriptionLOD.RelativeDetail relativeDetail) {
|
||||
private synchronized void loadSubBundles(DescriptionLoD.RelativeDetail relativeDetail) {
|
||||
chart.getEventBundles().removeIf(bundle ->
|
||||
getSubNodes().stream().anyMatch(subNode ->
|
||||
bundle.equals(subNode.getEventStripe()))
|
||||
@@ -436,7 +436,7 @@ final public class EventStripeNode extends StackPane {
|
||||
|
||||
Task<Collection<EventStripe>> loggedTask = new Task<Collection<EventStripe>>() {
|
||||
|
||||
private volatile DescriptionLOD loadedDescriptionLoD = getDescriptionLoD().withRelativeDetail(relativeDetail);
|
||||
private volatile DescriptionLoD loadedDescriptionLoD = getDescriptionLoD().withRelativeDetail(relativeDetail);
|
||||
|
||||
{
|
||||
updateTitle(Bundle.EventStripeNode_loggedTask_name());
|
||||
@@ -445,7 +445,7 @@ final public class EventStripeNode extends StackPane {
|
||||
@Override
|
||||
protected Collection<EventStripe> call() throws Exception {
|
||||
Collection<EventStripe> bundles;
|
||||
DescriptionLOD next = loadedDescriptionLoD;
|
||||
DescriptionLoD next = loadedDescriptionLoD;
|
||||
do {
|
||||
loadedDescriptionLoD = next;
|
||||
if (loadedDescriptionLoD == eventStripe.getDescriptionLoD()) {
|
||||
@@ -551,9 +551,9 @@ final public class EventStripeNode extends StackPane {
|
||||
} else if (t.isShortcutDown()) {
|
||||
chart.selectedNodes.removeAll(EventStripeNode.this);
|
||||
} else if (t.getClickCount() > 1) {
|
||||
final DescriptionLOD next = descLOD.get().moreDetailed();
|
||||
final DescriptionLoD next = descLOD.get().moreDetailed();
|
||||
if (next != null) {
|
||||
loadSubBundles(DescriptionLOD.RelativeDetail.MORE);
|
||||
loadSubBundles(DescriptionLoD.RelativeDetail.MORE);
|
||||
|
||||
}
|
||||
} else {
|
||||
@@ -586,13 +586,13 @@ final public class EventStripeNode extends StackPane {
|
||||
|
||||
setGraphic(new ImageView(PLUS));
|
||||
setEventHandler((ActionEvent t) -> {
|
||||
final DescriptionLOD next = descLOD.get().moreDetailed();
|
||||
final DescriptionLoD next = descLOD.get().moreDetailed();
|
||||
if (next != null) {
|
||||
loadSubBundles(DescriptionLOD.RelativeDetail.MORE);
|
||||
loadSubBundles(DescriptionLoD.RelativeDetail.MORE);
|
||||
|
||||
}
|
||||
});
|
||||
disabledProperty().bind(descLOD.isEqualTo(DescriptionLOD.FULL));
|
||||
disabledProperty().bind(descLOD.isEqualTo(DescriptionLoD.FULL));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -604,9 +604,9 @@ final public class EventStripeNode extends StackPane {
|
||||
|
||||
setGraphic(new ImageView(MINUS));
|
||||
setEventHandler((ActionEvent t) -> {
|
||||
final DescriptionLOD previous = descLOD.get().lessDetailed();
|
||||
final DescriptionLoD previous = descLOD.get().lessDetailed();
|
||||
if (previous != null) {
|
||||
loadSubBundles(DescriptionLOD.RelativeDetail.LESS);
|
||||
loadSubBundles(DescriptionLoD.RelativeDetail.LESS);
|
||||
}
|
||||
});
|
||||
disabledProperty().bind(Bindings.createBooleanBinding(() -> nonNull(eventStripe) && descLOD.get() == eventStripe.getDescriptionLoD(), descLOD));
|
||||
|
||||
@@ -49,6 +49,7 @@ import org.sleuthkit.autopsy.timeline.TimeLineController;
|
||||
import org.sleuthkit.autopsy.timeline.TimeLineView;
|
||||
import org.sleuthkit.autopsy.timeline.datamodel.EventBundle;
|
||||
import org.sleuthkit.autopsy.timeline.datamodel.FilteredEventsModel;
|
||||
import org.sleuthkit.autopsy.timeline.filters.AbstractFilter;
|
||||
import org.sleuthkit.autopsy.timeline.filters.DescriptionFilter;
|
||||
import org.sleuthkit.autopsy.timeline.ui.detailview.DetailViewPane;
|
||||
|
||||
@@ -164,17 +165,17 @@ public class NavPanel extends BorderPane implements TimeLineView {
|
||||
setTooltip(null);
|
||||
setGraphic(null);
|
||||
setContextMenu(null);
|
||||
deRegisterListeners(controller.getQuickHideMasks());
|
||||
deRegisterListeners(controller.getQuickHideFilters());
|
||||
} else {
|
||||
filterStateChangeListener = (filterState) -> updateHiddenState(item);
|
||||
controller.getQuickHideMasks().addListener((ListChangeListener.Change<? extends DescriptionFilter> listChange) -> {
|
||||
controller.getQuickHideFilters().addListener((ListChangeListener.Change<? extends DescriptionFilter> listChange) -> {
|
||||
while (listChange.next()) {
|
||||
deRegisterListeners(listChange.getRemoved());
|
||||
registerListeners(listChange.getAddedSubList(), item);
|
||||
}
|
||||
updateHiddenState(item);
|
||||
});
|
||||
registerListeners(controller.getQuickHideMasks(), item);
|
||||
registerListeners(controller.getQuickHideFilters(), item);
|
||||
String text = item.getDescription() + " (" + item.getCount() + ")"; // NON-NLS
|
||||
TreeItem<EventBundle> parent = getTreeItem().getParent();
|
||||
if (parent != null && parent.getValue() != null && (parent instanceof EventDescriptionTreeItem)) {
|
||||
@@ -207,7 +208,9 @@ public class NavPanel extends BorderPane implements TimeLineView {
|
||||
private void updateHiddenState(EventBundle item) {
|
||||
TreeItem<EventBundle> treeItem = getTreeItem();
|
||||
ContextMenu newMenu;
|
||||
if (controller.getQuickHideMasks().stream().anyMatch((mask) -> mask.isActive() && mask.getDescription().equals(item.getDescription()))) {
|
||||
if (controller.getQuickHideFilters().stream().
|
||||
filter(AbstractFilter::isActive)
|
||||
.anyMatch(filter -> filter.getDescription().equals(item.getDescription()))) {
|
||||
if (treeItem != null) {
|
||||
treeItem.setExpanded(false);
|
||||
}
|
||||
|
||||
@@ -201,7 +201,7 @@ final public class FilterSetPanel extends BorderPane implements TimeLineView {
|
||||
defaultButton.disableProperty().bind(defaultFiltersAction.disabledProperty());
|
||||
this.setModel(timeLineController.getEventsModel());
|
||||
|
||||
hiddenDescriptionsListView.setItems(controller.getQuickHideMasks());
|
||||
hiddenDescriptionsListView.setItems(controller.getQuickHideFilters());
|
||||
hiddenDescriptionsListView.setCellFactory((ListView<DescriptionFilter> param) -> {
|
||||
final ListCell<DescriptionFilter> forList = new FilterCheckBoxCellFactory<DescriptionFilter>().forList();
|
||||
|
||||
@@ -217,7 +217,7 @@ final public class FilterSetPanel extends BorderPane implements TimeLineView {
|
||||
|
||||
configureText(forList.getItem().selectedProperty().get());
|
||||
setOnAction((ActionEvent event) -> {
|
||||
controller.getQuickHideMasks().remove(forList.getItem());
|
||||
controller.getQuickHideFilters().remove(forList.getItem());
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
+9
-9
@@ -23,11 +23,11 @@ import org.openide.util.NbBundle;
|
||||
/**
|
||||
* Enumeration of all description levels of detail.
|
||||
*/
|
||||
public enum DescriptionLOD {
|
||||
public enum DescriptionLoD {
|
||||
|
||||
SHORT(NbBundle.getMessage(DescriptionLOD.class, "DescriptionLOD.short")),
|
||||
MEDIUM(NbBundle.getMessage(DescriptionLOD.class, "DescriptionLOD.medium")),
|
||||
FULL(NbBundle.getMessage(DescriptionLOD.class, "DescriptionLOD.full"));
|
||||
SHORT(NbBundle.getMessage(DescriptionLoD.class, "DescriptionLOD.short")),
|
||||
MEDIUM(NbBundle.getMessage(DescriptionLoD.class, "DescriptionLOD.medium")),
|
||||
FULL(NbBundle.getMessage(DescriptionLoD.class, "DescriptionLOD.full"));
|
||||
|
||||
private final String displayName;
|
||||
|
||||
@@ -35,11 +35,11 @@ public enum DescriptionLOD {
|
||||
return displayName;
|
||||
}
|
||||
|
||||
private DescriptionLOD(String displayName) {
|
||||
private DescriptionLoD(String displayName) {
|
||||
this.displayName = displayName;
|
||||
}
|
||||
|
||||
public DescriptionLOD moreDetailed() {
|
||||
public DescriptionLoD moreDetailed() {
|
||||
try {
|
||||
return values()[ordinal() + 1];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
@@ -47,7 +47,7 @@ public enum DescriptionLOD {
|
||||
}
|
||||
}
|
||||
|
||||
public DescriptionLOD lessDetailed() {
|
||||
public DescriptionLoD lessDetailed() {
|
||||
try {
|
||||
return values()[ordinal() - 1];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
@@ -55,7 +55,7 @@ public enum DescriptionLOD {
|
||||
}
|
||||
}
|
||||
|
||||
public DescriptionLOD withRelativeDetail(RelativeDetail relativeDetail) {
|
||||
public DescriptionLoD withRelativeDetail(RelativeDetail relativeDetail) {
|
||||
switch (relativeDetail) {
|
||||
case EQUAL:
|
||||
return this;
|
||||
@@ -68,7 +68,7 @@ public enum DescriptionLOD {
|
||||
}
|
||||
}
|
||||
|
||||
public RelativeDetail getDetailLevelRelativeTo(DescriptionLOD other) {
|
||||
public RelativeDetail getDetailLevelRelativeTo(DescriptionLoD other) {
|
||||
int compareTo = this.compareTo(other);
|
||||
if (compareTo < 0) {
|
||||
return RelativeDetail.LESS;
|
||||
@@ -35,7 +35,7 @@ public class ZoomParams {
|
||||
|
||||
private final RootFilter filter;
|
||||
|
||||
private final DescriptionLOD descrLOD;
|
||||
private final DescriptionLoD descrLOD;
|
||||
|
||||
public Interval getTimeRange() {
|
||||
return timeRange;
|
||||
@@ -49,11 +49,11 @@ public class ZoomParams {
|
||||
return filter;
|
||||
}
|
||||
|
||||
public DescriptionLOD getDescriptionLOD() {
|
||||
public DescriptionLoD getDescriptionLOD() {
|
||||
return descrLOD;
|
||||
}
|
||||
|
||||
public ZoomParams(Interval timeRange, EventTypeZoomLevel zoomLevel, RootFilter filter, DescriptionLOD descrLOD) {
|
||||
public ZoomParams(Interval timeRange, EventTypeZoomLevel zoomLevel, RootFilter filter, DescriptionLoD descrLOD) {
|
||||
this.timeRange = timeRange;
|
||||
this.typeZoomLevel = zoomLevel;
|
||||
this.filter = filter;
|
||||
@@ -72,7 +72,7 @@ public class ZoomParams {
|
||||
return new ZoomParams(timeRange, typeZoomLevel, filter, descrLOD);
|
||||
}
|
||||
|
||||
public ZoomParams withDescrLOD(DescriptionLOD descrLOD) {
|
||||
public ZoomParams withDescrLOD(DescriptionLoD descrLOD) {
|
||||
return new ZoomParams(timeRange, typeZoomLevel, filter, descrLOD);
|
||||
}
|
||||
|
||||
@@ -92,7 +92,7 @@ public class ZoomParams {
|
||||
return this.timeRange == null ? false : this.timeRange.equals(timeRange);
|
||||
}
|
||||
|
||||
public boolean hasDescrLOD(DescriptionLOD newLOD) {
|
||||
public boolean hasDescrLOD(DescriptionLoD newLOD) {
|
||||
return this.descrLOD.equals(newLOD);
|
||||
}
|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@ public class ZoomSettingsPane extends TitledPane implements TimeLineView {
|
||||
typeZoomSlider.setMin(1);
|
||||
typeZoomSlider.setMax(2);
|
||||
typeZoomSlider.setLabelFormatter(new TypeZoomConverter());
|
||||
descrLODSlider.setMax(DescriptionLOD.values().length - 1);
|
||||
descrLODSlider.setMax(DescriptionLoD.values().length - 1);
|
||||
descrLODSlider.setLabelFormatter(new DescrLODConverter());
|
||||
descrLODLabel.setText(
|
||||
NbBundle.getMessage(this.getClass(), "ZoomSettingsPane.descrLODLabel.text"));
|
||||
@@ -154,7 +154,7 @@ public class ZoomSettingsPane extends TitledPane implements TimeLineView {
|
||||
|
||||
initializeSlider(descrLODSlider,
|
||||
() -> {
|
||||
DescriptionLOD newLOD = DescriptionLOD.values()[Math.round(descrLODSlider.valueProperty().floatValue())];
|
||||
DescriptionLoD newLOD = DescriptionLoD.values()[Math.round(descrLODSlider.valueProperty().floatValue())];
|
||||
if (controller.pushDescrLOD(newLOD) == false) {
|
||||
descrLODSlider.setValue(new DescrLODConverter().fromString(filteredEvents.getDescriptionLOD().toString()));
|
||||
}
|
||||
@@ -244,12 +244,12 @@ public class ZoomSettingsPane extends TitledPane implements TimeLineView {
|
||||
|
||||
@Override
|
||||
public String toString(Double object) {
|
||||
return DescriptionLOD.values()[object.intValue()].getDisplayName();
|
||||
return DescriptionLoD.values()[object.intValue()].getDisplayName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double fromString(String string) {
|
||||
return new Integer(DescriptionLOD.valueOf(string).ordinal()).doubleValue();
|
||||
return new Integer(DescriptionLoD.valueOf(string).ordinal()).doubleValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,13 +29,18 @@
|
||||
<package>com.apple.eawt</package>
|
||||
<package>com.apple.eawt.event</package>
|
||||
<package>com.apple.eio</package>
|
||||
<package>com.google.common.annotations</package>
|
||||
<package>com.google.common.base</package>
|
||||
<package>com.google.common.cache</package>
|
||||
<package>com.google.common.collect</package>
|
||||
<package>com.google.common.escape</package>
|
||||
<package>com.google.common.eventbus</package>
|
||||
<package>com.google.common.hash</package>
|
||||
<package>com.google.common.html</package>
|
||||
<package>com.google.common.io</package>
|
||||
<package>com.google.common.math</package>
|
||||
<package>com.google.common.net</package>
|
||||
<package>com.google.common.primitives</package>
|
||||
<package>com.google.common.reflect</package>
|
||||
<package>com.google.common.util.concurrent</package>
|
||||
<package>com.google.common.xml</package>
|
||||
|
||||
Reference in New Issue
Block a user