diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/NextUnseenGroup.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/NextUnseenGroup.java index 336b91471c..24eb31fcea 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/NextUnseenGroup.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/NextUnseenGroup.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-17 Basis Technology Corp. + * Copyright 2011-18 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,6 +19,7 @@ package org.sleuthkit.autopsy.imagegallery.actions; import java.util.Optional; +import javafx.application.Platform; import javafx.beans.Observable; import javafx.beans.value.ObservableValue; import javafx.collections.ObservableList; @@ -41,52 +42,57 @@ import org.sleuthkit.autopsy.imagegallery.datamodel.grouping.GroupViewState; public class NextUnseenGroup extends Action { private static final String IMAGE_PATH = "/org/sleuthkit/autopsy/imagegallery/images/"; //NON-NLS - private static final Image END = new Image(NextUnseenGroup.class.getResourceAsStream( + private static final Image END_IMAGE = new Image(NextUnseenGroup.class.getResourceAsStream( IMAGE_PATH + "control-stop.png")); //NON-NLS - private static final Image ADVANCE = new Image(NextUnseenGroup.class.getResourceAsStream( + private static final Image ADVANCE_IMAGE = new Image(NextUnseenGroup.class.getResourceAsStream( IMAGE_PATH + "control-double.png")); //NON-NLS private static final String MARK_GROUP_SEEN = Bundle.NextUnseenGroup_markGroupSeen(); private static final String NEXT_UNSEEN_GROUP = Bundle.NextUnseenGroup_nextUnseenGroup(); + private final ImageGalleryController controller; + private final ObservableList unSeenGroups; + public NextUnseenGroup(ImageGalleryController controller) { super(NEXT_UNSEEN_GROUP); + setGraphic(new ImageView(ADVANCE_IMAGE)); + + this.controller = controller; GroupManager groupManager = controller.getGroupManager(); + unSeenGroups = groupManager.getUnSeenGroups(); + unSeenGroups.addListener((Observable observable) -> this.updateButton()); - ObservableList unSeenGroups = groupManager.getUnSeenGroups(); - setGraphic(new ImageView(ADVANCE)); - - unSeenGroups.addListener((Observable o) -> this.updateButton(unSeenGroups)); - - setEventHandler(event -> { - //fx-thread + setEventHandler(event -> { //on fx-thread //if there is a group assigned to the view, mark it as seen Optional.ofNullable(controller.viewState()) .map(ObservableValue::getValue) .map(GroupViewState::getGroup) - .ifPresent(group -> groupManager.saveGroupSeen(group, true)); + .ifPresent(group -> { + groupManager.saveGroupSeen(group, true) + .addListener(this::advanceToNextUnseenGroup, Platform::runLater); + }); - if (unSeenGroups.isEmpty() == false) { - controller.advance(GroupViewState.tile(unSeenGroups.get(0)), true); - updateButton(unSeenGroups); - } }); - updateButton(unSeenGroups); + updateButton(); } - /** - * - * @param unSeenGroups the value of unSeenGroups - */ @ThreadConfined(type = ThreadConfined.ThreadType.JFX) - private void updateButton(ObservableList unSeenGroups) { + private void advanceToNextUnseenGroup() { + if (unSeenGroups.isEmpty() == false) { + controller.advance(GroupViewState.tile(unSeenGroups.get(0)), true); + } + updateButton(); + } + + @ThreadConfined(type = ThreadConfined.ThreadType.JFX) + private void updateButton() { setDisabled(unSeenGroups.isEmpty()); if (unSeenGroups.size() <= 1) { setText(MARK_GROUP_SEEN); - setGraphic(new ImageView(END)); + setGraphic(new ImageView(END_IMAGE)); } else { setText(NEXT_UNSEEN_GROUP); - setGraphic(new ImageView(ADVANCE)); + setGraphic(new ImageView(ADVANCE_IMAGE)); } } } diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupManager.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupManager.java index 146f613ccf..cc65732917 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupManager.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupManager.java @@ -286,20 +286,19 @@ public class GroupManager { * DB. */ public ListenableFuture saveGroupSeen(DrawableGroup group, boolean seen) { - synchronized (controller) { - DrawableDB db = getDB(); - if (nonNull(db)) { - return exec.submit(() -> { - try { - db.markGroupSeen(group.getGroupKey(), seen); - group.setSeen(seen); - - } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "Error marking group as seen", ex); //NON-NLS - } - }); - } + DrawableDB db = getDB(); + if (nonNull(db)) { + return exec.submit(() -> { + try { + db.markGroupSeen(group.getGroupKey(), seen); + group.setSeen(seen); + Platform.runLater(() -> updateUnSeenGroups(group, seen)); + } catch (TskCoreException ex) { + logger.log(Level.SEVERE, "Error marking group as seen", ex); //NON-NLS + } + }); } + return Futures.immediateFuture(null); } @@ -659,9 +658,7 @@ public class GroupManager { group = new DrawableGroup(groupKey, fileIDs, groupSeen); controller.getCategoryManager().registerListener(group); group.seenProperty().addListener((o, oldSeen, newSeen) - -> saveGroupSeen(group, newSeen) - .addListener(() -> updateUnSeenGroups(group, newSeen), - Platform::runLater)); + -> saveGroupSeen(group, newSeen)); groupMap.put(groupKey, group); } @@ -857,7 +854,6 @@ public class GroupManager { default: //otherwise do straight db query if (nonNull(db)) { - //TODO -1017: pass datasource in here as appropriate values = db.findValuesForAttribute(groupBy, sortBy, sortOrder, dataSource); } }