mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-14 17:06:16 +00:00
fix bugs updating tags/categpries in slideshowview and metadata pane
make new abstract base calss DrawableUIBase and move fileid and file object access to it.
This commit is contained in:
parent
13ad8aaaeb
commit
f1000486b7
@ -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<Void, Void>() {
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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<DrawableFile<?>> fileOpt = Optional.empty();
|
||||
|
||||
volatile private Optional<Long> fileIDOpt = Optional.empty();
|
||||
|
||||
@Override
|
||||
public Optional<Long> getFileID() {
|
||||
return fileIDOpt;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<DrawableFile<?>> 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<MenuItem> 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<TagName> 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;
|
||||
}
|
||||
}
|
@ -0,0 +1,97 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> 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<DrawableFile<?>> fileOpt = Optional.empty();
|
||||
|
||||
volatile private Optional<Long> fileIDOpt = Optional.empty();
|
||||
|
||||
public DrawableUIBase(ImageGalleryController controller) {
|
||||
this.controller = controller;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImageGalleryController getController() {
|
||||
return controller;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<Long> getFileID() {
|
||||
return fileIDOpt;
|
||||
}
|
||||
|
||||
void setFileIDOpt(Optional<Long> fileIDOpt) {
|
||||
this.fileIDOpt = fileIDOpt;
|
||||
}
|
||||
|
||||
void setFileOpt(Optional<DrawableFile<?>> fileOpt) {
|
||||
this.fileOpt = fileOpt;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<DrawableFile<?>> 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -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 {
|
||||
|
@ -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<DrawableFile<?>> fileOpt = Optional.empty();
|
||||
|
||||
volatile private Optional<Long> fileIDOpt = Optional.empty();
|
||||
|
||||
@Override
|
||||
public Optional<Long> getFileID() {
|
||||
return fileIDOpt;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<DrawableFile<?>> 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());
|
||||
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user