From f04e26621296318eb7079dfb010ab5bdbecd2d53 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Fri, 10 Nov 2017 21:06:10 +0100 Subject: [PATCH 1/8] remove etched border from FiltersPanel --- .../sleuthkit/autopsy/communications/CVTTopComponent.form | 5 ----- .../sleuthkit/autopsy/communications/CVTTopComponent.java | 1 - 2 files changed, 6 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.form b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.form index 524529e9bd..0463a92715 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.form +++ b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.form @@ -111,11 +111,6 @@ - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java index 0618cb7fc4..b5c26bb1a2 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java @@ -88,7 +88,6 @@ public final class CVTTopComponent extends TopComponent implements ExplorerManag splitPane.setLeftComponent(BrowseVisualizeTabPane); - filtersPane.setBorder(javax.swing.BorderFactory.createEtchedBorder()); filtersPane.setMinimumSize(new java.awt.Dimension(256, 495)); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); From 8dc4ce4408e52c971d8f6a6fc9869b8f74d79bba Mon Sep 17 00:00:00 2001 From: millmanorama Date: Fri, 10 Nov 2017 21:06:56 +0100 Subject: [PATCH 2/8] add date filter widgets to FiltersPanel --- .../autopsy/communications/Bundle.properties | 7 + .../autopsy/communications/FiltersPanel.form | 186 +++++++++++-- .../autopsy/communications/FiltersPanel.java | 245 ++++++++++++++++-- 3 files changed, 391 insertions(+), 47 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties index c95f1af5c8..11ae095dbc 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties @@ -8,3 +8,10 @@ FiltersPanel.unCheckAllAccountTypesButton.text=Uncheck All FiltersPanel.checkAllAccountTypesButton.text=Check All FiltersPanel.unCheckAllDevicesButton.text=Uncheck All FiltersPanel.checkAllDevicesButton.text=Check All +FiltersPanel.dateRangeLabel.text=Date Range: +FiltersPanel.startCheckBox.text=start: +FiltersPanel.endCheckBox.text=end: +FiltersPanel.endDateTextField.text= +FiltersPanel.startDateTextField.text= +FiltersPanel.startCalendarButton.text= +FiltersPanel.endCalendarButton.text= diff --git a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.form b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.form index ef451b0751..02c5a82a1e 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.form +++ b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.form @@ -43,16 +43,17 @@ - - - - + + + + + @@ -68,9 +69,11 @@ - + - + + + @@ -111,16 +114,24 @@ - - - - - - - + + + + + + + + + + + + + + + + + - - @@ -131,7 +142,7 @@ - + @@ -197,12 +208,17 @@ - - - - - + + + + + + + + + + @@ -212,7 +228,7 @@ - + @@ -269,5 +285,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java index 26b216b182..43ba0b4a4c 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java @@ -18,6 +18,13 @@ */ package org.sleuthkit.autopsy.communications; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -25,6 +32,7 @@ import java.util.Map.Entry; import java.util.logging.Level; import java.util.stream.Collectors; import javax.swing.JCheckBox; +import javax.swing.JFormattedTextField; import org.openide.explorer.ExplorerManager; import org.openide.nodes.AbstractNode; import org.sleuthkit.autopsy.casemodule.Case; @@ -47,6 +55,8 @@ final public class FiltersPanel extends javax.swing.JPanel { private static final Logger logger = Logger.getLogger(FiltersPanel.class.getName()); private static final long serialVersionUID = 1L; + private static final DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy"); + private ExplorerManager em; @ThreadConfined(type = ThreadConfined.ThreadType.AWT) @@ -56,6 +66,9 @@ final public class FiltersPanel extends javax.swing.JPanel { public FiltersPanel() { initComponents(); + startCalendarButton.addPropertyChangeListener(this::startPopupChanged); + endCalendarButton.addPropertyChangeListener(this::endPopupChanged); + updateAndApplyFilters(); } @@ -80,6 +93,42 @@ final public class FiltersPanel extends javax.swing.JPanel { em = ExplorerManager.find(this); } + private void startPopupChanged(java.beans.PropertyChangeEvent evt) { + if (evt.getNewValue() instanceof Date) { + setStartDate((Date) evt.getNewValue()); + } + } + + /** + * + * @param newStartDate the value of newStartDate + */ + private void setStartDate(final Date newStartDate) { + startDateTextField.setValue(newStartDate); + startCalendarButton.setTargetDate(newStartDate); + } + + private void endPopupChanged(java.beans.PropertyChangeEvent evt) { + if (evt.getNewValue() instanceof Date) { + setEndDate((Date) evt.getNewValue()); + } + } + + /** + * + * @param newEndDate the value of newEndDate + */ + private void setEndDate(final Date newEndDate) { + endDateTextField.setValue(newEndDate); + endCalendarButton.setTargetDate(newEndDate); + } + + /** + * Validate and set the datetime field on the screen given a datetime + * string. + * + * @param date The date object + */ /** * Populate the Account Types filter widgets */ @@ -187,15 +236,20 @@ final public class FiltersPanel extends javax.swing.JPanel { jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel2Layout.createSequentialGroup() - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() - .addContainerGap(43, Short.MAX_VALUE) - .addComponent(unCheckAllAccountTypesButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(checkAllAccountTypesButton)) - .addComponent(accountTypesLabel) - .addComponent(accountTypePane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel2Layout.createSequentialGroup() + .addComponent(accountTypesLabel) + .addGap(0, 0, Short.MAX_VALUE)) + .addGroup(jPanel2Layout.createSequentialGroup() + .addGap(8, 8, 8) + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(accountTypePane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(jPanel2Layout.createSequentialGroup() + .addGap(0, 32, Short.MAX_VALUE) + .addComponent(unCheckAllAccountTypesButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(checkAllAccountTypesButton))))) .addGap(0, 0, 0)) ); jPanel2Layout.setVerticalGroup( @@ -203,7 +257,7 @@ final public class FiltersPanel extends javax.swing.JPanel { .addGroup(jPanel2Layout.createSequentialGroup() .addComponent(accountTypesLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(accountTypePane, javax.swing.GroupLayout.DEFAULT_SIZE, 189, Short.MAX_VALUE) + .addComponent(accountTypePane, javax.swing.GroupLayout.DEFAULT_SIZE, 174, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(checkAllAccountTypesButton) @@ -238,12 +292,15 @@ final public class FiltersPanel extends javax.swing.JPanel { .addGroup(jPanel3Layout.createSequentialGroup() .addComponent(devicesLabel) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addComponent(devicesPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(jPanel3Layout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(unCheckAllDevicesButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(checkAllDevicesButton)) + .addGap(8, 8, 8) + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel3Layout.createSequentialGroup() + .addGap(0, 32, Short.MAX_VALUE) + .addComponent(unCheckAllDevicesButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(checkAllDevicesButton)) + .addComponent(devicesPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) ); jPanel3Layout.setVerticalGroup( jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -251,7 +308,7 @@ final public class FiltersPanel extends javax.swing.JPanel { .addGap(0, 0, 0) .addComponent(devicesLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(devicesPane, javax.swing.GroupLayout.DEFAULT_SIZE, 86, Short.MAX_VALUE) + .addComponent(devicesPane, javax.swing.GroupLayout.DEFAULT_SIZE, 59, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(checkAllDevicesButton) @@ -259,19 +316,97 @@ final public class FiltersPanel extends javax.swing.JPanel { .addGap(0, 0, 0)) ); + dateRangeLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/calendar.png"))); // NOI18N + dateRangeLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.dateRangeLabel.text")); // NOI18N + + startCheckBox.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.startCheckBox.text")); // NOI18N + startCheckBox.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + startCheckBoxStateChanged(evt); + } + }); + + endCheckBox.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.endCheckBox.text")); // NOI18N + endCheckBox.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + endCheckBoxStateChanged(evt); + } + }); + + startCalendarButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.startCalendarButton.text")); // NOI18N + startCalendarButton.setEnabled(false); + + endCalendarButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.endCalendarButton.text")); // NOI18N + endCalendarButton.setEnabled(false); + + endDateTextField.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.endDateTextField.text")); // NOI18N + endDateTextField.setEnabled(false); + endDateTextField.addFocusListener(new java.awt.event.FocusAdapter() { + public void focusLost(java.awt.event.FocusEvent evt) { + endDateTextFieldFocusLost(evt); + } + }); + + startDateTextField.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.startDateTextField.text")); // NOI18N + startDateTextField.setEnabled(false); + startDateTextField.addFocusListener(new java.awt.event.FocusAdapter() { + public void focusLost(java.awt.event.FocusEvent evt) { + startDateTextFieldFocusLost(evt); + } + }); + + javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4); + jPanel4.setLayout(jPanel4Layout); + jPanel4Layout.setHorizontalGroup( + jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel4Layout.createSequentialGroup() + .addComponent(dateRangeLabel) + .addContainerGap()) + .addGroup(jPanel4Layout.createSequentialGroup() + .addGap(0, 0, 0) + .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(endCheckBox) + .addComponent(startCheckBox)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(endDateTextField) + .addComponent(startDateTextField)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(startCalendarButton, javax.swing.GroupLayout.DEFAULT_SIZE, 27, Short.MAX_VALUE) + .addComponent(endCalendarButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + ); + jPanel4Layout.setVerticalGroup( + jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel4Layout.createSequentialGroup() + .addComponent(dateRangeLabel) + .addGap(5, 5, 5) + .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(startCheckBox) + .addComponent(startCalendarButton, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(startDateTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(endCheckBox) + .addComponent(endCalendarButton, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(endDateTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(0, 0, 0)) + ); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jPanel3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() + .addGroup(layout.createSequentialGroup() + .addGap(8, 8, 8) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() .addComponent(filtersTitleLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(applyFiltersButton, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addComponent(applyFiltersButton, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); layout.setVerticalGroup( @@ -283,9 +418,11 @@ final public class FiltersPanel extends javax.swing.JPanel { .addComponent(applyFiltersButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGap(18, 18, 18) .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(18, 18, 18) + .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap()) ); }// //GEN-END:initComponents @@ -388,6 +525,56 @@ final public class FiltersPanel extends javax.swing.JPanel { setAllDevicesSelected(true); }//GEN-LAST:event_checkAllDevicesButtonActionPerformed + private void endDateTextFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_endDateTextFieldFocusLost + String endDateString = this.endDateTextField.getText(); + if (endDateString.isEmpty() == false) { + try { + Date fromDate = DATE_FORMAT.parse(endDateString); + endCalendarButton.setTargetDate(fromDate); + } catch (ParseException ex) { + // for now, no need to show the error message to the user here + } + } else { + endCheckBox.setSelected(false); + } + }//GEN-LAST:event_endDateTextFieldFocusLost + + private void startDateTextFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_startDateTextFieldFocusLost + String startDateString = this.startDateTextField.getText(); + if (startDateString.isEmpty() == false) { + try { + Date fromDate = DATE_FORMAT.parse(startDateString); + startCalendarButton.setTargetDate(fromDate); + } catch (ParseException ex) { + // for now, no need to show the error message to the user here + } + } else { + startCheckBox.setSelected(false); + } + }//GEN-LAST:event_startDateTextFieldFocusLost + + private void startCheckBoxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_startCheckBoxStateChanged + boolean selected = startCheckBox.isSelected(); + startCalendarButton.setEnabled(selected); + startDateTextField.setEnabled(selected); + + if (selected && startDateTextField.getText().isEmpty()) { + final Instant threeWeeksAgoInstant = + LocalDate.now().minusWeeks(3).atStartOfDay(ZoneId.systemDefault()).toInstant(); + setStartDate(Date.from(threeWeeksAgoInstant)); + } + }//GEN-LAST:event_startCheckBoxStateChanged + + private void endCheckBoxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_endCheckBoxStateChanged + boolean selected = endCheckBox.isSelected(); + endCalendarButton.setEnabled(selected); + endDateTextField.setEnabled(selected); + + if (selected && endDateTextField.getText().isEmpty()) { + setEndDate(new Date()); + } + }//GEN-LAST:event_endCheckBoxStateChanged + // Variables declaration - do not modify//GEN-BEGIN:variables private final javax.swing.JPanel accountTypePane = new javax.swing.JPanel(); @@ -395,13 +582,21 @@ final public class FiltersPanel extends javax.swing.JPanel { private final javax.swing.JButton applyFiltersButton = new javax.swing.JButton(); private final javax.swing.JButton checkAllAccountTypesButton = new javax.swing.JButton(); private final javax.swing.JButton checkAllDevicesButton = new javax.swing.JButton(); + private final javax.swing.JLabel dateRangeLabel = new javax.swing.JLabel(); private final javax.swing.JLabel devicesLabel = new javax.swing.JLabel(); private final javax.swing.JPanel devicesPane = new javax.swing.JPanel(); + private final org.jbundle.thin.base.screen.jcalendarbutton.JCalendarButton endCalendarButton = new org.jbundle.thin.base.screen.jcalendarbutton.JCalendarButton(); + private final javax.swing.JCheckBox endCheckBox = new javax.swing.JCheckBox(); + private final javax.swing.JFormattedTextField endDateTextField = new JFormattedTextField(this.DATE_FORMAT); private final javax.swing.JLabel filtersTitleLabel = new javax.swing.JLabel(); private final javax.swing.JList jList1 = new javax.swing.JList<>(); private final javax.swing.JPanel jPanel2 = new javax.swing.JPanel(); private final javax.swing.JPanel jPanel3 = new javax.swing.JPanel(); + private final javax.swing.JPanel jPanel4 = new javax.swing.JPanel(); private final javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane(); + private final org.jbundle.thin.base.screen.jcalendarbutton.JCalendarButton startCalendarButton = new org.jbundle.thin.base.screen.jcalendarbutton.JCalendarButton(); + private final javax.swing.JCheckBox startCheckBox = new javax.swing.JCheckBox(); + private final javax.swing.JFormattedTextField startDateTextField = new JFormattedTextField(this.DATE_FORMAT); 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 From 1b296156936baf9b22a0b503710bb9d2ab5689e2 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Fri, 10 Nov 2017 21:18:48 +0100 Subject: [PATCH 3/8] just set the default value initialy, don't wait for fields to be eneabled --- .../autopsy/communications/FiltersPanel.java | 47 +++++++------------ 1 file changed, 16 insertions(+), 31 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java index 43ba0b4a4c..f397627f65 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java @@ -68,7 +68,10 @@ final public class FiltersPanel extends javax.swing.JPanel { initComponents(); startCalendarButton.addPropertyChangeListener(this::startPopupChanged); endCalendarButton.addPropertyChangeListener(this::endPopupChanged); - + final Instant threeWeeksAgoInstant = + LocalDate.now().minusWeeks(3).atStartOfDay(ZoneId.systemDefault()).toInstant(); + setStartDate(Date.from(threeWeeksAgoInstant)); + setEndDate(new Date()); updateAndApplyFilters(); } @@ -527,52 +530,34 @@ final public class FiltersPanel extends javax.swing.JPanel { private void endDateTextFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_endDateTextFieldFocusLost String endDateString = this.endDateTextField.getText(); - if (endDateString.isEmpty() == false) { - try { - Date fromDate = DATE_FORMAT.parse(endDateString); - endCalendarButton.setTargetDate(fromDate); - } catch (ParseException ex) { - // for now, no need to show the error message to the user here - } - } else { - endCheckBox.setSelected(false); + try { + Date fromDate = DATE_FORMAT.parse(endDateString); + endCalendarButton.setTargetDate(fromDate); + } catch (ParseException ex) { + // for now, no need to show the error message to the user here } }//GEN-LAST:event_endDateTextFieldFocusLost private void startDateTextFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_startDateTextFieldFocusLost String startDateString = this.startDateTextField.getText(); - if (startDateString.isEmpty() == false) { - try { - Date fromDate = DATE_FORMAT.parse(startDateString); - startCalendarButton.setTargetDate(fromDate); - } catch (ParseException ex) { - // for now, no need to show the error message to the user here - } - } else { - startCheckBox.setSelected(false); + try { + Date fromDate = DATE_FORMAT.parse(startDateString); + startCalendarButton.setTargetDate(fromDate); + } catch (ParseException ex) { + // for now, no need to show the error message to the user here } }//GEN-LAST:event_startDateTextFieldFocusLost private void startCheckBoxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_startCheckBoxStateChanged - boolean selected = startCheckBox.isSelected(); + boolean selected = startCheckBox.isSelected(); startCalendarButton.setEnabled(selected); startDateTextField.setEnabled(selected); - - if (selected && startDateTextField.getText().isEmpty()) { - final Instant threeWeeksAgoInstant = - LocalDate.now().minusWeeks(3).atStartOfDay(ZoneId.systemDefault()).toInstant(); - setStartDate(Date.from(threeWeeksAgoInstant)); - } }//GEN-LAST:event_startCheckBoxStateChanged private void endCheckBoxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_endCheckBoxStateChanged - boolean selected = endCheckBox.isSelected(); + boolean selected = endCheckBox.isSelected(); endCalendarButton.setEnabled(selected); endDateTextField.setEnabled(selected); - - if (selected && endDateTextField.getText().isEmpty()) { - setEndDate(new Date()); - } }//GEN-LAST:event_endCheckBoxStateChanged From 30455d5c65b61a3e09ef9a648ff5d4c2e8f56aa3 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Mon, 13 Nov 2017 15:08:42 +0100 Subject: [PATCH 4/8] replace JCalendarButton with LGoodDatePicker, tweak layout --- .../autopsy/communications/Bundle.properties | 4 - .../communications/CVTTopComponent.form | 20 +- .../communications/CVTTopComponent.java | 18 +- .../autopsy/communications/FiltersPanel.form | 110 ++++------ .../autopsy/communications/FiltersPanel.java | 192 +++++------------- CoreLibs/ivy.xml | 1 + CoreLibs/nbproject/project.properties | 3 + CoreLibs/nbproject/project.xml | 7 + 8 files changed, 123 insertions(+), 232 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties index 11ae095dbc..5b2de59bea 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties @@ -11,7 +11,3 @@ FiltersPanel.checkAllDevicesButton.text=Check All FiltersPanel.dateRangeLabel.text=Date Range: FiltersPanel.startCheckBox.text=start: FiltersPanel.endCheckBox.text=end: -FiltersPanel.endDateTextField.text= -FiltersPanel.startDateTextField.text= -FiltersPanel.startCalendarButton.text= -FiltersPanel.endCalendarButton.text= diff --git a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.form b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.form index 0463a92715..3f36c1afd3 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.form +++ b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.form @@ -17,23 +17,23 @@ - - - - - + + + + + - + + - - + @@ -95,12 +95,12 @@ - + - + diff --git a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java index b5c26bb1a2..f7b5daa0c2 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java @@ -77,11 +77,11 @@ public final class CVTTopComponent extends TopComponent implements ExplorerManag jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 594, Short.MAX_VALUE) + .addGap(0, 597, Short.MAX_VALUE) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 710, Short.MAX_VALUE) + .addGap(0, 718, Short.MAX_VALUE) ); BrowseVisualizeTabPane.addTab(org.openide.util.NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.TabConstraints.tabTitle"), new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/emblem-web.png")), jPanel1); // NOI18N @@ -95,20 +95,20 @@ public final class CVTTopComponent extends TopComponent implements ExplorerManag layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(filtersPane, javax.swing.GroupLayout.PREFERRED_SIZE, 244, Short.MAX_VALUE) + .addGap(0, 0, 0) + .addComponent(filtersPane, javax.swing.GroupLayout.PREFERRED_SIZE, 246, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(splitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 1322, Short.MAX_VALUE) - .addContainerGap()) + .addComponent(splitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 1344, Short.MAX_VALUE) + .addGap(0, 0, 0)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(filtersPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(splitPane)) - .addContainerGap()) + .addComponent(splitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 756, Short.MAX_VALUE) + .addComponent(filtersPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(5, 5, 5)) ); }// //GEN-END:initComponents diff --git a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.form b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.form index 02c5a82a1e..cfcdf28784 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.form +++ b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.form @@ -53,7 +53,10 @@ - + + + + @@ -62,7 +65,7 @@ - + @@ -125,7 +128,7 @@ - + @@ -142,7 +145,7 @@ - + @@ -212,7 +215,7 @@ - + @@ -228,7 +231,7 @@ - + @@ -277,6 +280,9 @@ + + + @@ -291,25 +297,20 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + @@ -318,23 +319,25 @@ - - - - + + + - - - - - + + + + - + + + + + @@ -365,50 +368,11 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java index f397627f65..b25100ab08 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java @@ -18,13 +18,9 @@ */ package org.sleuthkit.autopsy.communications; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.time.Instant; import java.time.LocalDate; import java.time.ZoneId; -import java.util.Date; +import java.time.ZoneOffset; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -32,10 +28,10 @@ import java.util.Map.Entry; import java.util.logging.Level; import java.util.stream.Collectors; import javax.swing.JCheckBox; -import javax.swing.JFormattedTextField; import org.openide.explorer.ExplorerManager; import org.openide.nodes.AbstractNode; import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.ThreadConfined; import org.sleuthkit.datamodel.Account; @@ -43,6 +39,7 @@ import org.sleuthkit.datamodel.AccountTypeFilter; import org.sleuthkit.datamodel.CommunicationsFilter; import org.sleuthkit.datamodel.CommunicationsManager; import org.sleuthkit.datamodel.DataSource; +import org.sleuthkit.datamodel.DateRangeFilter; import org.sleuthkit.datamodel.DeviceFilter; import org.sleuthkit.datamodel.TskCoreException; @@ -51,27 +48,22 @@ import org.sleuthkit.datamodel.TskCoreException; * changes into queries against the CommunicationsManager. */ final public class FiltersPanel extends javax.swing.JPanel { - + private static final Logger logger = Logger.getLogger(FiltersPanel.class.getName()); private static final long serialVersionUID = 1L; - private static final DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy"); - +// private static final DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy"); private ExplorerManager em; - + @ThreadConfined(type = ThreadConfined.ThreadType.AWT) private final Map accountTypeMap = new HashMap<>(); @ThreadConfined(type = ThreadConfined.ThreadType.AWT) private final Map devicesMap = new HashMap<>(); - + public FiltersPanel() { initComponents(); - startCalendarButton.addPropertyChangeListener(this::startPopupChanged); - endCalendarButton.addPropertyChangeListener(this::endPopupChanged); - final Instant threeWeeksAgoInstant = - LocalDate.now().minusWeeks(3).atStartOfDay(ZoneId.systemDefault()).toInstant(); - setStartDate(Date.from(threeWeeksAgoInstant)); - setEndDate(new Date()); + startDatePicker.setDate(LocalDate.now().minusWeeks(3)); + endDatePicker.setDateToToday(); updateAndApplyFilters(); } @@ -84,8 +76,10 @@ final public class FiltersPanel extends javax.swing.JPanel { if (em != null) { applyFilters(); } + + dateRangeLabel.setText("Date Range ( " + (UserPreferences.displayTimesInLocalTime() ? ZoneId.systemDefault().getId() : ZoneOffset.UTC.getId()) + "):"); } - + @Override public void addNotify() { super.addNotify(); @@ -96,42 +90,6 @@ final public class FiltersPanel extends javax.swing.JPanel { em = ExplorerManager.find(this); } - private void startPopupChanged(java.beans.PropertyChangeEvent evt) { - if (evt.getNewValue() instanceof Date) { - setStartDate((Date) evt.getNewValue()); - } - } - - /** - * - * @param newStartDate the value of newStartDate - */ - private void setStartDate(final Date newStartDate) { - startDateTextField.setValue(newStartDate); - startCalendarButton.setTargetDate(newStartDate); - } - - private void endPopupChanged(java.beans.PropertyChangeEvent evt) { - if (evt.getNewValue() instanceof Date) { - setEndDate((Date) evt.getNewValue()); - } - } - - /** - * - * @param newEndDate the value of newEndDate - */ - private void setEndDate(final Date newEndDate) { - endDateTextField.setValue(newEndDate); - endCalendarButton.setTargetDate(newEndDate); - } - - /** - * Validate and set the datetime field on the screen given a datetime - * string. - * - * @param date The date object - */ /** * Populate the Account Types filter widgets */ @@ -249,7 +207,7 @@ final public class FiltersPanel extends javax.swing.JPanel { .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(accountTypePane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(jPanel2Layout.createSequentialGroup() - .addGap(0, 32, Short.MAX_VALUE) + .addGap(0, 0, Short.MAX_VALUE) .addComponent(unCheckAllAccountTypesButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(checkAllAccountTypesButton))))) @@ -260,7 +218,7 @@ final public class FiltersPanel extends javax.swing.JPanel { .addGroup(jPanel2Layout.createSequentialGroup() .addComponent(accountTypesLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(accountTypePane, javax.swing.GroupLayout.DEFAULT_SIZE, 174, Short.MAX_VALUE) + .addComponent(accountTypePane, javax.swing.GroupLayout.DEFAULT_SIZE, 220, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(checkAllAccountTypesButton) @@ -286,6 +244,7 @@ final public class FiltersPanel extends javax.swing.JPanel { }); devicesPane.setBorder(javax.swing.BorderFactory.createEtchedBorder()); + devicesPane.setMinimumSize(new java.awt.Dimension(4, 100)); devicesPane.setLayout(new javax.swing.BoxLayout(devicesPane, javax.swing.BoxLayout.Y_AXIS)); javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); @@ -299,7 +258,7 @@ final public class FiltersPanel extends javax.swing.JPanel { .addGap(8, 8, 8) .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel3Layout.createSequentialGroup() - .addGap(0, 32, Short.MAX_VALUE) + .addGap(0, 0, Short.MAX_VALUE) .addComponent(unCheckAllDevicesButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(checkAllDevicesButton)) @@ -311,7 +270,7 @@ final public class FiltersPanel extends javax.swing.JPanel { .addGap(0, 0, 0) .addComponent(devicesLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(devicesPane, javax.swing.GroupLayout.DEFAULT_SIZE, 59, Short.MAX_VALUE) + .addComponent(devicesPane, javax.swing.GroupLayout.DEFAULT_SIZE, 107, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(checkAllDevicesButton) @@ -319,6 +278,8 @@ final public class FiltersPanel extends javax.swing.JPanel { .addGap(0, 0, 0)) ); + startDatePicker.setEnabled(false); + dateRangeLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/calendar.png"))); // NOI18N dateRangeLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.dateRangeLabel.text")); // NOI18N @@ -336,64 +297,37 @@ final public class FiltersPanel extends javax.swing.JPanel { } }); - startCalendarButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.startCalendarButton.text")); // NOI18N - startCalendarButton.setEnabled(false); - - endCalendarButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.endCalendarButton.text")); // NOI18N - endCalendarButton.setEnabled(false); - - endDateTextField.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.endDateTextField.text")); // NOI18N - endDateTextField.setEnabled(false); - endDateTextField.addFocusListener(new java.awt.event.FocusAdapter() { - public void focusLost(java.awt.event.FocusEvent evt) { - endDateTextFieldFocusLost(evt); - } - }); - - startDateTextField.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.startDateTextField.text")); // NOI18N - startDateTextField.setEnabled(false); - startDateTextField.addFocusListener(new java.awt.event.FocusAdapter() { - public void focusLost(java.awt.event.FocusEvent evt) { - startDateTextFieldFocusLost(evt); - } - }); + endDatePicker.setEnabled(false); javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4); jPanel4.setLayout(jPanel4Layout); jPanel4Layout.setHorizontalGroup( jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel4Layout.createSequentialGroup() - .addComponent(dateRangeLabel) - .addContainerGap()) - .addGroup(jPanel4Layout.createSequentialGroup() - .addGap(0, 0, 0) .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(endCheckBox) - .addComponent(startCheckBox)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(endDateTextField) - .addComponent(startDateTextField)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(startCalendarButton, javax.swing.GroupLayout.DEFAULT_SIZE, 27, Short.MAX_VALUE) - .addComponent(endCalendarButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addComponent(dateRangeLabel) + .addGroup(jPanel4Layout.createSequentialGroup() + .addComponent(startCheckBox) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(startDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, 162, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel4Layout.createSequentialGroup() + .addComponent(endCheckBox) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(endDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, 161, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGap(0, 0, 0)) ); jPanel4Layout.setVerticalGroup( jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel4Layout.createSequentialGroup() .addComponent(dateRangeLabel) .addGap(5, 5, 5) - .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(startCheckBox) - .addComponent(startCalendarButton, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(startDateTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(startDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(7, 7, 7) + .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(endCheckBox) - .addComponent(endCalendarButton, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(endDateTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(0, 0, 0)) + .addComponent(endDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); @@ -409,13 +343,15 @@ final public class FiltersPanel extends javax.swing.JPanel { .addComponent(filtersTitleLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(applyFiltersButton, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(0, 0, 0))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addContainerGap() + .addGap(0, 0, 0) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(filtersTitleLabel) .addComponent(applyFiltersButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) @@ -441,16 +377,17 @@ final public class FiltersPanel extends javax.swing.JPanel { CommunicationsFilter commsFilter = new CommunicationsFilter(); commsFilter.addAndFilter(getDeviceFilter()); commsFilter.addAndFilter(getAccountTypeFilter()); - + commsFilter.addAndFilter(getDateRangeFilter()); + try { final CommunicationsManager commsManager = Case.getCurrentCase().getSleuthkitCase().getCommunicationsManager(); - + List accountDeviceInstanceKeys = commsManager.getAccountDeviceInstancesWithCommunications(commsFilter) .stream() .map(adi -> new AccountDeviceInstanceKey(adi, commsFilter)) .collect(Collectors.toList()); - + em.setRootContext(new AbstractNode(new AccountsRootChildren(accountDeviceInstanceKeys, commsManager))); } catch (TskCoreException ex) { logger.log(Level.SEVERE, "There was a error loading the accounts.", ex); @@ -480,6 +417,15 @@ final public class FiltersPanel extends javax.swing.JPanel { .map(entry -> entry.getKey()).collect(Collectors.toSet())); return accountTypeFilter; } + + private DateRangeFilter getDateRangeFilter() { + ZoneId zone = UserPreferences.displayTimesInLocalTime() ? ZoneId.systemDefault() : ZoneOffset.UTC; + long start = startDatePicker.isEnabled() ? startDatePicker.getDate().atStartOfDay(zone).toEpochSecond() : 0; + + //need to go to next day since atStartOfDay() is going to shift back to midnight + long end = endDatePicker.isEnabled() ? endDatePicker.getDate().plusDays(1).atStartOfDay(zone).toEpochSecond() : 0; + return new DateRangeFilter(start, end); + } /** * Set the selection state of all the account type check boxes @@ -528,36 +474,12 @@ final public class FiltersPanel extends javax.swing.JPanel { setAllDevicesSelected(true); }//GEN-LAST:event_checkAllDevicesButtonActionPerformed - private void endDateTextFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_endDateTextFieldFocusLost - String endDateString = this.endDateTextField.getText(); - try { - Date fromDate = DATE_FORMAT.parse(endDateString); - endCalendarButton.setTargetDate(fromDate); - } catch (ParseException ex) { - // for now, no need to show the error message to the user here - } - }//GEN-LAST:event_endDateTextFieldFocusLost - - private void startDateTextFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_startDateTextFieldFocusLost - String startDateString = this.startDateTextField.getText(); - try { - Date fromDate = DATE_FORMAT.parse(startDateString); - startCalendarButton.setTargetDate(fromDate); - } catch (ParseException ex) { - // for now, no need to show the error message to the user here - } - }//GEN-LAST:event_startDateTextFieldFocusLost - private void startCheckBoxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_startCheckBoxStateChanged - boolean selected = startCheckBox.isSelected(); - startCalendarButton.setEnabled(selected); - startDateTextField.setEnabled(selected); + startDatePicker.setEnabled(startCheckBox.isSelected()); }//GEN-LAST:event_startCheckBoxStateChanged private void endCheckBoxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_endCheckBoxStateChanged - boolean selected = endCheckBox.isSelected(); - endCalendarButton.setEnabled(selected); - endDateTextField.setEnabled(selected); + endDatePicker.setEnabled(endCheckBox.isSelected()); }//GEN-LAST:event_endCheckBoxStateChanged @@ -570,18 +492,16 @@ final public class FiltersPanel extends javax.swing.JPanel { private final javax.swing.JLabel dateRangeLabel = new javax.swing.JLabel(); private final javax.swing.JLabel devicesLabel = new javax.swing.JLabel(); private final javax.swing.JPanel devicesPane = new javax.swing.JPanel(); - private final org.jbundle.thin.base.screen.jcalendarbutton.JCalendarButton endCalendarButton = new org.jbundle.thin.base.screen.jcalendarbutton.JCalendarButton(); private final javax.swing.JCheckBox endCheckBox = new javax.swing.JCheckBox(); - private final javax.swing.JFormattedTextField endDateTextField = new JFormattedTextField(this.DATE_FORMAT); + private final com.github.lgooddatepicker.datepicker.DatePicker endDatePicker = new com.github.lgooddatepicker.datepicker.DatePicker(); private final javax.swing.JLabel filtersTitleLabel = new javax.swing.JLabel(); private final javax.swing.JList jList1 = new javax.swing.JList<>(); private final javax.swing.JPanel jPanel2 = new javax.swing.JPanel(); private final javax.swing.JPanel jPanel3 = new javax.swing.JPanel(); private final javax.swing.JPanel jPanel4 = new javax.swing.JPanel(); private final javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane(); - private final org.jbundle.thin.base.screen.jcalendarbutton.JCalendarButton startCalendarButton = new org.jbundle.thin.base.screen.jcalendarbutton.JCalendarButton(); private final javax.swing.JCheckBox startCheckBox = new javax.swing.JCheckBox(); - private final javax.swing.JFormattedTextField startDateTextField = new JFormattedTextField(this.DATE_FORMAT); + private final com.github.lgooddatepicker.datepicker.DatePicker startDatePicker = new com.github.lgooddatepicker.datepicker.DatePicker(); 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 diff --git a/CoreLibs/ivy.xml b/CoreLibs/ivy.xml index bfd9112f9e..406847acac 100755 --- a/CoreLibs/ivy.xml +++ b/CoreLibs/ivy.xml @@ -14,6 +14,7 @@ + diff --git a/CoreLibs/nbproject/project.properties b/CoreLibs/nbproject/project.properties index 13a62b62ee..057a3d3568 100755 --- a/CoreLibs/nbproject/project.properties +++ b/CoreLibs/nbproject/project.properties @@ -53,6 +53,7 @@ file.reference.joda-time-2.4-javadoc.jar=release/modules/ext/joda-time-2.4-javad file.reference.joda-time-2.4-sources.jar=release/modules/ext/joda-time-2.4-sources.jar file.reference.joda-time-2.4.jar=release/modules/ext/joda-time-2.4.jar file.reference.jsr305-1.3.9.jar=release/modules/ext/jsr305-1.3.9.jar +file.reference.LGoodDatePicker-4.3.1.jar=release/modules/ext/LGoodDatePicker-4.3.1.jar file.reference.log4j-1.2.17.jar=release/modules/ext/log4j-1.2.17.jar file.reference.logkit-1.0.1.jar=release/modules/ext/logkit-1.0.1.jar file.reference.mail-1.4.3.jar=release/modules/ext/mail-1.4.3.jar @@ -82,6 +83,7 @@ javadoc.reference.guava-19.0.jar=release/modules/ext/guava-19.0-javadoc.jar javadoc.reference.jfxtras-common-8.0-r4.jar=release/modules/ext/jfxtras-common-8.0-r4-javadoc.jar javadoc.reference.jfxtras-controls-8.0-r4.jar=release/modules/ext/jfxtras-controls-8.0-r4-javadoc.jar javadoc.reference.jfxtras-fxml-8.0-r4.jar=release/modules/ext/jfxtras-fxml-8.0-r4-javadoc.jar +javadoc.reference.LGoodDatePicker-4.3.1.jar=release/modules/ext/LGoodDatePicker-4.3.1-javadoc.jar nbm.needs.restart=true source.reference.commons-csv-1.4.jar=release/modules/ext/commons-csv-1.4-sources.jar source.reference.commons-io-2.5.jar=release/modules/ext/commons-io-2.5-sources.jar @@ -91,3 +93,4 @@ source.reference.guava-19.0.jar=release/modules/ext/guava-19.0-sources.jar source.reference.jfxtras-common-8.0-r4.jar=release/modules/ext/jfxtras-common-8.0-r4-sources.jar source.reference.jfxtras-controls-8.0-r4.jar=release/modules/ext/jfxtras-controls-8.0-r4-sources.jar source.reference.jfxtras-fxml-8.0-r4.jar=release/modules/ext/jfxtras-fxml-8.0-r4-sources.jar +source.reference.LGoodDatePicker-4.3.1.jar=release/modules/ext/LGoodDatePicker-4.3.1-sources.jar diff --git a/CoreLibs/nbproject/project.xml b/CoreLibs/nbproject/project.xml index 6fcef46ccd..bd62edb402 100755 --- a/CoreLibs/nbproject/project.xml +++ b/CoreLibs/nbproject/project.xml @@ -37,6 +37,9 @@ com.apple.eawt com.apple.eawt.event com.apple.eio + com.github.lgooddatepicker.datepicker + com.github.lgooddatepicker.datetimepicker + com.github.lgooddatepicker.timepicker com.github.mustachejava com.github.mustachejava.codes com.github.mustachejava.functions @@ -723,6 +726,10 @@ ext/imgscalr-lib-4.2.jar release/modules/ext/imgscalr-lib-4.2.jar + + ext/LGoodDatePicker-4.3.1.jar + release/modules/ext/LGoodDatePicker-4.3.1.jar + ext/xmlbeans-2.6.0.jar release/modules/ext/xmlbeans-2.6.0.jar From e0d768d139fe92c8f434bb385377b90976a46786 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Mon, 13 Nov 2017 15:52:30 +0100 Subject: [PATCH 5/8] don't do extra day, it is handled in filter --- .../autopsy/communications/FiltersPanel.java | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java index b25100ab08..858567f8e0 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java @@ -48,18 +48,18 @@ import org.sleuthkit.datamodel.TskCoreException; * changes into queries against the CommunicationsManager. */ final public class FiltersPanel extends javax.swing.JPanel { - + private static final Logger logger = Logger.getLogger(FiltersPanel.class.getName()); private static final long serialVersionUID = 1L; // private static final DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy"); private ExplorerManager em; - + @ThreadConfined(type = ThreadConfined.ThreadType.AWT) private final Map accountTypeMap = new HashMap<>(); @ThreadConfined(type = ThreadConfined.ThreadType.AWT) private final Map devicesMap = new HashMap<>(); - + public FiltersPanel() { initComponents(); startDatePicker.setDate(LocalDate.now().minusWeeks(3)); @@ -76,10 +76,10 @@ final public class FiltersPanel extends javax.swing.JPanel { if (em != null) { applyFilters(); } - + dateRangeLabel.setText("Date Range ( " + (UserPreferences.displayTimesInLocalTime() ? ZoneId.systemDefault().getId() : ZoneOffset.UTC.getId()) + "):"); } - + @Override public void addNotify() { super.addNotify(); @@ -378,16 +378,16 @@ final public class FiltersPanel extends javax.swing.JPanel { commsFilter.addAndFilter(getDeviceFilter()); commsFilter.addAndFilter(getAccountTypeFilter()); commsFilter.addAndFilter(getDateRangeFilter()); - + try { final CommunicationsManager commsManager = Case.getCurrentCase().getSleuthkitCase().getCommunicationsManager(); - + List accountDeviceInstanceKeys = commsManager.getAccountDeviceInstancesWithCommunications(commsFilter) .stream() .map(adi -> new AccountDeviceInstanceKey(adi, commsFilter)) .collect(Collectors.toList()); - + em.setRootContext(new AbstractNode(new AccountsRootChildren(accountDeviceInstanceKeys, commsManager))); } catch (TskCoreException ex) { logger.log(Level.SEVERE, "There was a error loading the accounts.", ex); @@ -417,13 +417,11 @@ final public class FiltersPanel extends javax.swing.JPanel { .map(entry -> entry.getKey()).collect(Collectors.toSet())); return accountTypeFilter; } - + private DateRangeFilter getDateRangeFilter() { ZoneId zone = UserPreferences.displayTimesInLocalTime() ? ZoneId.systemDefault() : ZoneOffset.UTC; long start = startDatePicker.isEnabled() ? startDatePicker.getDate().atStartOfDay(zone).toEpochSecond() : 0; - - //need to go to next day since atStartOfDay() is going to shift back to midnight - long end = endDatePicker.isEnabled() ? endDatePicker.getDate().plusDays(1).atStartOfDay(zone).toEpochSecond() : 0; + long end = endDatePicker.isEnabled() ? endDatePicker.getDate().atStartOfDay(zone).toEpochSecond() : 0; return new DateRangeFilter(start, end); } From 29237dd8825286425961cc3c80bcaf7beb2c181e Mon Sep 17 00:00:00 2001 From: millmanorama Date: Tue, 14 Nov 2017 16:35:44 +0100 Subject: [PATCH 6/8] fix project.xml for LGoodDatePicker --- CoreLibs/nbproject/project.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/CoreLibs/nbproject/project.xml b/CoreLibs/nbproject/project.xml index bd62edb402..f95b75754b 100755 --- a/CoreLibs/nbproject/project.xml +++ b/CoreLibs/nbproject/project.xml @@ -40,6 +40,7 @@ com.github.lgooddatepicker.datepicker com.github.lgooddatepicker.datetimepicker com.github.lgooddatepicker.timepicker + com.github.lgooddatepicker.zinternaltools com.github.mustachejava com.github.mustachejava.codes com.github.mustachejava.functions From f1c4792fa278df6beaf57a5b74b77521e1a3222b Mon Sep 17 00:00:00 2001 From: millmanorama Date: Tue, 14 Nov 2017 16:57:00 +0100 Subject: [PATCH 7/8] show the relationship date/time in the table according to user preferences --- .../sleuthkit/autopsy/communications/MessageBrowser.java | 8 +++----- .../autopsy/communications/RelationShipNode.java | 8 ++++++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessageBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/MessageBrowser.java index 6ab5289133..c7c1e6c83b 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/MessageBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MessageBrowser.java @@ -29,8 +29,6 @@ import org.sleuthkit.autopsy.corecomponents.DataResultPanel; import org.sleuthkit.autopsy.corecomponents.DataResultViewerTable; import org.sleuthkit.autopsy.corecomponents.TableFilterNode; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.directorytree.DataResultFilterNode; -import org.sleuthkit.datamodel.Account; import org.sleuthkit.datamodel.AccountDeviceInstance; import org.sleuthkit.datamodel.CommunicationsFilter; import org.sleuthkit.datamodel.CommunicationsManager; @@ -52,7 +50,7 @@ final class MessageBrowser extends javax.swing.JPanel implements ExplorerManager MessageBrowser() { initComponents(); messagesResultPanel = DataResultPanel.createInstanceUninitialized("Account", "", Node.EMPTY, 0, messageDataContent); - + splitPane.setTopComponent(messagesResultPanel); splitPane.setBottomComponent(messageDataContent); @@ -102,8 +100,8 @@ final class MessageBrowser extends javax.swing.JPanel implements ExplorerManager } } }); - messagesResultPanel.addResultViewer(new DataResultViewerTable(internalExplorerManager,"Messages")); - + messagesResultPanel.addResultViewer(new DataResultViewerTable(internalExplorerManager, "Messages")); + messagesResultPanel.open(); } diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationShipNode.java b/Core/src/org/sleuthkit/autopsy/communications/RelationShipNode.java index b46aa90ff3..19002a0771 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationShipNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationShipNode.java @@ -18,9 +18,13 @@ */ package org.sleuthkit.autopsy.communications; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.util.TimeZone; import java.util.logging.Level; import org.apache.commons.lang3.StringUtils; import org.openide.nodes.Sheet; +import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; import org.sleuthkit.autopsy.datamodel.NodeProperty; @@ -35,6 +39,7 @@ import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMA import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT; +import org.sleuthkit.datamodel.TimeUtilities; import org.sleuthkit.datamodel.TskCoreException; /** @@ -117,6 +122,9 @@ public class RelationShipNode extends BlackboardArtifactNode { BlackboardAttribute attribute = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.fromID(attributeType.getTypeID()))); if (attribute == null) { return ""; + } else if (attributeType.getValueType() == BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME) { + ZoneId zone = UserPreferences.displayTimesInLocalTime() ? ZoneOffset.systemDefault() : ZoneOffset.UTC; + return TimeUtilities.epochToTime(attribute.getValueLong(), TimeZone.getTimeZone(zone)); } else { return attribute.getDisplayString(); } From 5fdf18d7486b7f9d3edd08aa665eeee873376afe Mon Sep 17 00:00:00 2001 From: millmanorama Date: Tue, 14 Nov 2017 17:06:16 +0100 Subject: [PATCH 8/8] rename AccountUtils to Utils, add Utils.getUserPreferredZoneId() method --- .../autopsy/communications/AccountsRootChildren.java | 2 +- .../autopsy/communications/FiltersPanel.java | 8 +++----- .../autopsy/communications/RelationShipNode.java | 11 +++++------ .../communications/{AccountUtils.java => Utils.java} | 12 ++++++++++-- 4 files changed, 19 insertions(+), 14 deletions(-) rename Core/src/org/sleuthkit/autopsy/communications/{AccountUtils.java => Utils.java} (87%) diff --git a/Core/src/org/sleuthkit/autopsy/communications/AccountsRootChildren.java b/Core/src/org/sleuthkit/autopsy/communications/AccountsRootChildren.java index 53cb4e06c3..4f7ad9a039 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/AccountsRootChildren.java +++ b/Core/src/org/sleuthkit/autopsy/communications/AccountsRootChildren.java @@ -89,7 +89,7 @@ class AccountsRootChildren extends Children.Keys { this.commsManager = commsManager; this.filter = accountDeviceInstanceKey.getCommunicationsFilter(); setName(accountDeviceInstance.getAccount().getAccountUniqueID()); - setIconBaseWithExtension("org/sleuthkit/autopsy/communications/images/" + AccountUtils.getIconFileName(accountDeviceInstance.getAccount().getAccountType())); + setIconBaseWithExtension("org/sleuthkit/autopsy/communications/images/" + Utils.getIconFileName(accountDeviceInstance.getAccount().getAccountType())); } public AccountDeviceInstance getAccountDeviceInstance() { diff --git a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java index 858567f8e0..df5b3132fe 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java @@ -20,7 +20,6 @@ package org.sleuthkit.autopsy.communications; import java.time.LocalDate; import java.time.ZoneId; -import java.time.ZoneOffset; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -31,7 +30,6 @@ import javax.swing.JCheckBox; import org.openide.explorer.ExplorerManager; import org.openide.nodes.AbstractNode; import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.ThreadConfined; import org.sleuthkit.datamodel.Account; @@ -77,7 +75,7 @@ final public class FiltersPanel extends javax.swing.JPanel { applyFilters(); } - dateRangeLabel.setText("Date Range ( " + (UserPreferences.displayTimesInLocalTime() ? ZoneId.systemDefault().getId() : ZoneOffset.UTC.getId()) + "):"); + dateRangeLabel.setText("Date Range ( " + (Utils.getUserPreferredZoneId().getId() + "):"); } @Override @@ -111,7 +109,7 @@ final public class FiltersPanel extends javax.swing.JPanel { final JCheckBox jCheckBox = new JCheckBox( "
" + type.getDisplayName() + "
", true ); @@ -419,7 +417,7 @@ final public class FiltersPanel extends javax.swing.JPanel { } private DateRangeFilter getDateRangeFilter() { - ZoneId zone = UserPreferences.displayTimesInLocalTime() ? ZoneId.systemDefault() : ZoneOffset.UTC; + ZoneId zone = Utils.getUserPreferredZoneId(); long start = startDatePicker.isEnabled() ? startDatePicker.getDate().atStartOfDay(zone).toEpochSecond() : 0; long end = endDatePicker.isEnabled() ? endDatePicker.getDate().atStartOfDay(zone).toEpochSecond() : 0; return new DateRangeFilter(start, end); diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationShipNode.java b/Core/src/org/sleuthkit/autopsy/communications/RelationShipNode.java index 19002a0771..f92b89ee71 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationShipNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationShipNode.java @@ -18,13 +18,10 @@ */ package org.sleuthkit.autopsy.communications; -import java.time.ZoneId; -import java.time.ZoneOffset; import java.util.TimeZone; import java.util.logging.Level; import org.apache.commons.lang3.StringUtils; import org.openide.nodes.Sheet; -import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; import org.sleuthkit.autopsy.datamodel.NodeProperty; @@ -39,6 +36,7 @@ import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMA import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT; +import static org.sleuthkit.datamodel.BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME; import org.sleuthkit.datamodel.TimeUtilities; import org.sleuthkit.datamodel.TskCoreException; @@ -122,9 +120,9 @@ public class RelationShipNode extends BlackboardArtifactNode { BlackboardAttribute attribute = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.fromID(attributeType.getTypeID()))); if (attribute == null) { return ""; - } else if (attributeType.getValueType() == BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME) { - ZoneId zone = UserPreferences.displayTimesInLocalTime() ? ZoneOffset.systemDefault() : ZoneOffset.UTC; - return TimeUtilities.epochToTime(attribute.getValueLong(), TimeZone.getTimeZone(zone)); + } else if (attributeType.getValueType() == DATETIME) { + return TimeUtilities.epochToTime(attribute.getValueLong(), + TimeZone.getTimeZone(Utils.getUserPreferredZoneId())); } else { return attribute.getDisplayString(); } @@ -133,4 +131,5 @@ public class RelationShipNode extends BlackboardArtifactNode { return ""; } } + } diff --git a/Core/src/org/sleuthkit/autopsy/communications/AccountUtils.java b/Core/src/org/sleuthkit/autopsy/communications/Utils.java similarity index 87% rename from Core/src/org/sleuthkit/autopsy/communications/AccountUtils.java rename to Core/src/org/sleuthkit/autopsy/communications/Utils.java index 3c936ecc70..af8cd3f8b4 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/AccountUtils.java +++ b/Core/src/org/sleuthkit/autopsy/communications/Utils.java @@ -18,14 +18,22 @@ */ package org.sleuthkit.autopsy.communications; +import java.time.ZoneId; +import java.time.ZoneOffset; +import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.datamodel.Account; /** * Utility class with helpers for dealing with accounts. */ -class AccountUtils { +class Utils { - private AccountUtils() { + static ZoneId getUserPreferredZoneId() { + ZoneId zone = UserPreferences.displayTimesInLocalTime() ? ZoneOffset.systemDefault() : ZoneOffset.UTC; + return zone; + } + + private Utils() { } /**