From 90ae935c005a6702302c4801f1e7fcae2b6fceac Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Fri, 11 Jun 2021 14:31:03 -0400 Subject: [PATCH 01/12] use analysis result for unique path --- .../datamodel/BlackboardArtifactNode.java | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java index 1068c72973..f048a84663 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java @@ -80,6 +80,7 @@ import static org.sleuthkit.autopsy.datamodel.AbstractContentNode.NO_DESCR; import org.sleuthkit.autopsy.texttranslation.TextTranslationService; import org.sleuthkit.autopsy.datamodel.utils.FileNameTransTask; import org.sleuthkit.datamodel.AnalysisResult; +import org.sleuthkit.datamodel.BlackboardArtifact.Category; import org.sleuthkit.datamodel.Score; /** @@ -109,17 +110,6 @@ public class BlackboardArtifactNode extends AbstractContentNode Date: Wed, 16 Jun 2021 13:17:06 -0400 Subject: [PATCH 02/12] pre-expand nodes no longer on tree listener and optimally loads root level nodes before expansion --- .../sleuthkit/autopsy/datamodel/HostNode.java | 2 +- .../DirectoryTreeTopComponent.java | 61 ++++++------------- 2 files changed, 19 insertions(+), 44 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/HostNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/HostNode.java index b05bca24a1..b060c63c08 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/HostNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/HostNode.java @@ -226,7 +226,7 @@ public class HostNode extends DisplayableItemNode { * @param hostGrouping The HostGrouping key. */ HostNode(HostGrouping hostGrouping) { - this(Children.create(new HostGroupingChildren(HOST_GROUPING_CONVERTER, hostGrouping.getHost()), false), hostGrouping.getHost()); + this(Children.create(new HostGroupingChildren(HOST_GROUPING_CONVERTER, hostGrouping.getHost()), true), hostGrouping.getHost()); } /** diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java index 26e4518cea..2736c6f6cb 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java @@ -33,6 +33,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.logging.Level; import java.util.prefs.PreferenceChangeEvent; @@ -134,31 +135,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat // only allow one item to be selected at a time getTree().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); - //Hook into the JTree and pre-expand the Views Node and Results node when a user - //expands an item in the tree that makes these nodes visible. - ((ExpansionBeanTreeView) getTree()).addTreeExpansionListener(new TreeExpansionListener() { - @Override - public void treeExpanded(TreeExpansionEvent event) { - //Bail immediately if we are not in the Group By view. - //Assumption here is that the views are already expanded. - if (!CasePreferences.getGroupItemsInTreeByDataSource()) { - return; - } - Node expandedNode = Visualizer.findNode(event.getPath().getLastPathComponent()); - for (Node child : em.getRootContext().getChildren().getNodes()) { - if (child.equals(expandedNode)) { - preExpandNodes(child.getChildren()); - } - } - } - - @Override - public void treeCollapsed(TreeExpansionEvent event) { - //Do nothing - } - - }); // remove the close button putClientProperty(TopComponent.PROP_CLOSING_DISABLED, Boolean.TRUE); setName(NbBundle.getMessage(DirectoryTreeTopComponent.class, "CTL_DirectoryTreeTopComponent")); @@ -201,30 +178,28 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat */ private void preExpandNodes(Children rootChildren) { BeanTreeView tree = getTree(); - for (String categoryKey : new String[]{AnalysisResults.getName(), DataArtifacts.getName()}) { - Node categoryNode = rootChildren.findChild(categoryKey); - if (!Objects.isNull(categoryNode)) { - tree.expandNode(categoryNode); - Children resultsChildren = categoryNode.getChildren(); - Arrays.stream(resultsChildren.getNodes()).forEach(tree::expandNode); - } - } - - Node views = rootChildren.findChild(ViewsNode.NAME); - if (!Objects.isNull(views)) { - tree.expandNode(views); + // using getNodes(true) to fetch children so that async nodes are loaded + Node[] rootChildrenNodes = rootChildren.getNodes(true); + if (rootChildrenNodes == null || rootChildrenNodes.length < 1) { + return; } // expand all nodes parents of and including hosts if group by host/person if (Objects.equals(CasePreferences.getGroupItemsInTreeByDataSource(), true)) { - Node[] rootNodes = rootChildren.getNodes(); - if (rootNodes != null) { - Stream.of(rootNodes) - .flatMap((n) -> getHostNodesAndParents(n).stream()) - .filter((n) -> n != null) - .forEach((n) -> tree.expandNode(n)); - } + Stream.of(rootChildrenNodes) + .flatMap((n) -> getHostNodesAndParents(n).stream()) + .filter((n) -> n != null) + .forEach(tree::expandNode); + } else { + // nodes to be opened if present at top level + Set resultArtifactNames + = Stream.of(AnalysisResults.getName(), DataArtifacts.getName(), ViewsNode.NAME) + .collect(Collectors.toSet()); + + Stream.of(rootChildrenNodes) + .filter(n -> n != null && resultArtifactNames.contains(n.getName())) + .forEach(tree::expandNode); } } From 4b76e26f2b84adff51de28521ad567bebab00cb7 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Thu, 17 Jun 2021 15:37:32 -0400 Subject: [PATCH 03/12] Made performance changes to improve the opening delay --- .../contentviewer/OtherOccurrencesPanel.form | 2 -- .../contentviewer/OtherOccurrencesPanel.java | 32 +++++++++++++------ .../contentviewers/MediaViewImagePanel.java | 27 +++++++++++----- .../org/sleuthkit/autopsy/core/Installer.java | 9 ++++++ .../autopsy/coreutils/ImageUtils.java | 2 +- 5 files changed, 52 insertions(+), 20 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/OtherOccurrencesPanel.form b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/OtherOccurrencesPanel.form index 237bfe4ce8..13284ecec9 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/OtherOccurrencesPanel.form +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/OtherOccurrencesPanel.form @@ -34,8 +34,6 @@ - - diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/OtherOccurrencesPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/OtherOccurrencesPanel.java index c4d0bf0e0a..db5f5c1990 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/OtherOccurrencesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/OtherOccurrencesPanel.java @@ -35,6 +35,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.FutureTask; import java.util.logging.Level; import javax.swing.JFileChooser; import javax.swing.JMenuItem; @@ -71,7 +74,6 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel { private static final CorrelationCaseWrapper NO_ARTIFACTS_CASE = new CorrelationCaseWrapper(Bundle.OtherOccurrencesPanel_table_noArtifacts()); private static final CorrelationCaseWrapper NO_RESULTS_CASE = new CorrelationCaseWrapper(Bundle.OtherOccurrencesPanel_table_noResultsFound()); - private static final CorrelationCaseWrapper LOADING_CASE = new CorrelationCaseWrapper(Bundle.OtherOccurrencesPanel_table_loadingResults()); private static final Logger logger = Logger.getLogger(OtherOccurrencesPanel.class.getName()); private static final long serialVersionUID = 1L; private final OtherOccurrencesFilesTableModel filesTableModel; @@ -84,6 +86,9 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel { private AbstractFile file = null; private SwingWorker worker; + + private final FutureTask futureFileChooser = new FutureTask<>(JFileChooser::new); + private JFileChooser CSVFileChooser; /** * Creates new form OtherOccurrencesPanel @@ -93,9 +98,11 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel { this.casesTableModel = new OtherOccurrencesCasesTableModel(); this.dataSourcesTableModel = new OtherOccurrencesDataSourcesTableModel(); this.correlationAttributes = new ArrayList<>(); - occurrencePanel = new OccurrencePanel(); initComponents(); customizeComponents(); + + ExecutorService executor = Executors.newSingleThreadExecutor(); + executor.execute(futureFileChooser); } private void customizeComponents() { @@ -245,6 +252,15 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel { private void saveToCSV() throws NoCurrentCaseException { if (casesTableModel.getRowCount() > 0) { + + if(CSVFileChooser == null) { + try { + CSVFileChooser = futureFileChooser.get(); + } catch (InterruptedException | ExecutionException ex) { + Exceptions.printStackTrace(ex); + } + } + Calendar now = Calendar.getInstance(); String fileName = String.format("%1$tY%1$tm%1$te%1$tI%1$tM%1$tS_other_data_sources.csv", now); CSVFileChooser.setCurrentDirectory(new File(Case.getCurrentCaseThrows().getExportDirectory())); @@ -258,8 +274,8 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel { if (!selectedFile.getName().endsWith(".csv")) { // NON-NLS selectedFile = new File(selectedFile.toString() + ".csv"); // NON-NLS } - CSVWorker worker = new CSVWorker(selectedFile, file, dataSourceName, deviceId, Collections.unmodifiableCollection(correlationAttributes)); - worker.execute(); + CSVWorker csvWorker = new CSVWorker(selectedFile, file, dataSourceName, deviceId, Collections.unmodifiableCollection(correlationAttributes)); + csvWorker.execute(); } } } @@ -685,7 +701,6 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel { exportToCSVMenuItem = new javax.swing.JMenuItem(); showCaseDetailsMenuItem = new javax.swing.JMenuItem(); showCommonalityMenuItem = new javax.swing.JMenuItem(); - CSVFileChooser = new javax.swing.JFileChooser(); tableContainerPanel = new javax.swing.JPanel(); tablesViewerSplitPane = new javax.swing.JSplitPane(); caseDatasourceFileSplitPane = new javax.swing.JSplitPane(); @@ -704,12 +719,12 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel { filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0)); rightClickPopupMenu.addPopupMenuListener(new javax.swing.event.PopupMenuListener() { - public void popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) { - rightClickPopupMenuPopupMenuWillBecomeVisible(evt); + public void popupMenuCanceled(javax.swing.event.PopupMenuEvent evt) { } public void popupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt) { } - public void popupMenuCanceled(javax.swing.event.PopupMenuEvent evt) { + public void popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) { + rightClickPopupMenuPopupMenuWillBecomeVisible(evt); } }); @@ -857,7 +872,6 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel { // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JFileChooser CSVFileChooser; private javax.swing.JSplitPane caseDatasourceFileSplitPane; private javax.swing.JSplitPane caseDatasourceSplitPane; private javax.swing.JScrollPane caseScrollPane; diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/MediaViewImagePanel.java b/Core/src/org/sleuthkit/autopsy/contentviewers/MediaViewImagePanel.java index 06b0a42fb7..591bed7ff3 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/MediaViewImagePanel.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/MediaViewImagePanel.java @@ -34,6 +34,9 @@ import java.util.Collections; import java.util.List; import static java.util.Objects.nonNull; import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.FutureTask; import java.util.logging.Level; import java.util.stream.Collectors; import javafx.application.Platform; @@ -69,6 +72,7 @@ import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import org.apache.commons.io.FilenameUtils; import org.controlsfx.control.MaskerPane; +import org.openide.util.Exceptions; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.actions.GetTagNameAndCommentDialog; import org.sleuthkit.autopsy.actions.GetTagNameAndCommentDialog.TagNameAndComment; @@ -150,7 +154,7 @@ class MediaViewImagePanel extends JPanel implements MediaFileViewer.MediaViewPan @ThreadConfined(type = ThreadConfined.ThreadType.AWT) private final JMenuItem exportTagsMenuItem; @ThreadConfined(type = ThreadConfined.ThreadType.AWT) - private final JFileChooser exportChooser; + private JFileChooser exportChooser; @ThreadConfined(type = ThreadConfined.ThreadType.AWT) private final JFXPanel fxPanel; @@ -189,10 +193,8 @@ class MediaViewImagePanel extends JPanel implements MediaFileViewer.MediaViewPan @ThreadConfined(type = ThreadConfined.ThreadType.JFX) private Task readImageFileTask; private volatile ImageTransforms imageTransforms; - - static { - ImageIO.scanForPlugins(); - } + + private final FutureTask futureFileChooser = new FutureTask<>(JFileChooser::new); /** * Constructs a media image file viewer implemented as a Swing panel that @@ -210,9 +212,9 @@ class MediaViewImagePanel extends JPanel implements MediaFileViewer.MediaViewPan initComponents(); imageTransforms = new ImageTransforms(0, 0, true); - - exportChooser = new JFileChooser(); - exportChooser.setDialogTitle(Bundle.MediaViewImagePanel_fileChooserTitle()); + + ExecutorService executor = Executors.newSingleThreadExecutor(); + executor.execute(futureFileChooser); //Build popupMenu when Tags Menu button is pressed. imageTaggingOptions = new JPopupMenu(); @@ -1043,6 +1045,15 @@ class MediaViewImagePanel extends JPanel implements MediaFileViewer.MediaViewPan final AbstractFile file = imageFile; tagsGroup.clearFocus(); SwingUtilities.invokeLater(() -> { + + if(exportChooser == null) { + try { + exportChooser = futureFileChooser.get(); + } catch (InterruptedException | ExecutionException ex) { + Exceptions.printStackTrace(ex); + } + } + exportChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); //Always base chooser location to export folder exportChooser.setCurrentDirectory(new File(Case.getCurrentCase().getExportDirectory())); diff --git a/Core/src/org/sleuthkit/autopsy/core/Installer.java b/Core/src/org/sleuthkit/autopsy/core/Installer.java index 5bd649e8cb..7411377733 100644 --- a/Core/src/org/sleuthkit/autopsy/core/Installer.java +++ b/Core/src/org/sleuthkit/autopsy/core/Installer.java @@ -33,6 +33,7 @@ import java.util.logging.Handler; import java.util.logging.Level; import javafx.application.Platform; import javafx.embed.swing.JFXPanel; +import javax.imageio.ImageIO; import net.sf.sevenzipjbinding.SevenZip; import net.sf.sevenzipjbinding.SevenZipNativeInitializationException; import org.apache.commons.io.FileUtils; @@ -44,6 +45,7 @@ import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.actions.IngestRunningCheck; import org.sleuthkit.autopsy.casemodule.Case; import static org.sleuthkit.autopsy.core.UserPreferences.SETTINGS_PROPERTIES; +import org.sleuthkit.autopsy.corelibs.OpenCvLoader; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.coreutils.ModuleSettings; @@ -66,6 +68,13 @@ public class Installer extends ModuleInstall { static { loadDynLibraries(); + + // This call was moved from MediaViewImagePanel so that it is + // not called during top level component construction. + ImageIO.scanForPlugins(); + + // This will cause OpenCvLoader to load its library instead of + OpenCvLoader.openCvIsLoaded(); } private static void loadDynLibraries() { diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java b/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java index 6ae521de1e..8d9c3a02b9 100644 --- a/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java +++ b/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java @@ -194,7 +194,7 @@ public class ImageUtils { public static SortedSet getSupportedImageMimeTypes() { return Collections.unmodifiableSortedSet(SUPPORTED_IMAGE_MIME_TYPES); } - + /** * Get the default thumbnail, which is the icon for a file. Used when we can * not generate a content based thumbnail. From 54e56b9bc2f9901aafb0b2b15df1ccd91820ec34 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Thu, 17 Jun 2021 16:04:35 -0400 Subject: [PATCH 04/12] Tweaked exception handling --- .../contentviewer/OtherOccurrencesPanel.java | 12 ++++++++---- .../autopsy/contentviewers/MediaViewImagePanel.java | 8 ++++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/OtherOccurrencesPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/OtherOccurrencesPanel.java index db5f5c1990..81fac1ebd6 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/OtherOccurrencesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/OtherOccurrencesPanel.java @@ -49,7 +49,6 @@ import javax.swing.SwingWorker; import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; -import org.openide.util.Exceptions; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; @@ -87,6 +86,8 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel { private SwingWorker worker; + // Initializing the JFileChooser in a thread to prevent a block on the EDT + // see https://stackoverflow.com/questions/49792375/jfilechooser-is-very-slow-when-using-windows-look-and-feel private final FutureTask futureFileChooser = new FutureTask<>(JFileChooser::new); private JFileChooser CSVFileChooser; @@ -254,11 +255,14 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel { if (casesTableModel.getRowCount() > 0) { if(CSVFileChooser == null) { - try { + try{ CSVFileChooser = futureFileChooser.get(); } catch (InterruptedException | ExecutionException ex) { - Exceptions.printStackTrace(ex); - } + // If something happened with the thread try and + // initalized the chooser now + logger.log(Level.WARNING, "A failure occurred in the JFileChooser background thread"); + CSVFileChooser = new JFileChooser(); + } } Calendar now = Calendar.getInstance(); diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/MediaViewImagePanel.java b/Core/src/org/sleuthkit/autopsy/contentviewers/MediaViewImagePanel.java index 591bed7ff3..177c397c78 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/MediaViewImagePanel.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/MediaViewImagePanel.java @@ -72,7 +72,6 @@ import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import org.apache.commons.io.FilenameUtils; import org.controlsfx.control.MaskerPane; -import org.openide.util.Exceptions; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.actions.GetTagNameAndCommentDialog; import org.sleuthkit.autopsy.actions.GetTagNameAndCommentDialog.TagNameAndComment; @@ -194,6 +193,8 @@ class MediaViewImagePanel extends JPanel implements MediaFileViewer.MediaViewPan private Task readImageFileTask; private volatile ImageTransforms imageTransforms; + // Initializing the JFileChooser in a thread to prevent a block on the EDT + // see https://stackoverflow.com/questions/49792375/jfilechooser-is-very-slow-when-using-windows-look-and-feel private final FutureTask futureFileChooser = new FutureTask<>(JFileChooser::new); /** @@ -1050,7 +1051,10 @@ class MediaViewImagePanel extends JPanel implements MediaFileViewer.MediaViewPan try { exportChooser = futureFileChooser.get(); } catch (InterruptedException | ExecutionException ex) { - Exceptions.printStackTrace(ex); + // If something happened with the thread try and + // initalized the chooser now + logger.log(Level.WARNING, "A failure occurred in the JFileChooser background thread"); + exportChooser = new JFileChooser(); } } From d461f5a3cf16199c185e22df69a10b4ca537fb45 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Thu, 17 Jun 2021 16:16:17 -0400 Subject: [PATCH 05/12] Added wait cursor --- Core/src/org/sleuthkit/autopsy/casemodule/Case.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index 19d70deb62..40e7dab750 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -22,6 +22,7 @@ import org.sleuthkit.autopsy.featureaccess.FeatureAccessUtils; import com.google.common.annotations.Beta; import com.google.common.eventbus.Subscribe; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import java.awt.Cursor; import org.sleuthkit.autopsy.casemodule.multiusercases.CaseNodeData; import java.awt.Frame; import java.awt.event.ActionEvent; @@ -1324,12 +1325,14 @@ public class Case { * opened via the DirectoryTreeTopComponent 'propertyChange()' * method on a DATA_SOURCE_ADDED event. */ + mainFrame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); if (hasData) { CoreComponentControl.openCoreWindows(); } else { //ensure that the DirectoryTreeTopComponent is open so that it's listener can open the core windows including making it visible. DirectoryTreeTopComponent.findInstance(); } + mainFrame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); /* * Reset the main window title to: From 13365f966297bce3f6f51091df451e4140d36bfa Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Fri, 18 Jun 2021 13:38:35 -0400 Subject: [PATCH 06/12] static field --- .../directorytree/DirectoryTreeTopComponent.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java index 2736c6f6cb..e4904a5cb8 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java @@ -45,14 +45,11 @@ import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; -import javax.swing.event.TreeExpansionEvent; -import javax.swing.event.TreeExpansionListener; import javax.swing.tree.TreeSelectionModel; import org.apache.commons.lang3.StringUtils; import org.openide.explorer.ExplorerManager; import org.openide.explorer.ExplorerUtils; import org.openide.explorer.view.BeanTreeView; -import org.openide.explorer.view.Visualizer; import org.openide.nodes.AbstractNode; import org.openide.nodes.Children; import org.openide.nodes.Node; @@ -127,6 +124,10 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat private static final String GROUPING_THRESHOLD_NAME = "GroupDataSourceThreshold"; private static final String SETTINGS_FILE = "CasePreferences.properties"; //NON-NLS + // nodes to be opened if present at top level + private static final Set NODES_TO_EXPAND = Stream.of(AnalysisResults.getName(), DataArtifacts.getName(), ViewsNode.NAME) + .collect(Collectors.toSet()); + /** * the constructor */ @@ -192,13 +193,8 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat .filter((n) -> n != null) .forEach(tree::expandNode); } else { - // nodes to be opened if present at top level - Set resultArtifactNames - = Stream.of(AnalysisResults.getName(), DataArtifacts.getName(), ViewsNode.NAME) - .collect(Collectors.toSet()); - Stream.of(rootChildrenNodes) - .filter(n -> n != null && resultArtifactNames.contains(n.getName())) + .filter(n -> n != null && NODES_TO_EXPAND.contains(n.getName())) .forEach(tree::expandNode); } } From 1afacd0e7b14e577ebc92a8cb1e9d40667d1070b Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Fri, 18 Jun 2021 14:44:09 -0400 Subject: [PATCH 07/12] move getType to constructor --- .../datamodel/BlackboardArtifactNode.java | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java index f048a84663..f0168936c1 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java @@ -119,6 +119,7 @@ public class BlackboardArtifactNode extends AbstractContentNode Date: Fri, 18 Jun 2021 16:06:08 -0400 Subject: [PATCH 08/12] move to separate method --- .../datamodel/BlackboardArtifactNode.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java index f0168936c1..e3bad44705 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java @@ -228,14 +228,7 @@ public class BlackboardArtifactNode extends AbstractContentNode Date: Mon, 21 Jun 2021 14:45:36 -0400 Subject: [PATCH 09/12] 7750 adjust resizing and size of additional report panels --- ...PortableCaseInterestingItemsListPanel.form | 8 ++-- ...PortableCaseInterestingItemsListPanel.java | 4 +- .../PortableCaseTagsListPanel.form | 8 ++-- .../PortableCaseTagsListPanel.java | 4 +- .../infrastructure/ReportVisualPanel2.form | 46 +++++++++---------- .../infrastructure/ReportVisualPanel2.java | 34 +++++++------- ...tWizardPortableCaseOptionsVisualPanel.form | 5 ++ ...tWizardPortableCaseOptionsVisualPanel.java | 2 + 8 files changed, 59 insertions(+), 52 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/PortableCaseInterestingItemsListPanel.form b/Core/src/org/sleuthkit/autopsy/report/infrastructure/PortableCaseInterestingItemsListPanel.form index 9fbe01c27b..3b851901ba 100644 --- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/PortableCaseInterestingItemsListPanel.form +++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/PortableCaseInterestingItemsListPanel.form @@ -57,11 +57,11 @@ - + - - - + + + diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/PortableCaseInterestingItemsListPanel.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/PortableCaseInterestingItemsListPanel.java index dd11137a0a..7de12c20da 100644 --- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/PortableCaseInterestingItemsListPanel.java +++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/PortableCaseInterestingItemsListPanel.java @@ -299,10 +299,10 @@ class PortableCaseInterestingItemsListPanel extends javax.swing.JPanel { .addGroup(jPanel1Layout.createSequentialGroup() .addGap(6, 6, 6) .addComponent(descLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jAllSetsCheckBox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 164, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 159, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(selectButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/PortableCaseTagsListPanel.form b/Core/src/org/sleuthkit/autopsy/report/infrastructure/PortableCaseTagsListPanel.form index 0757f14756..7828a13fd3 100644 --- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/PortableCaseTagsListPanel.form +++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/PortableCaseTagsListPanel.form @@ -56,11 +56,11 @@ - + - - - + + + diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/PortableCaseTagsListPanel.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/PortableCaseTagsListPanel.java index 2e4a8c98cd..9b65cd3c93 100644 --- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/PortableCaseTagsListPanel.java +++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/PortableCaseTagsListPanel.java @@ -331,10 +331,10 @@ class PortableCaseTagsListPanel extends javax.swing.JPanel { jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(descLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jAllTagsCheckBox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 168, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 163, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(selectButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.form b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.form index bad6a7a7fa..1a6fcfb696 100644 --- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.form +++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.form @@ -26,26 +26,25 @@ - + + + + + - - - - - - - - - + - - - - - + + + + + + + + + - @@ -55,15 +54,15 @@ - + - + - + - + - + @@ -72,12 +71,13 @@ - + + - + diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.java index 5243f2fe63..9a43174ae7 100644 --- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.java @@ -366,21 +366,20 @@ final class ReportVisualPanel2 extends JPanel { .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(allTaggedResultsRadioButton) + .addComponent(dataLabel) + .addComponent(allResultsRadioButton) + .addComponent(specificTaggedResultsRadioButton) .addGroup(layout.createSequentialGroup() - .addGap(27, 27, 27) - .addComponent(tagsScrollPane) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(deselectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(selectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) - .addGroup(layout.createSequentialGroup() + .addGap(10, 10, 10) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(allTaggedResultsRadioButton) - .addComponent(dataLabel) - .addComponent(allResultsRadioButton) - .addComponent(specificTaggedResultsRadioButton) - .addComponent(advancedButton)) - .addGap(0, 454, Short.MAX_VALUE))) + .addComponent(advancedButton) + .addGroup(layout.createSequentialGroup() + .addComponent(tagsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 699, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(deselectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(selectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))))) .addContainerGap()) ); @@ -397,7 +396,7 @@ final class ReportVisualPanel2 extends JPanel { .addComponent(allTaggedResultsRadioButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(specificTaggedResultsRadioButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(selectAllButton) @@ -405,10 +404,11 @@ final class ReportVisualPanel2 extends JPanel { .addComponent(deselectAllButton) .addGap(136, 136, 136)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addComponent(tagsScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(1, 1, 1) + .addComponent(tagsScrollPane) .addGap(5, 5, 5) - .addComponent(advancedButton) - .addContainerGap()))) + .addComponent(advancedButton))) + .addContainerGap()) ); }// //GEN-END:initComponents diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardPortableCaseOptionsVisualPanel.form b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardPortableCaseOptionsVisualPanel.form index 4d404676e0..42a80761d7 100644 --- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardPortableCaseOptionsVisualPanel.form +++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardPortableCaseOptionsVisualPanel.form @@ -1,6 +1,11 @@
+ + + + + diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardPortableCaseOptionsVisualPanel.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardPortableCaseOptionsVisualPanel.java index 4967431884..3e5a76b90e 100644 --- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardPortableCaseOptionsVisualPanel.java +++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardPortableCaseOptionsVisualPanel.java @@ -155,6 +155,8 @@ class ReportWizardPortableCaseOptionsVisualPanel extends javax.swing.JPanel { listPanel = new javax.swing.JPanel(); includeAppCheckbox = new javax.swing.JCheckBox(); + setPreferredSize(new java.awt.Dimension(834, 374)); + chunkSizeComboBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { chunkSizeComboBoxActionPerformed(evt); From 739e8407c8b4a100efc2498a753d6346cc65c733 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 21 Jun 2021 15:49:44 -0400 Subject: [PATCH 10/12] 7750 fix tagged hashes panel sizing. --- .../taggedhashes/SaveTaggedHashesToHashDbConfigPanel.form | 8 ++++---- .../taggedhashes/SaveTaggedHashesToHashDbConfigPanel.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDbConfigPanel.form b/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDbConfigPanel.form index 6047a7a789..f199821d56 100644 --- a/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDbConfigPanel.form +++ b/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDbConfigPanel.form @@ -49,18 +49,18 @@ - + - + - + - + diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDbConfigPanel.java b/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDbConfigPanel.java index 081aa03b61..8409a66d4a 100644 --- a/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDbConfigPanel.java +++ b/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDbConfigPanel.java @@ -322,7 +322,7 @@ class SaveTaggedHashesToHashDbConfigPanel extends javax.swing.JPanel { layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jLabel1) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jAllTagsCheckBox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -330,7 +330,7 @@ class SaveTaggedHashesToHashDbConfigPanel extends javax.swing.JPanel { .addComponent(selectAllButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(deselectAllButton)) - .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 112, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 112, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel2) .addGap(4, 4, 4) @@ -388,6 +388,6 @@ class SaveTaggedHashesToHashDbConfigPanel extends javax.swing.JPanel { private javax.swing.JLabel jLabel2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JButton selectAllButton; - private javax.swing.JList tagNamesListBox; + private javax.swing.JList tagNamesListBox; // End of variables declaration//GEN-END:variables } From 4465462d45602ac00a6ae9d8dd840991e7c26a0b Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 21 Jun 2021 16:45:09 -0400 Subject: [PATCH 11/12] 7750 fix list type --- .../taggedhashes/SaveTaggedHashesToHashDbConfigPanel.form | 2 +- .../taggedhashes/SaveTaggedHashesToHashDbConfigPanel.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDbConfigPanel.form b/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDbConfigPanel.form index f199821d56..cbec9b572d 100644 --- a/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDbConfigPanel.form +++ b/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDbConfigPanel.form @@ -87,7 +87,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDbConfigPanel.java b/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDbConfigPanel.java index 8409a66d4a..afa511657d 100644 --- a/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDbConfigPanel.java +++ b/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDbConfigPanel.java @@ -388,6 +388,6 @@ class SaveTaggedHashesToHashDbConfigPanel extends javax.swing.JPanel { private javax.swing.JLabel jLabel2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JButton selectAllButton; - private javax.swing.JList tagNamesListBox; + private javax.swing.JList tagNamesListBox; // End of variables declaration//GEN-END:variables } From 0af3dd1d8ef43e8dfc5dffffa3c05ae7d8b9d7f6 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Tue, 22 Jun 2021 14:39:19 -0400 Subject: [PATCH 12/12] fix for bundle spelling --- .../centralrepository/contentviewer/Bundle.properties-MERGED | 2 +- .../centralrepository/contentviewer/OtherOccurrencesPanel.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/Bundle.properties-MERGED index e4507c7d3b..a97cc319da 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/Bundle.properties-MERGED @@ -43,5 +43,5 @@ OtherOccurrencesPanel.showCommonalityMenuItem.text=Show Frequency OtherOccurrencesPanel.showCaseDetailsMenuItem.text=Show Case Details OtherOccurrencesPanel.table.noArtifacts=Item has no attributes with which to search. OtherOccurrencesPanel.table.noResultsFound=No results found. -OtherOccurrencesPanel_earliestCaseNotAvailable=Not Availble. +OtherOccurrencesPanel_earliestCaseNotAvailable=Not Available. OtherOccurrencesPanel_table_loadingResults=Loading results diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/OtherOccurrencesPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/OtherOccurrencesPanel.java index 81fac1ebd6..c8266bd595 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/OtherOccurrencesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/OtherOccurrencesPanel.java @@ -284,7 +284,7 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel { } } - @NbBundle.Messages({"OtherOccurrencesPanel_earliestCaseNotAvailable=Not Availble."}) + @NbBundle.Messages({"OtherOccurrencesPanel_earliestCaseNotAvailable=Not Available."}) /** * Reset the UI and clear cached data. */