Autopsy  4.8.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
FiltersPanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2017-2018 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.communications;
20 
21 import com.google.common.collect.ImmutableSet;
22 import java.awt.event.ItemListener;
23 import java.beans.PropertyChangeListener;
24 import java.time.LocalDate;
25 import java.time.ZoneId;
26 import java.util.EnumSet;
27 import java.util.HashMap;
28 import java.util.Map;
29 import java.util.Map.Entry;
30 import java.util.logging.Level;
31 import java.util.stream.Collectors;
32 import javax.swing.JCheckBox;
33 import javax.swing.JPanel;
34 import org.openide.util.NbBundle;
44 import org.sleuthkit.datamodel.Account;
45 import org.sleuthkit.datamodel.BlackboardArtifact;
46 import org.sleuthkit.datamodel.CommunicationsFilter;
47 import org.sleuthkit.datamodel.CommunicationsFilter.AccountTypeFilter;
48 import org.sleuthkit.datamodel.CommunicationsFilter.DateRangeFilter;
49 import org.sleuthkit.datamodel.CommunicationsFilter.DeviceFilter;
50 import org.sleuthkit.datamodel.DataSource;
51 import static org.sleuthkit.datamodel.Relationship.Type.CALL_LOG;
52 import static org.sleuthkit.datamodel.Relationship.Type.MESSAGE;
53 import org.sleuthkit.datamodel.SleuthkitCase;
54 import org.sleuthkit.datamodel.TskCoreException;
55 
60 @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
61 final public class FiltersPanel extends JPanel {
62 
63  private static final long serialVersionUID = 1L;
64  private static final Logger logger = Logger.getLogger(FiltersPanel.class.getName());
65 
70  private final Map<Account.Type, JCheckBox> accountTypeMap = new HashMap<>();
71 
75  @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
76  private final Map<String, JCheckBox> devicesMap = new HashMap<>();
77 
81  private final PropertyChangeListener ingestListener;
82 
87  private boolean needsRefresh;
88 
94  private final ItemListener validationListener;
95 
102  private boolean deviceAccountTypeEnabled;
103 
104  @NbBundle.Messages({"refreshText=Refresh Results", "applyText=Apply"})
105  public FiltersPanel() {
106  initComponents();
107  deviceRequiredLabel.setVisible(false);
108  accountTypeRequiredLabel.setVisible(false);
109  startDatePicker.setDate(LocalDate.now().minusWeeks(3));
110  endDatePicker.setDateToToday();
111  startDatePicker.getSettings().setVetoPolicy(
112  //no end date, or start is before end
113  startDate -> endCheckBox.isSelected() == false
114  || startDate.compareTo(endDatePicker.getDate()) <= 0
115  );
116  endDatePicker.getSettings().setVetoPolicy(
117  //no start date, or end is after start
118  endDate -> startCheckBox.isSelected() == false
119  || endDate.compareTo(startDatePicker.getDate()) >= 0
120  );
121 
122  updateTimeZone();
123  validationListener = itemEvent -> validateFilters();
124 
125  updateFilters(true);
126  UserPreferences.addChangeListener(preferenceChangeEvent -> {
127  if (preferenceChangeEvent.getKey().equals(UserPreferences.DISPLAY_TIMES_IN_LOCAL_TIME)) {
128  updateTimeZone();
129  }
130  });
131 
132  this.ingestListener = pce -> {
133  String eventType = pce.getPropertyName();
134  if (eventType.equals(DATA_ADDED.toString())) {
135  // Indicate that a refresh may be needed, unless the data added is Keyword or Hashset hits
136  ModuleDataEvent eventData = (ModuleDataEvent) pce.getOldValue();
137  if (null != eventData
138  && eventData.getBlackboardArtifactType().getTypeID() != BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID()
139  && eventData.getBlackboardArtifactType().getTypeID() != BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID()) {
140  updateFilters(false);
141  needsRefresh = true;
142  validateFilters();
143  }
144  }
145  };
146 
147  applyFiltersButton.addActionListener(e -> applyFilters());
148  refreshButton.addActionListener(e -> applyFilters());
149  }
150 
157  private void validateFilters() {
158  boolean someDevice = devicesMap.values().stream().anyMatch(JCheckBox::isSelected);
159  boolean someAccountType = accountTypeMap.values().stream().anyMatch(JCheckBox::isSelected);
160 
161  deviceRequiredLabel.setVisible(someDevice == false);
162  accountTypeRequiredLabel.setVisible(someAccountType == false);
163 
164  applyFiltersButton.setEnabled(someDevice && someAccountType);
165  refreshButton.setEnabled(someDevice && someAccountType && needsRefresh);
166  needsRefreshLabel.setVisible(needsRefresh);
167  }
168 
172  void updateAndApplyFilters(boolean initialState) {
173  updateFilters(initialState);
174  applyFilters();
175  }
176 
177  private void updateTimeZone() {
178  dateRangeLabel.setText("Date Range ( " + Utils.getUserPreferredZoneId().toString() + "):");
179  }
180 
184  private void updateFilters(boolean initialState) {
185  updateAccountTypeFilter();
186  updateDeviceFilter(initialState);
187  }
188 
189  @Override
190  public void addNotify() {
191  super.addNotify();
193  Case.addEventTypeSubscriber(EnumSet.of(CURRENT_CASE), evt -> {
194  //clear the device filter widget when the case changes.
195  devicesMap.clear();
196  devicesPane.removeAll();
197  });
198  }
199 
200  @Override
201  public void removeNotify() {
202  super.removeNotify();
204  }
205 
209  private void updateAccountTypeFilter() {
210 
211  //TODO: something like this commented code could be used to show only
212  //the account types that are found:
213  //final CommunicationsManager communicationsManager = Case.getCurrentOpenCase().getSleuthkitCase().getCommunicationsManager();
214  //List<Account.Type> accountTypesInUse = communicationsManager.getAccountTypesInUse();
215  //accountTypesInUSe.forEach(...)
216  Account.Type.PREDEFINED_ACCOUNT_TYPES.forEach(type -> {
217  if (type.equals(Account.Type.CREDIT_CARD)) {
218  //don't show a check box for credit cards
219  } else {
220  accountTypeMap.computeIfAbsent(type, t -> {
221  final JCheckBox jCheckBox = new JCheckBox(
222  "<html><table cellpadding=0><tr><td><img src=\""
223  + FiltersPanel.class.getResource(Utils.getIconFilePath(type))
224  + "\"/></td><td width=" + 3 + "><td>" + type.getDisplayName() + "</td></tr></table></html>",
225  true
226  );
227  jCheckBox.addItemListener(validationListener);
228  accountTypePane.add(jCheckBox);
229  if (t.equals(Account.Type.DEVICE)) {
230  //Deveice type filter is enabled based on whether we are in table or graph view.
231  jCheckBox.setEnabled(deviceAccountTypeEnabled);
232  }
233  return jCheckBox;
234  });
235  }
236  });
237  }
238 
242  private void updateDeviceFilter(boolean initialState) {
243  try {
244  final SleuthkitCase sleuthkitCase = Case.getCurrentCaseThrows().getSleuthkitCase();
245 
246  for (DataSource dataSource : sleuthkitCase.getDataSources()) {
247  String dsName = sleuthkitCase.getContentById(dataSource.getId()).getName();
248  //store the device id in the map, but display a datasource name in the UI.
249  devicesMap.computeIfAbsent(dataSource.getDeviceId(), ds -> {
250  final JCheckBox jCheckBox = new JCheckBox(dsName, initialState);
251  jCheckBox.addItemListener(validationListener);
252  devicesPane.add(jCheckBox);
253  return jCheckBox;
254  });
255  }
256  } catch (NoCurrentCaseException ex) {
257  logger.log(Level.INFO, "Filter update cancelled. Case is closed.");
258  } catch (TskCoreException tskCoreException) {
259  logger.log(Level.SEVERE, "There was a error loading the datasources for the case.", tskCoreException);
260  }
261  }
262 
268  @SuppressWarnings("unchecked")
269  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
270  private void initComponents() {
271 
272  applyFiltersButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/tick.png"))); // NOI18N
273  applyFiltersButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.applyFiltersButton.text")); // NOI18N
274  applyFiltersButton.setPreferredSize(null);
275 
276  filtersTitleLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/funnel.png"))); // NOI18N
277  filtersTitleLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.filtersTitleLabel.text")); // NOI18N
278 
279  unCheckAllAccountTypesButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.unCheckAllAccountTypesButton.text")); // NOI18N
280  unCheckAllAccountTypesButton.addActionListener(new java.awt.event.ActionListener() {
281  public void actionPerformed(java.awt.event.ActionEvent evt) {
282  unCheckAllAccountTypesButtonActionPerformed(evt);
283  }
284  });
285 
286  accountTypesLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/accounts.png"))); // NOI18N
287  accountTypesLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.accountTypesLabel.text")); // NOI18N
288 
289  checkAllAccountTypesButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.checkAllAccountTypesButton.text")); // NOI18N
290  checkAllAccountTypesButton.addActionListener(new java.awt.event.ActionListener() {
291  public void actionPerformed(java.awt.event.ActionEvent evt) {
292  checkAllAccountTypesButtonActionPerformed(evt);
293  }
294  });
295 
296  accountTypePane.setLayout(new javax.swing.BoxLayout(accountTypePane, javax.swing.BoxLayout.Y_AXIS));
297  jScrollPane3.setViewportView(accountTypePane);
298 
299  accountTypeRequiredLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/error-icon-16.png"))); // NOI18N
300  accountTypeRequiredLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.accountTypeRequiredLabel.text")); // NOI18N
301  accountTypeRequiredLabel.setForeground(new java.awt.Color(255, 0, 0));
302  accountTypeRequiredLabel.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);
303 
304  javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
305  jPanel2.setLayout(jPanel2Layout);
306  jPanel2Layout.setHorizontalGroup(
307  jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
308  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
309  .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
310  .addGroup(jPanel2Layout.createSequentialGroup()
311  .addComponent(accountTypesLabel)
312  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
313  .addComponent(accountTypeRequiredLabel))
314  .addGroup(jPanel2Layout.createSequentialGroup()
315  .addContainerGap()
316  .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
317  .addComponent(jScrollPane3)
318  .addGroup(jPanel2Layout.createSequentialGroup()
319  .addGap(0, 0, Short.MAX_VALUE)
320  .addComponent(unCheckAllAccountTypesButton)
321  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
322  .addComponent(checkAllAccountTypesButton)))))
323  .addGap(0, 0, 0))
324  );
325  jPanel2Layout.setVerticalGroup(
326  jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
327  .addGroup(jPanel2Layout.createSequentialGroup()
328  .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
329  .addComponent(accountTypesLabel)
330  .addComponent(accountTypeRequiredLabel))
331  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
332  .addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 243, Short.MAX_VALUE)
333  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
334  .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
335  .addComponent(checkAllAccountTypesButton)
336  .addComponent(unCheckAllAccountTypesButton)))
337  );
338 
339  unCheckAllDevicesButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.unCheckAllDevicesButton.text")); // NOI18N
340  unCheckAllDevicesButton.addActionListener(new java.awt.event.ActionListener() {
341  public void actionPerformed(java.awt.event.ActionEvent evt) {
342  unCheckAllDevicesButtonActionPerformed(evt);
343  }
344  });
345 
346  devicesLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/image.png"))); // NOI18N
347  devicesLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.devicesLabel.text")); // NOI18N
348 
349  checkAllDevicesButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.checkAllDevicesButton.text")); // NOI18N
350  checkAllDevicesButton.addActionListener(new java.awt.event.ActionListener() {
351  public void actionPerformed(java.awt.event.ActionEvent evt) {
352  checkAllDevicesButtonActionPerformed(evt);
353  }
354  });
355 
356  jScrollPane2.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
357  jScrollPane2.setMinimumSize(new java.awt.Dimension(27, 75));
358 
359  devicesPane.setMinimumSize(new java.awt.Dimension(4, 100));
360  devicesPane.setLayout(new javax.swing.BoxLayout(devicesPane, javax.swing.BoxLayout.Y_AXIS));
361  jScrollPane2.setViewportView(devicesPane);
362 
363  deviceRequiredLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/error-icon-16.png"))); // NOI18N
364  deviceRequiredLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.deviceRequiredLabel.text")); // NOI18N
365  deviceRequiredLabel.setForeground(new java.awt.Color(255, 0, 0));
366  deviceRequiredLabel.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);
367 
368  javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
369  jPanel3.setLayout(jPanel3Layout);
370  jPanel3Layout.setHorizontalGroup(
371  jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
372  .addGroup(jPanel3Layout.createSequentialGroup()
373  .addComponent(devicesLabel)
374  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
375  .addComponent(deviceRequiredLabel))
376  .addGroup(jPanel3Layout.createSequentialGroup()
377  .addContainerGap()
378  .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
379  .addGroup(jPanel3Layout.createSequentialGroup()
380  .addGap(0, 0, Short.MAX_VALUE)
381  .addComponent(unCheckAllDevicesButton)
382  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
383  .addComponent(checkAllDevicesButton))
384  .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
385  );
386  jPanel3Layout.setVerticalGroup(
387  jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
388  .addGroup(jPanel3Layout.createSequentialGroup()
389  .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
390  .addComponent(devicesLabel)
391  .addComponent(deviceRequiredLabel))
392  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
393  .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 94, Short.MAX_VALUE)
394  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
395  .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
396  .addComponent(checkAllDevicesButton)
397  .addComponent(unCheckAllDevicesButton))
398  .addGap(5, 5, 5))
399  );
400 
401  startDatePicker.setEnabled(false);
402 
403  dateRangeLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/calendar.png"))); // NOI18N
404  dateRangeLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.dateRangeLabel.text")); // NOI18N
405 
406  startCheckBox.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.startCheckBox.text")); // NOI18N
407  startCheckBox.addChangeListener(new javax.swing.event.ChangeListener() {
408  public void stateChanged(javax.swing.event.ChangeEvent evt) {
409  startCheckBoxStateChanged(evt);
410  }
411  });
412 
413  endCheckBox.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.endCheckBox.text")); // NOI18N
414  endCheckBox.addChangeListener(new javax.swing.event.ChangeListener() {
415  public void stateChanged(javax.swing.event.ChangeEvent evt) {
416  endCheckBoxStateChanged(evt);
417  }
418  });
419 
420  endDatePicker.setEnabled(false);
421 
422  javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
423  jPanel4.setLayout(jPanel4Layout);
424  jPanel4Layout.setHorizontalGroup(
425  jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
426  .addGroup(jPanel4Layout.createSequentialGroup()
427  .addComponent(dateRangeLabel)
428  .addGap(0, 0, Short.MAX_VALUE))
429  .addGroup(jPanel4Layout.createSequentialGroup()
430  .addContainerGap()
431  .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
432  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel4Layout.createSequentialGroup()
433  .addComponent(endCheckBox)
434  .addGap(12, 12, 12)
435  .addComponent(endDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
436  .addGroup(jPanel4Layout.createSequentialGroup()
437  .addComponent(startCheckBox)
438  .addGap(12, 12, 12)
439  .addComponent(startDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
440  );
441 
442  jPanel4Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {endCheckBox, startCheckBox});
443 
444  jPanel4Layout.setVerticalGroup(
445  jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
446  .addGroup(jPanel4Layout.createSequentialGroup()
447  .addComponent(dateRangeLabel)
448  .addGap(6, 6, 6)
449  .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
450  .addComponent(startDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
451  .addComponent(startCheckBox))
452  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
453  .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
454  .addComponent(endDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
455  .addComponent(endCheckBox)))
456  );
457 
458  refreshButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-circle-double-135.png"))); // NOI18N
459  refreshButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.refreshButton.text")); // NOI18N
460 
461  needsRefreshLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.needsRefreshLabel.text")); // NOI18N
462  needsRefreshLabel.setForeground(new java.awt.Color(255, 0, 0));
463 
464  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
465  this.setLayout(layout);
466  layout.setHorizontalGroup(
467  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
468  .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
469  .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
470  .addGroup(layout.createSequentialGroup()
471  .addComponent(filtersTitleLabel)
472  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
473  .addComponent(applyFiltersButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
474  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
475  .addComponent(refreshButton))
476  .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
477  .addGroup(layout.createSequentialGroup()
478  .addContainerGap()
479  .addComponent(needsRefreshLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
480  );
481  layout.setVerticalGroup(
482  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
483  .addGroup(layout.createSequentialGroup()
484  .addGap(0, 0, 0)
485  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
486  .addComponent(filtersTitleLabel)
487  .addComponent(applyFiltersButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
488  .addComponent(refreshButton))
489  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
490  .addComponent(needsRefreshLabel)
491  .addGap(4, 4, 4)
492  .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
493  .addGap(18, 18, 18)
494  .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
495  .addGap(18, 18, 18)
496  .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
497  .addContainerGap(19, Short.MAX_VALUE))
498  );
499  }// </editor-fold>//GEN-END:initComponents
500 
504  private void applyFilters() {
505  CVTEvents.getCVTEventBus().post(new CVTEvents.FilterChangeEvent(getFilter()));
506  needsRefresh = false;
507  validateFilters();
508  }
509 
510  private CommunicationsFilter getFilter() {
511  CommunicationsFilter commsFilter = new CommunicationsFilter();
512  commsFilter.addAndFilter(getDeviceFilter());
513  commsFilter.addAndFilter(getAccountTypeFilter());
514  commsFilter.addAndFilter(getDateRangeFilter());
515  commsFilter.addAndFilter(new CommunicationsFilter.RelationshipTypeFilter(
516  ImmutableSet.of(CALL_LOG, MESSAGE)));
517  return commsFilter;
518  }
519 
525  private DeviceFilter getDeviceFilter() {
526  DeviceFilter deviceFilter = new DeviceFilter(
527  devicesMap.entrySet().stream()
528  .filter(entry -> entry.getValue().isSelected())
529  .map(Entry::getKey)
530  .collect(Collectors.toSet()));
531  return deviceFilter;
532  }
533 
539  private AccountTypeFilter getAccountTypeFilter() {
540  AccountTypeFilter accountTypeFilter = new AccountTypeFilter(
541  accountTypeMap.entrySet().stream()
542  .filter(entry -> entry.getValue().isSelected())
543  .map(entry -> entry.getKey())
544  .collect(Collectors.toSet()));
545  return accountTypeFilter;
546  }
547 
553  private DateRangeFilter getDateRangeFilter() {
554  ZoneId zone = Utils.getUserPreferredZoneId();
555  long start = startDatePicker.isEnabled() ? startDatePicker.getDate().atStartOfDay(zone).toEpochSecond() : 0;
556  long end = endDatePicker.isEnabled() ? endDatePicker.getDate().atStartOfDay(zone).toEpochSecond() : 0;
557  return new DateRangeFilter(start, end);
558  }
559 
567  void setDeviceAccountTypeEnabled(boolean enable) {
568  deviceAccountTypeEnabled = enable;
569  JCheckBox deviceCheckbox = accountTypeMap.get(Account.Type.DEVICE);
570  if (deviceCheckbox != null) {
571  deviceCheckbox.setEnabled(deviceAccountTypeEnabled);
572  }
573  }
574 
580  @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
581  private void setAllAccountTypesSelected(boolean selected) {
582  setAllSelected(accountTypeMap, selected);
583  }
584 
591  private void setAllDevicesSelected(boolean selected) {
592  setAllSelected(devicesMap, selected);
593  }
594 
603  private void setAllSelected(Map<?, JCheckBox> map, boolean selected) {
604  map.values().forEach(box -> box.setSelected(selected));
605  }
606 
607  private void unCheckAllAccountTypesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_unCheckAllAccountTypesButtonActionPerformed
608  setAllAccountTypesSelected(false);
609  }//GEN-LAST:event_unCheckAllAccountTypesButtonActionPerformed
610 
611  private void checkAllAccountTypesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkAllAccountTypesButtonActionPerformed
612  setAllAccountTypesSelected(true);
613  }//GEN-LAST:event_checkAllAccountTypesButtonActionPerformed
614 
615  private void unCheckAllDevicesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_unCheckAllDevicesButtonActionPerformed
616  setAllDevicesSelected(false);
617  }//GEN-LAST:event_unCheckAllDevicesButtonActionPerformed
618 
619  private void checkAllDevicesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkAllDevicesButtonActionPerformed
620  setAllDevicesSelected(true);
621  }//GEN-LAST:event_checkAllDevicesButtonActionPerformed
622 
623  private void startCheckBoxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_startCheckBoxStateChanged
624  startDatePicker.setEnabled(startCheckBox.isSelected());
625  }//GEN-LAST:event_startCheckBoxStateChanged
626 
627  private void endCheckBoxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_endCheckBoxStateChanged
628  endDatePicker.setEnabled(endCheckBox.isSelected());
629  }//GEN-LAST:event_endCheckBoxStateChanged
630 
631 
632  // Variables declaration - do not modify//GEN-BEGIN:variables
633  private final javax.swing.JPanel accountTypePane = new javax.swing.JPanel();
634  private final javax.swing.JLabel accountTypeRequiredLabel = new javax.swing.JLabel();
635  private final javax.swing.JLabel accountTypesLabel = new javax.swing.JLabel();
636  private final javax.swing.JButton applyFiltersButton = new javax.swing.JButton();
637  private final javax.swing.JButton checkAllAccountTypesButton = new javax.swing.JButton();
638  private final javax.swing.JButton checkAllDevicesButton = new javax.swing.JButton();
639  private final javax.swing.JLabel dateRangeLabel = new javax.swing.JLabel();
640  private final javax.swing.JLabel deviceRequiredLabel = new javax.swing.JLabel();
641  private final javax.swing.JLabel devicesLabel = new javax.swing.JLabel();
642  private final javax.swing.JPanel devicesPane = new javax.swing.JPanel();
643  private final javax.swing.JCheckBox endCheckBox = new javax.swing.JCheckBox();
644  private final com.github.lgooddatepicker.components.DatePicker endDatePicker = new com.github.lgooddatepicker.components.DatePicker();
645  private final javax.swing.JLabel filtersTitleLabel = new javax.swing.JLabel();
646  private final javax.swing.JPanel jPanel2 = new javax.swing.JPanel();
647  private final javax.swing.JPanel jPanel3 = new javax.swing.JPanel();
648  private final javax.swing.JPanel jPanel4 = new javax.swing.JPanel();
649  private final javax.swing.JScrollPane jScrollPane2 = new javax.swing.JScrollPane();
650  private final javax.swing.JScrollPane jScrollPane3 = new javax.swing.JScrollPane();
651  private final javax.swing.JLabel needsRefreshLabel = new javax.swing.JLabel();
652  private final javax.swing.JButton refreshButton = new javax.swing.JButton();
653  private final javax.swing.JCheckBox startCheckBox = new javax.swing.JCheckBox();
654  private final com.github.lgooddatepicker.components.DatePicker startDatePicker = new com.github.lgooddatepicker.components.DatePicker();
655  private final javax.swing.JButton unCheckAllAccountTypesButton = new javax.swing.JButton();
656  private final javax.swing.JButton unCheckAllDevicesButton = new javax.swing.JButton();
657  // End of variables declaration//GEN-END:variables
658 }
BlackboardArtifact.Type getBlackboardArtifactType()
void unCheckAllDevicesButtonActionPerformed(java.awt.event.ActionEvent evt)
void removeIngestModuleEventListener(final PropertyChangeListener listener)
static synchronized IngestManager getInstance()
void unCheckAllAccountTypesButtonActionPerformed(java.awt.event.ActionEvent evt)
void endCheckBoxStateChanged(javax.swing.event.ChangeEvent evt)
void startCheckBoxStateChanged(javax.swing.event.ChangeEvent evt)
void checkAllAccountTypesButtonActionPerformed(java.awt.event.ActionEvent evt)
void addIngestModuleEventListener(final PropertyChangeListener listener)
synchronized static Logger getLogger(String name)
Definition: Logger.java:124
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
Definition: Case.java:428
static void addChangeListener(PreferenceChangeListener listener)
void checkAllDevicesButtonActionPerformed(java.awt.event.ActionEvent evt)

Copyright © 2012-2018 Basis Technology. Generated on: Thu Oct 4 2018
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.