diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/discovery/ui/Bundle.properties-MERGED index 814d78da16..b8e68e97ba 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/Bundle.properties-MERGED @@ -9,8 +9,9 @@ DataSourceModuleWrapper.fileTypeModule.text=File Type Identification module was DataSourceModuleWrapper.hashModule.text=Hash Lookup module was not run on data source: {0}\n # {0} - timeZone DateFilterPanel.dateRange.text=Date Range ({0}): -DateFilterPanel.invalidRange.text=Range or Only Last must be selected -DateFilterPanel.startOrEndNeeded.text=A start or end date must be specified to use the range filter +DateFilterPanel.invalidRange.text=Range or Only Last must be selected. +DateFilterPanel.startAfterEnd.text=Start date should be before the end date when both are enabled. +DateFilterPanel.startOrEndNeeded.text=A start or end date must be specified to use the range filter. DiscoveryDialog.name.text=Discovery DiscoveryTopComponent.cancelButton.text=Cancel Search DiscoveryTopComponent.name=\ Discovery diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/DateFilterPanel.form b/Core/src/org/sleuthkit/autopsy/discovery/ui/DateFilterPanel.form index 8ecca7e27b..276a4f9ef5 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/DateFilterPanel.form +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/DateFilterPanel.form @@ -104,7 +104,10 @@ - + + + + @@ -114,9 +117,6 @@ - - - diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/DateFilterPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/DateFilterPanel.java index 668e441f95..528a5d1bc2 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/DateFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/DateFilterPanel.java @@ -18,6 +18,9 @@ */ package org.sleuthkit.autopsy.discovery.ui; +import com.github.lgooddatepicker.optionalusertools.DateChangeListener; +import com.github.lgooddatepicker.zinternaltools.DateChangeEvent; +import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.time.LocalDate; import java.time.Period; @@ -26,7 +29,7 @@ import org.sleuthkit.autopsy.discovery.search.AbstractFilter; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JList; -import javax.swing.SpinnerNumberModel; +import javax.swing.JSpinner; import javax.swing.event.ListSelectionListener; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.communications.Utils; @@ -38,7 +41,6 @@ import org.sleuthkit.autopsy.discovery.search.SearchFiltering; class DateFilterPanel extends AbstractDiscoveryFilterPanel { private static final long serialVersionUID = 1L; - private final SpinnerNumberModel numberModel; private static final long SECS_PER_DAY = 86400; /** @@ -47,10 +49,13 @@ class DateFilterPanel extends AbstractDiscoveryFilterPanel { @NbBundle.Messages({"# {0} - timeZone", "DateFilterPanel.dateRange.text=Date Range ({0}):"}) DateFilterPanel() { - // numberModel is used in initComponents - numberModel = new SpinnerNumberModel(10, 1, Integer.MAX_VALUE, 1); initComponents(); rangeRadioButton.setText(Bundle.DateFilterPanel_dateRange_text(Utils.getUserPreferredZoneId().toString())); + //Disable manual entry in the spinner + ((JSpinner.DefaultEditor) daysSpinner.getEditor()).getTextField().setEditable(false); + //Disable manual entry in the date pickers + startDatePicker.getComponentDateTextField().setEditable(false); + endDatePicker.getComponentDateTextField().setEditable(false); } /** @@ -65,7 +70,7 @@ class DateFilterPanel extends AbstractDiscoveryFilterPanel { buttonGroup1 = new javax.swing.ButtonGroup(); dateFilterCheckBox = new javax.swing.JCheckBox(); jPanel1 = new javax.swing.JPanel(); - daysSpinner = new javax.swing.JSpinner(numberModel); + daysSpinner = new javax.swing.JSpinner(); daysLabel = new javax.swing.JLabel(); mostRecentRadioButton = new javax.swing.JRadioButton(); startCheckBox = new javax.swing.JCheckBox(); @@ -81,7 +86,8 @@ class DateFilterPanel extends AbstractDiscoveryFilterPanel { } }); - daysSpinner.setModel(new javax.swing.SpinnerNumberModel(1, 1, null, 1)); + daysSpinner.setModel(new javax.swing.SpinnerNumberModel(7, 1, 100000, 1)); + daysSpinner.setEditor(new javax.swing.JSpinner.NumberEditor(daysSpinner, "")); daysSpinner.setEnabled(false); daysSpinner.setPreferredSize(new java.awt.Dimension(75, 26)); daysSpinner.setValue(7); @@ -254,6 +260,18 @@ class DateFilterPanel extends AbstractDiscoveryFilterPanel { endCheckBox.addActionListener(actionListener); rangeRadioButton.addActionListener(actionListener); mostRecentRadioButton.addActionListener(actionListener); + startDatePicker.addDateChangeListener(new DateChangeListener() { + @Override + public void dateChanged(DateChangeEvent event) { + actionListener.actionPerformed(new ActionEvent(startDatePicker, ActionEvent.ACTION_PERFORMED, "StartDateChanged")); + } + }); + endDatePicker.addDateChangeListener(new DateChangeListener() { + @Override + public void dateChanged(DateChangeEvent event) { + actionListener.actionPerformed(new ActionEvent(endDatePicker, ActionEvent.ACTION_PERFORMED, "EndDateChanged")); + } + }); } @Override @@ -276,10 +294,17 @@ class DateFilterPanel extends AbstractDiscoveryFilterPanel { for (ActionListener listener : endCheckBox.getActionListeners()) { endCheckBox.removeActionListener(listener); } + for (DateChangeListener listener : endDatePicker.getDateChangeListeners()) { + endDatePicker.removeDateChangeListener(listener); + } + for (DateChangeListener listener : startDatePicker.getDateChangeListeners()) { + startDatePicker.removeDateChangeListener(listener); + } } - @NbBundle.Messages({"DateFilterPanel.invalidRange.text=Range or Only Last must be selected", - "DateFilterPanel.startOrEndNeeded.text=A start or end date must be specified to use the range filter"}) + @NbBundle.Messages({"DateFilterPanel.invalidRange.text=Range or Only Last must be selected.", + "DateFilterPanel.startOrEndNeeded.text=A start or end date must be specified to use the range filter.", + "DateFilterPanel.startAfterEnd.text=Start date should be before the end date when both are enabled."}) @Override String checkForError() { if (dateFilterCheckBox.isSelected()) { @@ -287,6 +312,9 @@ class DateFilterPanel extends AbstractDiscoveryFilterPanel { return Bundle.DateFilterPanel_invalidRange_text(); } else if (rangeRadioButton.isSelected() && !(startCheckBox.isSelected() || endCheckBox.isSelected())) { return Bundle.DateFilterPanel_startOrEndNeeded_text(); + } else if (startCheckBox.isSelected() && endCheckBox.isSelected() && startDatePicker.getDate().isAfter(endDatePicker.getDate())) { + //if the dates are equal it will effectively search just that day due to the rounding up of the end date in the getFilter code + return Bundle.DateFilterPanel_startAfterEnd_text(); } } return "";