19 package org.sleuthkit.autopsy.filesearch;
 
   21 import java.awt.event.ActionEvent;
 
   22 import java.awt.event.ActionListener;
 
   23 import java.text.DateFormat;
 
   24 import java.text.ParseException;
 
   25 import java.util.Date;
 
   26 import java.util.List;
 
   27 import javax.swing.JCheckBox;
 
   28 import javax.swing.JComboBox;
 
   29 import javax.swing.JFormattedTextField;
 
   30 import javax.swing.JMenuItem;
 
   31 import javax.swing.JPopupMenu;
 
   36 class DateSearchPanel 
extends javax.swing.JPanel {
 
   38     DateFormat dateFormat;
 
   39     List<String> timeZones;
 
   41     DateSearchPanel(DateFormat dateFormat, List<String> timeZones) {
 
   42         this.dateFormat = dateFormat;
 
   43         this.timeZones = timeZones;
 
   46         customizeComponents();
 
   49     private void customizeComponents() {
 
   51         dateFromTextField.setComponentPopupMenu(rightClickMenu);
 
   52         dateToTextField.setComponentPopupMenu(rightClickMenu);
 
   53         ActionListener actList = 
new ActionListener() {
 
   55             public void actionPerformed(ActionEvent e) {
 
   56                 JMenuItem jmi = (JMenuItem) e.getSource();
 
   61                 JFormattedTextField jftf = (JFormattedTextField) ((JPopupMenu) jmi.getParent()).getInvoker();
 
   62                 if (jmi.equals(cutMenuItem)) {
 
   64                 } 
else if (jmi.equals(copyMenuItem)) {
 
   66                 } 
else if (jmi.equals(pasteMenuItem)) {
 
   68                 } 
else if (jmi.equals(selectAllMenuItem)) {
 
   73         cutMenuItem.addActionListener(actList);
 
   74         copyMenuItem.addActionListener(actList);
 
   75         pasteMenuItem.addActionListener(actList);
 
   76         selectAllMenuItem.addActionListener(actList);
 
   77         this.setComponentsEnabled();
 
   80     JCheckBox getAccessedCheckBox() {
 
   81         return accessedCheckBox;
 
   84     JCheckBox getChangedCheckBox() {
 
   85         return changedCheckBox;
 
   88     JCheckBox getCreatedCheckBox() {
 
   89         return createdCheckBox;
 
   92     JCheckBox getDateCheckBox() {
 
   96     JFormattedTextField getDateFromTextField() {
 
   97         return dateFromTextField;
 
  100     JFormattedTextField getDateToTextField() {
 
  101         return dateToTextField;
 
  104     JCheckBox getModifiedCheckBox() {
 
  105         return modifiedCheckBox;
 
  108     JComboBox<String> getTimeZoneComboBox() {
 
  109         return timeZoneComboBox;
 
  112     void setTimeZones(List<String> newTimeZones) {
 
  113         this.timeZones = newTimeZones;
 
  114         this.timeZoneComboBox.removeAllItems();
 
  115         for (String tz : newTimeZones) {
 
  116             this.timeZoneComboBox.addItem(tz);
 
  120     private void setComponentsEnabled() {
 
  121         boolean enable = this.dateCheckBox.isSelected();
 
  122         this.dateFromTextField.setEnabled(enable);
 
  123         this.dateFromButtonCalendar.setEnabled(enable);
 
  124         this.jLabel1.setEnabled(enable);
 
  125         this.dateToTextField.setEnabled(enable);
 
  126         this.dateToButtonCalendar.setEnabled(enable);
 
  127         this.jLabel2.setEnabled(enable);
 
  128         this.jLabel3.setEnabled(enable);
 
  129         this.jLabel4.setEnabled(enable);
 
  130         this.timeZoneComboBox.setEnabled(enable);
 
  131         this.modifiedCheckBox.setEnabled(enable);
 
  132         this.accessedCheckBox.setEnabled(enable);
 
  133         this.changedCheckBox.setEnabled(enable);
 
  134         this.createdCheckBox.setEnabled(enable);
 
  142     @SuppressWarnings(
"unchecked")
 
  144     private 
void initComponents() {
 
  146         rightClickMenu = 
new javax.swing.JPopupMenu();
 
  147         cutMenuItem = 
new javax.swing.JMenuItem();
 
  148         copyMenuItem = 
new javax.swing.JMenuItem();
 
  149         pasteMenuItem = 
new javax.swing.JMenuItem();
 
  150         selectAllMenuItem = 
new javax.swing.JMenuItem();
 
  151         dateToTextField = 
new JFormattedTextField(this.dateFormat);
 
  152         jLabel1 = 
new javax.swing.JLabel();
 
  153         jLabel4 = 
new javax.swing.JLabel();
 
  154         dateCheckBox = 
new javax.swing.JCheckBox();
 
  155         timeZoneComboBox = 
new JComboBox<>(this.timeZones.toArray(
new String[this.timeZones.size()]));
 
  156         timeZoneComboBox.setRenderer(
new DateSearchFilter.ComboBoxRenderer());
 
  157         jLabel3 = 
new javax.swing.JLabel();
 
  158         dateFromTextField = 
new JFormattedTextField(this.dateFormat);
 
  159         jLabel2 = 
new javax.swing.JLabel();
 
  160         modifiedCheckBox = 
new javax.swing.JCheckBox();
 
  161         changedCheckBox = 
new javax.swing.JCheckBox();
 
  162         accessedCheckBox = 
new javax.swing.JCheckBox();
 
  163         createdCheckBox = 
new javax.swing.JCheckBox();
 
  164         dateFromButtonCalendar = 
new org.jbundle.thin.base.screen.jcalendarbutton.JCalendarButton();
 
  165         dateToButtonCalendar = 
new org.jbundle.thin.base.screen.jcalendarbutton.JCalendarButton();
 
  167         cutMenuItem.setText(
org.openide.util.NbBundle.getMessage(DateSearchPanel.class, 
"DateSearchPanel.cutMenuItem.text")); 
 
  168         rightClickMenu.add(cutMenuItem);
 
  170         copyMenuItem.setText(
org.openide.util.NbBundle.getMessage(DateSearchPanel.class, 
"DateSearchPanel.copyMenuItem.text")); 
 
  171         rightClickMenu.add(copyMenuItem);
 
  173         pasteMenuItem.setText(
org.openide.util.NbBundle.getMessage(DateSearchPanel.class, 
"DateSearchPanel.pasteMenuItem.text")); 
 
  174         rightClickMenu.add(pasteMenuItem);
 
  176         selectAllMenuItem.setText(
org.openide.util.NbBundle.getMessage(DateSearchPanel.class, 
"DateSearchPanel.selectAllMenuItem.text")); 
 
  177         rightClickMenu.add(selectAllMenuItem);
 
  179         dateToTextField.setText(
org.openide.util.NbBundle.getMessage(DateSearchPanel.class, 
"DateSearchPanel.dateToTextField.text")); 
 
  180         dateToTextField.addFocusListener(
new java.awt.event.FocusAdapter() {
 
  181             public void focusLost(java.awt.event.FocusEvent evt) {
 
  182                 dateToTextFieldFocusLost(evt);
 
  186         jLabel1.setText(
org.openide.util.NbBundle.getMessage(DateSearchPanel.class, 
"DateSearchPanel.jLabel1.text")); 
 
  188         jLabel4.setText(
org.openide.util.NbBundle.getMessage(DateSearchPanel.class, 
"DateSearchPanel.jLabel4.text")); 
 
  190         dateCheckBox.setText(
org.openide.util.NbBundle.getMessage(DateSearchPanel.class, 
"DateSearchPanel.dateCheckBox.text")); 
 
  191         dateCheckBox.addActionListener(
new java.awt.event.ActionListener() {
 
  192             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  193                 dateCheckBoxActionPerformed(evt);
 
  197         jLabel3.setFont(
new java.awt.Font(
"Tahoma", 0, 10)); 
 
  198         jLabel3.setText(
org.openide.util.NbBundle.getMessage(DateSearchPanel.class, 
"DateSearchPanel.jLabel3.text")); 
 
  200         dateFromTextField.setText(
org.openide.util.NbBundle.getMessage(DateSearchPanel.class, 
"DateSearchPanel.dateFromTextField.text")); 
 
  201         dateFromTextField.addFocusListener(
new java.awt.event.FocusAdapter() {
 
  202             public void focusLost(java.awt.event.FocusEvent evt) {
 
  203                 dateFromTextFieldFocusLost(evt);
 
  207         jLabel2.setFont(
new java.awt.Font(
"Tahoma", 0, 10)); 
 
  208         jLabel2.setText(
org.openide.util.NbBundle.getMessage(DateSearchPanel.class, 
"DateSearchPanel.jLabel2.text")); 
 
  210         modifiedCheckBox.setSelected(
true);
 
  211         modifiedCheckBox.setText(
org.openide.util.NbBundle.getMessage(DateSearchPanel.class, 
"DateSearchPanel.modifiedCheckBox.text")); 
 
  212         modifiedCheckBox.addActionListener(
new java.awt.event.ActionListener() {
 
  213             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  214                 modifiedCheckBoxActionPerformed(evt);
 
  218         changedCheckBox.setSelected(
true);
 
  219         changedCheckBox.setText(
org.openide.util.NbBundle.getMessage(DateSearchPanel.class, 
"DateSearchPanel.changedCheckBox.text")); 
 
  220         changedCheckBox.addActionListener(
new java.awt.event.ActionListener() {
 
  221             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  222                 changedCheckBoxActionPerformed(evt);
 
  226         accessedCheckBox.setSelected(
true);
 
  227         accessedCheckBox.setText(
org.openide.util.NbBundle.getMessage(DateSearchPanel.class, 
"DateSearchPanel.accessedCheckBox.text")); 
 
  228         accessedCheckBox.addActionListener(
new java.awt.event.ActionListener() {
 
  229             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  230                 accessedCheckBoxActionPerformed(evt);
 
  234         createdCheckBox.setSelected(
true);
 
  235         createdCheckBox.setText(
org.openide.util.NbBundle.getMessage(DateSearchPanel.class, 
"DateSearchPanel.createdCheckBox.text")); 
 
  236         createdCheckBox.addActionListener(
new java.awt.event.ActionListener() {
 
  237             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  238                 createdCheckBoxActionPerformed(evt);
 
  242         dateFromButtonCalendar.setText(
org.openide.util.NbBundle.getMessage(DateSearchPanel.class, 
"DateSearchPanel.dateFromButtonCalendar.text")); 
 
  243         dateFromButtonCalendar.addPropertyChangeListener(
new java.beans.PropertyChangeListener() {
 
  244             public void propertyChange(java.beans.PropertyChangeEvent evt) {
 
  245                 dateFromPopupChanged(evt);
 
  249         dateToButtonCalendar.setText(
org.openide.util.NbBundle.getMessage(DateSearchPanel.class, 
"DateSearchPanel.dateToButtonCalendar.text")); 
 
  250         dateToButtonCalendar.addPropertyChangeListener(
new java.beans.PropertyChangeListener() {
 
  251             public void propertyChange(java.beans.PropertyChangeEvent evt) {
 
  252                 dateToPopupChanged(evt);
 
  256         javax.swing.GroupLayout layout = 
new javax.swing.GroupLayout(
this);
 
  257         this.setLayout(layout);
 
  258         layout.setHorizontalGroup(
 
  259             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  260             .addGroup(layout.createSequentialGroup()
 
  261                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, 
false)
 
  262                     .addGroup(layout.createSequentialGroup()
 
  263                         .addComponent(dateCheckBox)
 
  264                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  265                         .addComponent(dateFromTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 92, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  267                         .addComponent(dateFromButtonCalendar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  268                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  269                         .addComponent(jLabel1)
 
  270                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  271                         .addComponent(dateToTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 92, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  273                         .addComponent(dateToButtonCalendar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  274                     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
 
  276                         .addComponent(jLabel2)
 
  277                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  278                         .addComponent(jLabel3)))
 
  279                 .addContainerGap(26, Short.MAX_VALUE))
 
  280             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
 
  281                 .addGap(0, 0, Short.MAX_VALUE)
 
  282                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  283                     .addGroup(layout.createSequentialGroup()
 
  284                         .addComponent(jLabel4)
 
  285                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  286                         .addComponent(timeZoneComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 193, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  287                     .addGroup(layout.createSequentialGroup()
 
  288                         .addComponent(modifiedCheckBox)
 
  290                         .addComponent(accessedCheckBox)
 
  291                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  292                         .addComponent(createdCheckBox)
 
  293                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  294                         .addComponent(changedCheckBox)))
 
  297         layout.setVerticalGroup(
 
  298             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  299             .addGroup(layout.createSequentialGroup()
 
  300                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, 
false)
 
  301                     .addGroup(layout.createSequentialGroup()
 
  302                         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  303                             .addComponent(dateCheckBox)
 
  304                             .addComponent(dateFromTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  306                     .addGroup(layout.createSequentialGroup()
 
  307                         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  308                             .addComponent(dateToButtonCalendar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  309                             .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  310                                 .addComponent(jLabel1)
 
  311                                 .addComponent(dateToTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  312                             .addComponent(dateFromButtonCalendar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  313                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  314                         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  315                             .addComponent(jLabel3)
 
  316                             .addComponent(jLabel2))
 
  317                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)))
 
  318                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  319                     .addComponent(jLabel4)
 
  320                     .addComponent(timeZoneComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  321                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  322                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  323                     .addComponent(modifiedCheckBox, javax.swing.GroupLayout.Alignment.TRAILING)
 
  324                     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  325                         .addComponent(accessedCheckBox)
 
  326                         .addComponent(createdCheckBox)
 
  327                         .addComponent(changedCheckBox)))
 
  332     private void dateFromTextFieldFocusLost(java.awt.event.FocusEvent evt) {
 
  334         String fromDateString = this.dateFromTextField.getText();
 
  335         if (!fromDateString.equals(
"")) {
 
  337                 Date fromDate = dateFormat.parse(fromDateString);
 
  338                 dateFromButtonCalendar.setTargetDate(fromDate);
 
  339             } 
catch (ParseException ex) {
 
  345     private void dateToTextFieldFocusLost(java.awt.event.FocusEvent evt) {
 
  347         String toDateString = this.dateToTextField.getText();
 
  348         if (!toDateString.equals(
"")) {
 
  350                 Date toDate = dateFormat.parse(toDateString);
 
  351                 dateToButtonCalendar.setTargetDate(toDate);
 
  352             } 
catch (ParseException ex) {
 
  358     private void dateFromPopupChanged(java.beans.PropertyChangeEvent evt) {
 
  359         if (evt.getNewValue() instanceof Date) {
 
  360             setFromDate((Date) evt.getNewValue());
 
  364     private void dateToPopupChanged(java.beans.PropertyChangeEvent evt) {
 
  365         if (evt.getNewValue() instanceof Date) {
 
  366             setToDate((Date) evt.getNewValue());
 
  370     private void dateCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {
 
  371         this.setComponentsEnabled();
 
  372         firePropertyChange(FileSearchPanel.EVENT.CHECKED.toString(), null, null);
 
  375     private void modifiedCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {
 
  376         firePropertyChange(FileSearchPanel.EVENT.CHECKED.toString(), null, null);
 
  379     private void accessedCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {
 
  380         firePropertyChange(FileSearchPanel.EVENT.CHECKED.toString(), null, null);
 
  383     private void createdCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {
 
  384         firePropertyChange(FileSearchPanel.EVENT.CHECKED.toString(), null, null);
 
  387     private void changedCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {
 
  388         firePropertyChange(FileSearchPanel.EVENT.CHECKED.toString(), null, null);
 
  397     private void setFromDate(Date date) {
 
  398         String dateStringResult = 
"";
 
  400             dateStringResult = dateFormat.format(date);
 
  402         dateFromTextField.setText(dateStringResult);
 
  403         dateFromButtonCalendar.setTargetDate(date);
 
  411     private void setToDate(Date date) {
 
  412         String dateStringResult = 
"";
 
  414             dateStringResult = dateFormat.format(date);
 
  416         dateToTextField.setText(dateStringResult);
 
  417         dateToButtonCalendar.setTargetDate(date);
 
  420     boolean isValidSearch() {
 
  421         return this.accessedCheckBox.isSelected() ||
 
  422                 this.changedCheckBox.isSelected() ||
 
  423                 this.createdCheckBox.isSelected() ||
 
  424                 this.modifiedCheckBox.isSelected();
 
  427     private javax.swing.JCheckBox accessedCheckBox;
 
  428     private javax.swing.JCheckBox changedCheckBox;
 
  429     private javax.swing.JMenuItem copyMenuItem;
 
  430     private javax.swing.JCheckBox createdCheckBox;
 
  431     private javax.swing.JMenuItem cutMenuItem;
 
  432     private javax.swing.JCheckBox dateCheckBox;
 
  433     private org.jbundle.thin.base.screen.jcalendarbutton.JCalendarButton dateFromButtonCalendar;
 
  434     private javax.swing.JFormattedTextField dateFromTextField;
 
  435     private org.jbundle.thin.base.screen.jcalendarbutton.JCalendarButton dateToButtonCalendar;
 
  436     private javax.swing.JFormattedTextField dateToTextField;
 
  437     private javax.swing.JLabel jLabel1;
 
  438     private javax.swing.JLabel jLabel2;
 
  439     private javax.swing.JLabel jLabel3;
 
  440     private javax.swing.JLabel jLabel4;
 
  441     private javax.swing.JCheckBox modifiedCheckBox;
 
  442     private javax.swing.JMenuItem pasteMenuItem;
 
  443     private javax.swing.JPopupMenu rightClickMenu;
 
  444     private javax.swing.JMenuItem selectAllMenuItem;
 
  445     private javax.swing.JComboBox<String> timeZoneComboBox;
 
  448     void addActionListener(ActionListener l) {
 
  449         dateFromTextField.addActionListener(l);
 
  450         dateToTextField.addActionListener(l);