diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/DeleteFollowUpTagAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/DeleteFollowUpTagAction.java index 74082fcd1c..934a3fb258 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/DeleteFollowUpTagAction.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/DeleteFollowUpTagAction.java @@ -37,11 +37,9 @@ import org.sleuthkit.datamodel.TskCoreException; public class DeleteFollowUpTagAction extends Action { private static final Logger LOGGER = Logger.getLogger(DeleteFollowUpTagAction.class.getName()); - private final long fileID; public DeleteFollowUpTagAction(final ImageGalleryController controller, final DrawableFile file) { super("Delete Follow Up Tag"); - this.fileID = file.getId(); setEventHandler((ActionEvent t) -> { new SwingWorker() { diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/CategoryManager.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/CategoryManager.java index 466278f588..4d2591aa1e 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/CategoryManager.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/CategoryManager.java @@ -251,7 +251,7 @@ public class CategoryManager { incrementCategoryCount(newCat); } - fireChange(Collections.singleton(addedTag.getId()), newCat); + fireChange(Collections.singleton(addedTag.getContent().getId()), newCat); } } @Subscribe @@ -263,7 +263,7 @@ public class CategoryManager { if (deletedCat != Category.ZERO) { decrementCategoryCount(deletedCat); } - fireChange(Collections.singleton(deleted.getId()), null); + fireChange(Collections.singleton(deleted.getContent().getId()), null); } } } diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/DrawableTile.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/DrawableTile.java index 96f05dd9c1..86a0b2ddee 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/DrawableTile.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/DrawableTile.java @@ -32,7 +32,7 @@ import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.ThreadConfined; import org.sleuthkit.autopsy.coreutils.ThreadConfined.ThreadType; import org.sleuthkit.autopsy.imagegallery.FXMLConstructor; -import static org.sleuthkit.autopsy.imagegallery.gui.DrawableViewBase.globalSelectionModel; +import static org.sleuthkit.autopsy.imagegallery.gui.DrawableTileBase.globalSelectionModel; import org.sleuthkit.datamodel.AbstractContent; /** @@ -43,7 +43,7 @@ import org.sleuthkit.datamodel.AbstractContent; * * TODO: refactor this to extend from {@link Control}? -jm */ -public class DrawableTile extends DrawableViewBase { +public class DrawableTile extends DrawableTileBase { private static final DropShadow LAST_SELECTED_EFFECT = new DropShadow(10, Color.BLUE); @@ -67,7 +67,6 @@ public class DrawableTile extends DrawableViewBase { assert imageBorder != null : "fx:id=\"imageAnchor\" was not injected: check your FXML file 'DrawableTile.fxml'."; assert imageView != null : "fx:id=\"imageView\" was not injected: check your FXML file 'DrawableTile.fxml'."; assert nameLabel != null : "fx:id=\"nameLabel\" was not injected: check your FXML file 'DrawableTile.fxml'."; - //set up properties and binding setCache(true); setCacheHint(CacheHint.SPEED); @@ -87,9 +86,11 @@ public class DrawableTile extends DrawableViewBase { public DrawableTile(GroupPane gp) { super(gp); + FXMLConstructor.construct(this, "DrawableTile.fxml"); } + @Override @ThreadConfined(type = ThreadType.JFX) protected void clearContent() { diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/DrawableViewBase.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/DrawableTileBase.java similarity index 79% rename from ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/DrawableViewBase.java rename to ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/DrawableTileBase.java index a1ee32a108..80c73b1ae9 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/DrawableViewBase.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/DrawableTileBase.java @@ -22,8 +22,6 @@ package org.sleuthkit.autopsy.imagegallery.gui; import com.google.common.eventbus.Subscribe; import java.util.ArrayList; import java.util.Collection; -import java.util.Objects; -import static java.util.Objects.nonNull; import java.util.Optional; import java.util.logging.Level; import javafx.application.Platform; @@ -39,7 +37,6 @@ import javafx.scene.control.Tooltip; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.input.MouseEvent; -import javafx.scene.layout.AnchorPane; import javafx.scene.layout.Border; import javafx.scene.layout.BorderPane; import javafx.scene.layout.BorderStroke; @@ -66,13 +63,11 @@ import org.sleuthkit.autopsy.directorytree.NewWindowViewAction; import org.sleuthkit.autopsy.events.ContentTagAddedEvent; import org.sleuthkit.autopsy.events.ContentTagDeletedEvent; import org.sleuthkit.autopsy.imagegallery.FileIDSelectionModel; -import org.sleuthkit.autopsy.imagegallery.ImageGalleryController; import org.sleuthkit.autopsy.imagegallery.ImageGalleryTopComponent; import org.sleuthkit.autopsy.imagegallery.actions.AddDrawableTagAction; import org.sleuthkit.autopsy.imagegallery.actions.CategorizeAction; import org.sleuthkit.autopsy.imagegallery.actions.DeleteFollowUpTagAction; import org.sleuthkit.autopsy.imagegallery.actions.SwingMenuItemAdapter; -import org.sleuthkit.autopsy.imagegallery.datamodel.CategoryChangeEvent; import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableAttribute; import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableFile; import org.sleuthkit.datamodel.TagName; @@ -84,9 +79,9 @@ import org.sleuthkit.datamodel.TskCoreException; * of {@link DrawableView}s should implement the interface directly * */ -public abstract class DrawableViewBase extends AnchorPane implements DrawableView { +public abstract class DrawableTileBase extends DrawableUIBase { - private static final Logger LOGGER = Logger.getLogger(DrawableViewBase.class.getName()); + private static final Logger LOGGER = Logger.getLogger(DrawableTileBase.class.getName()); private static final Border UNSELECTED_BORDER = new Border(new BorderStroke(Color.GRAY, BorderStrokeStyle.SOLID, new CornerRadii(2), new BorderWidths(3))); @@ -99,6 +94,7 @@ public abstract class DrawableViewBase extends AnchorPane implements DrawableVie protected static final Image followUpGray = new Image("org/sleuthkit/autopsy/imagegallery/images/flag_gray.png"); protected static final FileIDSelectionModel globalSelectionModel = FileIDSelectionModel.getInstance(); + private static ContextMenu contextMenu; /** * displays the icon representing video files @@ -130,50 +126,16 @@ public abstract class DrawableViewBase extends AnchorPane implements DrawableVie @FXML protected BorderPane imageBorder; - static private ContextMenu contextMenu; - - volatile private Optional> fileOpt = Optional.empty(); - - volatile private Optional fileIDOpt = Optional.empty(); - - @Override - public Optional getFileID() { - return fileIDOpt; - } - - @Override - public Optional> getFile() { - if (fileIDOpt.isPresent()) { - if (fileOpt.isPresent() && fileOpt.get().getId() == fileIDOpt.get()) { - return fileOpt; - } else { - try { - fileOpt = Optional.of(ImageGalleryController.getDefault().getFileFromId(fileIDOpt.get())); - } catch (TskCoreException ex) { - Logger.getAnonymousLogger().log(Level.WARNING, "failed to get DrawableFile for obj_id" + fileIDOpt.get(), ex); - fileOpt = Optional.empty(); - } - return fileOpt; - } - } else { - return Optional.empty(); - } - } - /** - * the groupPane this {@link DrawableViewBase} is embedded in + * the groupPane this {@link DrawableTileBase} is embedded in */ final private GroupPane groupPane; - private boolean registered = false; - private final ImageGalleryController controller; + volatile private boolean registered = false; - GroupPane getGroupPane() { - return groupPane; - } + protected DrawableTileBase(GroupPane groupPane) { + super(groupPane.getController()); - protected DrawableViewBase(GroupPane groupPane) { this.groupPane = groupPane; - this.controller = groupPane.getController(); globalSelectionModel.getSelected().addListener((Observable observable) -> { updateSelectionState(); }); @@ -213,7 +175,7 @@ public abstract class DrawableViewBase extends AnchorPane implements DrawableVie groupContextMenu.hide(); } contextMenu = buildContextMenu(file); - contextMenu.show(DrawableViewBase.this, t.getScreenX(), t.getScreenY()); + contextMenu.show(DrawableTileBase.this, t.getScreenX(), t.getScreenY()); break; } }); @@ -224,9 +186,9 @@ public abstract class DrawableViewBase extends AnchorPane implements DrawableVie private ContextMenu buildContextMenu(DrawableFile file) { final ArrayList menuItems = new ArrayList<>(); - menuItems.add(new CategorizeAction(controller).getPopupMenu()); + menuItems.add(new CategorizeAction(getController()).getPopupMenu()); - menuItems.add(new AddDrawableTagAction(controller).getPopupMenu()); + menuItems.add(new AddDrawableTagAction(getController()).getPopupMenu()); final MenuItem extractMenuItem = new MenuItem("Extract File(s)"); extractMenuItem.setOnAction((ActionEvent t) -> { @@ -274,6 +236,10 @@ public abstract class DrawableViewBase extends AnchorPane implements DrawableVie }); } + GroupPane getGroupPane() { + return groupPane; + } + @ThreadConfined(type = ThreadType.UI) protected abstract void clearContent(); @@ -283,31 +249,29 @@ public abstract class DrawableViewBase extends AnchorPane implements DrawableVie protected abstract String getTextForLabel(); - @SuppressWarnings("deprecation") protected void initialize() { followUpToggle.setOnAction((ActionEvent event) -> { getFile().ifPresent(file -> { if (followUpToggle.isSelected() == true) { try { - final TagName followUpTagName = controller.getTagsManager().getFollowUpTagName(); globalSelectionModel.clearAndSelect(file.getId()); - new AddDrawableTagAction(controller).addTag(followUpTagName, ""); + new AddDrawableTagAction(getController()).addTag(getController().getTagsManager().getFollowUpTagName(), ""); } catch (TskCoreException ex) { LOGGER.log(Level.SEVERE, "Failed to add Follow Up tag. Could not load TagName.", ex); } } else { - new DeleteFollowUpTagAction(controller, file).handle(event); + new DeleteFollowUpTagAction(getController(), file).handle(event); } }); }); } protected boolean hasFollowUp() { - if (getFile().isPresent()) { + if (getFileID().isPresent()) { try { TagName followUpTagName = getController().getTagsManager().getFollowUpTagName(); - Collection tagNames = DrawableAttribute.TAGS.getValue(getFile().get()); - return tagNames.stream().anyMatch((tn) -> tn.equals(followUpTagName)); + return DrawableAttribute.TAGS.getValue(getFile().get()).stream() + .anyMatch(followUpTagName::equals); } catch (TskCoreException ex) { LOGGER.log(Level.WARNING, "failed to get follow up tag name ", ex); return true; @@ -318,29 +282,17 @@ public abstract class DrawableViewBase extends AnchorPane implements DrawableVie } @Override - public void setFile(final Long newFileID) { - if (fileIDOpt.isPresent()) { - if (Objects.equals(newFileID, fileIDOpt.get()) == false) { - setFileHelper(newFileID); - } - } else { - if (nonNull(newFileID)) { - setFileHelper(newFileID); - } - } - } - - private void setFileHelper(final Long newFileID) { - fileIDOpt = Optional.ofNullable(newFileID); + protected void setFileHelper(final Long newFileID) { + setFileIDOpt(Optional.ofNullable(newFileID)); disposeContent(); - if (fileIDOpt.isPresent() == false || Case.isCaseOpen() == false) { + if (getFileID().isPresent() == false || Case.isCaseOpen() == false) { if (registered == true) { getController().getCategoryManager().unregisterListener(this); getController().getTagsManager().unregisterListener(this); registered = false; } - fileOpt = Optional.empty(); + setFileOpt(Optional.empty()); Platform.runLater(() -> { clearContent(); }); @@ -350,10 +302,10 @@ public abstract class DrawableViewBase extends AnchorPane implements DrawableVie getController().getTagsManager().registerListener(this); registered = true; } - fileOpt = Optional.empty(); + setFileOpt(Optional.empty()); updateSelectionState(); - updateCategoryBorder(); + updateCategory(); updateFollowUpIcon(); updateUI(); Platform.runLater(getContentUpdateRunnable()); @@ -397,10 +349,10 @@ public abstract class DrawableViewBase extends AnchorPane implements DrawableVie @Subscribe @Override public void handleTagAdded(ContentTagAddedEvent evt) { - fileIDOpt.ifPresent(fileID -> { + getFileID().ifPresent(fileID -> { try { if (fileID == evt.getAddedTag().getContent().getId() - && evt.getAddedTag().getName() == getController().getTagsManager().getFollowUpTagName()) { + && evt.getAddedTag().getName().equals(getController().getTagsManager().getFollowUpTagName())) { Platform.runLater(() -> { followUpImageView.setImage(followUpIcon); @@ -417,10 +369,10 @@ public abstract class DrawableViewBase extends AnchorPane implements DrawableVie @Override public void handleTagDeleted(ContentTagDeletedEvent evt) { - fileIDOpt.ifPresent(fileID -> { + getFileID().ifPresent(fileID -> { try { if (fileID == evt.getDeletedTag().getContent().getId() - && evt.getDeletedTag().getName() == controller.getTagsManager().getFollowUpTagName()) { + && evt.getDeletedTag().getName().equals(getController().getTagsManager().getFollowUpTagName())) { updateFollowUpIcon(); } } catch (TskCoreException ex) { @@ -436,19 +388,4 @@ public abstract class DrawableViewBase extends AnchorPane implements DrawableVie followUpToggle.setSelected(hasFollowUp); }); } - - @Subscribe - @Override - public void handleCategoryChanged(CategoryChangeEvent evt) { - fileIDOpt.ifPresent(fileID -> { - if (evt.getFileIDs().contains(fileID)) { - updateCategoryBorder(); - } - }); - } - - @Override - public ImageGalleryController getController() { - return controller; - } } diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/DrawableUIBase.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/DrawableUIBase.java new file mode 100644 index 0000000000..ec794eabae --- /dev/null +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/DrawableUIBase.java @@ -0,0 +1,97 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2015 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.imagegallery.gui; + +import java.util.Objects; +import static java.util.Objects.nonNull; +import java.util.Optional; +import java.util.logging.Level; +import javafx.scene.layout.AnchorPane; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.imagegallery.ImageGalleryController; +import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableFile; +import org.sleuthkit.datamodel.TskCoreException; + +/** + * + */ +abstract public class DrawableUIBase extends AnchorPane implements DrawableView { + + private final ImageGalleryController controller; + + volatile private Optional> fileOpt = Optional.empty(); + + volatile private Optional fileIDOpt = Optional.empty(); + + public DrawableUIBase(ImageGalleryController controller) { + this.controller = controller; + } + + @Override + public ImageGalleryController getController() { + return controller; + } + + @Override + public Optional getFileID() { + return fileIDOpt; + } + + void setFileIDOpt(Optional fileIDOpt) { + this.fileIDOpt = fileIDOpt; + } + + void setFileOpt(Optional> fileOpt) { + this.fileOpt = fileOpt; + } + + @Override + public Optional> getFile() { + if (fileIDOpt.isPresent()) { + if (fileOpt.isPresent() && fileOpt.get().getId() == fileIDOpt.get()) { + return fileOpt; + } else { + try { + fileOpt = Optional.of(getController().getFileFromId(fileIDOpt.get())); + } catch (TskCoreException ex) { + Logger.getAnonymousLogger().log(Level.WARNING, "failed to get DrawableFile for obj_id" + fileIDOpt.get(), ex); + fileOpt = Optional.empty(); + } + return fileOpt; + } + } else { + return Optional.empty(); + } + } + + protected abstract void setFileHelper(Long newFileID); + + @Override + public void setFile(Long newFileID) { + if (getFileID().isPresent()) { + if (Objects.equals(newFileID, getFileID().get()) == false) { + setFileHelper(newFileID); + } + } else if (nonNull(newFileID)) { + setFileHelper(newFileID); + } + } + + +} diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/DrawableView.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/DrawableView.java index e4e6faf1de..709679173e 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/DrawableView.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/DrawableView.java @@ -68,7 +68,13 @@ public interface DrawableView { * @param evt the CategoryChangeEvent to handle */ @Subscribe - void handleCategoryChanged(CategoryChangeEvent evt); + default void handleCategoryChanged(CategoryChangeEvent evt) { + getFileID().ifPresent(fileID -> { + if (evt.getFileIDs().contains(fileID)) { + updateCategory(); + } + }); + } @Subscribe void handleTagAdded(ContentTagAddedEvent evt); @@ -116,16 +122,12 @@ public interface DrawableView { } @ThreadConfined(type = ThreadConfined.ThreadType.ANY) - default Category updateCategoryBorder() { - if (getFile() != null) { + default Category updateCategory() { + if (getFile().isPresent()) { final Category category = getFile().map(DrawableFile::getCategory).orElse(Category.ZERO); - final Border border = hasHashHit() && (category == Category.ZERO) - ? HASH_BORDER - : getCategoryBorder(category); - + final Border border = hasHashHit() && (category == Category.ZERO) ? HASH_BORDER : getCategoryBorder(category); Platform.runLater(() -> { getCategoryBorderRegion().setBorder(border); - getCategoryBorderRegion().requestLayout(); }); return category; } else { diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/MetaDataPane.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/MetaDataPane.java index 87bd64491f..d89db4116c 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/MetaDataPane.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/MetaDataPane.java @@ -23,9 +23,7 @@ import java.io.IOException; import java.util.Arrays; import java.util.Collection; import java.util.Objects; -import static java.util.Objects.nonNull; import java.util.Optional; -import java.util.logging.Level; import java.util.stream.Collectors; import javafx.application.Platform; import javafx.beans.property.SimpleObjectProperty; @@ -39,7 +37,6 @@ import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.image.Image; import javafx.scene.image.ImageView; -import javafx.scene.layout.AnchorPane; import javafx.scene.layout.BorderPane; import javafx.scene.layout.Region; import static javafx.scene.layout.Region.USE_COMPUTED_SIZE; @@ -53,24 +50,15 @@ import org.sleuthkit.autopsy.imagegallery.ImageGalleryController; import org.sleuthkit.autopsy.imagegallery.datamodel.Category; import org.sleuthkit.autopsy.imagegallery.datamodel.CategoryChangeEvent; import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableAttribute; -import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableFile; import org.sleuthkit.datamodel.TagName; -import org.sleuthkit.datamodel.TskCoreException; /** * Shows details of the selected file. */ -public class MetaDataPane extends AnchorPane implements DrawableView { +public class MetaDataPane extends DrawableUIBase { private static final Logger LOGGER = Logger.getLogger(MetaDataPane.class.getName()); - private final ImageGalleryController controller; - - @Override - public ImageGalleryController getController() { - return controller; - } - @FXML private ImageView imageView; @@ -141,56 +129,14 @@ public class MetaDataPane extends AnchorPane implements DrawableView { tableView.getColumns().setAll(Arrays.asList(attributeColumn, valueColumn)); //listen for selection change - controller.getSelectionModel().lastSelectedProperty().addListener((observable, oldFileID, newFileID) -> { + getController().getSelectionModel().lastSelectedProperty().addListener((observable, oldFileID, newFileID) -> { setFile(newFileID); }); } - volatile private Optional> fileOpt = Optional.empty(); - - volatile private Optional fileIDOpt = Optional.empty(); - @Override - public Optional getFileID() { - return fileIDOpt; - } - - @Override - public Optional> getFile() { - if (fileIDOpt.isPresent()) { - if (fileOpt.isPresent() && fileOpt.get().getId() == fileIDOpt.get()) { - return fileOpt; - } else { - try { - fileOpt = Optional.of(ImageGalleryController.getDefault().getFileFromId(fileIDOpt.get())); - } catch (TskCoreException ex) { - Logger.getAnonymousLogger().log(Level.WARNING, "failed to get DrawableFile for obj_id" + fileIDOpt.get(), ex); - fileOpt = Optional.empty(); - } - return fileOpt; - } - } else { - return Optional.empty(); - } - } - - @Override - public void setFile(Long newFileID) { - - if (fileIDOpt.isPresent()) { - if (Objects.equals(newFileID, fileIDOpt.get()) == false) { - setFileHelper(newFileID); - } - } else { - if (nonNull(newFileID)) { - setFileHelper(newFileID); - } - } - setFileHelper(newFileID); - } - - private void setFileHelper(Long newFileID) { - fileIDOpt = Optional.of(newFileID); + synchronized protected void setFileHelper(Long newFileID) { + setFileIDOpt(Optional.ofNullable(newFileID)); if (newFileID == null) { Platform.runLater(() -> { imageView.setImage(null); @@ -204,7 +150,7 @@ public class MetaDataPane extends AnchorPane implements DrawableView { } public MetaDataPane(ImageGalleryController controller) { - this.controller = controller; + super(controller); FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("MetaDataPane.fxml")); fxmlLoader.setRoot(this); @@ -224,12 +170,12 @@ public class MetaDataPane extends AnchorPane implements DrawableView { Platform.runLater(() -> { imageView.setImage(icon); + tableView.getItems().clear(); tableView.getItems().setAll(attributesList); }); - updateCategoryBorder(); + updateCategory(); }); - } @Override @@ -248,11 +194,13 @@ public class MetaDataPane extends AnchorPane implements DrawableView { }); } + @Subscribe @Override public void handleTagAdded(ContentTagAddedEvent evt) { handleTagChanged(evt.getAddedTag().getContent().getId()); } + @Subscribe @Override public void handleTagDeleted(ContentTagDeletedEvent evt) { handleTagChanged(evt.getDeletedTag().getContent().getId()); diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SlideShowView.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SlideShowView.java index ab74554b39..99944d6d19 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SlideShowView.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/SlideShowView.java @@ -58,8 +58,6 @@ import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableFile; import org.sleuthkit.autopsy.imagegallery.datamodel.ImageFile; import org.sleuthkit.autopsy.imagegallery.datamodel.VideoFile; import static org.sleuthkit.autopsy.imagegallery.gui.DrawableView.CAT_BORDER_WIDTH; -import static org.sleuthkit.autopsy.imagegallery.gui.DrawableView.HASH_BORDER; -import static org.sleuthkit.autopsy.imagegallery.gui.DrawableView.getCategoryBorder; import org.sleuthkit.datamodel.TagName; import org.sleuthkit.datamodel.TskCoreException; @@ -68,7 +66,7 @@ import org.sleuthkit.datamodel.TskCoreException; * GroupPane. TODO: Extract a subclass for video files in slideshow mode-jm * TODO: reduce coupling to GroupPane */ -public class SlideShowView extends DrawableViewBase { +public class SlideShowView extends DrawableTileBase { private static final Logger LOGGER = Logger.getLogger(SlideShowView.class.getName()); @@ -223,6 +221,7 @@ public class SlideShowView extends DrawableViewBase { SlideShowView(GroupPane gp) { super(gp); + FXMLConstructor.construct(this, "SlideShow.fxml"); } @@ -237,6 +236,7 @@ public class SlideShowView extends DrawableViewBase { @Override synchronized public void setFile(final Long fileID) { super.setFile(fileID); + getFileID().ifPresent((Long id) -> { getGroupPane().makeSelection(false, id); }); @@ -288,7 +288,7 @@ public class SlideShowView extends DrawableViewBase { @ThreadConfined(type = ThreadType.JFX) private void cycleSlideShowImage(int d) { stopVideo(); - if (getFileID() != null) { + if (getFileID().isPresent()) { int index = getGroupPane().getGrouping().fileIds().indexOf(getFileID()); final int size = getGroupPane().getGrouping().fileIds().size(); index = (index + d) % size; @@ -312,20 +312,17 @@ public class SlideShowView extends DrawableViewBase { @Override @ThreadConfined(type = ThreadType.ANY) - public Category updateCategoryBorder() { - return getFile().map(file -> { - final Category category = file.getCategory(); - final Border border1 = hasHashHit() && (category == Category.ZERO) - ? HASH_BORDER - : getCategoryBorder(category); + public Category updateCategory() { + if (getFile().isPresent()) { + final Category category = super.updateCategory(); ToggleButton toggleForCategory = getToggleForCategory(category); Platform.runLater(() -> { - getCategoryBorderRegion().setBorder(border1); toggleForCategory.setSelected(true); }); return category; - }).orElse(Category.ZERO); - + } else { + return Category.ZERO; + } } private ToggleButton getToggleForCategory(Category category) {