From f674556521d53e5a0841493f6a5da5bb75642c67 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Fri, 31 Jan 2020 13:20:19 -0500 Subject: [PATCH] 5979 clean up document file discovery viewer --- .../autopsy/filequery/Bundle.properties | 4 +- .../filequery/Bundle.properties-MERGED | 22 ++- .../filequery/DiscoveryTopComponent.java | 53 +++--- .../autopsy/filequery/DiscoveryUiUtils.java | 154 ++++++++++++++++++ .../autopsy/filequery/DocumentPanel.form | 18 +- .../autopsy/filequery/DocumentPanel.java | 110 ++----------- ...Viewer.form => DocumentPreviewViewer.form} | 0 ...Viewer.java => DocumentPreviewViewer.java} | 46 +++++- .../autopsy/filequery/DocumentWrapper.java | 25 ++- .../autopsy/filequery/FileSearchPanel.java | 48 ++++-- .../filequery/ImageThumbnailPanel.form | 18 +- .../filequery/ImageThumbnailPanel.java | 104 ++---------- .../autopsy/filequery/ResultsPanel.java | 83 ++++++---- .../filequery/VideoThumbnailPanel.form | 14 +- .../filequery/VideoThumbnailPanel.java | 55 +------ 15 files changed, 402 insertions(+), 352 deletions(-) create mode 100644 Core/src/org/sleuthkit/autopsy/filequery/DiscoveryUiUtils.java rename Core/src/org/sleuthkit/autopsy/filequery/{DocumentViewer.form => DocumentPreviewViewer.form} (100%) rename Core/src/org/sleuthkit/autopsy/filequery/{DocumentViewer.java => DocumentPreviewViewer.java} (69%) diff --git a/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties b/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties index 46f7060e20..6a4b6e4047 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties @@ -67,6 +67,6 @@ DiscoveryTopComponent.stepOneLabel.text=Step 1: Pick File Type DiscoveryTopComponent.documentsButton.text=Documents DocumentPanel.countLabel.toolTipText= DocumentPanel.fileSizeLabel.toolTipText= -DocumentPanel.scoreLabel.toolTipText= -DocumentPanel.isDeletedLabel.toolTipText= DocumentPanel.documentType.text= +DocumentPanel.isDeletedLabel.toolTipText= +ImageThumbnailPanel.isDeletedLabel.toolTipText= diff --git a/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties-MERGED index a36a61b825..5244e1a432 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties-MERGED @@ -6,6 +6,14 @@ DataSourceModuleWrapper.fileTypeModule.text=File Type Identification module was # {0} - dataSourceName DataSourceModuleWrapper.hashModule.text=Hash Lookup module was not run on data source: {0}\n DiscoveryTopComponent.name=\ File Discovery +DiscoveryUiUtility.bytes.text=bytes +DiscoveryUiUtility.gigaBytes.text=GB +DiscoveryUiUtility.kiloBytes.text=KB +DiscoveryUiUtility.megaBytes.text=MB +# {0} - fileSize +# {1} - units +DiscoveryUiUtility.sizeLabel.text=Size: {0} {1} +DiscoveryUiUtility.terraBytes.text=TB FileGroup.groupSortingAlgorithm.groupName.text=Group Name FileGroup.groupSortingAlgorithm.groupSize.text=Group Size # {0} - Data source name @@ -162,17 +170,9 @@ FileSorter.SortingMethod.fullPath.displayName=Full Path FileSorter.SortingMethod.keywordlist.displayName=Keyword List Names GroupsListPanel.noResults.message.text=No results were found for the selected filters. GroupsListPanel.noResults.title.text=No results found -ImageThumbnailPanel.bytes.text=bytes # {0} - numberOfInstances ImageThumbnailPanel.countLabel.text=Number of Instances: {0} -ImageThumbnailPanel.gigaBytes.text=GB ImageThumbnailPanel.isDeleted.text=All instances of file are deleted. -ImageThumbnailPanel.kiloBytes.text=KB -ImageThumbnailPanel.megaBytes.text=MB -# {0} - fileSize -# {1} - units -ImageThumbnailPanel.sizeLabel.text=Size: {0} {1} -ImageThumbnailPanel.terraBytes.text=TB OpenFileDiscoveryAction.resultsIncomplete.text=Results may be incomplete ResultFile.score.interestingResult.description=At least one instance of the file has an interesting result associated with it. ResultFile.score.notableFile.description=At least one instance of the file was recognized as notable. @@ -203,6 +203,12 @@ ResultsPanel.resultsSplitPane.toolTipText= FileSearchPanel.stepTwoLabel.text=Step 2: Filter which images to show FileSearchPanel.stepThreeLabel.text=Step 3: Choose display settings DiscoveryTopComponent.stepOneLabel.text=Step 1: Pick File Type +DiscoveryTopComponent.documentsButton.text=Documents +DocumentPanel.countLabel.toolTipText= +DocumentPanel.fileSizeLabel.toolTipText= +DocumentPanel.documentType.text= +DocumentPanel.isDeletedLabel.toolTipText= +ImageThumbnailPanel.isDeletedLabel.toolTipText= ResultsPanel.viewFileInDir.name=View File in Directory VideoThumbnailPanel.bytes.text=bytes # {0} - numberOfInstances diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java index 69da626436..91d1db2b12 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java @@ -34,7 +34,6 @@ import org.sleuthkit.autopsy.corecomponents.DataContentPanel; import org.sleuthkit.autopsy.corecomponents.TableFilterNode; import org.sleuthkit.autopsy.coreutils.ThreadConfined; import org.sleuthkit.autopsy.datamodel.FileNode; -import org.sleuthkit.autopsy.filequery.FileSearchData.FileType; import org.sleuthkit.datamodel.AbstractFile; /** @@ -322,15 +321,23 @@ public final class DiscoveryTopComponent extends TopComponent { @Subscribe void handleSearchCancelledEvent(DiscoveryEventUtils.SearchCancelledEvent searchCancelledEvent) { SwingUtilities.invokeLater(() -> { - if (fileSearchPanel.getSelectedType() == FileType.VIDEO) { - imagesButton.setEnabled(true); - documentsButton.setEnabled(true); - } else if (fileSearchPanel.getSelectedType() == FileType.IMAGE) { - videosButton.setEnabled(true); - documentsButton.setEnabled(true); - } else if (fileSearchPanel.getSelectedType() == FileType.DOCUMENTS) { - videosButton.setEnabled(true); - imagesButton.setEnabled(true); + if (null != fileSearchPanel.getSelectedType()) { + switch (fileSearchPanel.getSelectedType()) { + case VIDEO: + imagesButton.setEnabled(true); + documentsButton.setEnabled(true); + break; + case IMAGE: + videosButton.setEnabled(true); + documentsButton.setEnabled(true); + break; + case DOCUMENTS: + videosButton.setEnabled(true); + imagesButton.setEnabled(true); + break; + default: + break; + } } }); @@ -344,15 +351,23 @@ public final class DiscoveryTopComponent extends TopComponent { @Subscribe void handleSearchCompletedEvent(DiscoveryEventUtils.SearchCompleteEvent searchCompletedEvent) { SwingUtilities.invokeLater(() -> { - if (fileSearchPanel.getSelectedType() == FileType.VIDEO) { - imagesButton.setEnabled(true); - documentsButton.setEnabled(true); - } else if (fileSearchPanel.getSelectedType() == FileType.IMAGE) { - videosButton.setEnabled(true); - documentsButton.setEnabled(true); - } else if (fileSearchPanel.getSelectedType() == FileType.DOCUMENTS) { - videosButton.setEnabled(true); - imagesButton.setEnabled(true); + if (null != fileSearchPanel.getSelectedType()) { + switch (fileSearchPanel.getSelectedType()) { + case VIDEO: + imagesButton.setEnabled(true); + documentsButton.setEnabled(true); + break; + case IMAGE: + videosButton.setEnabled(true); + documentsButton.setEnabled(true); + break; + case DOCUMENTS: + videosButton.setEnabled(true); + imagesButton.setEnabled(true); + break; + default: + break; + } } }); } diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryUiUtils.java b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryUiUtils.java new file mode 100644 index 0000000000..bc5746c177 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryUiUtils.java @@ -0,0 +1,154 @@ +/* + * Autopsy + * + * Copyright 2020 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.filequery; + +import java.awt.Component; +import java.awt.Point; +import javax.swing.ImageIcon; +import javax.swing.JComponent; +import org.openide.util.ImageUtilities; +import org.openide.util.NbBundle; + +/** + * Utility class for the various user interface elements used by File Discovery. + */ +class DiscoveryUiUtils { + + private static final int BYTE_UNIT_CONVERSION = 1000; + private static final int ICON_SIZE = 16; + private static final String RED_CIRCLE_ICON_PATH = "org/sleuthkit/autopsy/images/red-circle-exclamation.png"; + private static final String YELLOW_CIRCLE_ICON_PATH = "org/sleuthkit/autopsy/images/yellow-circle-yield.png"; + private static final String DELETE_ICON_PATH = "/org/sleuthkit/autopsy/images/file-icon-deleted.png"; + private static final ImageIcon INTERESTING_SCORE_ICON = new ImageIcon(ImageUtilities.loadImage(YELLOW_CIRCLE_ICON_PATH, false)); + private static final ImageIcon NOTABLE_SCORE_ICON = new ImageIcon(ImageUtilities.loadImage(RED_CIRCLE_ICON_PATH, false)); + private static final ImageIcon DELETED_ICON = new ImageIcon(ImageUtilities.loadImage(DELETE_ICON_PATH, false)); + + @NbBundle.Messages({"# {0} - fileSize", + "# {1} - units", + "DiscoveryUiUtility.sizeLabel.text=Size: {0} {1}", + "DiscoveryUiUtility.bytes.text=bytes", + "DiscoveryUiUtility.kiloBytes.text=KB", + "DiscoveryUiUtility.megaBytes.text=MB", + "DiscoveryUiUtility.gigaBytes.text=GB", + "DiscoveryUiUtility.terraBytes.text=TB"}) + /** + * Convert a size in bytes to a string with representing the size in the + * largest units which represent the value as being greater than or equal to + * one. Result will be rounded down to the nearest whole number of those + * units. + * + * @param bytes Size in bytes. + */ + static String getFileSizeString(long bytes) { + long size = bytes; + int unitsSwitchValue = 0; + while (size > BYTE_UNIT_CONVERSION && unitsSwitchValue < 4) { + size /= BYTE_UNIT_CONVERSION; + unitsSwitchValue++; + } + String units; + switch (unitsSwitchValue) { + case 1: + units = Bundle.DiscoveryUiUtility_kiloBytes_text(); + break; + case 2: + units = Bundle.DiscoveryUiUtility_megaBytes_text(); + break; + case 3: + units = Bundle.DiscoveryUiUtility_gigaBytes_text(); + break; + case 4: + units = Bundle.DiscoveryUiUtility_terraBytes_text(); + break; + default: + units = Bundle.DiscoveryUiUtility_bytes_text(); + break; + } + return Bundle.DiscoveryUiUtility_sizeLabel_text(size, units); + } + + /** + * Helper method to see if point is on the icon. + * + * @param comp The component to check if the cursor is over the icon of + * @param point The point the cursor is at. + * + * @return True if the point is over the icon, false otherwise. + */ + static boolean isPointOnIcon(Component comp, Point point) { + return comp instanceof JComponent && point.x >= comp.getX() && point.x <= comp.getX() + ICON_SIZE && point.y >= comp.getY() && point.y <= comp.getY() + ICON_SIZE; + } + + /** + * Method to set the icon and tool tip text for a label to show deleted + * status. + * + * @param isDeleted True if the label should reflect deleted status, + * false otherwise. + * @param isDeletedLabel The label to set the icon and tooltip for. + */ + static void setDeletedIcon(boolean isDeleted, javax.swing.JLabel isDeletedLabel) { + if (isDeleted) { + isDeletedLabel.setIcon(DELETED_ICON); + isDeletedLabel.setToolTipText(Bundle.ImageThumbnailPanel_isDeleted_text()); + } else { + isDeletedLabel.setIcon(null); + isDeletedLabel.setToolTipText(null); + } + } + + /** + * Method to set the icon and tool tip text for a label to show the score. + * + * @param resultFile The result file which the label should reflect the + * score of. + * @param scoreLabel The label to set the icon and tooltip for. + */ + static void setScoreIcon(ResultFile resultFile, javax.swing.JLabel scoreLabel) { + switch (resultFile.getScore()) { + case NOTABLE_SCORE: + scoreLabel.setIcon(NOTABLE_SCORE_ICON); + break; + case INTERESTING_SCORE: + scoreLabel.setIcon(INTERESTING_SCORE_ICON); + break; + case NO_SCORE: // empty case - this is interpreted as an intentional fall-through + default: + scoreLabel.setIcon(null); + break; + } + scoreLabel.setToolTipText(resultFile.getScoreDescription()); + } + + /** + * Get the size of the icons used by the UI. + * + * @return + */ + static int getIconSize() { + return ICON_SIZE; + } + + /** + * Private constructor for DiscoveryUiUtils utility class. + */ + private DiscoveryUiUtils() { + //private constructor in a utility class intentionally left blank + } +} diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DocumentPanel.form b/Core/src/org/sleuthkit/autopsy/filequery/DocumentPanel.form index 6d5b59123f..0b75290d6a 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/DocumentPanel.form +++ b/Core/src/org/sleuthkit/autopsy/filequery/DocumentPanel.form @@ -87,13 +87,13 @@ - + - + - + @@ -102,17 +102,15 @@ - - - + - + - + - + @@ -160,4 +158,4 @@ - + \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DocumentPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/DocumentPanel.java index 3d0e6deb74..5cb6147c6b 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/DocumentPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/DocumentPanel.java @@ -23,29 +23,18 @@ import java.awt.Component; import java.awt.Dimension; import java.awt.Point; import java.awt.event.MouseEvent; -import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JList; import javax.swing.ListCellRenderer; -import org.openide.util.ImageUtilities; -import org.openide.util.NbBundle; + /** - * - * @author wschaefer + * Class which displays a preview and details about a document. */ public class DocumentPanel extends javax.swing.JPanel implements ListCellRenderer { private static final long serialVersionUID = 1L; private static final Color SELECTION_COLOR = new Color(0, 120, 215); - private static final int BYTE_UNIT_CONVERSION = 1000; - private static final int ICON_SIZE = 16; - private static final String RED_CIRCLE_ICON_PATH = "org/sleuthkit/autopsy/images/red-circle-exclamation.png"; - private static final String YELLOW_CIRCLE_ICON_PATH = "org/sleuthkit/autopsy/images/yellow-circle-yield.png"; - private static final String DELETE_ICON_PATH = "/org/sleuthkit/autopsy/images/file-icon-deleted.png"; - private static final ImageIcon INTERESTING_SCORE_ICON = new ImageIcon(ImageUtilities.loadImage(YELLOW_CIRCLE_ICON_PATH, false)); - private static final ImageIcon NOTABLE_SCORE_ICON = new ImageIcon(ImageUtilities.loadImage(RED_CIRCLE_ICON_PATH, false)); - private static final ImageIcon DELETED_ICON = new ImageIcon(ImageUtilities.loadImage(DELETE_ICON_PATH, false)); /** * Creates new form DocumentPanel @@ -80,15 +69,15 @@ public class DocumentPanel extends javax.swing.JPanel implements ListCellRendere isDeletedLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/file-icon-deleted.png"))); // NOI18N isDeletedLabel.setToolTipText(org.openide.util.NbBundle.getMessage(DocumentPanel.class, "DocumentPanel.isDeletedLabel.toolTipText")); // NOI18N - isDeletedLabel.setMaximumSize(new Dimension(ICON_SIZE,ICON_SIZE)); - isDeletedLabel.setMinimumSize(new Dimension(ICON_SIZE,ICON_SIZE)); - isDeletedLabel.setPreferredSize(new Dimension(ICON_SIZE,ICON_SIZE)); + isDeletedLabel.setMaximumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize())); + isDeletedLabel.setMinimumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize())); + isDeletedLabel.setPreferredSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize())); scoreLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/red-circle-exclamation.png"))); // NOI18N - scoreLabel.setToolTipText(org.openide.util.NbBundle.getMessage(DocumentPanel.class, "DocumentPanel.scoreLabel.toolTipText")); // NOI18N - scoreLabel.setMaximumSize(new Dimension(ICON_SIZE,ICON_SIZE)); - scoreLabel.setMinimumSize(new Dimension(ICON_SIZE,ICON_SIZE)); - scoreLabel.setPreferredSize(new Dimension(ICON_SIZE,ICON_SIZE)); + scoreLabel.setToolTipText(""); + scoreLabel.setMaximumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize())); + scoreLabel.setMinimumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize())); + scoreLabel.setPreferredSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize())); fileSizeLabel.setToolTipText(org.openide.util.NbBundle.getMessage(DocumentPanel.class, "DocumentPanel.fileSizeLabel.toolTipText")); // NOI18N @@ -143,49 +132,7 @@ public class DocumentPanel extends javax.swing.JPanel implements ListCellRendere ); }// //GEN-END:initComponents - @NbBundle.Messages({"# {0} - fileSize", - "# {1} - units", - "DocumentPanel.sizeLabel.text=Size: {0} {1}", - "DocumentPanel.bytes.text=bytes", - "DocumentPanel.kiloBytes.text=KB", - "DocumentPanel.megaBytes.text=MB", - "DocumentPanel.gigaBytes.text=GB", - "DocumentPanel.terraBytes.text=TB"}) - /** - * Convert a size in bytes to a string with representing the size in the - * largest units which represent the value as being greater than or equal to - * one. Result will be rounded down to the nearest whole number of those - * units. - * - * @param bytes Size in bytes. - */ - private String getFileSizeString(long bytes) { - long size = bytes; - int unitsSwitchValue = 0; - while (size > BYTE_UNIT_CONVERSION && unitsSwitchValue < 4) { - size /= BYTE_UNIT_CONVERSION; - unitsSwitchValue++; - } - String units; - switch (unitsSwitchValue) { - case 1: - units = Bundle.DocumentPanel_kiloBytes_text(); - break; - case 2: - units = Bundle.DocumentPanel_megaBytes_text(); - break; - case 3: - units = Bundle.DocumentPanel_gigaBytes_text(); - break; - case 4: - units = Bundle.DocumentPanel_terraBytes_text(); - break; - default: - units = Bundle.DocumentPanel_bytes_text(); - break; - } - return Bundle.DocumentPanel_sizeLabel_text(size, units); - } + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel countLabel; @@ -199,31 +146,13 @@ public class DocumentPanel extends javax.swing.JPanel implements ListCellRendere @Override public Component getListCellRendererComponent(JList list, DocumentWrapper value, int index, boolean isSelected, boolean cellHasFocus) { - fileSizeLabel.setText(getFileSizeString(value.getResultFile().getFirstInstance().getSize())); + fileSizeLabel.setText(DiscoveryUiUtils.getFileSizeString(value.getResultFile().getFirstInstance().getSize())); countLabel.setText(Bundle.ImageThumbnailPanel_countLabel_text(value.getResultFile().getAllInstances().size())); documentType.setText("Extension: " + value.getResultFile().getFirstInstance().getNameExtension()); //WJS-TODO fill this in with a document type instead of just DOCUMENT previewTextArea.setText(value.getPreview()); previewTextArea.setCaretPosition(0); - if (value.getResultFile().isDeleted()) { - isDeletedLabel.setIcon(DELETED_ICON); - isDeletedLabel.setToolTipText(Bundle.ImageThumbnailPanel_isDeleted_text()); - } else { - isDeletedLabel.setIcon(null); - isDeletedLabel.setToolTipText(null); - } - switch (value.getResultFile().getScore()) { - case NOTABLE_SCORE: - scoreLabel.setIcon(NOTABLE_SCORE_ICON); - break; - case INTERESTING_SCORE: - scoreLabel.setIcon(INTERESTING_SCORE_ICON); - break; - case NO_SCORE: // empty case - this is interpreted as an intentional fall-through - default: - scoreLabel.setIcon(null); - break; - } - scoreLabel.setToolTipText(value.getResultFile().getScoreDescription()); + DiscoveryUiUtils.setDeletedIcon(value.getResultFile().isDeleted(), isDeletedLabel); + DiscoveryUiUtils.setScoreIcon(value.getResultFile(), scoreLabel); setBackground(isSelected ? SELECTION_COLOR : list.getBackground()); return this; @@ -235,7 +164,7 @@ public class DocumentPanel extends javax.swing.JPanel implements ListCellRendere //gets tooltip of internal panel item mouse is over Point point = event.getPoint(); for (Component comp : getComponents()) { - if (isPointOnIcon(comp, point)) { + if (DiscoveryUiUtils.isPointOnIcon(comp, point)) { String toolTip = ((JComponent) comp).getToolTipText(); if (toolTip == null || toolTip.isEmpty()) { return null; @@ -248,15 +177,4 @@ public class DocumentPanel extends javax.swing.JPanel implements ListCellRendere return null; } - /** - * Helper method to see if point is on the icon. - * - * @param comp The component to check if the cursor is over the icon of - * @param point The point the cursor is at. - * - * @return True if the point is over the icon, false otherwise. - */ - private boolean isPointOnIcon(Component comp, Point point) { - return comp instanceof JComponent && point.x >= comp.getX() && point.x <= comp.getX() + ICON_SIZE && point.y >= comp.getY() && point.y <= comp.getY() + ICON_SIZE; - } } diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DocumentViewer.form b/Core/src/org/sleuthkit/autopsy/filequery/DocumentPreviewViewer.form similarity index 100% rename from Core/src/org/sleuthkit/autopsy/filequery/DocumentViewer.form rename to Core/src/org/sleuthkit/autopsy/filequery/DocumentPreviewViewer.form diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DocumentViewer.java b/Core/src/org/sleuthkit/autopsy/filequery/DocumentPreviewViewer.java similarity index 69% rename from Core/src/org/sleuthkit/autopsy/filequery/DocumentViewer.java rename to Core/src/org/sleuthkit/autopsy/filequery/DocumentPreviewViewer.java index 3643311433..c65287da42 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/DocumentViewer.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/DocumentPreviewViewer.java @@ -1,7 +1,20 @@ /* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. + * Autopsy + * + * Copyright 2020 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.filequery; @@ -12,17 +25,17 @@ import javax.swing.event.ListSelectionListener; import org.sleuthkit.datamodel.AbstractFile; /** - * - * @author wschaefer + * A JPanel to display document previews. */ -public class DocumentViewer extends javax.swing.JPanel { +public class DocumentPreviewViewer extends javax.swing.JPanel { + private static final long serialVersionUID = 1L; private final DefaultListModel documentListModel = new DefaultListModel<>(); /** * Creates new form DocumentViewer */ - public DocumentViewer() { + public DocumentPreviewViewer() { initComponents(); } @@ -59,6 +72,9 @@ public class DocumentViewer extends javax.swing.JPanel { ); }// //GEN-END:initComponents + /** + * Clear the list of documents being displayed. + */ void clearViewer() { synchronized (this) { documentListModel.removeAllElements(); @@ -67,7 +83,8 @@ public class DocumentViewer extends javax.swing.JPanel { } /** - * Add a selection listener to the list of thumbnails being displayed. + * Add a selection listener to the list of document previews being + * displayed. * * @param listener The ListSelectionListener to add to the selection model. */ @@ -75,6 +92,13 @@ public class DocumentViewer extends javax.swing.JPanel { documentList.getSelectionModel().addListSelectionListener(listener); } + /** + * Get the list of AbstractFiles which are represented by the selected + * document preview. + * + * @return The list of AbstractFiles which are represented by the selected + * document preview. + */ List getInstancesForSelected() { synchronized (this) { if (documentList.getSelectedIndex() == -1) { @@ -90,6 +114,12 @@ public class DocumentViewer extends javax.swing.JPanel { private javax.swing.JScrollPane documentScrollPane; // End of variables declaration//GEN-END:variables + /** + * Add the preview for a document to the panel. + * + * @param documentWrapper The object which contains the document preview + * which will be displayed. + */ void addDocument(DocumentWrapper documentWrapper) { synchronized (this) { documentListModel.addElement(documentWrapper); diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DocumentWrapper.java b/Core/src/org/sleuthkit/autopsy/filequery/DocumentWrapper.java index a1b9e5ffde..e9ac26aeeb 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/DocumentWrapper.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/DocumentWrapper.java @@ -18,22 +18,20 @@ */ package org.sleuthkit.autopsy.filequery; -import org.sleuthkit.autopsy.coreutils.Logger; - - +/** + * Class to wrap all the information necessary for a document preview to be + * displayed. + */ public class DocumentWrapper { private String preview; private final ResultFile resultFile; - private static final Logger logger = Logger.getLogger(DocumentWrapper.class.getName()); - //string extract utility - /** - * Construct a new ImageThumbnailsWrapper. + * Construct a new DocumentWrapper. * * @param file The ResultFile which represents the document which the - * summary is created for. + * preview summary is created for. */ DocumentWrapper(ResultFile file) { this.preview = "Preview being generated."; @@ -43,18 +41,19 @@ public class DocumentWrapper { /** * Set the preview summary which exists. * - * @param summary The String which summarizes this document. + * @param preview The String which should be displayed as a preview for this + * document. */ - void setSummary(String summary) { - this.preview = summary; + void setPreview(String preview) { + this.preview = preview; } /** * Get the ResultFile which represents the document the preview summary was * created for. * - * @return The ResultFile which represents the image file which the - * thumbnail was created for. + * @return The ResultFile which represents the document file which the + * preview was created for. */ ResultFile getResultFile() { return resultFile; diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java index 41884e0ca2..58403878cc 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java @@ -511,6 +511,16 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener notableFilterSettings(false, false, false); } + /** + * Set the UI elements available to be the set of UI elements available when + * a Document search is being performed. + * + * @param enabled Boolean indicating if the filters present for documents + * should be enabled. + * @param resetSelected Boolean indicating if selection of the filters + * present for documents should be reset to their default + * status. + */ private void documentsSelected(boolean enabled, boolean resetSelected) { dataSourceFilterSettings(true, enabled, !resetSelected && dataSourceCheckbox.isSelected(), null); sizeFilterSettings(true, enabled, !resetSelected && sizeCheckbox.isSelected(), null); @@ -541,12 +551,20 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener void setSelectedType(FileType type) { fileType = type; setUpSizeFilter(); - if (fileType == FileType.IMAGE) { - imagesSelected(true, true); - } else if (fileType == FileType.VIDEO) { - videosSelected(true, true); - } else if (fileType == FileType.DOCUMENTS) { - documentsSelected(true, true); + if (null != fileType) { + switch (fileType) { + case IMAGE: + imagesSelected(true, true); + break; + case VIDEO: + videosSelected(true, true); + break; + case DOCUMENTS: + documentsSelected(true, true); + break; + default: + break; + } } validateFields(); } @@ -1792,10 +1810,20 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener } else { DiscoveryTopComponent.getTopComponent().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); } - if (fileType == FileType.IMAGE) { - imagesSelected(enabled, false); - } else if (fileType == FileType.VIDEO) { - videosSelected(enabled, false); + if (null != fileType) { + switch (fileType) { + case IMAGE: + imagesSelected(enabled, false); + break; + case VIDEO: + videosSelected(enabled, false); + break; + case DOCUMENTS: + documentsSelected(enabled, false); + break; + default: + break; + } } searchButton.setEnabled(enabled); cancelButton.setEnabled(!enabled); diff --git a/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailPanel.form b/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailPanel.form index e75effab93..ff120eecdd 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailPanel.form +++ b/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailPanel.form @@ -101,15 +101,17 @@ - + + + - + - + - + @@ -120,15 +122,15 @@ - + - + - + - + \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailPanel.java index a1d04c9621..f0c0022905 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailPanel.java @@ -27,7 +27,6 @@ import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JList; import javax.swing.ListCellRenderer; -import org.openide.util.ImageUtilities; import org.openide.util.NbBundle; /** @@ -37,14 +36,6 @@ public class ImageThumbnailPanel extends javax.swing.JPanel implements ListCellR private static final long serialVersionUID = 1L; private static final Color SELECTION_COLOR = new Color(0, 120, 215); - private static final int BYTE_UNIT_CONVERSION = 1000; - private static final int ICON_SIZE = 16; - private static final String RED_CIRCLE_ICON_PATH = "org/sleuthkit/autopsy/images/red-circle-exclamation.png"; - private static final String YELLOW_CIRCLE_ICON_PATH = "org/sleuthkit/autopsy/images/yellow-circle-yield.png"; - private static final String DELETE_ICON_PATH = "/org/sleuthkit/autopsy/images/file-icon-deleted.png"; - private static final ImageIcon INTERESTING_SCORE_ICON = new ImageIcon(ImageUtilities.loadImage(YELLOW_CIRCLE_ICON_PATH, false)); - private static final ImageIcon NOTABLE_SCORE_ICON = new ImageIcon(ImageUtilities.loadImage(RED_CIRCLE_ICON_PATH, false)); - private static final ImageIcon DELETED_ICON = new ImageIcon(ImageUtilities.loadImage(DELETE_ICON_PATH, false)); /** * Creates new form ImageThumbnailPanel @@ -83,16 +74,16 @@ public class ImageThumbnailPanel extends javax.swing.JPanel implements ListCellR countLabel.setPreferredSize(new java.awt.Dimension(159, 12)); isDeletedLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/file-icon-deleted.png"))); // NOI18N - isDeletedLabel.setToolTipText(""); - isDeletedLabel.setMaximumSize(new Dimension(ICON_SIZE,ICON_SIZE)); - isDeletedLabel.setMinimumSize(new Dimension(ICON_SIZE,ICON_SIZE)); - isDeletedLabel.setPreferredSize(new Dimension(ICON_SIZE,ICON_SIZE)); + isDeletedLabel.setToolTipText(org.openide.util.NbBundle.getMessage(ImageThumbnailPanel.class, "ImageThumbnailPanel.isDeletedLabel.toolTipText")); // NOI18N + isDeletedLabel.setMaximumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize())); + isDeletedLabel.setMinimumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize())); + isDeletedLabel.setPreferredSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize())); scoreLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/red-circle-exclamation.png"))); // NOI18N scoreLabel.setToolTipText(""); - scoreLabel.setMaximumSize(new Dimension(ICON_SIZE,ICON_SIZE)); - scoreLabel.setMinimumSize(new Dimension(ICON_SIZE,ICON_SIZE)); - scoreLabel.setPreferredSize(new Dimension(ICON_SIZE,ICON_SIZE)); + scoreLabel.setMaximumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize())); + scoreLabel.setMinimumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize())); + scoreLabel.setPreferredSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize())); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); @@ -143,85 +134,23 @@ public class ImageThumbnailPanel extends javax.swing.JPanel implements ListCellR "ImageThumbnailPanel.isDeleted.text=All instances of file are deleted."}) @Override public Component getListCellRendererComponent(JList list, ImageThumbnailWrapper value, int index, boolean isSelected, boolean cellHasFocus) { - fileSizeLabel.setText(getFileSizeString(value.getResultFile().getFirstInstance().getSize())); + fileSizeLabel.setText(DiscoveryUiUtils.getFileSizeString(value.getResultFile().getFirstInstance().getSize())); countLabel.setText(Bundle.ImageThumbnailPanel_countLabel_text(value.getResultFile().getAllInstances().size())); thumbnailLabel.setIcon(new ImageIcon(value.getThumbnail())); - if (value.getResultFile().isDeleted()) { - isDeletedLabel.setIcon(DELETED_ICON); - isDeletedLabel.setToolTipText(Bundle.ImageThumbnailPanel_isDeleted_text()); - } else { - isDeletedLabel.setIcon(null); - isDeletedLabel.setToolTipText(null); - } - switch (value.getResultFile().getScore()) { - case NOTABLE_SCORE: - scoreLabel.setIcon(NOTABLE_SCORE_ICON); - break; - case INTERESTING_SCORE: - scoreLabel.setIcon(INTERESTING_SCORE_ICON); - break; - case NO_SCORE: // empty case - this is interpreted as an intentional fall-through - default: - scoreLabel.setIcon(null); - break; - } - scoreLabel.setToolTipText(value.getResultFile().getScoreDescription()); + DiscoveryUiUtils.setDeletedIcon(value.getResultFile().isDeleted(), isDeletedLabel); + DiscoveryUiUtils.setScoreIcon(value.getResultFile(), scoreLabel); setBackground(isSelected ? SELECTION_COLOR : list.getBackground()); return this; } - @NbBundle.Messages({"# {0} - fileSize", - "# {1} - units", - "ImageThumbnailPanel.sizeLabel.text=Size: {0} {1}", - "ImageThumbnailPanel.bytes.text=bytes", - "ImageThumbnailPanel.kiloBytes.text=KB", - "ImageThumbnailPanel.megaBytes.text=MB", - "ImageThumbnailPanel.gigaBytes.text=GB", - "ImageThumbnailPanel.terraBytes.text=TB"}) - /** - * Convert a size in bytes to a string with representing the size in the - * largest units which represent the value as being greater than or equal to - * one. Result will be rounded down to the nearest whole number of those - * units. - * - * @param bytes Size in bytes. - */ - private String getFileSizeString(long bytes) { - long size = bytes; - int unitsSwitchValue = 0; - while (size > BYTE_UNIT_CONVERSION && unitsSwitchValue < 4) { - size /= BYTE_UNIT_CONVERSION; - unitsSwitchValue++; - } - String units; - switch (unitsSwitchValue) { - case 1: - units = Bundle.ImageThumbnailPanel_kiloBytes_text(); - break; - case 2: - units = Bundle.ImageThumbnailPanel_megaBytes_text(); - break; - case 3: - units = Bundle.ImageThumbnailPanel_gigaBytes_text(); - break; - case 4: - units = Bundle.ImageThumbnailPanel_terraBytes_text(); - break; - default: - units = Bundle.ImageThumbnailPanel_bytes_text(); - break; - } - return Bundle.ImageThumbnailPanel_sizeLabel_text(size, units); - } - @Override public String getToolTipText(MouseEvent event) { if (event != null) { //gets tooltip of internal panel item mouse is over Point point = event.getPoint(); for (Component comp : getComponents()) { - if (isPointOnIcon(comp, point)) { + if (DiscoveryUiUtils.isPointOnIcon(comp, point)) { String toolTip = ((JComponent) comp).getToolTipText(); if (toolTip == null || toolTip.isEmpty()) { return null; @@ -234,16 +163,5 @@ public class ImageThumbnailPanel extends javax.swing.JPanel implements ListCellR return null; } - /** - * Helper method to see if point is on the icon. - * - * @param comp The component to check if the cursor is over the icon of - * @param point The point the cursor is at. - * - * @return True if the point is over the icon, false otherwise. - */ - private boolean isPointOnIcon(Component comp, Point point) { - return comp instanceof JComponent && point.x >= comp.getX() && point.x <= comp.getX() + ICON_SIZE && point.y >= comp.getY() && point.y <= comp.getY() + ICON_SIZE; - } } diff --git a/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java index 77cdc71a3e..6e8f10a27a 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java @@ -66,7 +66,7 @@ public class ResultsPanel extends javax.swing.JPanel { private final static Logger logger = Logger.getLogger(ResultsPanel.class.getName()); private final VideoThumbnailViewer videoThumbnailViewer; private final ImageThumbnailViewer imageThumbnailViewer; - private final DocumentViewer documentViewer; + private final DocumentPreviewViewer documentPreviewViewer; private List searchFilters; private FileSearch.AttributeType groupingAttribute; private FileGroup.GroupSortingAlgorithm groupSort; @@ -90,7 +90,7 @@ public class ResultsPanel extends javax.swing.JPanel { initComponents(); imageThumbnailViewer = new ImageThumbnailViewer(); videoThumbnailViewer = new VideoThumbnailViewer(); - documentViewer = new DocumentViewer(); + documentPreviewViewer = new DocumentPreviewViewer(); videoThumbnailViewer.addListSelectionListener((e) -> { if (resultType == FileSearchData.FileType.VIDEO) { if (!e.getValueIsAdjusting()) { @@ -109,7 +109,7 @@ public class ResultsPanel extends javax.swing.JPanel { } } }); - documentViewer.addListSelectionListener((e) -> { + documentPreviewViewer.addListSelectionListener((e) -> { if (resultType == FileSearchData.FileType.DOCUMENTS) { if (!e.getValueIsAdjusting()) { populateInstancesList(); @@ -201,12 +201,17 @@ public class ResultsPanel extends javax.swing.JPanel { * selected in the results viewer area. */ private List getInstancesForSelected() { - if (resultType == FileSearchData.FileType.VIDEO) { - return videoThumbnailViewer.getInstancesForSelected(); - } else if (resultType == FileSearchData.FileType.IMAGE) { - return imageThumbnailViewer.getInstancesForSelected(); - } else if (resultType == FileSearchData.FileType.DOCUMENTS) { - return documentViewer.getInstancesForSelected(); + if (null != resultType) { + switch (resultType) { + case VIDEO: + return videoThumbnailViewer.getInstancesForSelected(); + case IMAGE: + return imageThumbnailViewer.getInstancesForSelected(); + case DOCUMENTS: + return documentPreviewViewer.getInstancesForSelected(); + default: + break; + } } return new ArrayList<>(); } @@ -223,15 +228,23 @@ public class ResultsPanel extends javax.swing.JPanel { currentPage = pageRetrievedEvent.getPageNumber(); updateControls(); resetResultViewer(); - if (pageRetrievedEvent.getType() == FileSearchData.FileType.IMAGE) { - populateImageViewer(pageRetrievedEvent.getSearchResults()); - resultsViewerPanel.add(imageThumbnailViewer); - } else if (pageRetrievedEvent.getType() == FileSearchData.FileType.VIDEO) { - populateVideoViewer(pageRetrievedEvent.getSearchResults()); - resultsViewerPanel.add(videoThumbnailViewer); - } else if (pageRetrievedEvent.getType() == FileSearchData.FileType.DOCUMENTS) { - populateDocumentViewer(pageRetrievedEvent.getSearchResults()); - resultsViewerPanel.add(documentViewer); + if (null != pageRetrievedEvent.getType()) { + switch (pageRetrievedEvent.getType()) { + case IMAGE: + populateImageViewer(pageRetrievedEvent.getSearchResults()); + resultsViewerPanel.add(imageThumbnailViewer); + break; + case VIDEO: + populateVideoViewer(pageRetrievedEvent.getSearchResults()); + resultsViewerPanel.add(videoThumbnailViewer); + break; + case DOCUMENTS: + populateDocumentViewer(pageRetrievedEvent.getSearchResults()); + resultsViewerPanel.add(documentPreviewViewer); + break; + default: + break; + } } resultsViewerPanel.revalidate(); resultsViewerPanel.repaint(); @@ -246,7 +259,7 @@ public class ResultsPanel extends javax.swing.JPanel { synchronized void resetResultViewer() { resultsViewerPanel.remove(imageThumbnailViewer); resultsViewerPanel.remove(videoThumbnailViewer); - resultsViewerPanel.remove(documentViewer); + resultsViewerPanel.remove(documentPreviewViewer); //cancel any unfished thumb workers for (SwingWorker thumbWorker : resultContentWorkers) { if (!thumbWorker.isDone()) { @@ -257,7 +270,7 @@ public class ResultsPanel extends javax.swing.JPanel { resultContentWorkers.clear(); videoThumbnailViewer.clearViewer(); imageThumbnailViewer.clearViewer(); - documentViewer.clearViewer(); + documentPreviewViewer.clearViewer(); } /** @@ -290,9 +303,15 @@ public class ResultsPanel extends javax.swing.JPanel { } } + /** + * Populate the document preview viewer, cancelling any content which is + * currently being created first. + * + * @param files The list of ResultFiles to populate the image viewer with. + */ synchronized void populateDocumentViewer(List files) { for (ResultFile file : files) { - DocumentSummaryWorker documentWorker = new DocumentSummaryWorker(file); + DocumentPreviewWorker documentWorker = new DocumentPreviewWorker(file); documentWorker.execute(); //keep track of thumb worker for possible cancelation resultContentWorkers.add(documentWorker); @@ -332,7 +351,7 @@ public class ResultsPanel extends javax.swing.JPanel { updateControls(); videoThumbnailViewer.clearViewer(); imageThumbnailViewer.clearViewer(); - documentViewer.clearViewer(); + documentPreviewViewer.clearViewer(); resultsViewerPanel.revalidate(); resultsViewerPanel.repaint(); }); @@ -723,29 +742,29 @@ public class ResultsPanel extends javax.swing.JPanel { } /** - * Swing worker to handle the retrieval of image thumbnails and population - * of the Image Thumbnail Viewer. + * Swing worker to handle the retrieval of document previews and population + * of the Document Preview Viewer. */ - private class DocumentSummaryWorker extends SwingWorker { + private class DocumentPreviewWorker extends SwingWorker { private final DocumentWrapper documentWrapper; /** - * Construct a new ImageThumbnailWorker. + * Construct a new DocumentPreviewWorker. * - * @param file The ResultFile which represents the image file thumbnails - * are being retrieved for. + * @param file The ResultFile which represents the document file a + * preview is being retrieved for. */ - DocumentSummaryWorker(ResultFile file) { + DocumentPreviewWorker(ResultFile file) { documentWrapper = new DocumentWrapper(file); - documentViewer.addDocument(documentWrapper); + documentPreviewViewer.addDocument(documentWrapper); } @Override protected Void doInBackground() throws Exception { String preview = createPreview(documentWrapper.getResultFile().getFirstInstance()); if (preview != null) { - documentWrapper.setSummary(preview); + documentWrapper.setPreview(preview); } return null; } @@ -779,7 +798,7 @@ public class ResultsPanel extends javax.swing.JPanel { @Override protected void done() { - documentViewer.repaint(); + documentPreviewViewer.repaint(); } } diff --git a/Core/src/org/sleuthkit/autopsy/filequery/VideoThumbnailPanel.form b/Core/src/org/sleuthkit/autopsy/filequery/VideoThumbnailPanel.form index 86a30442f6..4ae16fddf2 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/VideoThumbnailPanel.form +++ b/Core/src/org/sleuthkit/autopsy/filequery/VideoThumbnailPanel.form @@ -75,13 +75,13 @@ - + - + - + @@ -91,15 +91,15 @@ - + - + - + - + \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/filequery/VideoThumbnailPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/VideoThumbnailPanel.java index 72296f7ce8..fdddfa2c62 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/VideoThumbnailPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/VideoThumbnailPanel.java @@ -31,7 +31,6 @@ import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.ListCellRenderer; -import org.openide.util.ImageUtilities; import org.openide.util.NbBundle.Messages; /** @@ -42,13 +41,6 @@ final class VideoThumbnailPanel extends javax.swing.JPanel implements ListCellRe private static final int GAP_SIZE = 4; private static final Color SELECTION_COLOR = new Color(0, 120, 215); private static final int BYTE_UNIT_CONVERSION = 1000; - private static final int ICON_SIZE = 16; - private static final String RED_CIRCLE_ICON_PATH = "org/sleuthkit/autopsy/images/red-circle-exclamation.png"; - private static final String YELLOW_CIRCLE_ICON_PATH = "org/sleuthkit/autopsy/images/yellow-circle-yield.png"; - private static final String DELETE_ICON_PATH = "/org/sleuthkit/autopsy/images/file-icon-deleted.png"; - private static final ImageIcon INTERESTING_SCORE_ICON = new ImageIcon(ImageUtilities.loadImage(YELLOW_CIRCLE_ICON_PATH, false)); - private static final ImageIcon NOTABLE_SCORE_ICON = new ImageIcon(ImageUtilities.loadImage(RED_CIRCLE_ICON_PATH, false)); - private static final ImageIcon DELETED_ICON = new ImageIcon(ImageUtilities.loadImage(DELETE_ICON_PATH, false)); private static final long serialVersionUID = 1L; /** @@ -117,14 +109,14 @@ final class VideoThumbnailPanel extends javax.swing.JPanel implements ListCellRe imagePanel.setLayout(new java.awt.GridBagLayout()); scoreLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/red-circle-exclamation.png"))); // NOI18N - scoreLabel.setMaximumSize(new Dimension(ICON_SIZE,ICON_SIZE)); - scoreLabel.setMinimumSize(new Dimension(ICON_SIZE,ICON_SIZE)); - scoreLabel.setPreferredSize(new Dimension(ICON_SIZE,ICON_SIZE)); + scoreLabel.setMaximumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize())); + scoreLabel.setMinimumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize())); + scoreLabel.setPreferredSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize())); deletedLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/file-icon-deleted.png"))); // NOI18N - deletedLabel.setMaximumSize(new Dimension(ICON_SIZE,ICON_SIZE)); - deletedLabel.setMinimumSize(new Dimension(ICON_SIZE,ICON_SIZE)); - deletedLabel.setPreferredSize(new Dimension(ICON_SIZE,ICON_SIZE)); + deletedLabel.setMaximumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize())); + deletedLabel.setMinimumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize())); + deletedLabel.setPreferredSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize())); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); @@ -179,26 +171,8 @@ final class VideoThumbnailPanel extends javax.swing.JPanel implements ListCellRe countLabel.setText(Bundle.VideoThumbnailPanel_countLabel_text(value.getResultFile().getAllInstances().size())); addThumbnails(value); imagePanel.setBackground(isSelected ? SELECTION_COLOR : list.getBackground()); - if (value.getResultFile().isDeleted()) { - deletedLabel.setIcon(DELETED_ICON); - deletedLabel.setToolTipText(Bundle.VideoThumbnailPanel_deleted_text()); - } else { - deletedLabel.setIcon(null); - deletedLabel.setToolTipText(""); - } - switch (value.getResultFile().getScore()) { - case NOTABLE_SCORE: - scoreLabel.setIcon(NOTABLE_SCORE_ICON); - break; - case INTERESTING_SCORE: - scoreLabel.setIcon(INTERESTING_SCORE_ICON); - break; - case NO_SCORE: // empty case - this is interpreted as an intentional fall-through - default: - scoreLabel.setIcon(null); - break; - } - scoreLabel.setToolTipText(value.getResultFile().getScoreDescription()); + DiscoveryUiUtils.setDeletedIcon(value.getResultFile().isDeleted(), deletedLabel); + DiscoveryUiUtils.setScoreIcon(value.getResultFile(), scoreLabel); setBackground(isSelected ? SELECTION_COLOR : list.getBackground()); return this; } @@ -253,7 +227,7 @@ final class VideoThumbnailPanel extends javax.swing.JPanel implements ListCellRe //gets tooltip of internal panel item mouse is over Point point = event.getPoint(); for (Component comp : getComponents()) { - if (isPointOnIcon(comp, point)) { + if (DiscoveryUiUtils.isPointOnIcon(comp, point)) { String toolTip = ((JComponent) comp).getToolTipText(); if (toolTip == null || toolTip.isEmpty()) { return null; @@ -266,15 +240,4 @@ final class VideoThumbnailPanel extends javax.swing.JPanel implements ListCellRe return null; } - /** - * Helper method to see if point is on the icon. - * - * @param comp The component to check if the cursor is over the icon of - * @param point The point the cursor is at. - * - * @return True if the point is over the icon, false otherwise. - */ - private boolean isPointOnIcon(Component comp, Point point) { - return comp instanceof JComponent && point.x >= comp.getX() && point.x <= comp.getX() + ICON_SIZE && point.y >= comp.getY() && point.y <= comp.getY() + ICON_SIZE; - } }