mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-12 16:06:15 +00:00
5979 clean up document file discovery viewer
This commit is contained in:
parent
7a5e911cee
commit
f674556521
@ -67,6 +67,6 @@ DiscoveryTopComponent.stepOneLabel.text=Step 1: Pick File Type
|
|||||||
DiscoveryTopComponent.documentsButton.text=Documents
|
DiscoveryTopComponent.documentsButton.text=Documents
|
||||||
DocumentPanel.countLabel.toolTipText=
|
DocumentPanel.countLabel.toolTipText=
|
||||||
DocumentPanel.fileSizeLabel.toolTipText=
|
DocumentPanel.fileSizeLabel.toolTipText=
|
||||||
DocumentPanel.scoreLabel.toolTipText=
|
|
||||||
DocumentPanel.isDeletedLabel.toolTipText=
|
|
||||||
DocumentPanel.documentType.text=
|
DocumentPanel.documentType.text=
|
||||||
|
DocumentPanel.isDeletedLabel.toolTipText=
|
||||||
|
ImageThumbnailPanel.isDeletedLabel.toolTipText=
|
||||||
|
@ -6,6 +6,14 @@ DataSourceModuleWrapper.fileTypeModule.text=File Type Identification module was
|
|||||||
# {0} - dataSourceName
|
# {0} - dataSourceName
|
||||||
DataSourceModuleWrapper.hashModule.text=Hash Lookup module was not run on data source: {0}\n
|
DataSourceModuleWrapper.hashModule.text=Hash Lookup module was not run on data source: {0}\n
|
||||||
DiscoveryTopComponent.name=\ File Discovery
|
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.groupName.text=Group Name
|
||||||
FileGroup.groupSortingAlgorithm.groupSize.text=Group Size
|
FileGroup.groupSortingAlgorithm.groupSize.text=Group Size
|
||||||
# {0} - Data source name
|
# {0} - Data source name
|
||||||
@ -162,17 +170,9 @@ FileSorter.SortingMethod.fullPath.displayName=Full Path
|
|||||||
FileSorter.SortingMethod.keywordlist.displayName=Keyword List Names
|
FileSorter.SortingMethod.keywordlist.displayName=Keyword List Names
|
||||||
GroupsListPanel.noResults.message.text=No results were found for the selected filters.
|
GroupsListPanel.noResults.message.text=No results were found for the selected filters.
|
||||||
GroupsListPanel.noResults.title.text=No results found
|
GroupsListPanel.noResults.title.text=No results found
|
||||||
ImageThumbnailPanel.bytes.text=bytes
|
|
||||||
# {0} - numberOfInstances
|
# {0} - numberOfInstances
|
||||||
ImageThumbnailPanel.countLabel.text=Number of Instances: {0}
|
ImageThumbnailPanel.countLabel.text=Number of Instances: {0}
|
||||||
ImageThumbnailPanel.gigaBytes.text=GB
|
|
||||||
ImageThumbnailPanel.isDeleted.text=All instances of file are deleted.
|
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
|
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.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.
|
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.stepTwoLabel.text=Step 2: Filter which images to show
|
||||||
FileSearchPanel.stepThreeLabel.text=Step 3: Choose display settings
|
FileSearchPanel.stepThreeLabel.text=Step 3: Choose display settings
|
||||||
DiscoveryTopComponent.stepOneLabel.text=Step 1: Pick File Type
|
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
|
ResultsPanel.viewFileInDir.name=View File in Directory
|
||||||
VideoThumbnailPanel.bytes.text=bytes
|
VideoThumbnailPanel.bytes.text=bytes
|
||||||
# {0} - numberOfInstances
|
# {0} - numberOfInstances
|
||||||
|
@ -34,7 +34,6 @@ import org.sleuthkit.autopsy.corecomponents.DataContentPanel;
|
|||||||
import org.sleuthkit.autopsy.corecomponents.TableFilterNode;
|
import org.sleuthkit.autopsy.corecomponents.TableFilterNode;
|
||||||
import org.sleuthkit.autopsy.coreutils.ThreadConfined;
|
import org.sleuthkit.autopsy.coreutils.ThreadConfined;
|
||||||
import org.sleuthkit.autopsy.datamodel.FileNode;
|
import org.sleuthkit.autopsy.datamodel.FileNode;
|
||||||
import org.sleuthkit.autopsy.filequery.FileSearchData.FileType;
|
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -322,15 +321,23 @@ public final class DiscoveryTopComponent extends TopComponent {
|
|||||||
@Subscribe
|
@Subscribe
|
||||||
void handleSearchCancelledEvent(DiscoveryEventUtils.SearchCancelledEvent searchCancelledEvent) {
|
void handleSearchCancelledEvent(DiscoveryEventUtils.SearchCancelledEvent searchCancelledEvent) {
|
||||||
SwingUtilities.invokeLater(() -> {
|
SwingUtilities.invokeLater(() -> {
|
||||||
if (fileSearchPanel.getSelectedType() == FileType.VIDEO) {
|
if (null != fileSearchPanel.getSelectedType()) {
|
||||||
imagesButton.setEnabled(true);
|
switch (fileSearchPanel.getSelectedType()) {
|
||||||
documentsButton.setEnabled(true);
|
case VIDEO:
|
||||||
} else if (fileSearchPanel.getSelectedType() == FileType.IMAGE) {
|
imagesButton.setEnabled(true);
|
||||||
videosButton.setEnabled(true);
|
documentsButton.setEnabled(true);
|
||||||
documentsButton.setEnabled(true);
|
break;
|
||||||
} else if (fileSearchPanel.getSelectedType() == FileType.DOCUMENTS) {
|
case IMAGE:
|
||||||
videosButton.setEnabled(true);
|
videosButton.setEnabled(true);
|
||||||
imagesButton.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
|
@Subscribe
|
||||||
void handleSearchCompletedEvent(DiscoveryEventUtils.SearchCompleteEvent searchCompletedEvent) {
|
void handleSearchCompletedEvent(DiscoveryEventUtils.SearchCompleteEvent searchCompletedEvent) {
|
||||||
SwingUtilities.invokeLater(() -> {
|
SwingUtilities.invokeLater(() -> {
|
||||||
if (fileSearchPanel.getSelectedType() == FileType.VIDEO) {
|
if (null != fileSearchPanel.getSelectedType()) {
|
||||||
imagesButton.setEnabled(true);
|
switch (fileSearchPanel.getSelectedType()) {
|
||||||
documentsButton.setEnabled(true);
|
case VIDEO:
|
||||||
} else if (fileSearchPanel.getSelectedType() == FileType.IMAGE) {
|
imagesButton.setEnabled(true);
|
||||||
videosButton.setEnabled(true);
|
documentsButton.setEnabled(true);
|
||||||
documentsButton.setEnabled(true);
|
break;
|
||||||
} else if (fileSearchPanel.getSelectedType() == FileType.DOCUMENTS) {
|
case IMAGE:
|
||||||
videosButton.setEnabled(true);
|
videosButton.setEnabled(true);
|
||||||
imagesButton.setEnabled(true);
|
documentsButton.setEnabled(true);
|
||||||
|
break;
|
||||||
|
case DOCUMENTS:
|
||||||
|
videosButton.setEnabled(true);
|
||||||
|
imagesButton.setEnabled(true);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
154
Core/src/org/sleuthkit/autopsy/filequery/DiscoveryUiUtils.java
Normal file
154
Core/src/org/sleuthkit/autopsy/filequery/DiscoveryUiUtils.java
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy
|
||||||
|
*
|
||||||
|
* Copyright 2020 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.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
|
||||||
|
}
|
||||||
|
}
|
@ -87,13 +87,13 @@
|
|||||||
<ResourceString bundle="org/sleuthkit/autopsy/filequery/Bundle.properties" key="DocumentPanel.isDeletedLabel.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/filequery/Bundle.properties" key="DocumentPanel.isDeletedLabel.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new Dimension(ICON_SIZE,ICON_SIZE)" type="code"/>
|
<Connection code="new Dimension(org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize(),org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize())" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new Dimension(ICON_SIZE,ICON_SIZE)" type="code"/>
|
<Connection code="new Dimension(org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize(),org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize())" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new Dimension(ICON_SIZE,ICON_SIZE)" type="code"/>
|
<Connection code="new Dimension(org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize(),org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize())" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
@ -102,17 +102,15 @@
|
|||||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||||
<Image iconType="3" name="/org/sleuthkit/autopsy/images/red-circle-exclamation.png"/>
|
<Image iconType="3" name="/org/sleuthkit/autopsy/images/red-circle-exclamation.png"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="toolTipText" type="java.lang.String" value=""/>
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/filequery/Bundle.properties" key="DocumentPanel.scoreLabel.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new Dimension(ICON_SIZE,ICON_SIZE)" type="code"/>
|
<Connection code="new Dimension(org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize(),org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize())" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new Dimension(ICON_SIZE,ICON_SIZE)" type="code"/>
|
<Connection code="new Dimension(org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize(),org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize())" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new Dimension(ICON_SIZE,ICON_SIZE)" type="code"/>
|
<Connection code="new Dimension(org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize(),org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize())" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
|
@ -23,29 +23,18 @@ import java.awt.Component;
|
|||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.Point;
|
import java.awt.Point;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import javax.swing.ImageIcon;
|
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.JList;
|
import javax.swing.JList;
|
||||||
import javax.swing.ListCellRenderer;
|
import javax.swing.ListCellRenderer;
|
||||||
import org.openide.util.ImageUtilities;
|
|
||||||
import org.openide.util.NbBundle;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
* Class which displays a preview and details about a document.
|
||||||
* @author wschaefer
|
|
||||||
*/
|
*/
|
||||||
public class DocumentPanel extends javax.swing.JPanel implements ListCellRenderer<DocumentWrapper> {
|
public class DocumentPanel extends javax.swing.JPanel implements ListCellRenderer<DocumentWrapper> {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
private static final Color SELECTION_COLOR = new Color(0, 120, 215);
|
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
|
* 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.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.setToolTipText(org.openide.util.NbBundle.getMessage(DocumentPanel.class, "DocumentPanel.isDeletedLabel.toolTipText")); // NOI18N
|
||||||
isDeletedLabel.setMaximumSize(new Dimension(ICON_SIZE,ICON_SIZE));
|
isDeletedLabel.setMaximumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize()));
|
||||||
isDeletedLabel.setMinimumSize(new Dimension(ICON_SIZE,ICON_SIZE));
|
isDeletedLabel.setMinimumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize()));
|
||||||
isDeletedLabel.setPreferredSize(new Dimension(ICON_SIZE,ICON_SIZE));
|
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.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.setToolTipText("");
|
||||||
scoreLabel.setMaximumSize(new Dimension(ICON_SIZE,ICON_SIZE));
|
scoreLabel.setMaximumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize()));
|
||||||
scoreLabel.setMinimumSize(new Dimension(ICON_SIZE,ICON_SIZE));
|
scoreLabel.setMinimumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize()));
|
||||||
scoreLabel.setPreferredSize(new Dimension(ICON_SIZE,ICON_SIZE));
|
scoreLabel.setPreferredSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize()));
|
||||||
|
|
||||||
fileSizeLabel.setToolTipText(org.openide.util.NbBundle.getMessage(DocumentPanel.class, "DocumentPanel.fileSizeLabel.toolTipText")); // NOI18N
|
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
|
|||||||
);
|
);
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//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
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
private javax.swing.JLabel countLabel;
|
private javax.swing.JLabel countLabel;
|
||||||
@ -199,31 +146,13 @@ public class DocumentPanel extends javax.swing.JPanel implements ListCellRendere
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Component getListCellRendererComponent(JList<? extends DocumentWrapper> list, DocumentWrapper value, int index, boolean isSelected, boolean cellHasFocus) {
|
public Component getListCellRendererComponent(JList<? extends DocumentWrapper> 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()));
|
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
|
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.setText(value.getPreview());
|
||||||
previewTextArea.setCaretPosition(0);
|
previewTextArea.setCaretPosition(0);
|
||||||
if (value.getResultFile().isDeleted()) {
|
DiscoveryUiUtils.setDeletedIcon(value.getResultFile().isDeleted(), isDeletedLabel);
|
||||||
isDeletedLabel.setIcon(DELETED_ICON);
|
DiscoveryUiUtils.setScoreIcon(value.getResultFile(), scoreLabel);
|
||||||
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());
|
|
||||||
setBackground(isSelected ? SELECTION_COLOR : list.getBackground());
|
setBackground(isSelected ? SELECTION_COLOR : list.getBackground());
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
@ -235,7 +164,7 @@ public class DocumentPanel extends javax.swing.JPanel implements ListCellRendere
|
|||||||
//gets tooltip of internal panel item mouse is over
|
//gets tooltip of internal panel item mouse is over
|
||||||
Point point = event.getPoint();
|
Point point = event.getPoint();
|
||||||
for (Component comp : getComponents()) {
|
for (Component comp : getComponents()) {
|
||||||
if (isPointOnIcon(comp, point)) {
|
if (DiscoveryUiUtils.isPointOnIcon(comp, point)) {
|
||||||
String toolTip = ((JComponent) comp).getToolTipText();
|
String toolTip = ((JComponent) comp).getToolTipText();
|
||||||
if (toolTip == null || toolTip.isEmpty()) {
|
if (toolTip == null || toolTip.isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
@ -248,15 +177,4 @@ public class DocumentPanel extends javax.swing.JPanel implements ListCellRendere
|
|||||||
return null;
|
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,20 @@
|
|||||||
/*
|
/*
|
||||||
* To change this license header, choose License Headers in Project Properties.
|
* Autopsy
|
||||||
* To change this template file, choose Tools | Templates
|
*
|
||||||
* and open the template in the editor.
|
* Copyright 2020 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.filequery;
|
package org.sleuthkit.autopsy.filequery;
|
||||||
|
|
||||||
@ -12,17 +25,17 @@ import javax.swing.event.ListSelectionListener;
|
|||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
* A JPanel to display document previews.
|
||||||
* @author wschaefer
|
|
||||||
*/
|
*/
|
||||||
public class DocumentViewer extends javax.swing.JPanel {
|
public class DocumentPreviewViewer extends javax.swing.JPanel {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
private final DefaultListModel<DocumentWrapper> documentListModel = new DefaultListModel<>();
|
private final DefaultListModel<DocumentWrapper> documentListModel = new DefaultListModel<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates new form DocumentViewer
|
* Creates new form DocumentViewer
|
||||||
*/
|
*/
|
||||||
public DocumentViewer() {
|
public DocumentPreviewViewer() {
|
||||||
initComponents();
|
initComponents();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,6 +72,9 @@ public class DocumentViewer extends javax.swing.JPanel {
|
|||||||
);
|
);
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the list of documents being displayed.
|
||||||
|
*/
|
||||||
void clearViewer() {
|
void clearViewer() {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
documentListModel.removeAllElements();
|
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.
|
* @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);
|
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<AbstractFile> getInstancesForSelected() {
|
List<AbstractFile> getInstancesForSelected() {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
if (documentList.getSelectedIndex() == -1) {
|
if (documentList.getSelectedIndex() == -1) {
|
||||||
@ -90,6 +114,12 @@ public class DocumentViewer extends javax.swing.JPanel {
|
|||||||
private javax.swing.JScrollPane documentScrollPane;
|
private javax.swing.JScrollPane documentScrollPane;
|
||||||
// End of variables declaration//GEN-END:variables
|
// 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) {
|
void addDocument(DocumentWrapper documentWrapper) {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
documentListModel.addElement(documentWrapper);
|
documentListModel.addElement(documentWrapper);
|
@ -18,22 +18,20 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.filequery;
|
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 {
|
public class DocumentWrapper {
|
||||||
|
|
||||||
private String preview;
|
private String preview;
|
||||||
private final ResultFile resultFile;
|
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
|
* @param file The ResultFile which represents the document which the
|
||||||
* summary is created for.
|
* preview summary is created for.
|
||||||
*/
|
*/
|
||||||
DocumentWrapper(ResultFile file) {
|
DocumentWrapper(ResultFile file) {
|
||||||
this.preview = "Preview being generated.";
|
this.preview = "Preview being generated.";
|
||||||
@ -43,18 +41,19 @@ public class DocumentWrapper {
|
|||||||
/**
|
/**
|
||||||
* Set the preview summary which exists.
|
* 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) {
|
void setPreview(String preview) {
|
||||||
this.preview = summary;
|
this.preview = preview;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the ResultFile which represents the document the preview summary was
|
* Get the ResultFile which represents the document the preview summary was
|
||||||
* created for.
|
* created for.
|
||||||
*
|
*
|
||||||
* @return The ResultFile which represents the image file which the
|
* @return The ResultFile which represents the document file which the
|
||||||
* thumbnail was created for.
|
* preview was created for.
|
||||||
*/
|
*/
|
||||||
ResultFile getResultFile() {
|
ResultFile getResultFile() {
|
||||||
return resultFile;
|
return resultFile;
|
||||||
|
@ -511,6 +511,16 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
|
|||||||
notableFilterSettings(false, false, false);
|
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) {
|
private void documentsSelected(boolean enabled, boolean resetSelected) {
|
||||||
dataSourceFilterSettings(true, enabled, !resetSelected && dataSourceCheckbox.isSelected(), null);
|
dataSourceFilterSettings(true, enabled, !resetSelected && dataSourceCheckbox.isSelected(), null);
|
||||||
sizeFilterSettings(true, enabled, !resetSelected && sizeCheckbox.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) {
|
void setSelectedType(FileType type) {
|
||||||
fileType = type;
|
fileType = type;
|
||||||
setUpSizeFilter();
|
setUpSizeFilter();
|
||||||
if (fileType == FileType.IMAGE) {
|
if (null != fileType) {
|
||||||
imagesSelected(true, true);
|
switch (fileType) {
|
||||||
} else if (fileType == FileType.VIDEO) {
|
case IMAGE:
|
||||||
videosSelected(true, true);
|
imagesSelected(true, true);
|
||||||
} else if (fileType == FileType.DOCUMENTS) {
|
break;
|
||||||
documentsSelected(true, true);
|
case VIDEO:
|
||||||
|
videosSelected(true, true);
|
||||||
|
break;
|
||||||
|
case DOCUMENTS:
|
||||||
|
documentsSelected(true, true);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
validateFields();
|
validateFields();
|
||||||
}
|
}
|
||||||
@ -1792,10 +1810,20 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
|
|||||||
} else {
|
} else {
|
||||||
DiscoveryTopComponent.getTopComponent().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
|
DiscoveryTopComponent.getTopComponent().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
|
||||||
}
|
}
|
||||||
if (fileType == FileType.IMAGE) {
|
if (null != fileType) {
|
||||||
imagesSelected(enabled, false);
|
switch (fileType) {
|
||||||
} else if (fileType == FileType.VIDEO) {
|
case IMAGE:
|
||||||
videosSelected(enabled, false);
|
imagesSelected(enabled, false);
|
||||||
|
break;
|
||||||
|
case VIDEO:
|
||||||
|
videosSelected(enabled, false);
|
||||||
|
break;
|
||||||
|
case DOCUMENTS:
|
||||||
|
documentsSelected(enabled, false);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
searchButton.setEnabled(enabled);
|
searchButton.setEnabled(enabled);
|
||||||
cancelButton.setEnabled(!enabled);
|
cancelButton.setEnabled(!enabled);
|
||||||
|
@ -101,15 +101,17 @@
|
|||||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||||
<Image iconType="3" name="/org/sleuthkit/autopsy/images/file-icon-deleted.png"/>
|
<Image iconType="3" name="/org/sleuthkit/autopsy/images/file-icon-deleted.png"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="toolTipText" type="java.lang.String" value=""/>
|
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/filequery/Bundle.properties" key="ImageThumbnailPanel.isDeletedLabel.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new Dimension(ICON_SIZE,ICON_SIZE)" type="code"/>
|
<Connection code="new Dimension(org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize(),org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize())" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new Dimension(ICON_SIZE,ICON_SIZE)" type="code"/>
|
<Connection code="new Dimension(org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize(),org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize())" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new Dimension(ICON_SIZE,ICON_SIZE)" type="code"/>
|
<Connection code="new Dimension(org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize(),org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize())" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
@ -120,13 +122,13 @@
|
|||||||
</Property>
|
</Property>
|
||||||
<Property name="toolTipText" type="java.lang.String" value=""/>
|
<Property name="toolTipText" type="java.lang.String" value=""/>
|
||||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new Dimension(ICON_SIZE,ICON_SIZE)" type="code"/>
|
<Connection code="new Dimension(org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize(),org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize())" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new Dimension(ICON_SIZE,ICON_SIZE)" type="code"/>
|
<Connection code="new Dimension(org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize(),org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize())" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new Dimension(ICON_SIZE,ICON_SIZE)" type="code"/>
|
<Connection code="new Dimension(org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize(),org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize())" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
|
@ -27,7 +27,6 @@ import javax.swing.ImageIcon;
|
|||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.JList;
|
import javax.swing.JList;
|
||||||
import javax.swing.ListCellRenderer;
|
import javax.swing.ListCellRenderer;
|
||||||
import org.openide.util.ImageUtilities;
|
|
||||||
import org.openide.util.NbBundle;
|
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 long serialVersionUID = 1L;
|
||||||
private static final Color SELECTION_COLOR = new Color(0, 120, 215);
|
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
|
* 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));
|
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.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/file-icon-deleted.png"))); // NOI18N
|
||||||
isDeletedLabel.setToolTipText("");
|
isDeletedLabel.setToolTipText(org.openide.util.NbBundle.getMessage(ImageThumbnailPanel.class, "ImageThumbnailPanel.isDeletedLabel.toolTipText")); // NOI18N
|
||||||
isDeletedLabel.setMaximumSize(new Dimension(ICON_SIZE,ICON_SIZE));
|
isDeletedLabel.setMaximumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize()));
|
||||||
isDeletedLabel.setMinimumSize(new Dimension(ICON_SIZE,ICON_SIZE));
|
isDeletedLabel.setMinimumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize()));
|
||||||
isDeletedLabel.setPreferredSize(new Dimension(ICON_SIZE,ICON_SIZE));
|
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.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/red-circle-exclamation.png"))); // NOI18N
|
||||||
scoreLabel.setToolTipText("");
|
scoreLabel.setToolTipText("");
|
||||||
scoreLabel.setMaximumSize(new Dimension(ICON_SIZE,ICON_SIZE));
|
scoreLabel.setMaximumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize()));
|
||||||
scoreLabel.setMinimumSize(new Dimension(ICON_SIZE,ICON_SIZE));
|
scoreLabel.setMinimumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize()));
|
||||||
scoreLabel.setPreferredSize(new Dimension(ICON_SIZE,ICON_SIZE));
|
scoreLabel.setPreferredSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize()));
|
||||||
|
|
||||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||||
this.setLayout(layout);
|
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."})
|
"ImageThumbnailPanel.isDeleted.text=All instances of file are deleted."})
|
||||||
@Override
|
@Override
|
||||||
public Component getListCellRendererComponent(JList<? extends ImageThumbnailWrapper> list, ImageThumbnailWrapper value, int index, boolean isSelected, boolean cellHasFocus) {
|
public Component getListCellRendererComponent(JList<? extends ImageThumbnailWrapper> 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()));
|
countLabel.setText(Bundle.ImageThumbnailPanel_countLabel_text(value.getResultFile().getAllInstances().size()));
|
||||||
thumbnailLabel.setIcon(new ImageIcon(value.getThumbnail()));
|
thumbnailLabel.setIcon(new ImageIcon(value.getThumbnail()));
|
||||||
if (value.getResultFile().isDeleted()) {
|
DiscoveryUiUtils.setDeletedIcon(value.getResultFile().isDeleted(), isDeletedLabel);
|
||||||
isDeletedLabel.setIcon(DELETED_ICON);
|
DiscoveryUiUtils.setScoreIcon(value.getResultFile(), scoreLabel);
|
||||||
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());
|
|
||||||
setBackground(isSelected ? SELECTION_COLOR : list.getBackground());
|
setBackground(isSelected ? SELECTION_COLOR : list.getBackground());
|
||||||
|
|
||||||
return this;
|
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
|
@Override
|
||||||
public String getToolTipText(MouseEvent event) {
|
public String getToolTipText(MouseEvent event) {
|
||||||
if (event != null) {
|
if (event != null) {
|
||||||
//gets tooltip of internal panel item mouse is over
|
//gets tooltip of internal panel item mouse is over
|
||||||
Point point = event.getPoint();
|
Point point = event.getPoint();
|
||||||
for (Component comp : getComponents()) {
|
for (Component comp : getComponents()) {
|
||||||
if (isPointOnIcon(comp, point)) {
|
if (DiscoveryUiUtils.isPointOnIcon(comp, point)) {
|
||||||
String toolTip = ((JComponent) comp).getToolTipText();
|
String toolTip = ((JComponent) comp).getToolTipText();
|
||||||
if (toolTip == null || toolTip.isEmpty()) {
|
if (toolTip == null || toolTip.isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
@ -234,16 +163,5 @@ public class ImageThumbnailPanel extends javax.swing.JPanel implements ListCellR
|
|||||||
return null;
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ public class ResultsPanel extends javax.swing.JPanel {
|
|||||||
private final static Logger logger = Logger.getLogger(ResultsPanel.class.getName());
|
private final static Logger logger = Logger.getLogger(ResultsPanel.class.getName());
|
||||||
private final VideoThumbnailViewer videoThumbnailViewer;
|
private final VideoThumbnailViewer videoThumbnailViewer;
|
||||||
private final ImageThumbnailViewer imageThumbnailViewer;
|
private final ImageThumbnailViewer imageThumbnailViewer;
|
||||||
private final DocumentViewer documentViewer;
|
private final DocumentPreviewViewer documentPreviewViewer;
|
||||||
private List<FileSearchFiltering.FileFilter> searchFilters;
|
private List<FileSearchFiltering.FileFilter> searchFilters;
|
||||||
private FileSearch.AttributeType groupingAttribute;
|
private FileSearch.AttributeType groupingAttribute;
|
||||||
private FileGroup.GroupSortingAlgorithm groupSort;
|
private FileGroup.GroupSortingAlgorithm groupSort;
|
||||||
@ -90,7 +90,7 @@ public class ResultsPanel extends javax.swing.JPanel {
|
|||||||
initComponents();
|
initComponents();
|
||||||
imageThumbnailViewer = new ImageThumbnailViewer();
|
imageThumbnailViewer = new ImageThumbnailViewer();
|
||||||
videoThumbnailViewer = new VideoThumbnailViewer();
|
videoThumbnailViewer = new VideoThumbnailViewer();
|
||||||
documentViewer = new DocumentViewer();
|
documentPreviewViewer = new DocumentPreviewViewer();
|
||||||
videoThumbnailViewer.addListSelectionListener((e) -> {
|
videoThumbnailViewer.addListSelectionListener((e) -> {
|
||||||
if (resultType == FileSearchData.FileType.VIDEO) {
|
if (resultType == FileSearchData.FileType.VIDEO) {
|
||||||
if (!e.getValueIsAdjusting()) {
|
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 (resultType == FileSearchData.FileType.DOCUMENTS) {
|
||||||
if (!e.getValueIsAdjusting()) {
|
if (!e.getValueIsAdjusting()) {
|
||||||
populateInstancesList();
|
populateInstancesList();
|
||||||
@ -201,12 +201,17 @@ public class ResultsPanel extends javax.swing.JPanel {
|
|||||||
* selected in the results viewer area.
|
* selected in the results viewer area.
|
||||||
*/
|
*/
|
||||||
private List<AbstractFile> getInstancesForSelected() {
|
private List<AbstractFile> getInstancesForSelected() {
|
||||||
if (resultType == FileSearchData.FileType.VIDEO) {
|
if (null != resultType) {
|
||||||
return videoThumbnailViewer.getInstancesForSelected();
|
switch (resultType) {
|
||||||
} else if (resultType == FileSearchData.FileType.IMAGE) {
|
case VIDEO:
|
||||||
return imageThumbnailViewer.getInstancesForSelected();
|
return videoThumbnailViewer.getInstancesForSelected();
|
||||||
} else if (resultType == FileSearchData.FileType.DOCUMENTS) {
|
case IMAGE:
|
||||||
return documentViewer.getInstancesForSelected();
|
return imageThumbnailViewer.getInstancesForSelected();
|
||||||
|
case DOCUMENTS:
|
||||||
|
return documentPreviewViewer.getInstancesForSelected();
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
@ -223,15 +228,23 @@ public class ResultsPanel extends javax.swing.JPanel {
|
|||||||
currentPage = pageRetrievedEvent.getPageNumber();
|
currentPage = pageRetrievedEvent.getPageNumber();
|
||||||
updateControls();
|
updateControls();
|
||||||
resetResultViewer();
|
resetResultViewer();
|
||||||
if (pageRetrievedEvent.getType() == FileSearchData.FileType.IMAGE) {
|
if (null != pageRetrievedEvent.getType()) {
|
||||||
populateImageViewer(pageRetrievedEvent.getSearchResults());
|
switch (pageRetrievedEvent.getType()) {
|
||||||
resultsViewerPanel.add(imageThumbnailViewer);
|
case IMAGE:
|
||||||
} else if (pageRetrievedEvent.getType() == FileSearchData.FileType.VIDEO) {
|
populateImageViewer(pageRetrievedEvent.getSearchResults());
|
||||||
populateVideoViewer(pageRetrievedEvent.getSearchResults());
|
resultsViewerPanel.add(imageThumbnailViewer);
|
||||||
resultsViewerPanel.add(videoThumbnailViewer);
|
break;
|
||||||
} else if (pageRetrievedEvent.getType() == FileSearchData.FileType.DOCUMENTS) {
|
case VIDEO:
|
||||||
populateDocumentViewer(pageRetrievedEvent.getSearchResults());
|
populateVideoViewer(pageRetrievedEvent.getSearchResults());
|
||||||
resultsViewerPanel.add(documentViewer);
|
resultsViewerPanel.add(videoThumbnailViewer);
|
||||||
|
break;
|
||||||
|
case DOCUMENTS:
|
||||||
|
populateDocumentViewer(pageRetrievedEvent.getSearchResults());
|
||||||
|
resultsViewerPanel.add(documentPreviewViewer);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
resultsViewerPanel.revalidate();
|
resultsViewerPanel.revalidate();
|
||||||
resultsViewerPanel.repaint();
|
resultsViewerPanel.repaint();
|
||||||
@ -246,7 +259,7 @@ public class ResultsPanel extends javax.swing.JPanel {
|
|||||||
synchronized void resetResultViewer() {
|
synchronized void resetResultViewer() {
|
||||||
resultsViewerPanel.remove(imageThumbnailViewer);
|
resultsViewerPanel.remove(imageThumbnailViewer);
|
||||||
resultsViewerPanel.remove(videoThumbnailViewer);
|
resultsViewerPanel.remove(videoThumbnailViewer);
|
||||||
resultsViewerPanel.remove(documentViewer);
|
resultsViewerPanel.remove(documentPreviewViewer);
|
||||||
//cancel any unfished thumb workers
|
//cancel any unfished thumb workers
|
||||||
for (SwingWorker<Void, Void> thumbWorker : resultContentWorkers) {
|
for (SwingWorker<Void, Void> thumbWorker : resultContentWorkers) {
|
||||||
if (!thumbWorker.isDone()) {
|
if (!thumbWorker.isDone()) {
|
||||||
@ -257,7 +270,7 @@ public class ResultsPanel extends javax.swing.JPanel {
|
|||||||
resultContentWorkers.clear();
|
resultContentWorkers.clear();
|
||||||
videoThumbnailViewer.clearViewer();
|
videoThumbnailViewer.clearViewer();
|
||||||
imageThumbnailViewer.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<ResultFile> files) {
|
synchronized void populateDocumentViewer(List<ResultFile> files) {
|
||||||
for (ResultFile file : files) {
|
for (ResultFile file : files) {
|
||||||
DocumentSummaryWorker documentWorker = new DocumentSummaryWorker(file);
|
DocumentPreviewWorker documentWorker = new DocumentPreviewWorker(file);
|
||||||
documentWorker.execute();
|
documentWorker.execute();
|
||||||
//keep track of thumb worker for possible cancelation
|
//keep track of thumb worker for possible cancelation
|
||||||
resultContentWorkers.add(documentWorker);
|
resultContentWorkers.add(documentWorker);
|
||||||
@ -332,7 +351,7 @@ public class ResultsPanel extends javax.swing.JPanel {
|
|||||||
updateControls();
|
updateControls();
|
||||||
videoThumbnailViewer.clearViewer();
|
videoThumbnailViewer.clearViewer();
|
||||||
imageThumbnailViewer.clearViewer();
|
imageThumbnailViewer.clearViewer();
|
||||||
documentViewer.clearViewer();
|
documentPreviewViewer.clearViewer();
|
||||||
resultsViewerPanel.revalidate();
|
resultsViewerPanel.revalidate();
|
||||||
resultsViewerPanel.repaint();
|
resultsViewerPanel.repaint();
|
||||||
});
|
});
|
||||||
@ -723,29 +742,29 @@ public class ResultsPanel extends javax.swing.JPanel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Swing worker to handle the retrieval of image thumbnails and population
|
* Swing worker to handle the retrieval of document previews and population
|
||||||
* of the Image Thumbnail Viewer.
|
* of the Document Preview Viewer.
|
||||||
*/
|
*/
|
||||||
private class DocumentSummaryWorker extends SwingWorker<Void, Void> {
|
private class DocumentPreviewWorker extends SwingWorker<Void, Void> {
|
||||||
|
|
||||||
private final DocumentWrapper documentWrapper;
|
private final DocumentWrapper documentWrapper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new ImageThumbnailWorker.
|
* Construct a new DocumentPreviewWorker.
|
||||||
*
|
*
|
||||||
* @param file The ResultFile which represents the image file thumbnails
|
* @param file The ResultFile which represents the document file a
|
||||||
* are being retrieved for.
|
* preview is being retrieved for.
|
||||||
*/
|
*/
|
||||||
DocumentSummaryWorker(ResultFile file) {
|
DocumentPreviewWorker(ResultFile file) {
|
||||||
documentWrapper = new DocumentWrapper(file);
|
documentWrapper = new DocumentWrapper(file);
|
||||||
documentViewer.addDocument(documentWrapper);
|
documentPreviewViewer.addDocument(documentWrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Void doInBackground() throws Exception {
|
protected Void doInBackground() throws Exception {
|
||||||
String preview = createPreview(documentWrapper.getResultFile().getFirstInstance());
|
String preview = createPreview(documentWrapper.getResultFile().getFirstInstance());
|
||||||
if (preview != null) {
|
if (preview != null) {
|
||||||
documentWrapper.setSummary(preview);
|
documentWrapper.setPreview(preview);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -779,7 +798,7 @@ public class ResultsPanel extends javax.swing.JPanel {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void done() {
|
protected void done() {
|
||||||
documentViewer.repaint();
|
documentPreviewViewer.repaint();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -75,13 +75,13 @@
|
|||||||
<Image iconType="3" name="/org/sleuthkit/autopsy/images/red-circle-exclamation.png"/>
|
<Image iconType="3" name="/org/sleuthkit/autopsy/images/red-circle-exclamation.png"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new Dimension(ICON_SIZE,ICON_SIZE)" type="code"/>
|
<Connection code="new Dimension(org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize(),org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize())" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new Dimension(ICON_SIZE,ICON_SIZE)" type="code"/>
|
<Connection code="new Dimension(org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize(),org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize())" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new Dimension(ICON_SIZE,ICON_SIZE)" type="code"/>
|
<Connection code="new Dimension(org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize(),org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize())" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
@ -91,13 +91,13 @@
|
|||||||
<Image iconType="3" name="/org/sleuthkit/autopsy/images/file-icon-deleted.png"/>
|
<Image iconType="3" name="/org/sleuthkit/autopsy/images/file-icon-deleted.png"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new Dimension(ICON_SIZE,ICON_SIZE)" type="code"/>
|
<Connection code="new Dimension(org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize(),org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize())" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new Dimension(ICON_SIZE,ICON_SIZE)" type="code"/>
|
<Connection code="new Dimension(org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize(),org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize())" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new Dimension(ICON_SIZE,ICON_SIZE)" type="code"/>
|
<Connection code="new Dimension(org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize(),org.sleuthkit.autopsy.filequery.DiscoveryUiUtils.getIconSize())" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
|
@ -31,7 +31,6 @@ import javax.swing.JComponent;
|
|||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JList;
|
import javax.swing.JList;
|
||||||
import javax.swing.ListCellRenderer;
|
import javax.swing.ListCellRenderer;
|
||||||
import org.openide.util.ImageUtilities;
|
|
||||||
import org.openide.util.NbBundle.Messages;
|
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 int GAP_SIZE = 4;
|
||||||
private static final Color SELECTION_COLOR = new Color(0, 120, 215);
|
private static final Color SELECTION_COLOR = new Color(0, 120, 215);
|
||||||
private static final int BYTE_UNIT_CONVERSION = 1000;
|
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;
|
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());
|
imagePanel.setLayout(new java.awt.GridBagLayout());
|
||||||
|
|
||||||
scoreLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/red-circle-exclamation.png"))); // NOI18N
|
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.setMaximumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize()));
|
||||||
scoreLabel.setMinimumSize(new Dimension(ICON_SIZE,ICON_SIZE));
|
scoreLabel.setMinimumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize()));
|
||||||
scoreLabel.setPreferredSize(new Dimension(ICON_SIZE,ICON_SIZE));
|
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.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.setMaximumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize()));
|
||||||
deletedLabel.setMinimumSize(new Dimension(ICON_SIZE,ICON_SIZE));
|
deletedLabel.setMinimumSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize()));
|
||||||
deletedLabel.setPreferredSize(new Dimension(ICON_SIZE,ICON_SIZE));
|
deletedLabel.setPreferredSize(new Dimension(DiscoveryUiUtils.getIconSize(),DiscoveryUiUtils.getIconSize()));
|
||||||
|
|
||||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||||
this.setLayout(layout);
|
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()));
|
countLabel.setText(Bundle.VideoThumbnailPanel_countLabel_text(value.getResultFile().getAllInstances().size()));
|
||||||
addThumbnails(value);
|
addThumbnails(value);
|
||||||
imagePanel.setBackground(isSelected ? SELECTION_COLOR : list.getBackground());
|
imagePanel.setBackground(isSelected ? SELECTION_COLOR : list.getBackground());
|
||||||
if (value.getResultFile().isDeleted()) {
|
DiscoveryUiUtils.setDeletedIcon(value.getResultFile().isDeleted(), deletedLabel);
|
||||||
deletedLabel.setIcon(DELETED_ICON);
|
DiscoveryUiUtils.setScoreIcon(value.getResultFile(), scoreLabel);
|
||||||
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());
|
|
||||||
setBackground(isSelected ? SELECTION_COLOR : list.getBackground());
|
setBackground(isSelected ? SELECTION_COLOR : list.getBackground());
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -253,7 +227,7 @@ final class VideoThumbnailPanel extends javax.swing.JPanel implements ListCellRe
|
|||||||
//gets tooltip of internal panel item mouse is over
|
//gets tooltip of internal panel item mouse is over
|
||||||
Point point = event.getPoint();
|
Point point = event.getPoint();
|
||||||
for (Component comp : getComponents()) {
|
for (Component comp : getComponents()) {
|
||||||
if (isPointOnIcon(comp, point)) {
|
if (DiscoveryUiUtils.isPointOnIcon(comp, point)) {
|
||||||
String toolTip = ((JComponent) comp).getToolTipText();
|
String toolTip = ((JComponent) comp).getToolTipText();
|
||||||
if (toolTip == null || toolTip.isEmpty()) {
|
if (toolTip == null || toolTip.isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
@ -266,15 +240,4 @@ final class VideoThumbnailPanel extends javax.swing.JPanel implements ListCellRe
|
|||||||
return null;
|
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user