19package org.sleuthkit.autopsy.timeline.ui;
21import com.google.common.collect.ImmutableList;
22import com.google.common.eventbus.Subscribe;
23import java.util.concurrent.ExecutionException;
24import java.util.logging.Level;
25import javafx.application.Platform;
26import javafx.beans.InvalidationListener;
27import javafx.beans.Observable;
28import javafx.beans.property.ReadOnlyBooleanProperty;
29import javafx.beans.property.ReadOnlyBooleanWrapper;
30import javafx.concurrent.Task;
31import javafx.scene.Cursor;
32import javafx.scene.Node;
33import javafx.scene.layout.BorderPane;
34import javafx.scene.layout.StackPane;
35import org.controlsfx.control.MaskerPane;
36import org.openide.util.NbBundle;
37import org.sleuthkit.autopsy.coreutils.LoggedTask;
38import org.sleuthkit.autopsy.coreutils.Logger;
39import org.sleuthkit.autopsy.coreutils.ThreadConfined;
40import org.sleuthkit.autopsy.timeline.EventsModel;
41import org.sleuthkit.autopsy.timeline.TimeLineController;
42import org.sleuthkit.autopsy.timeline.ViewMode;
43import org.sleuthkit.autopsy.timeline.events.RefreshRequestedEvent;
57 private final ReadOnlyBooleanWrapper
hasVisibleEvents =
new ReadOnlyBooleanWrapper(
true);
64 private final ReadOnlyBooleanWrapper
needsRefresh =
new ReadOnlyBooleanWrapper(
false);
87 this.filteredEvents =
controller.getEventsModel();
148 updateTask.stateProperty().addListener((Observable observable) -> {
159 }
catch (InterruptedException | ExecutionException ex) {
160 logger.log(Level.SEVERE,
"Unexpected exception updating view", ex);
220 final synchronized void dispose() {
242 return hasVisibleEventsProperty().get();
252 ReadOnlyBooleanProperty hasVisibleEventsProperty() {
260 void setNeedsRefresh() {
267 @ThreadConfined(type = ThreadConfined.ThreadType.JFX)
289 this.center = getCenter();
302 @NbBundle.Messages(value = {
"ViewRefreshTask.preparing=Analyzing zoom and filter settings"})
304 protected Boolean
call()
throws Exception {
305 updateProgress(-1, 1);
306 updateMessage(Bundle.ViewRefreshTask_preparing());
307 Platform.runLater(() -> {
308 MaskerPane maskerPane =
new MaskerPane();
309 maskerPane.textProperty().bind(messageProperty());
310 maskerPane.progressProperty().bind(progressProperty());
311 setCenter(
new StackPane(
center, maskerPane));
312 setCursor(Cursor.WAIT);
355 setCursor(Cursor.DEFAULT);
374 Platform.runLater(() -> {
LoggedTask(String taskName, boolean logStateChanges)
final boolean logStateChanges
synchronized static Logger getLogger(String name)
synchronized void registerForEvents(Object subscriber)
synchronized void unRegisterForEvents(Object subscriber)
final ReadOnlyObjectWrapper< EventsModelParams > modelParamsProperty
synchronized void unRegisterForEvents(Object listener)
synchronized void monitorTask(final Task<?> task)
static ReadOnlyObjectProperty< TimeZone > timeZoneProperty()
ViewRefreshTask(String taskName, boolean logStateChanges)
void resetView(AxisValuesType axisValues)
abstract void setDateValues(AxisValuesType values)
TimeLineController getController()
abstract Task< Boolean > getNewUpdateTask()
final EventsModel filteredEvents
abstract ViewMode getViewMode()
ReadOnlyBooleanProperty needsRefreshProperty()
void handleRefreshRequested(RefreshRequestedEvent event)
Task< Boolean > updateTask
abstract ImmutableList< Node > getTimeNavigationControls()
EventsModel getEventsModel()
final TimeLineController controller
abstract ImmutableList< Node > getSettingsControls()
final ReadOnlyBooleanWrapper hasVisibleEvents
abstract void clearData()
final synchronized void refresh()
final ReadOnlyBooleanWrapper needsRefresh
InvalidationListener updateListener
abstract boolean hasCustomTimeNavigationControls()
static final Logger logger
AbstractTimeLineView(TimeLineController controller)