diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractVisualizationPane.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractVisualizationPane.java index 52d64c0c1f..719269bbcd 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractVisualizationPane.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractVisualizationPane.java @@ -33,7 +33,6 @@ import javafx.concurrent.Task; import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.chart.Axis; -import javafx.scene.chart.BarChart; import javafx.scene.chart.Chart; import javafx.scene.chart.XYChart; import javafx.scene.control.Label; @@ -81,7 +80,7 @@ public abstract class AbstractVisualizationPane } protected final SimpleBooleanProperty hasEvents = new SimpleBooleanProperty(true); - protected final ObservableList> dataSets = FXCollections.>observableArrayList(); + protected final ObservableList> dataSeries = FXCollections.> observableArrayList(); protected C chart; diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/CountsViewPane.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/CountsViewPane.java index ff5a3d4798..80e46601d9 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/CountsViewPane.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/CountsViewPane.java @@ -111,7 +111,7 @@ public class CountsViewPane extends AbstractVisualizationPane series.getData().stream()) + return dataSeries.stream().flatMap((series) -> series.getData().stream()) .anyMatch((data) -> data.getXValue().equals(value) && data.getYValue().intValue() > 0); } @@ -144,7 +144,7 @@ public class CountsViewPane extends AbstractVisualizationPane { updateMessage(NbBundle.getMessage(this.getClass(), "CountsViewPane.loggedTask.resetUI")); eventTypeMap.clear(); - dataSets.clear(); + dataSeries.clear(); dateAxis.getCategories().clear(); DateTime start = timeRange.getStart(); @@ -264,7 +264,7 @@ public class CountsViewPane extends AbstractVisualizationPane(); series.setName(et.getDisplayName()); eventTypeMap.put(et, series); - - dataSets.add(series); + dataSeries.add(series); } return series; @@ -395,7 +394,7 @@ public class CountsViewPane extends AbstractVisualizationPane s : dataSets) { + for (XYChart.Series s : dataSeries) { s.getData().forEach((XYChart.Data d) -> { if (startDateString.contains(d.getXValue())) { selectedNodes.add(d.getNode()); diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailViewPane.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailViewPane.java index 6a8e6355f2..cf6a11dae2 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailViewPane.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailViewPane.java @@ -111,15 +111,13 @@ public class DetailViewPane extends AbstractVisualizationPane(new DetailViewSettingsPane().getChildrenUnmodifiable()); - //bind layout fo axes and spacers dateAxis.setTickLabelGap(0); dateAxis.setAutoRanging(false); @@ -260,7 +258,10 @@ public class DetailViewPane extends AbstractVisualizationPane { XYChart.Series series = new XYChart.Series<>(); series.setName(et.getDisplayName()); - dataSets.add(series); + Platform.runLater(() -> { + dataSeries.add(series); + }); + return series; }); } @@ -299,7 +300,7 @@ public class DetailViewPane extends AbstractVisualizationPane eventClusters = filteredEvents.getEventClusters(); @@ -315,9 +316,9 @@ public class DetailViewPane extends AbstractVisualizationPane xyData = new BarChart.Data<>(new DateTime(cluster.getSpan().getStartMillis()), cluster); if (isCancelled() == false) { - Platform.runLater(() -> { - getSeries(cluster.getEventType()).getData().add(xyData); - }); +// Platform.runLater(() -> { + getSeries(cluster.getEventType()).getData().add(xyData); +// }); } } diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventDetailsChart.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventDetailsChart.java index 906b1c5511..c7522e1e6f 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventDetailsChart.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventDetailsChart.java @@ -24,11 +24,11 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.MissingResourceException; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -36,6 +36,7 @@ import java.util.stream.Stream; import javafx.animation.KeyFrame; import javafx.animation.KeyValue; import javafx.animation.Timeline; +import javafx.application.Platform; import javafx.beans.InvalidationListener; import javafx.beans.Observable; import javafx.beans.property.ReadOnlyDoubleProperty; @@ -148,17 +149,9 @@ public final class EventDetailsChart extends XYChart imp */ private final Group nodeGroup = new Group(); private final ObservableList> bundles = FXCollections.observableArrayList(); - private final Map, EventStripe> stripeDescMap = new HashMap<>(); - private final Map stripeNodeMap = new HashMap<>(); - private final Map projectionMap = new HashMap<>(); - - /** - * list of series of data added to this chart - * - * TODO: replace this with a map from name to series? -jm - */ - private final ObservableList> seriesList = - FXCollections.>observableArrayList(); + private final Map, EventStripe> stripeDescMap = new ConcurrentHashMap<>(); + private final Map stripeNodeMap = new ConcurrentHashMap<>(); + private final Map projectionMap = new ConcurrentHashMap<>(); /** * true == layout each event type in its own band, false == mix all the @@ -334,21 +327,26 @@ public final class EventDetailsChart extends XYChart imp @Override protected synchronized void dataItemAdded(Series series, int i, Data data) { final EventCluster eventCluster = data.getYValue(); - bundles.add(eventCluster); + EventStripe eventStripe = stripeDescMap.merge(ImmutablePair.of(eventCluster.getEventType(), eventCluster.getDescription()), new EventStripe(eventCluster, null), (EventStripe u, EventStripe v) -> { - EventStripeNode remove = stripeNodeMap.remove(u); - nodeGroup.getChildren().remove(remove); - remove = stripeNodeMap.remove(v); - nodeGroup.getChildren().remove(remove); + EventStripeNode removeU = stripeNodeMap.remove(u); + EventStripeNode removeV = stripeNodeMap.remove(v); + Platform.runLater(() -> { + nodeGroup.getChildren().remove(removeU); + nodeGroup.getChildren().remove(removeV); + }); return EventStripe.merge(u, v); } ); EventStripeNode stripeNode = new EventStripeNode(EventDetailsChart.this, eventStripe, null); stripeNodeMap.put(eventStripe, stripeNode); - nodeGroup.getChildren().add(stripeNode); - data.setNode(stripeNode); + Platform.runLater(() -> { + bundles.add(eventCluster); + nodeGroup.getChildren().add(stripeNode); + data.setNode(stripeNode); + }); } @Override @@ -360,11 +358,18 @@ public final class EventDetailsChart extends XYChart imp @Override protected synchronized void dataItemRemoved(Data data, Series series) { EventCluster eventCluster = data.getYValue(); - bundles.removeAll(eventCluster); + Platform.runLater(() -> { + bundles.removeAll(eventCluster); + }); + EventStripe removedStripe = stripeDescMap.remove(ImmutablePair.of(eventCluster.getEventType(), eventCluster.getDescription())); - EventStripeNode removedNode = stripeNodeMap.remove(removedStripe); - nodeGroup.getChildren().remove(removedNode); - data.setNode(null); + if (removedStripe != null) { + EventStripeNode removedNode = stripeNodeMap.remove(removedStripe); + Platform.runLater(() -> { + nodeGroup.getChildren().remove(removedNode); + data.setNode(null); + }); + } } @Override @@ -396,7 +401,6 @@ public final class EventDetailsChart extends XYChart imp for (int j = 0; j < series.getData().size(); j++) { dataItemAdded(series, j, series.getData().get(j)); } - seriesList.add(series); } @Override @@ -404,7 +408,6 @@ public final class EventDetailsChart extends XYChart imp for (int j = 0; j < series.getData().size(); j++) { dataItemRemoved(series.getData().get(j), series); } - seriesList.remove(series); } ReadOnlyDoubleProperty maxVScrollProperty() {