Autopsy  4.9.1
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  preferenceChangeEvent.getKey().equals(UserPreferences.TIME_ZONE_FOR_DISPLAYS)) {
129  updateTimeZone();
130  }
131  });
132 
133  this.ingestListener = pce -> {
134  String eventType = pce.getPropertyName();
135  if (eventType.equals(DATA_ADDED.toString())) {
136  // Indicate that a refresh may be needed, unless the data added is Keyword or Hashset hits
137  ModuleDataEvent eventData = (ModuleDataEvent) pce.getOldValue();
138  if (null != eventData
139  && eventData.getBlackboardArtifactType().getTypeID() != BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID()
140  && eventData.getBlackboardArtifactType().getTypeID() != BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID()) {
141  updateFilters(false);
142  needsRefresh = true;
143  validateFilters();
144  }
145  }
146  };
147 
148  applyFiltersButton.addActionListener(e -> applyFilters());
149  refreshButton.addActionListener(e -> applyFilters());
150  }
151 
158  private void validateFilters() {
159  boolean someDevice = devicesMap.values().stream().anyMatch(JCheckBox::isSelected);
160  boolean someAccountType = accountTypeMap.values().stream().anyMatch(JCheckBox::isSelected);
161 
162  deviceRequiredLabel.setVisible(someDevice == false);
163  accountTypeRequiredLabel.setVisible(someAccountType == false);
164 
165  applyFiltersButton.setEnabled(someDevice && someAccountType);
166  refreshButton.setEnabled(someDevice && someAccountType && needsRefresh);
167  needsRefreshLabel.setVisible(needsRefresh);
168  }
169 
173  void updateAndApplyFilters(boolean initialState) {
174  updateFilters(initialState);
175  applyFilters();
176  }
177 
178  private void updateTimeZone() {
179  dateRangeLabel.setText("Date Range (" + Utils.getUserPreferredZoneId().toString() + "):");
180  }
181 
185  private void updateFilters(boolean initialState) {
186  updateAccountTypeFilter();
187  updateDeviceFilter(initialState);
188  }
189 
190  @Override
191  public void addNotify() {
192  super.addNotify();
194  Case.addEventTypeSubscriber(EnumSet.of(CURRENT_CASE), evt -> {
195  //clear the device filter widget when the case changes.
196  devicesMap.clear();
197  devicesPane.removeAll();
198  });
199  }
200 
201  @Override
202  public void removeNotify() {
203  super.removeNotify();
205  }
206 
210  private void updateAccountTypeFilter() {
211 
212  //TODO: something like this commented code could be used to show only
213  //the account types that are found:
214  //final CommunicationsManager communicationsManager = Case.getCurrentOpenCase().getSleuthkitCase().getCommunicationsManager();
215  //List<Account.Type> accountTypesInUse = communicationsManager.getAccountTypesInUse();
216  //accountTypesInUSe.forEach(...)
217  Account.Type.PREDEFINED_ACCOUNT_TYPES.forEach(type -> {
218  if (type.equals(Account.Type.CREDIT_CARD)) {
219  //don't show a check box for credit cards
220  } else {
221  accountTypeMap.computeIfAbsent(type, t -> {
222  final JCheckBox jCheckBox = new JCheckBox(
223  "<html><table cellpadding=0><tr><td><img src=\""
224  + FiltersPanel.class.getResource(Utils.getIconFilePath(type))
225  + "\"/></td><td width=" + 3 + "><td>" + type.getDisplayName() + "</td></tr></table></html>",
226  true
227  );
228  jCheckBox.addItemListener(validationListener);
229  accountTypePane.add(jCheckBox);
230  if (t.equals(Account.Type.DEVICE)) {
231  //Deveice type filter is enabled based on whether we are in table or graph view.
232  jCheckBox.setEnabled(deviceAccountTypeEnabled);
233  }
234  return jCheckBox;
235  });
236  }
237  });
238  }
239 
243  private void updateDeviceFilter(boolean initialState) {
244  try {
245  final SleuthkitCase sleuthkitCase = Case.getCurrentCaseThrows().getSleuthkitCase();
246 
247  for (DataSource dataSource : sleuthkitCase.getDataSources()) {
248  String dsName = sleuthkitCase.getContentById(dataSource.getId()).getName();
249  //store the device id in the map, but display a datasource name in the UI.
250  devicesMap.computeIfAbsent(dataSource.getDeviceId(), ds -> {
251  final JCheckBox jCheckBox = new JCheckBox(dsName, initialState);
252  jCheckBox.addItemListener(validationListener);
253  devicesPane.add(jCheckBox);
254  return jCheckBox;
255  });
256  }
257  } catch (NoCurrentCaseException ex) {
258  logger.log(Level.INFO, "Filter update cancelled. Case is closed.");
259  } catch (TskCoreException tskCoreException) {
260  logger.log(Level.SEVERE, "There was a error loading the datasources for the case.", tskCoreException);
261  }
262  }
263 
269  @SuppressWarnings("unchecked")
270  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
271  private void initComponents() {
272 
273  applyFiltersButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/tick.png"))); // NOI18N
274  applyFiltersButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.applyFiltersButton.text")); // NOI18N
275  applyFiltersButton.setPreferredSize(null);
276 
277  filtersTitleLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/funnel.png"))); // NOI18N
278  filtersTitleLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.filtersTitleLabel.text")); // NOI18N
279 
280  unCheckAllAccountTypesButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.unCheckAllAccountTypesButton.text")); // NOI18N
281  unCheckAllAccountTypesButton.addActionListener(new java.awt.event.ActionListener() {
282  public void actionPerformed(java.awt.event.ActionEvent evt) {
283  unCheckAllAccountTypesButtonActionPerformed(evt);
284  }
285  });
286 
287  accountTypesLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/accounts.png"))); // NOI18N
288  accountTypesLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.accountTypesLabel.text")); // NOI18N
289 
290  checkAllAccountTypesButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.checkAllAccountTypesButton.text")); // NOI18N
291  checkAllAccountTypesButton.addActionListener(new java.awt.event.ActionListener() {
292  public void actionPerformed(java.awt.event.ActionEvent evt) {
293  checkAllAccountTypesButtonActionPerformed(evt);
294  }
295  });
296 
297  accountTypePane.setLayout(new javax.swing.BoxLayout(accountTypePane, javax.swing.BoxLayout.Y_AXIS));
298  jScrollPane3.setViewportView(accountTypePane);
299 
300  accountTypeRequiredLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/error-icon-16.png"))); // NOI18N
301  accountTypeRequiredLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.accountTypeRequiredLabel.text")); // NOI18N
302  accountTypeRequiredLabel.setForeground(new java.awt.Color(255, 0, 0));
303  accountTypeRequiredLabel.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);
304 
305  javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
306  jPanel2.setLayout(jPanel2Layout);
307  jPanel2Layout.setHorizontalGroup(
308  jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
309  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
310  .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
311  .addGroup(jPanel2Layout.createSequentialGroup()
312  .addComponent(accountTypesLabel)
313  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
314  .addComponent(accountTypeRequiredLabel))
315  .addGroup(jPanel2Layout.createSequentialGroup()
316  .addContainerGap()
317  .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
318  .addComponent(jScrollPane3)
319  .addGroup(jPanel2Layout.createSequentialGroup()
320  .addGap(0, 0, Short.MAX_VALUE)
321  .addComponent(unCheckAllAccountTypesButton)
322  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
323  .addComponent(checkAllAccountTypesButton)))))
324  .addGap(0, 0, 0))
325  );
326  jPanel2Layout.setVerticalGroup(
327  jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
328  .addGroup(jPanel2Layout.createSequentialGroup()
329  .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
330  .addComponent(accountTypesLabel)
331  .addComponent(accountTypeRequiredLabel))
332  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
333  .addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 243, Short.MAX_VALUE)
334  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
335  .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
336  .addComponent(checkAllAccountTypesButton)
337  .addComponent(unCheckAllAccountTypesButton)))
338  );
339 
340  unCheckAllDevicesButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.unCheckAllDevicesButton.text")); // NOI18N
341  unCheckAllDevicesButton.addActionListener(new java.awt.event.ActionListener() {
342  public void actionPerformed(java.awt.event.ActionEvent evt) {
343  unCheckAllDevicesButtonActionPerformed(evt);
344  }
345  });
346 
347  devicesLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/image.png"))); // NOI18N
348  devicesLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.devicesLabel.text")); // NOI18N
349 
350  checkAllDevicesButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.checkAllDevicesButton.text")); // NOI18N
351  checkAllDevicesButton.addActionListener(new java.awt.event.ActionListener() {
352  public void actionPerformed(java.awt.event.ActionEvent evt) {
353  checkAllDevicesButtonActionPerformed(evt);
354  }
355  });
356 
357  jScrollPane2.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
358  jScrollPane2.setMinimumSize(new java.awt.Dimension(27, 75));
359 
360  devicesPane.setMinimumSize(new java.awt.Dimension(4, 100));
361  devicesPane.setLayout(new javax.swing.BoxLayout(devicesPane, javax.swing.BoxLayout.Y_AXIS));
362  jScrollPane2.setViewportView(devicesPane);
363 
364  deviceRequiredLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/error-icon-16.png"))); // NOI18N
365  deviceRequiredLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.deviceRequiredLabel.text")); // NOI18N
366  deviceRequiredLabel.setForeground(new java.awt.Color(255, 0, 0));
367  deviceRequiredLabel.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);
368 
369  javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
370  jPanel3.setLayout(jPanel3Layout);
371  jPanel3Layout.setHorizontalGroup(
372  jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
373  .addGroup(jPanel3Layout.createSequentialGroup()
374  .addComponent(devicesLabel)
375  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
376  .addComponent(deviceRequiredLabel))
377  .addGroup(jPanel3Layout.createSequentialGroup()
378  .addContainerGap()
379  .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
380  .addGroup(jPanel3Layout.createSequentialGroup()
381  .addGap(0, 0, Short.MAX_VALUE)
382  .addComponent(unCheckAllDevicesButton)
383  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
384  .addComponent(checkAllDevicesButton))
385  .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
386  );
387  jPanel3Layout.setVerticalGroup(
388  jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
389  .addGroup(jPanel3Layout.createSequentialGroup()
390  .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
391  .addComponent(devicesLabel)
392  .addComponent(deviceRequiredLabel))
393  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
394  .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 94, Short.MAX_VALUE)
395  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
396  .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
397  .addComponent(checkAllDevicesButton)
398  .addComponent(unCheckAllDevicesButton))
399  .addGap(5, 5, 5))
400  );
401 
402  startDatePicker.setEnabled(false);
403 
404  dateRangeLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/calendar.png"))); // NOI18N
405  dateRangeLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.dateRangeLabel.text")); // NOI18N
406 
407  startCheckBox.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.startCheckBox.text")); // NOI18N
408  startCheckBox.addChangeListener(new javax.swing.event.ChangeListener() {
409  public void stateChanged(javax.swing.event.ChangeEvent evt) {
410  startCheckBoxStateChanged(evt);
411  }
412  });
413 
414  endCheckBox.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.endCheckBox.text")); // NOI18N
415  endCheckBox.addChangeListener(new javax.swing.event.ChangeListener() {
416  public void stateChanged(javax.swing.event.ChangeEvent evt) {
417  endCheckBoxStateChanged(evt);
418  }
419  });
420 
421  endDatePicker.setEnabled(false);
422 
423  javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
424  jPanel4.setLayout(jPanel4Layout);
425  jPanel4Layout.setHorizontalGroup(
426  jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
427  .addGroup(jPanel4Layout.createSequentialGroup()
428  .addComponent(dateRangeLabel)
429  .addGap(0, 0, Short.MAX_VALUE))
430  .addGroup(jPanel4Layout.createSequentialGroup()
431  .addContainerGap()
432  .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
433  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel4Layout.createSequentialGroup()
434  .addComponent(endCheckBox)
435  .addGap(12, 12, 12)
436  .addComponent(endDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
437  .addGroup(jPanel4Layout.createSequentialGroup()
438  .addComponent(startCheckBox)
439  .addGap(12, 12, 12)
440  .addComponent(startDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
441  );
442 
443  jPanel4Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {endCheckBox, startCheckBox});
444 
445  jPanel4Layout.setVerticalGroup(
446  jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
447  .addGroup(jPanel4Layout.createSequentialGroup()
448  .addComponent(dateRangeLabel)
449  .addGap(6, 6, 6)
450  .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
451  .addComponent(startDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
452  .addComponent(startCheckBox))
453  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
454  .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
455  .addComponent(endDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
456  .addComponent(endCheckBox)))
457  );
458 
459  refreshButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-circle-double-135.png"))); // NOI18N
460  refreshButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.refreshButton.text")); // NOI18N
461 
462  needsRefreshLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.needsRefreshLabel.text")); // NOI18N
463  needsRefreshLabel.setForeground(new java.awt.Color(255, 0, 0));
464 
465  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
466  this.setLayout(layout);
467  layout.setHorizontalGroup(
468  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
469  .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
470  .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
471  .addGroup(layout.createSequentialGroup()
472  .addComponent(filtersTitleLabel)
473  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
474  .addComponent(applyFiltersButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
475  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
476  .addComponent(refreshButton))
477  .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
478  .addGroup(layout.createSequentialGroup()
479  .addContainerGap()
480  .addComponent(needsRefreshLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
481  );
482  layout.setVerticalGroup(
483  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
484  .addGroup(layout.createSequentialGroup()
485  .addGap(0, 0, 0)
486  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
487  .addComponent(filtersTitleLabel)
488  .addComponent(applyFiltersButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
489  .addComponent(refreshButton))
490  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
491  .addComponent(needsRefreshLabel)
492  .addGap(4, 4, 4)
493  .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
494  .addGap(18, 18, 18)
495  .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
496  .addGap(18, 18, 18)
497  .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
498  .addContainerGap(19, Short.MAX_VALUE))
499  );
500  }// </editor-fold>//GEN-END:initComponents
501 
505  private void applyFilters() {
506  CVTEvents.getCVTEventBus().post(new CVTEvents.FilterChangeEvent(getFilter()));
507  needsRefresh = false;
508  validateFilters();
509  }
510 
511  private CommunicationsFilter getFilter() {
512  CommunicationsFilter commsFilter = new CommunicationsFilter();
513  commsFilter.addAndFilter(getDeviceFilter());
514  commsFilter.addAndFilter(getAccountTypeFilter());
515  commsFilter.addAndFilter(getDateRangeFilter());
516  commsFilter.addAndFilter(new CommunicationsFilter.RelationshipTypeFilter(
517  ImmutableSet.of(CALL_LOG, MESSAGE)));
518  return commsFilter;
519  }
520 
526  private DeviceFilter getDeviceFilter() {
527  DeviceFilter deviceFilter = new DeviceFilter(
528  devicesMap.entrySet().stream()
529  .filter(entry -> entry.getValue().isSelected())
530  .map(Entry::getKey)
531  .collect(Collectors.toSet()));
532  return deviceFilter;
533  }
534 
540  private AccountTypeFilter getAccountTypeFilter() {
541  AccountTypeFilter accountTypeFilter = new AccountTypeFilter(
542  accountTypeMap.entrySet().stream()
543  .filter(entry -> entry.getValue().isSelected())
544  .map(entry -> entry.getKey())
545  .collect(Collectors.toSet()));
546  return accountTypeFilter;
547  }
548 
554  private DateRangeFilter getDateRangeFilter() {
555  ZoneId zone = Utils.getUserPreferredZoneId();
556  long start = startDatePicker.isEnabled() ? startDatePicker.getDate().atStartOfDay(zone).toEpochSecond() : 0;
557  long end = endDatePicker.isEnabled() ? endDatePicker.getDate().atStartOfDay(zone).toEpochSecond() : 0;
558  return new DateRangeFilter(start, end);
559  }
560 
568  void setDeviceAccountTypeEnabled(boolean enable) {
569  deviceAccountTypeEnabled = enable;
570  JCheckBox deviceCheckbox = accountTypeMap.get(Account.Type.DEVICE);
571  if (deviceCheckbox != null) {
572  deviceCheckbox.setEnabled(deviceAccountTypeEnabled);
573  }
574  }
575 
581  @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
582  private void setAllAccountTypesSelected(boolean selected) {
583  setAllSelected(accountTypeMap, selected);
584  }
585 
592  private void setAllDevicesSelected(boolean selected) {
593  setAllSelected(devicesMap, selected);
594  }
595 
604  private void setAllSelected(Map<?, JCheckBox> map, boolean selected) {
605  map.values().forEach(box -> box.setSelected(selected));
606  }
607 
608  private void unCheckAllAccountTypesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_unCheckAllAccountTypesButtonActionPerformed
609  setAllAccountTypesSelected(false);
610  }//GEN-LAST:event_unCheckAllAccountTypesButtonActionPerformed
611 
612  private void checkAllAccountTypesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkAllAccountTypesButtonActionPerformed
613  setAllAccountTypesSelected(true);
614  }//GEN-LAST:event_checkAllAccountTypesButtonActionPerformed
615 
616  private void unCheckAllDevicesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_unCheckAllDevicesButtonActionPerformed
617  setAllDevicesSelected(false);
618  }//GEN-LAST:event_unCheckAllDevicesButtonActionPerformed
619 
620  private void checkAllDevicesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkAllDevicesButtonActionPerformed
621  setAllDevicesSelected(true);
622  }//GEN-LAST:event_checkAllDevicesButtonActionPerformed
623 
624  private void startCheckBoxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_startCheckBoxStateChanged
625  startDatePicker.setEnabled(startCheckBox.isSelected());
626  }//GEN-LAST:event_startCheckBoxStateChanged
627 
628  private void endCheckBoxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_endCheckBoxStateChanged
629  endDatePicker.setEnabled(endCheckBox.isSelected());
630  }//GEN-LAST:event_endCheckBoxStateChanged
631 
632 
633  // Variables declaration - do not modify//GEN-BEGIN:variables
634  private final javax.swing.JPanel accountTypePane = new javax.swing.JPanel();
635  private final javax.swing.JLabel accountTypeRequiredLabel = new javax.swing.JLabel();
636  private final javax.swing.JLabel accountTypesLabel = new javax.swing.JLabel();
637  private final javax.swing.JButton applyFiltersButton = new javax.swing.JButton();
638  private final javax.swing.JButton checkAllAccountTypesButton = new javax.swing.JButton();
639  private final javax.swing.JButton checkAllDevicesButton = new javax.swing.JButton();
640  private final javax.swing.JLabel dateRangeLabel = new javax.swing.JLabel();
641  private final javax.swing.JLabel deviceRequiredLabel = new javax.swing.JLabel();
642  private final javax.swing.JLabel devicesLabel = new javax.swing.JLabel();
643  private final javax.swing.JPanel devicesPane = new javax.swing.JPanel();
644  private final javax.swing.JCheckBox endCheckBox = new javax.swing.JCheckBox();
645  private final com.github.lgooddatepicker.components.DatePicker endDatePicker = new com.github.lgooddatepicker.components.DatePicker();
646  private final javax.swing.JLabel filtersTitleLabel = new javax.swing.JLabel();
647  private final javax.swing.JPanel jPanel2 = new javax.swing.JPanel();
648  private final javax.swing.JPanel jPanel3 = new javax.swing.JPanel();
649  private final javax.swing.JPanel jPanel4 = new javax.swing.JPanel();
650  private final javax.swing.JScrollPane jScrollPane2 = new javax.swing.JScrollPane();
651  private final javax.swing.JScrollPane jScrollPane3 = new javax.swing.JScrollPane();
652  private final javax.swing.JLabel needsRefreshLabel = new javax.swing.JLabel();
653  private final javax.swing.JButton refreshButton = new javax.swing.JButton();
654  private final javax.swing.JCheckBox startCheckBox = new javax.swing.JCheckBox();
655  private final com.github.lgooddatepicker.components.DatePicker startDatePicker = new com.github.lgooddatepicker.components.DatePicker();
656  private final javax.swing.JButton unCheckAllAccountTypesButton = new javax.swing.JButton();
657  private final javax.swing.JButton unCheckAllDevicesButton = new javax.swing.JButton();
658  // End of variables declaration//GEN-END:variables
659 }
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:429
static void addChangeListener(PreferenceChangeListener listener)
void checkAllDevicesButtonActionPerformed(java.awt.event.ActionEvent evt)

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