From 3f5619933d6dd73f4fe560a9c724e43e195bd1c7 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Tue, 27 Feb 2018 15:24:44 +0100 Subject: [PATCH] reset state of data source filters when case is opened. --- .../communications/CVTTopComponent.java | 2 +- .../communications/CommunicationsGraph.java | 2 +- .../autopsy/communications/FiltersPanel.java | 68 +++++++++++++------ 3 files changed, 48 insertions(+), 24 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java index 11ae8809e8..539459fdea 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java @@ -142,7 +142,7 @@ public final class CVTTopComponent extends TopComponent { * * Re-applying the filters means we will lose the selection... */ - filtersPane.updateAndApplyFilters(); + filtersPane.updateAndApplyFilters(true); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java b/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java index 81ec5d7838..3d51f3c292 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java +++ b/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java @@ -310,7 +310,7 @@ final class CommunicationsGraph extends mxGraph { Set accountIDs = relatedAccounts.keySet(); - Map relationshipCounts = commsManager.getRelationshipCounts(accountIDs, currentFilter); + Map relationshipCounts = commsManager.getRelationshipCountsBetween(accountIDs, currentFilter); int total = relationshipCounts.size(); int k = 0; diff --git a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java index 36f9ac4410..f9031af04a 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java @@ -61,8 +61,15 @@ final public class FiltersPanel extends JPanel { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(FiltersPanel.class.getName()); + /** + * Map from Account.Type to the checkbox for that account type's filter. + */ @ThreadConfined(type = ThreadConfined.ThreadType.AWT) private final Map accountTypeMap = new HashMap<>(); + + /** + * Map from datasource device id to the checkbox for that datasource. + */ @ThreadConfined(type = ThreadConfined.ThreadType.AWT) private final Map devicesMap = new HashMap<>(); @@ -70,6 +77,11 @@ final public class FiltersPanel extends JPanel { * Listens to ingest events to enable refresh button */ private final PropertyChangeListener ingestListener; + + /** + * Flag that indicates the UI is not up-sto-date with respect to the case DB + * and it should be refreshed (by reapplying the filters). + */ private boolean needsRefresh; /** @@ -78,10 +90,16 @@ final public class FiltersPanel extends JPanel { * results) */ private final ItemListener validationListener; - private boolean deviceAccountTypeEnabled = false; - @NbBundle.Messages({"refreshText=Refresh Results", - "applyText=Apply"}) + /** + * Is the device account type filter enabled or not. It should be enabled + * when the Table/Brows mode is active and disabled when the visualization + * is active. Initially false since the browse/table mode is active + * initially. + */ + private boolean deviceAccountTypeEnabled; + + @NbBundle.Messages({"refreshText=Refresh Results", "applyText=Apply"}) public FiltersPanel() { initComponents(); deviceRequiredLabel.setVisible(false); @@ -102,8 +120,7 @@ final public class FiltersPanel extends JPanel { updateTimeZone(); validationListener = itemEvent -> validateFilters(); - updateFilters(); - setAllDevicesSelected(true); + updateFilters(true); UserPreferences.addChangeListener(preferenceChangeEvent -> { if (preferenceChangeEvent.getKey().equals(UserPreferences.DISPLAY_TIMES_IN_LOCAL_TIME)) { updateTimeZone(); @@ -118,7 +135,7 @@ final public class FiltersPanel extends JPanel { if (null != eventData && eventData.getBlackboardArtifactType().getTypeID() != BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() && eventData.getBlackboardArtifactType().getTypeID() != BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID()) { - updateFilters(); + updateFilters(false); needsRefresh = true; validateFilters(); } @@ -150,8 +167,8 @@ final public class FiltersPanel extends JPanel { /** * Update the filter widgets, and apply them. */ - void updateAndApplyFilters() { - updateFilters(); + void updateAndApplyFilters(boolean initialState) { + updateFilters(initialState); applyFilters(); } @@ -162,9 +179,9 @@ final public class FiltersPanel extends JPanel { /** * Updates the filter widgets to reflect he data sources/types in the case. */ - private void updateFilters() { + private void updateFilters(boolean initialState) { updateAccountTypeFilter(); - updateDeviceFilter(); + updateDeviceFilter(initialState); } @Override @@ -221,7 +238,7 @@ final public class FiltersPanel extends JPanel { /** * Populate the devices filter widgets */ - private void updateDeviceFilter() { + private void updateDeviceFilter(boolean initialState) { try { final SleuthkitCase sleuthkitCase = Case.getCurrentCase().getSleuthkitCase(); @@ -229,13 +246,12 @@ final public class FiltersPanel extends JPanel { String dsName = sleuthkitCase.getContentById(dataSource.getId()).getName(); //store the device id in the map, but display a datasource name in the UI. devicesMap.computeIfAbsent(dataSource.getDeviceId(), ds -> { - final JCheckBox jCheckBox = new JCheckBox(dsName, false); + final JCheckBox jCheckBox = new JCheckBox(dsName, initialState); jCheckBox.addItemListener(validationListener); devicesPane.add(jCheckBox); return jCheckBox; }); - }; - + } } catch (IllegalStateException ex) { logger.log(Level.WARNING, "Communications Visualization Tool opened with no open case.", ex); } catch (TskCoreException tskCoreException) { @@ -538,6 +554,21 @@ final public class FiltersPanel extends JPanel { return new DateRangeFilter(start, end); } + /** + * Enable or disable the device account type filter. The filter should be + * disabled for the browse/table mode and enabled for the visualization. + * + * @param enable True to enable the device account type filter, False to + * disable it. + */ + void setDeviceAccountTypeEnabled(boolean enable) { + deviceAccountTypeEnabled = enable; + JCheckBox deviceCheckbox = accountTypeMap.get(Account.Type.DEVICE); + if (deviceCheckbox != null) { + deviceCheckbox.setEnabled(deviceAccountTypeEnabled); + } + } + /** * Set the selection state of all the account type check boxes * @@ -569,6 +600,7 @@ final public class FiltersPanel extends JPanel { private void setAllSelected(Map map, boolean selected) { map.values().forEach(box -> box.setSelected(selected)); } + private void unCheckAllAccountTypesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_unCheckAllAccountTypesButtonActionPerformed setAllAccountTypesSelected(false); }//GEN-LAST:event_unCheckAllAccountTypesButtonActionPerformed @@ -620,12 +652,4 @@ final public class FiltersPanel extends JPanel { private final javax.swing.JButton unCheckAllAccountTypesButton = new javax.swing.JButton(); private final javax.swing.JButton unCheckAllDevicesButton = new javax.swing.JButton(); // End of variables declaration//GEN-END:variables - - void setDeviceAccountTypeEnabled(boolean enableDeviceAccountType) { - deviceAccountTypeEnabled = enableDeviceAccountType; - JCheckBox deviceCheckbox = accountTypeMap.get(Account.Type.DEVICE); - if (deviceCheckbox != null) { - deviceCheckbox.setEnabled(deviceAccountTypeEnabled); - } - } }