From f8c82a617094aa7713bcc45a66bc26378a0107fa Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 15 Oct 2019 15:32:45 -0400 Subject: [PATCH 1/8] 5657 initial change of FileDiscoveryDialog to top component --- .../filequery/Bundle.properties-MERGED | 1 + ...Dialog.form => DiscoveryTopComponent.form} | 7 +--- ...Dialog.java => DiscoveryTopComponent.java} | 37 +++++++++++-------- .../filequery/FileDiscoveryTestAction.java | 4 +- 4 files changed, 25 insertions(+), 24 deletions(-) rename Core/src/org/sleuthkit/autopsy/filequery/{FileDiscoveryDialog.form => DiscoveryTopComponent.form} (93%) rename Core/src/org/sleuthkit/autopsy/filequery/{FileDiscoveryDialog.java => DiscoveryTopComponent.java} (84%) diff --git a/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties-MERGED index af49cf14a4..ab81986afa 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties-MERGED @@ -1,5 +1,6 @@ CTL_FileDiscoveryTestAction=Test file discovery CTL_FileSearchTestAction=Test file search +DiscoveryTopComponent.name=\ File Discovery # {0} - Data source name # {1} - Data source ID FileSearch.DataSourceGroupKey.datasourceAndID={0}(ID: {1}) diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileDiscoveryDialog.form b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.form similarity index 93% rename from Core/src/org/sleuthkit/autopsy/filequery/FileDiscoveryDialog.form rename to Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.form index cc70ee2002..92772c1173 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileDiscoveryDialog.form +++ b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.form @@ -1,16 +1,11 @@ -
+ - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileDiscoveryDialog.java b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java similarity index 84% rename from Core/src/org/sleuthkit/autopsy/filequery/FileDiscoveryDialog.java rename to Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java index f5b332f599..1cb7cf3849 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileDiscoveryDialog.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java @@ -18,16 +18,20 @@ */ package org.sleuthkit.autopsy.filequery; -import javax.swing.JFrame; +import java.awt.KeyboardFocusManager; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.openide.explorer.ExplorerManager; import org.openide.nodes.Node; +import org.openide.util.NbBundle; +import org.openide.windows.RetainLocation; +import org.openide.windows.TopComponent; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; import org.sleuthkit.autopsy.corecomponents.DataContentPanel; import org.sleuthkit.autopsy.corecomponents.TableFilterNode; +import org.sleuthkit.autopsy.coreutils.ThreadConfined; import org.sleuthkit.autopsy.datamodel.FileNode; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.SleuthkitCase; @@ -35,7 +39,11 @@ import org.sleuthkit.datamodel.SleuthkitCase; /** * Create a dialog for displaying the file discovery tool */ -class FileDiscoveryDialog extends javax.swing.JDialog { +@TopComponent.Description(preferredID = "DiscoveryTopComponent", persistenceType = TopComponent.PERSISTENCE_NEVER) +@TopComponent.Registration(mode = "discovery", openAtStartup = false) +@RetainLocation("discovery") +@NbBundle.Messages("DiscoveryTopComponent.name= File Discovery") +public final class DiscoveryTopComponent extends TopComponent { private static final long serialVersionUID = 1L; private final FileSearchPanel fileSearchPanel; @@ -47,9 +55,10 @@ class FileDiscoveryDialog extends javax.swing.JDialog { /** * Creates new form FileDiscoveryDialog */ - FileDiscoveryDialog(java.awt.Frame parent, boolean modal, SleuthkitCase caseDb, EamDb centralRepoDb) { - super((JFrame) WindowManager.getDefault().getMainWindow(), Bundle.FileSearchPanel_dialogTitle_text(), modal); + @ThreadConfined(type = ThreadConfined.ThreadType.AWT) + public DiscoveryTopComponent(SleuthkitCase caseDb, EamDb centralRepoDb) { initComponents(); + setName(Bundle.DiscoveryTopComponent_name()); explorerManager = new ExplorerManager(); fileSearchPanel = new FileSearchPanel(caseDb, centralRepoDb); dataContentPanel = DataContentPanel.createInstance(); @@ -100,21 +109,19 @@ class FileDiscoveryDialog extends javax.swing.JDialog { }); } - /** - * Show the dialog - */ - void display() { - this.setLocationRelativeTo(WindowManager.getDefault().getMainWindow()); - setVisible(true); + @Override + public void componentOpened() { + super.componentOpened(); + WindowManager.getDefault().setTopComponentFloating(this, true); } @Override - public void dispose() { + protected void componentClosed() { fileSearchPanel.cancelSearch(); FileSearch.clearCache(); DiscoveryEvents.getDiscoveryEventBus().unregister(groupListPanel); DiscoveryEvents.getDiscoveryEventBus().unregister(resultsPanel); - super.dispose(); + super.componentClosed(); } /** @@ -130,8 +137,8 @@ class FileDiscoveryDialog extends javax.swing.JDialog { leftSplitPane = new javax.swing.JSplitPane(); rightSplitPane = new javax.swing.JSplitPane(); - setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setPreferredSize(new java.awt.Dimension(1100, 700)); + setLayout(new java.awt.BorderLayout()); mainSplitPane.setDividerLocation(550); mainSplitPane.setResizeWeight(0.2); @@ -147,9 +154,7 @@ class FileDiscoveryDialog extends javax.swing.JDialog { rightSplitPane.setResizeWeight(0.5); mainSplitPane.setRightComponent(rightSplitPane); - getContentPane().add(mainSplitPane, java.awt.BorderLayout.CENTER); - - pack(); + add(mainSplitPane, java.awt.BorderLayout.CENTER); }// //GEN-END:initComponents diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileDiscoveryTestAction.java b/Core/src/org/sleuthkit/autopsy/filequery/FileDiscoveryTestAction.java index 75baedb528..3c4c14acbf 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileDiscoveryTestAction.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileDiscoveryTestAction.java @@ -65,9 +65,9 @@ public final class FileDiscoveryTestAction extends CallableSystemAction { } } //modal set to true currently to prevent multiple dialogs being opened because messaging uses a shared eventbus - FileDiscoveryDialog dialog = new FileDiscoveryDialog(WindowManager.getDefault().getMainWindow(), true, Case.getCurrentCase().getSleuthkitCase(), crDb); + DiscoveryTopComponent discoveryTc = new DiscoveryTopComponent(Case.getCurrentCase().getSleuthkitCase(), crDb); // Display the dialog - dialog.display(); + discoveryTc.open(); } From 1c075bdbaad7952a869626c2e8071fccbaad3252 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 15 Oct 2019 16:43:35 -0400 Subject: [PATCH 2/8] 5657 initial file discovery wait cursor enabling disabling code --- .../filequery/DiscoveryTopComponent.java | 15 +++- .../autopsy/filequery/FileSearchPanel.java | 73 ++++++++++++++++++- .../autopsy/filequery/ResultsPanel.java | 2 +- .../autopsy/filequery/SearchWorker.java | 17 ++--- 4 files changed, 91 insertions(+), 16 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java index 1cb7cf3849..bcfbccfe03 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java @@ -18,7 +18,6 @@ */ package org.sleuthkit.autopsy.filequery; -import java.awt.KeyboardFocusManager; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; @@ -46,6 +45,7 @@ import org.sleuthkit.datamodel.SleuthkitCase; public final class DiscoveryTopComponent extends TopComponent { private static final long serialVersionUID = 1L; + private static final String PREFERRED_ID = "DiscoveryTopComponent"; // NON-NLS private final FileSearchPanel fileSearchPanel; private final GroupListPanel groupListPanel; private final DataContentPanel dataContentPanel; @@ -61,6 +61,7 @@ public final class DiscoveryTopComponent extends TopComponent { setName(Bundle.DiscoveryTopComponent_name()); explorerManager = new ExplorerManager(); fileSearchPanel = new FileSearchPanel(caseDb, centralRepoDb); + DiscoveryEvents.getDiscoveryEventBus().register(fileSearchPanel); dataContentPanel = DataContentPanel.createInstance(); resultsPanel = new ResultsPanel(explorerManager, centralRepoDb); DiscoveryEvents.getDiscoveryEventBus().register(resultsPanel); @@ -109,6 +110,17 @@ public final class DiscoveryTopComponent extends TopComponent { }); } + /** + * Gets the singleton Image Gallery top component. Note that calling this + * method will cause the top component to be constructed if it does not + * already exist. + * + * @return The top component. + */ + public static DiscoveryTopComponent getTopComponent() { + return (DiscoveryTopComponent) WindowManager.getDefault().findTopComponent(PREFERRED_ID); + } + @Override public void componentOpened() { super.componentOpened(); @@ -119,6 +131,7 @@ public final class DiscoveryTopComponent extends TopComponent { protected void componentClosed() { fileSearchPanel.cancelSearch(); FileSearch.clearCache(); + DiscoveryEvents.getDiscoveryEventBus().unregister(fileSearchPanel); DiscoveryEvents.getDiscoveryEventBus().unregister(groupListPanel); DiscoveryEvents.getDiscoveryEventBus().unregister(resultsPanel); super.componentClosed(); diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java index c9bbb29cbe..d45cdcae91 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java @@ -18,6 +18,8 @@ */ package org.sleuthkit.autopsy.filequery; +import com.google.common.eventbus.Subscribe; +import java.awt.Cursor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; @@ -32,6 +34,7 @@ import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.JCheckBox; import javax.swing.JList; +import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.openide.util.NbBundle; @@ -1169,7 +1172,8 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener }// //GEN-END:initComponents private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchButtonActionPerformed - searchButton.setEnabled(false); + enableSearch(false); + DiscoveryTopComponent.getTopComponent().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); FileType searchType = fileTypeComboBox.getItemAt(fileTypeComboBox.getSelectedIndex()); DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchStartedEvent(searchType)); // For testing, allow the user to run different searches in loop @@ -1183,10 +1187,69 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener // Get the file sorting method FileSorter.SortingMethod fileSort = getFileSortingMethod(); - searchWorker = new SearchWorker(centralRepoDb, searchButton, filters, groupingAttr, groupSortAlgorithm, fileSort); + searchWorker = new SearchWorker(centralRepoDb, filters, groupingAttr, groupSortAlgorithm, fileSort); searchWorker.execute(); }//GEN-LAST:event_searchButtonActionPerformed + private void enableSearch(boolean enabled) { + searchButton.setEnabled(enabled); + fileTypeComboBox.setEnabled(enabled); + orderByCombobox.setEnabled(enabled); + groupByCombobox.setEnabled(enabled); + attributeRadioButton.setEnabled(enabled); + groupSizeRadioButton.setEnabled(enabled); + sizeCheckbox.setEnabled(enabled); + sizeScrollPane.setEnabled(enabled && sizeCheckbox.isSelected()); + sizeList.setEnabled(enabled && sizeCheckbox.isSelected()); + dataSourceCheckbox.setEnabled(enabled); + dataSourceList.setEnabled(enabled && dataSourceCheckbox.isSelected()); + dataSourceScrollPane.setEnabled(enabled && dataSourceCheckbox.isSelected()); + crFrequencyCheckbox.setEnabled(enabled); + crFrequencyScrollPane.setEnabled(enabled && crFrequencyCheckbox.isSelected()); + crFrequencyList.setEnabled(enabled && crFrequencyCheckbox.isSelected()); + keywordCheckbox.setEnabled(enabled); + keywordList.setEnabled(enabled && keywordCheckbox.isSelected()); + keywordScrollPane.setEnabled(enabled && keywordCheckbox.isSelected()); + hashSetCheckbox.setEnabled(enabled); + hashSetScrollPane.setEnabled(enabled && hashSetCheckbox.isSelected()); + hashSetList.setEnabled(enabled && hashSetCheckbox.isSelected()); + objectsCheckbox.setEnabled(enabled); + objectsScrollPane.setEnabled(enabled && objectsCheckbox.isSelected()); + objectsList.setEnabled(enabled && objectsCheckbox.isSelected()); + tagsCheckbox.setEnabled(enabled); + tagsScrollPane.setEnabled(enabled && tagsCheckbox.isSelected()); + tagsList.setEnabled(enabled && tagsCheckbox.isSelected()); + interestingItemsCheckbox.setEnabled(enabled); + interestingItemsScrollPane.setEnabled(enabled && interestingItemsCheckbox.isSelected()); + interestingItemsList.setEnabled(enabled && interestingItemsCheckbox.isSelected()); + scoreCheckbox.setEnabled(enabled); + scoreScrollPane.setEnabled(enabled && scoreCheckbox.isSelected()); + scoreList.setEnabled(enabled && scoreCheckbox.isSelected()); + exifCheckbox.setEnabled(enabled); + notableCheckbox.setEnabled(enabled); + parentCheckbox.setEnabled(enabled); + parentScrollPane.setEnabled(enabled && parentCheckbox.isSelected()); + parentList.setEnabled(enabled && parentCheckbox.isSelected()); + parentTextField.setEnabled(enabled && parentCheckbox.isSelected()); + addButton.setEnabled(enabled && parentCheckbox.isSelected()); + deleteButton.setEnabled(enabled && parentCheckbox.isSelected() && !parentListModel.isEmpty()); + fullRadioButton.setEnabled(enabled && parentCheckbox.isSelected()); + substringRadioButton.setEnabled(enabled && parentCheckbox.isSelected()); + } + + @Subscribe + void handleNoResultsEvent(DiscoveryEvents.NoResultsEvent noResultsEvent) { + SwingUtilities.invokeLater(() -> { + enableSearch(true); + }); + } + + @Subscribe + void handleSearchCompleteEvent(DiscoveryEvents.SearchCompleteEvent searchCompleteEvent) { + SwingUtilities.invokeLater(() -> { + enableSearch(true); + }); + } private void parentCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_parentCheckboxActionPerformed parentList.setEnabled(parentCheckbox.isSelected()); @@ -1194,7 +1257,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener substringRadioButton.setEnabled(parentCheckbox.isSelected()); parentTextField.setEnabled(parentCheckbox.isSelected()); addButton.setEnabled(parentCheckbox.isSelected()); - deleteButton.setEnabled(parentCheckbox.isSelected()); + deleteButton.setEnabled(parentCheckbox.isSelected() && !parentListModel.isEmpty()); }//GEN-LAST:event_parentCheckboxActionPerformed private void keywordCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_keywordCheckboxActionPerformed @@ -1230,7 +1293,9 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteButtonActionPerformed int index = parentList.getSelectedIndex(); - parentListModel.remove(index); + if (index >= 0) { + parentListModel.remove(index); + } validateFields(); }//GEN-LAST:event_deleteButtonActionPerformed diff --git a/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java index 5809eb6051..65094b8ac9 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java @@ -249,7 +249,7 @@ public class ResultsPanel extends javax.swing.JPanel { } @Subscribe - void handleNoResultsEvent(DiscoveryEvents.NoResultsEvent noResultsEven) { + void handleNoResultsEvent(DiscoveryEvents.NoResultsEvent noResultsEvent) { SwingUtilities.invokeLater(() -> { groupSize = 0; currentPage = 0; diff --git a/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java b/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java index 734b49d04e..8fb76dc5ab 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java @@ -18,8 +18,8 @@ */ package org.sleuthkit.autopsy.filequery; +import java.awt.Cursor; import java.util.LinkedHashMap; -import javax.swing.JButton; import javax.swing.SwingWorker; import java.util.List; import java.util.logging.Level; @@ -33,27 +33,24 @@ import org.sleuthkit.autopsy.coreutils.Logger; final class SearchWorker extends SwingWorker { private final static Logger logger = Logger.getLogger(SearchWorker.class.getName()); - private final JButton searchButtonToEnable; private final List filters; private final FileSearch.AttributeType groupingAttr; private final FileSorter.SortingMethod fileSort; private final FileGroup.GroupSortingAlgorithm groupSortAlgorithm; private final EamDb centralRepoDb; + private boolean searchCompleted = false; /** * Create a SwingWorker which performs a search * * @param centralRepo the central repository being used for the search - * @param searchButton the search button to renable when the search is - * complete * @param searchfilters the FileFilters to use for the search * @param groupingAttribute the AttributeType to group by * @param groupSort the Algorithm to sort groups by * @param fileSortMethod the SortingMethod to use for files */ - SearchWorker(EamDb centralRepo, JButton searchButton, List searchfilters, FileSearch.AttributeType groupingAttribute, FileGroup.GroupSortingAlgorithm groupSort, FileSorter.SortingMethod fileSortMethod) { + SearchWorker(EamDb centralRepo, List searchfilters, FileSearch.AttributeType groupingAttribute, FileGroup.GroupSortingAlgorithm groupSort, FileSorter.SortingMethod fileSortMethod) { centralRepoDb = centralRepo; - searchButtonToEnable = searchButton; filters = searchfilters; groupingAttr = groupingAttribute; groupSortAlgorithm = groupSort; @@ -62,7 +59,6 @@ final class SearchWorker extends SwingWorker { @Override protected Void doInBackground() throws Exception { - try { // Run the search LinkedHashMap results = FileSearch.getGroupSizes(filters, @@ -71,6 +67,7 @@ final class SearchWorker extends SwingWorker { fileSort, Case.getCurrentCase().getSleuthkitCase(), centralRepoDb); DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchCompleteEvent(results, filters, groupingAttr, groupSortAlgorithm, fileSort)); + searchCompleted = true; } catch (FileSearchException ex) { logger.log(Level.SEVERE, "Error running file search test", ex); } @@ -79,9 +76,9 @@ final class SearchWorker extends SwingWorker { @Override protected void done() { - //If a search button was provided re-enable it - if (searchButtonToEnable != null) { - searchButtonToEnable.setEnabled(true); + if (!searchCompleted) { + DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.NoResultsEvent()); } + DiscoveryTopComponent.getTopComponent().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } } From d522c23caea8e60342106f9c06ffcf3ab0562bb4 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 15 Oct 2019 18:12:08 -0400 Subject: [PATCH 3/8] 5657 fix cancellation and button enabling --- .../autopsy/filequery/DiscoveryEvents.java | 11 ++++ .../filequery/DiscoveryTopComponent.java | 55 +++++++++++++------ .../filequery/FileDiscoveryTestAction.java | 21 +------ .../autopsy/filequery/FileSearchPanel.form | 1 + .../autopsy/filequery/FileSearchPanel.java | 11 +++- .../autopsy/filequery/SearchWorker.java | 3 +- 6 files changed, 62 insertions(+), 40 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEvents.java b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEvents.java index 48fe0cc41d..77f8370c18 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEvents.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEvents.java @@ -212,6 +212,17 @@ final class DiscoveryEvents { } } + static final class SearchCancelledEvent { + + /** + * Construct a new SearchCancelledEvent. + */ + SearchCancelledEvent() { + //no arg conustructor + } + + } + /** * Event to signal that a group has been selected. */ diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java index bcfbccfe03..c16c7f437a 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java @@ -18,22 +18,27 @@ */ package org.sleuthkit.autopsy.filequery; +import java.awt.Cursor; +import java.util.logging.Level; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.openide.explorer.ExplorerManager; import org.openide.nodes.Node; import org.openide.util.NbBundle; +import org.openide.windows.Mode; import org.openide.windows.RetainLocation; import org.openide.windows.TopComponent; import org.openide.windows.WindowManager; +import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.autopsy.corecomponents.DataContentPanel; import org.sleuthkit.autopsy.corecomponents.TableFilterNode; +import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.ThreadConfined; import org.sleuthkit.autopsy.datamodel.FileNode; import org.sleuthkit.datamodel.AbstractFile; -import org.sleuthkit.datamodel.SleuthkitCase; /** * Create a dialog for displaying the file discovery tool @@ -42,10 +47,11 @@ import org.sleuthkit.datamodel.SleuthkitCase; @TopComponent.Registration(mode = "discovery", openAtStartup = false) @RetainLocation("discovery") @NbBundle.Messages("DiscoveryTopComponent.name= File Discovery") -public final class DiscoveryTopComponent extends TopComponent { +final class DiscoveryTopComponent extends TopComponent { private static final long serialVersionUID = 1L; private static final String PREFERRED_ID = "DiscoveryTopComponent"; // NON-NLS + private final static Logger logger = Logger.getLogger(DiscoveryTopComponent.class.getName()); private final FileSearchPanel fileSearchPanel; private final GroupListPanel groupListPanel; private final DataContentPanel dataContentPanel; @@ -56,17 +62,23 @@ public final class DiscoveryTopComponent extends TopComponent { * Creates new form FileDiscoveryDialog */ @ThreadConfined(type = ThreadConfined.ThreadType.AWT) - public DiscoveryTopComponent(SleuthkitCase caseDb, EamDb centralRepoDb) { + DiscoveryTopComponent() { initComponents(); + // Load the central repository database. + EamDb centralRepoDb = null; + if (EamDb.isEnabled()) { + try { + centralRepoDb = EamDb.getInstance(); + } catch (EamDbException ex) { + logger.log(Level.SEVERE, "Error loading central repository database, no central repository options will be available for File Discovery", ex); + } + } setName(Bundle.DiscoveryTopComponent_name()); explorerManager = new ExplorerManager(); - fileSearchPanel = new FileSearchPanel(caseDb, centralRepoDb); - DiscoveryEvents.getDiscoveryEventBus().register(fileSearchPanel); + fileSearchPanel = new FileSearchPanel(Case.getCurrentCase().getSleuthkitCase(), centralRepoDb); dataContentPanel = DataContentPanel.createInstance(); resultsPanel = new ResultsPanel(explorerManager, centralRepoDb); - DiscoveryEvents.getDiscoveryEventBus().register(resultsPanel); groupListPanel = new GroupListPanel(); - DiscoveryEvents.getDiscoveryEventBus().register(groupListPanel); leftSplitPane.setLeftComponent(fileSearchPanel); leftSplitPane.setRightComponent(groupListPanel); rightSplitPane.setTopComponent(resultsPanel); @@ -110,21 +122,32 @@ public final class DiscoveryTopComponent extends TopComponent { }); } - /** - * Gets the singleton Image Gallery top component. Note that calling this - * method will cause the top component to be constructed if it does not - * already exist. - * - * @return The top component. - */ - public static DiscoveryTopComponent getTopComponent() { - return (DiscoveryTopComponent) WindowManager.getDefault().findTopComponent(PREFERRED_ID); + static void openTopComponent() { + final DiscoveryTopComponent tc = (DiscoveryTopComponent) WindowManager.getDefault().findTopComponent(PREFERRED_ID); + if (tc != null) { + WindowManager.getDefault().isTopComponentFloating(tc); + + if (tc.isOpened() == false) { + Mode mode = WindowManager.getDefault().findMode("discovery"); // NON-NLS + if (mode != null) { + mode.dockInto(tc); + } + tc.open(); + } + } + } + + static void changeCursor(Cursor cursor) { + WindowManager.getDefault().findTopComponent(PREFERRED_ID).setCursor(cursor); } @Override public void componentOpened() { super.componentOpened(); WindowManager.getDefault().setTopComponentFloating(this, true); + DiscoveryEvents.getDiscoveryEventBus().register(resultsPanel); + DiscoveryEvents.getDiscoveryEventBus().register(groupListPanel); + DiscoveryEvents.getDiscoveryEventBus().register(fileSearchPanel); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileDiscoveryTestAction.java b/Core/src/org/sleuthkit/autopsy/filequery/FileDiscoveryTestAction.java index 3c4c14acbf..a6c912af93 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileDiscoveryTestAction.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileDiscoveryTestAction.java @@ -18,16 +18,12 @@ */ package org.sleuthkit.autopsy.filequery; -import java.util.logging.Level; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.openide.awt.ActionID; import org.openide.awt.ActionReference; import org.openide.awt.ActionRegistration; import org.openide.util.HelpCtx; import org.openide.util.NbBundle; import org.openide.util.actions.CallableSystemAction; -import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; @@ -53,22 +49,7 @@ public final class FileDiscoveryTestAction extends CallableSystemAction { @Override @SuppressWarnings("fallthrough") public void performAction() { - - // Load the central repository database. - EamDb crDb = null; - if (EamDb.isEnabled()) { - try { - crDb = EamDb.getInstance(); - } catch (EamDbException ex) { - logger.log(Level.SEVERE, "Error loading central repository database", ex); - return; - } - } - //modal set to true currently to prevent multiple dialogs being opened because messaging uses a shared eventbus - DiscoveryTopComponent discoveryTc = new DiscoveryTopComponent(Case.getCurrentCase().getSleuthkitCase(), crDb); - // Display the dialog - discoveryTc.open(); - + DiscoveryTopComponent.openTopComponent(); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.form b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.form index e0835a9d76..5d319cb4f9 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.form +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.form @@ -828,6 +828,7 @@ + diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java index d45cdcae91..e5764409f7 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java @@ -1119,6 +1119,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener errorLabel.setForeground(new java.awt.Color(255, 0, 0)); org.openide.awt.Mnemonics.setLocalizedText(cancelButton, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.cancelButton.text")); // NOI18N + cancelButton.setEnabled(false); cancelButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelButtonActionPerformed(evt); @@ -1173,7 +1174,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchButtonActionPerformed enableSearch(false); - DiscoveryTopComponent.getTopComponent().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + FileType searchType = fileTypeComboBox.getItemAt(fileTypeComboBox.getSelectedIndex()); DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchStartedEvent(searchType)); // For testing, allow the user to run different searches in loop @@ -1192,7 +1193,13 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener }//GEN-LAST:event_searchButtonActionPerformed private void enableSearch(boolean enabled) { + if (enabled) { + DiscoveryTopComponent.changeCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } else { + DiscoveryTopComponent.changeCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + } searchButton.setEnabled(enabled); + cancelButton.setEnabled(!enabled); fileTypeComboBox.setEnabled(enabled); orderByCombobox.setEnabled(enabled); groupByCombobox.setEnabled(enabled); @@ -1238,7 +1245,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener } @Subscribe - void handleNoResultsEvent(DiscoveryEvents.NoResultsEvent noResultsEvent) { + void handleSearchCancelledEvent(DiscoveryEvents.SearchCancelledEvent SearchCancelledEvent) { SwingUtilities.invokeLater(() -> { enableSearch(true); }); diff --git a/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java b/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java index 8fb76dc5ab..2a2c17602b 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java @@ -77,8 +77,7 @@ final class SearchWorker extends SwingWorker { @Override protected void done() { if (!searchCompleted) { - DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.NoResultsEvent()); + DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchCancelledEvent()); } - DiscoveryTopComponent.getTopComponent().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } } From 4cf950ccf83384b1105d3107311cf45b850d1d09 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 15 Oct 2019 18:21:26 -0400 Subject: [PATCH 4/8] 5657 move file discovery to front when opened --- .../org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java index c16c7f437a..d99b9e69e3 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java @@ -126,7 +126,6 @@ final class DiscoveryTopComponent extends TopComponent { final DiscoveryTopComponent tc = (DiscoveryTopComponent) WindowManager.getDefault().findTopComponent(PREFERRED_ID); if (tc != null) { WindowManager.getDefault().isTopComponentFloating(tc); - if (tc.isOpened() == false) { Mode mode = WindowManager.getDefault().findMode("discovery"); // NON-NLS if (mode != null) { @@ -134,6 +133,7 @@ final class DiscoveryTopComponent extends TopComponent { } tc.open(); } + tc.toFront(); } } From 824e56be7207440437ff743f363a75f6ec8c9e55 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 16 Oct 2019 14:54:17 -0400 Subject: [PATCH 5/8] 5657 move call to clear cache when closing --- .../org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java | 1 - Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java | 1 - 2 files changed, 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java index d99b9e69e3..bd0a51e0f3 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java @@ -153,7 +153,6 @@ final class DiscoveryTopComponent extends TopComponent { @Override protected void componentClosed() { fileSearchPanel.cancelSearch(); - FileSearch.clearCache(); DiscoveryEvents.getDiscoveryEventBus().unregister(fileSearchPanel); DiscoveryEvents.getDiscoveryEventBus().unregister(groupListPanel); DiscoveryEvents.getDiscoveryEventBus().unregister(resultsPanel); diff --git a/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java b/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java index 2a2c17602b..8d62c073e4 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java @@ -18,7 +18,6 @@ */ package org.sleuthkit.autopsy.filequery; -import java.awt.Cursor; import java.util.LinkedHashMap; import javax.swing.SwingWorker; import java.util.List; From 2757d20083a213c283bd31d652ec2e0b6502c5ca Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 16 Oct 2019 16:04:12 -0400 Subject: [PATCH 6/8] 5657 prevent displaying of cancelled results --- .../autopsy/filequery/PageWorker.java | 18 ++++++++++++++---- .../autopsy/filequery/SearchWorker.java | 14 ++++++++------ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/filequery/PageWorker.java b/Core/src/org/sleuthkit/autopsy/filequery/PageWorker.java index 08a68cf953..d50722275d 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/PageWorker.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/PageWorker.java @@ -19,6 +19,7 @@ package org.sleuthkit.autopsy.filequery; import java.util.List; +import java.util.ArrayList; import java.util.logging.Level; import javax.swing.SwingWorker; import org.sleuthkit.autopsy.casemodule.Case; @@ -40,6 +41,7 @@ final class PageWorker extends SwingWorker { private final int pageSize; private final FileSearchData.FileType resultType; private final EamDb centralRepo; + private final List results = new ArrayList<>(); /** * Construct a new PageWorker. @@ -75,16 +77,24 @@ final class PageWorker extends SwingWorker { try { // Run the search - List results = FileSearch.getFilesInGroup(searchfilters, + results.addAll(FileSearch.getFilesInGroup(searchfilters, groupingAttribute, groupSort, fileSortMethod, groupName, startingEntry, pageSize, - Case.getCurrentCase().getSleuthkitCase(), centralRepo); - int currentPage = startingEntry / pageSize; //integer division should round down to get page number correctly - DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.PageRetrievedEvent(resultType, currentPage, results)); + Case.getCurrentCase().getSleuthkitCase(), centralRepo)); } catch (FileSearchException ex) { logger.log(Level.SEVERE, "Error running file search test", ex); + cancel(true); } return null; } + + @Override + protected void done() { + if (!isCancelled()) { + int currentPage = startingEntry / pageSize; //integer division should round down to get page number correctly + DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.PageRetrievedEvent(resultType, currentPage, results)); + } + } + } diff --git a/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java b/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java index 8d62c073e4..3d53e1f31b 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java @@ -37,7 +37,7 @@ final class SearchWorker extends SwingWorker { private final FileSorter.SortingMethod fileSort; private final FileGroup.GroupSortingAlgorithm groupSortAlgorithm; private final EamDb centralRepoDb; - private boolean searchCompleted = false; + private final LinkedHashMap results = new LinkedHashMap<>(); /** * Create a SwingWorker which performs a search @@ -60,23 +60,25 @@ final class SearchWorker extends SwingWorker { protected Void doInBackground() throws Exception { try { // Run the search - LinkedHashMap results = FileSearch.getGroupSizes(filters, + results.putAll(FileSearch.getGroupSizes(filters, groupingAttr, groupSortAlgorithm, fileSort, - Case.getCurrentCase().getSleuthkitCase(), centralRepoDb); - DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchCompleteEvent(results, filters, groupingAttr, groupSortAlgorithm, fileSort)); - searchCompleted = true; + Case.getCurrentCase().getSleuthkitCase(), centralRepoDb)); } catch (FileSearchException ex) { logger.log(Level.SEVERE, "Error running file search test", ex); + cancel(true); } return null; } @Override protected void done() { - if (!searchCompleted) { + if (isCancelled()) { DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchCancelledEvent()); } + else { + DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchCompleteEvent(results, filters, groupingAttr, groupSortAlgorithm, fileSort)); + } } } From 5b25dd3050f5d570e1eb2eba73e74efb84500af3 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 16 Oct 2019 16:36:01 -0400 Subject: [PATCH 7/8] 5657 add and fix comments --- .../autopsy/filequery/DiscoveryEvents.java | 3 ++ .../filequery/DiscoveryTopComponent.java | 9 ++++ .../filequery/FileDiscoveryTestAction.java | 2 - .../autopsy/filequery/FileSearchPanel.java | 43 ++++++++++++++++++- .../autopsy/filequery/ResultsPanel.java | 6 +++ 5 files changed, 60 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEvents.java b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEvents.java index 77f8370c18..becbc8157d 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEvents.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEvents.java @@ -212,6 +212,9 @@ final class DiscoveryEvents { } } + /** + * Event to signal that a search has been cancelled + */ static final class SearchCancelledEvent { /** diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java index bd0a51e0f3..54a7cda52d 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java @@ -122,6 +122,9 @@ final class DiscoveryTopComponent extends TopComponent { }); } + /** + * Open the instance of the DiscoveryTopComponent which exists. + */ static void openTopComponent() { final DiscoveryTopComponent tc = (DiscoveryTopComponent) WindowManager.getDefault().findTopComponent(PREFERRED_ID); if (tc != null) { @@ -137,6 +140,12 @@ final class DiscoveryTopComponent extends TopComponent { } } + /** + * Sets the cursor for the instance of the DiscoveryTopComponent which + * exists. + * + * @param cursor The Cursor which you want to have displayed. + */ static void changeCursor(Cursor cursor) { WindowManager.getDefault().findTopComponent(PREFERRED_ID).setCursor(cursor); } diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileDiscoveryTestAction.java b/Core/src/org/sleuthkit/autopsy/filequery/FileDiscoveryTestAction.java index a6c912af93..2962ec6fe5 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileDiscoveryTestAction.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileDiscoveryTestAction.java @@ -25,7 +25,6 @@ import org.openide.util.HelpCtx; import org.openide.util.NbBundle; import org.openide.util.actions.CallableSystemAction; import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.coreutils.Logger; /** * Class to test the file search API. Allows the user to run searches and see @@ -37,7 +36,6 @@ import org.sleuthkit.autopsy.coreutils.Logger; @NbBundle.Messages({"CTL_FileDiscoveryTestAction=Test file discovery"}) public final class FileDiscoveryTestAction extends CallableSystemAction { - private final static Logger logger = Logger.getLogger(FileDiscoveryTestAction.class.getName()); private static final String DISPLAY_NAME = "Test file discovery"; private static final long serialVersionUID = 1L; diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java index e5764409f7..d8fce68807 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java @@ -218,6 +218,9 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener addListeners(keywordCheckbox, keywordList); } + /** + * Initialize the hash filter. + */ private void setUpHashFilter() { int count = 0; try { @@ -237,6 +240,9 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener addListeners(hashSetCheckbox, hashSetList); } + /** + * Initialize the interesting items filter. + */ private void setUpInterestingItemsFilter() { int count = 0; try { @@ -256,6 +262,9 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener addListeners(interestingItemsCheckbox, interestingItemsList); } + /** + * Initialize the tags filter. + */ private void setUpTagsFilter() { int count = 0; try { @@ -332,6 +341,18 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener addListeners(scoreCheckbox, scoreList); } + /** + * Get the names of the sets which exist in the case database for the + * specified artifact and attribute types. + * + * @param artifactType The artifact type to get the list of sets for. + * @param setNameAttribute The attribute type which contains the set names. + * + * @return A list of set names which exist in the case for the specified + * artifact and attribute types. + * + * @throws TskCoreException + */ private List getSetNames(BlackboardArtifact.ARTIFACT_TYPE artifactType, BlackboardAttribute.ATTRIBUTE_TYPE setNameAttribute) throws TskCoreException { List arts = caseDb.getBlackboardArtifacts(artifactType); List setNames = new ArrayList<>(); @@ -1192,6 +1213,13 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener searchWorker.execute(); }//GEN-LAST:event_searchButtonActionPerformed + /** + * Set the enabled status of the search controls. + * + * @param enabled Boolean which indicates if the search should be enabled. + * True if the search button and controls should be enabled, + * false otherwise. + */ private void enableSearch(boolean enabled) { if (enabled) { DiscoveryTopComponent.changeCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); @@ -1244,13 +1272,23 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener substringRadioButton.setEnabled(enabled && parentCheckbox.isSelected()); } + /** + * Update the user interface when a search has been cancelled. + * + * @param searchCancelledEvent The SearchCancelledEvent which was received. + */ @Subscribe - void handleSearchCancelledEvent(DiscoveryEvents.SearchCancelledEvent SearchCancelledEvent) { + void handleSearchCancelledEvent(DiscoveryEvents.SearchCancelledEvent searchCancelledEvent) { SwingUtilities.invokeLater(() -> { enableSearch(true); }); } + /** + * Update the user interface when a search has been successfully completed. + * + * @param searchCompleteEvent The SearchCompleteEvent which was received. + */ @Subscribe void handleSearchCompleteEvent(DiscoveryEvents.SearchCompleteEvent searchCompleteEvent) { SwingUtilities.invokeLater(() -> { @@ -1292,6 +1330,9 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener } }//GEN-LAST:event_addButtonActionPerformed + /** + * Cancel the current search. + */ void cancelSearch() { if (searchWorker != null) { searchWorker.cancel(true); diff --git a/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java index 65094b8ac9..fe2594073b 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java @@ -248,6 +248,12 @@ public class ResultsPanel extends javax.swing.JPanel { }); } + /** + * Handle and respond to NoResultsEvent, updating the panel to reflect that + * there were no results. + * + * @param noResultsEvent the NoResultsEvent received. + */ @Subscribe void handleNoResultsEvent(DiscoveryEvents.NoResultsEvent noResultsEvent) { SwingUtilities.invokeLater(() -> { From 8337512d4e99964b89a054f4f049c2b5c710d1ea Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 22 Oct 2019 17:06:08 -0400 Subject: [PATCH 8/8] 5657 fix typo --- Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEvents.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEvents.java b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEvents.java index b13feb7293..d3dad4b24f 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEvents.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEvents.java @@ -209,7 +209,7 @@ final class DiscoveryEvents { * Construct a new NoResultsEvent. */ NoResultsEvent() { - //no arg conustructor + //no arg constructor } } @@ -222,7 +222,7 @@ final class DiscoveryEvents { * Construct a new SearchCancelledEvent. */ SearchCancelledEvent() { - //no arg conustructor + //no arg constructor } }