diff --git a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java index d895da9355..5c9f9526d3 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java @@ -485,15 +485,12 @@ public class TimeLineController { showFullRange(); } else { - setViewMode(ViewMode.LIST); - List eventIDs = filteredEvents.getDerivedEventIDs(fileIDs, artifactIDS); - - Interval interval = filteredEvents.getSpanningInterval(eventIDs); - synchronized (filteredEvents) { + List eventIDs = filteredEvents.getDerivedEventIDs(fileIDs, artifactIDS); + Interval interval = filteredEvents.getSpanningInterval(eventIDs); pushTimeRange(interval); + selectEventIDs(eventIDs, () -> setViewMode(ViewMode.LIST)); } - Platform.runLater(() -> selectEventIDs(eventIDs)); } } @@ -641,6 +638,12 @@ public class TimeLineController { } public void selectEventIDs(Collection events) { + selectEventIDs(events, () -> { + } + ); + } + + public void selectEventIDs(Collection events, Runnable andThen) { final LoggedTask selectEventIDsTask = new LoggedTask("Select Event IDs", true) { //NON-NLS @Override protected Interval call() throws Exception { @@ -654,7 +657,7 @@ public class TimeLineController { synchronized (TimeLineController.this) { selectedTimeRange.set(get()); selectedEventIDs.setAll(events); - + andThen.run(); } } catch (InterruptedException | ExecutionException ex) { LOGGER.log(Level.SEVERE, getTitle() + " Unexpected error", ex); //NON-NLS diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/ListTimeline.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/ListTimeline.java index ae228ff5aa..b2f047f1a9 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/ListTimeline.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/ListTimeline.java @@ -182,24 +182,29 @@ class ListTimeline extends BorderPane { } }); - table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); //keep controller's list of selected event IDs in sync with this list's table.getSelectionModel().getSelectedItems().addListener((Observable change) -> { -// keep the selectedEventsIDs in sync with the table's selection model, via getRepresentitiveEventID(). + //keep the selectedEventsIDs in sync with the table's selection model, via getRepresentitiveEventID(). controller.selectEventIDs(table.getSelectionModel().getSelectedItems().stream() .filter(Objects::nonNull) .map(CombinedEvent::getRepresentativeEventID) .collect(Collectors.toSet())); - }); + + Platform.runLater(new Runnable() { + + @Override + public void run() { + Set collect = table.getItems().stream() + .filter(combinedEvent -> combinedEvent.getEventIDs().stream().anyMatch(controller.getSelectedEventIDs()::contains)) + .collect(Collectors.toSet()); - controller.getSelectedEventIDs().addListener((Observable change) -> { - Set selectedCombinedEvents = table.getItems().stream() - .filter(combinedEvent -> combinedEvent.getEventIDs().stream().anyMatch(controller.getSelectedEventIDs()::contains)) - .collect(Collectors.toSet()); - selectEvents(selectedCombinedEvents); + selectEvents(collect); + } }); + + } /** diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/ListViewPane.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/ListViewPane.java index 9a85968760..28cc798f3b 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/ListViewPane.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/listvew/ListViewPane.java @@ -94,7 +94,7 @@ public class ListViewPane extends AbstractTimeLineView { Platform.runLater(() -> { //put the combined events into the table. listTimeline.setCombinedEvents(combinedEvents); - //restore the selected event + //restore the selected events listTimeline.selectEvents(selectedEvents); });