view in timeline selection appears to be working

This commit is contained in:
jmillman
2016-06-09 16:06:21 -04:00
parent 41658e76ad
commit 64048b014f
4 changed files with 27 additions and 55 deletions
@@ -438,8 +438,8 @@ public class TimeLineController {
setEventsDBStale(false);
filteredEvents.postDBUpdated();
}
if (file == null && artifact==null) {
if (file == null && artifact == null) {
SwingUtilities.invokeLater(this::showWindow);
TimeLineController.this.showFullRange();
} else {
@@ -481,7 +481,7 @@ public class TimeLineController {
* timeline when done.
*/
@ThreadConfined(type = ThreadConfined.ThreadType.JFX)
void rebuildTagsTable(AbstractFile file,BlackboardArtifact artifact) {
void rebuildTagsTable(AbstractFile file, BlackboardArtifact artifact) {
rebuildRepoHelper(eventsRepository::rebuildTags, false, file, artifact);
}
@@ -503,7 +503,8 @@ public class TimeLineController {
pushTimeRange(interval);
}
if (eventIDs != null) {
selectEventIDs(eventIDs, () -> setViewMode(ViewMode.LIST));
setViewMode(ViewMode.LIST);
selectEventIDs(eventIDs);
}
}
}
@@ -651,34 +652,8 @@ public class TimeLineController {
}
public void selectEventIDs(Collection<Long> events) {
selectEventIDs(events, () -> {
}
);
}
public void selectEventIDs(Collection<Long> events, Runnable andThen) {
final LoggedTask<Interval> selectEventIDsTask = new LoggedTask<Interval>("Select Event IDs", true) { //NON-NLS
@Override
protected Interval call() throws Exception {
return filteredEvents.getSpanningInterval(events);
}
@Override
protected void succeeded() {
super.succeeded();
try {
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
}
}
};
monitorTask(selectEventIDsTask);
selectedTimeRange.set(filteredEvents.getSpanningInterval(events));
selectedEventIDs.setAll(events);
}
/**
@@ -74,7 +74,7 @@ public abstract class AbstractTimeLineView extends BorderPane {
*/
private Task<Boolean> updateTask;
private final TimeLineController controller;
public final TimeLineController controller;
private final FilteredEventsModel filteredEvents;
/**
@@ -251,20 +251,8 @@ class ListTimeline extends BorderPane {
.map(CombinedEvent::getRepresentativeEventID)
.collect(Collectors.toSet()));
});
Platform.runLater(new Runnable() {
@Override
public void run() {
Set<CombinedEvent> collect = table.getItems().stream()
.filter(combinedEvent -> combinedEvent.getEventIDs().stream().anyMatch(controller.getSelectedEventIDs()::contains))
.collect(Collectors.toSet());
selectEvents(collect);
}
});
selectEvents(controller.getSelectedEventIDs());
}
/**
@@ -298,17 +286,25 @@ class ListTimeline extends BorderPane {
/**
* Set the combined events that are selected in this view.
*
* @param selectedEvents The events that should be selected.
* @param selectedEventIDs The events that should be selected.
*/
void selectEvents(Collection<CombinedEvent> selectedEvents) {
void selectEvents(Collection<Long> selectedEventIDs) {
table.getSelectionModel().clearSelection();
if (selectedEvents.isEmpty() == false) {
CombinedEvent firstSelected = selectedEvents.stream().filter(Objects::nonNull).min(Comparator.comparing(CombinedEvent::getStartMillis)).orElse(null);
table.scrollTo(firstSelected);
Set<Integer> selectedIndices = selectedEvents.stream()
if (selectedEventIDs.isEmpty() == false) {
List<CombinedEvent> selectedCombinedEvents = table.getItems().stream()
.filter(combinedEvent -> combinedEvent.getEventIDs().stream().anyMatch(selectedEventIDs::contains))
.sorted(Comparator.comparing(CombinedEvent::getStartMillis))
.collect(Collectors.toList());
if (selectedCombinedEvents.size() > 0) {
CombinedEvent firstSelected = selectedCombinedEvents.get(0);
table.scrollTo(firstSelected);
}
Set<Integer> selectedIndices = selectedCombinedEvents.stream()
.map(table.getItems()::indexOf)
.filter(index -> index >= 0)
.collect(Collectors.toSet());
Integer[] indices = selectedIndices.toArray(new Integer[selectedIndices.size()]);
if (indices.length >= 1) {
table.getSelectionModel().selectIndices(indices[0], ArrayUtils.toPrimitive(indices));
@@ -19,9 +19,9 @@
package org.sleuthkit.autopsy.timeline.ui.listvew;
import com.google.common.collect.ImmutableList;
import java.util.HashSet;
import java.util.List;
import javafx.application.Platform;
import javafx.collections.ObservableList;
import javafx.concurrent.Task;
import javafx.scene.Node;
import org.joda.time.Interval;
@@ -46,6 +46,7 @@ public class ListViewPane extends AbstractTimeLineView {
*/
public ListViewPane(TimeLineController controller) {
super(controller);
listTimeline = new ListTimeline(controller);
//initialize chart;
@@ -104,7 +105,7 @@ public class ListViewPane extends AbstractTimeLineView {
FilteredEventsModel eventsModel = getEventsModel();
//grab the currently selected event
HashSet<CombinedEvent> selectedEvents = new HashSet<>(listTimeline.getSelectedEvents());
ObservableList<Long> selectedEventIDs = getController().getSelectedEventIDs();
//clear the chart and set the time range.
resetView(eventsModel.getTimeRange());
@@ -118,7 +119,7 @@ public class ListViewPane extends AbstractTimeLineView {
//put the combined events into the table.
listTimeline.setCombinedEvents(combinedEvents);
//restore the selected events
listTimeline.selectEvents(selectedEvents);
listTimeline.selectEvents(selectedEventIDs);
});
return combinedEvents.isEmpty() == false;