diff --git a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/ThreadConfined.java b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/ThreadConfined.java index 2e33930be9..067272e291 100644 --- a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/ThreadConfined.java +++ b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/ThreadConfined.java @@ -17,6 +17,6 @@ public @interface ThreadConfined { public enum ThreadType { - ANY, UI, NOT_UI + ANY, UI, JFX, AWT, NOT_UI } } diff --git a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/grouping/GroupManager.java b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/grouping/GroupManager.java index 2881974873..8ce9e048d6 100644 --- a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/grouping/GroupManager.java +++ b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/grouping/GroupManager.java @@ -44,6 +44,8 @@ import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.imageanalyzer.EurekaController; import org.sleuthkit.autopsy.imageanalyzer.EurekaModule; import org.sleuthkit.autopsy.imageanalyzer.LoggedTask; +import org.sleuthkit.autopsy.imageanalyzer.ThreadConfined; +import org.sleuthkit.autopsy.imageanalyzer.ThreadConfined.ThreadType; import org.sleuthkit.autopsy.imageanalyzer.datamodel.Category; import org.sleuthkit.autopsy.imageanalyzer.datamodel.DrawableAttribute; import org.sleuthkit.autopsy.imageanalyzer.datamodel.DrawableDB; @@ -74,12 +76,15 @@ public class GroupManager { private final Map groupMap = new HashMap<>(); /** list of all analyzed groups */ + @ThreadConfined(type = ThreadType.JFX) private final ObservableList analyzedGroups = FXCollections.observableArrayList(); /** list of unseen groups */ + @ThreadConfined(type = ThreadType.JFX) private final ObservableList unSeenGroups = FXCollections.observableArrayList(); /** sorted list of unseen groups */ + @ThreadConfined(type = ThreadType.JFX) private final SortedList sortedUnSeenGroups = unSeenGroups.sorted(); private ReGroupTask groupByTask; @@ -100,6 +105,7 @@ public class GroupManager { return analyzedGroups; } + @ThreadConfined(type = ThreadType.JFX) public SortedList getUnSeenGroups() { return sortedUnSeenGroups; } @@ -542,14 +548,19 @@ public class GroupManager { if (groupByTask != null) { groupByTask.cancel(true); } - sortedUnSeenGroups.setComparator(sortBy.getGrpComparator(groupBy, sortOrder)); + Platform.runLater(() -> { + sortedUnSeenGroups.setComparator(sortBy.getGrpComparator(groupBy, sortOrder)); + }); + groupByTask = new ReGroupTask(groupBy, sortBy, sortOrder); controller.submitBGTask(groupByTask); } else { // just resort the list of groups setSortBy(sortBy); setSortOrder(sortOrder); - sortedUnSeenGroups.setComparator(sortBy.getGrpComparator(groupBy, sortOrder)); + Platform.runLater(() -> { + sortedUnSeenGroups.setComparator(sortBy.getGrpComparator(groupBy, sortOrder)); + }); } } diff --git a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/navpanel/NavPanel.fxml b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/navpanel/NavPanel.fxml index 100d08afa9..27132629fa 100644 --- a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/navpanel/NavPanel.fxml +++ b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/navpanel/NavPanel.fxml @@ -6,9 +6,8 @@ - -
- + + @@ -63,6 +62,4 @@ - -
-
+ diff --git a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/navpanel/NavPanel.java b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/navpanel/NavPanel.java index dd77299bde..d59257e1ab 100644 --- a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/navpanel/NavPanel.java +++ b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/navpanel/NavPanel.java @@ -39,7 +39,6 @@ import javafx.scene.control.Tab; import javafx.scene.control.TabPane; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; -import javafx.scene.layout.BorderPane; import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; import org.apache.commons.lang3.StringUtils; @@ -62,7 +61,7 @@ import org.sleuthkit.datamodel.TskCoreException; * with images. the user can select folders with images to see them in the * main GroupPane The other shows folders with hash set hits. */ -public class NavPanel extends BorderPane { +public class NavPanel extends TabPane { @FXML private ResourceBundle resources; @@ -113,7 +112,7 @@ public class NavPanel extends BorderPane { assert navTree != null : "fx:id=\"navTree\" was not injected: check your FXML file 'NavPanel.fxml'."; assert sortByBox != null : "fx:id=\"sortByBox\" was not injected: check your FXML file 'NavPanel.fxml'."; - VBox.setVgrow(this, Priority.SOMETIMES); + VBox.setVgrow(this, Priority.ALWAYS); navTree.setShowRoot(false); hashTree.setShowRoot(false); @@ -169,6 +168,13 @@ public class NavPanel extends BorderPane { } }); + for (Grouping g : controller.getGroupManager().getAnalyzedGroups()) { + insertIntoNavTree(g); + if (g.getFilesWithHashSetHitsCount() > 0) { + insertIntoHashTree(g); + } + } + controller.viewState().addListener((ObservableValue observable, GroupViewState oldValue, GroupViewState newValue) -> { if (newValue != null && newValue.getGroup() != null) { setFocusedGroup(newValue.getGroup());