19 package org.sleuthkit.autopsy.communications;
22 import com.google.common.collect.ImmutableSet;
23 import com.google.common.eventbus.Subscribe;
24 import java.awt.event.ItemListener;
25 import java.beans.PropertyChangeListener;
26 import java.time.Instant;
27 import java.time.LocalDate;
28 import java.time.LocalDateTime;
29 import java.time.ZoneId;
30 import java.util.ArrayList;
31 import java.util.Collection;
32 import java.util.Comparator;
33 import java.util.EnumSet;
34 import java.util.HashMap;
35 import java.util.List;
37 import java.util.Map.Entry;
39 import java.util.stream.Collectors;
40 import javax.swing.Box;
41 import javax.swing.BoxLayout;
42 import javax.swing.Icon;
43 import javax.swing.ImageIcon;
44 import javax.swing.JCheckBox;
45 import javax.swing.JLabel;
46 import javax.swing.JPanel;
47 import org.openide.util.NbBundle;
60 import org.
sleuthkit.datamodel.CommunicationsFilter.AccountTypeFilter;
61 import org.
sleuthkit.datamodel.CommunicationsFilter.DateRangeFilter;
62 import org.
sleuthkit.datamodel.CommunicationsFilter.DeviceFilter;
63 import org.
sleuthkit.datamodel.CommunicationsFilter.MostRecentFilter;
65 import static org.
sleuthkit.datamodel.Relationship.Type.CALL_LOG;
66 import static org.
sleuthkit.datamodel.Relationship.Type.CONTACT;
67 import static org.
sleuthkit.datamodel.Relationship.Type.MESSAGE;
73 @SuppressWarnings(
"PMD.SingularField")
76 private static final long serialVersionUID = 1L;
84 private final Map<Account.Type, JCheckBox> accountTypeMap = new HashMap<>();
90 private final Map<String, JCheckBox> devicesMap = new HashMap<>();
95 private final PropertyChangeListener ingestListener;
96 private final PropertyChangeListener ingestJobListener;
102 private
boolean needsRefresh;
109 private final ItemListener validationListener;
119 private
boolean deviceAccountTypeEnabled;
123 @NbBundle.Messages({
"refreshText=Refresh Results",
"applyText=Apply"})
127 initalizeDeviceAccountType();
128 setDateTimeFiltersToDefault();
130 deviceRequiredLabel.setVisible(
false);
131 accountTypeRequiredLabel.setVisible(
false);
132 startDatePicker.setDate(LocalDate.now().minusWeeks(3));
133 endDatePicker.setDateToToday();
134 startDatePicker.getSettings().setVetoPolicy(
136 startDate -> endCheckBox.isSelected() ==
false
137 || startDate.compareTo(endDatePicker.getDate()) <= 0
139 endDatePicker.getSettings().setVetoPolicy(
141 endDate -> startCheckBox.isSelected() ==
false
142 || endDate.compareTo(startDatePicker.getDate()) >= 0
146 validationListener = itemEvent -> validateFilters();
155 this.ingestListener = pce -> {
156 String eventType = pce.getPropertyName();
157 if (eventType.equals(DATA_ADDED.toString())) {
172 refreshThrottler =
new RefreshThrottler(
new FilterPanelRefresher(
false,
false));
174 this.ingestJobListener = pce -> {
175 String eventType = pce.getPropertyName();
176 if (eventType.equals(COMPLETED.toString()) && !needsRefresh) {
184 applyFiltersButton.addActionListener(e -> applyFilters());
185 refreshButton.addActionListener(e -> applyFilters());
196 boolean someDevice = devicesMap.values().stream().anyMatch(JCheckBox::isSelected);
197 boolean someAccountType = accountTypeMap.values().stream().anyMatch(JCheckBox::isSelected);
198 boolean validLimit = validateLimitValue();
200 deviceRequiredLabel.setVisible(someDevice ==
false);
201 accountTypeRequiredLabel.setVisible(someAccountType ==
false);
202 limitErrorMsgLabel.setVisible(!validLimit);
204 applyFiltersButton.setEnabled(someDevice && someAccountType && validLimit);
205 refreshButton.setEnabled(someDevice && someAccountType && needsRefresh && validLimit);
206 needsRefreshLabel.setVisible(needsRefresh);
210 String selectedValue = (String) limitComboBox.getSelectedItem();
211 if (selectedValue.trim().equalsIgnoreCase(
"all")) {
215 int value = Integer.parseInt(selectedValue);
217 }
catch (NumberFormatException ex) {
223 void initalizeFilters() {
225 applyFiltersButton.setEnabled(
false);
226 refreshButton.setEnabled(
true);
227 needsRefreshLabel.setText(
"Loading filters...");
228 needsRefreshLabel.setVisible(
true);
230 (
new Thread(
new Runnable(){
233 new FilterPanelRefresher(
true,
true).refresh();
245 refreshThrottler.registerForIngestModuleEvents();
251 devicesListPane.removeAll();
253 accountTypeMap.clear();
254 accountTypeListPane.removeAll();
256 initalizeDeviceAccountType();
262 super.removeNotify();
263 refreshThrottler.unregisterEventListener();
269 CheckBoxIconPanel panel = createAccoutTypeCheckBoxPanel(Account.Type.DEVICE,
true);
270 accountTypeMap.put(Account.Type.DEVICE, panel.getCheckBox());
271 accountTypeListPane.add(panel);
283 boolean newOneFound =
false;
285 for (Account.Type type : accountTypesInUse) {
286 if (!accountTypeMap.containsKey(type) && !type.equals(Account.Type.CREDIT_CARD)) {
287 CheckBoxIconPanel panel = createAccoutTypeCheckBoxPanel(type, checkNewOnes);
288 accountTypeMap.put(type, panel.getCheckBox());
289 accountTypeListPane.add(panel);
296 accountTypeListPane.validate();
312 CheckBoxIconPanel panel =
new CheckBoxIconPanel(
313 type.getDisplayName(),
316 panel.setSelected(initalState);
317 panel.addItemListener(validationListener);
330 boolean newOneFound =
false;
331 for (Entry<String, DataSource> entry : dataSourceMap.entrySet()) {
332 if (devicesMap.containsKey(entry.getValue().getDeviceId())) {
336 final JCheckBox jCheckBox =
new JCheckBox(entry.getKey(), checkNewOnes);
337 jCheckBox.addItemListener(validationListener);
338 jCheckBox.setToolTipText(entry.getKey());
339 devicesListPane.add(jCheckBox);
340 devicesMap.put(entry.getValue().getDeviceId(), jCheckBox);
346 devicesListPane.removeAll();
347 List<JCheckBox> checkList =
new ArrayList<>(devicesMap.values());
348 checkList.sort(
new DeviceCheckBoxComparator());
350 for (JCheckBox cb : checkList) {
351 devicesListPane.add(cb);
354 devicesListPane.revalidate();
359 if (start != null && start != 0) {
363 if (end != null && end != 0) {
375 List<CommunicationsFilter.SubFilter> subFilters = commFilter.getAndFilters();
376 subFilters.forEach(subFilter -> {
377 if (subFilter instanceof DeviceFilter) {
378 setDeviceFilter((DeviceFilter) subFilter);
379 }
else if (subFilter instanceof AccountTypeFilter) {
380 setAccountTypeFilter((AccountTypeFilter) subFilter);
381 }
else if (subFilter instanceof MostRecentFilter) {
382 setMostRecentFilter((MostRecentFilter) subFilter);
393 Collection<String> deviceIDs = deviceFilter.getDevices();
394 devicesMap.forEach((type, cb) -> {
395 cb.setSelected(deviceIDs.contains(type));
407 accountTypeMap.forEach((type, cb) -> {
408 cb.setSelected(typeFilter.getAccountTypes().contains(type));
419 startDatePicker.setDate(state.getDate());
420 startCheckBox.setSelected(state.isEnabled());
421 startDatePicker.setEnabled(state.isEnabled());
431 endDatePicker.setDate(state.getDate());
432 endCheckBox.setSelected(state.isEnabled());
433 endDatePicker.setEnabled(state.isEnabled());
443 int limit = filter.getLimit();
445 limitComboBox.setSelectedItem(filter.getLimit());
447 limitComboBox.setSelectedItem(
"All");
452 void filtersBack(CVTEvents.StateChangeEvent event) {
453 if (event.getCommunicationsState().getCommunicationsFilter() != null) {
454 setFilters(event.getCommunicationsState().getCommunicationsFilter());
455 setStartDateControlState(event.getCommunicationsState().getStartControlState());
456 setEndDateControlState(event.getCommunicationsState().getEndControlState());
457 needsRefresh =
false;
467 @SuppressWarnings(
"unchecked")
469 private
void initComponents() {
470 java.awt.GridBagConstraints gridBagConstraints;
472 setLayout(
new java.awt.GridBagLayout());
474 scrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
475 scrollPane.setAutoscrolls(
true);
476 scrollPane.setBorder(null);
478 mainPanel.setLayout(
new java.awt.GridBagLayout());
480 limitPane.setLayout(
new java.awt.GridBagLayout());
482 mostRecentLabel.setText(
org.openide.util.NbBundle.getMessage(
FiltersPanel.class,
"FiltersPanel.mostRecentLabel.text"));
483 gridBagConstraints =
new java.awt.GridBagConstraints();
484 gridBagConstraints.gridx = 0;
485 gridBagConstraints.gridy = 1;
486 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
487 gridBagConstraints.insets =
new java.awt.Insets(0, 9, 0, 9);
488 limitPane.add(mostRecentLabel, gridBagConstraints);
490 limitComboBox.setEditable(
true);
491 limitComboBox.setModel(
new javax.swing.DefaultComboBoxModel<>(
new String[] {
"All",
"10000",
"5000",
"1000",
"500",
"100" }));
492 limitComboBox.addActionListener(
new java.awt.event.ActionListener() {
493 public void actionPerformed(java.awt.event.ActionEvent evt) {
494 limitComboBoxActionPerformed(evt);
497 gridBagConstraints =
new java.awt.GridBagConstraints();
498 gridBagConstraints.gridx = 1;
499 gridBagConstraints.gridy = 1;
500 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
501 limitPane.add(limitComboBox, gridBagConstraints);
503 limitTitlePanel.setLayout(
new java.awt.GridBagLayout());
505 limitHeaderLabel.setText(
org.openide.util.NbBundle.getMessage(
FiltersPanel.class,
"FiltersPanel.limitHeaderLabel.text"));
506 gridBagConstraints =
new java.awt.GridBagConstraints();
507 gridBagConstraints.gridx = 0;
508 gridBagConstraints.gridy = 0;
509 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
510 gridBagConstraints.weightx = 1.0;
511 limitTitlePanel.add(limitHeaderLabel, gridBagConstraints);
513 limitErrorMsgLabel.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/error-icon-16.png")));
514 limitErrorMsgLabel.setText(
org.openide.util.NbBundle.getMessage(
FiltersPanel.class,
"FiltersPanel.limitErrorMsgLabel.text"));
515 limitErrorMsgLabel.setForeground(
new java.awt.Color(255, 0, 0));
516 limitErrorMsgLabel.setHorizontalTextPosition(javax.swing.SwingConstants.LEADING);
517 gridBagConstraints =
new java.awt.GridBagConstraints();
518 gridBagConstraints.gridx = 1;
519 gridBagConstraints.gridy = 0;
520 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
521 limitTitlePanel.add(limitErrorMsgLabel, gridBagConstraints);
523 gridBagConstraints =
new java.awt.GridBagConstraints();
524 gridBagConstraints.gridx = 0;
525 gridBagConstraints.gridy = 0;
526 gridBagConstraints.gridwidth = 2;
527 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
528 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
529 gridBagConstraints.weightx = 1.0;
530 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 9, 0);
531 limitPane.add(limitTitlePanel, gridBagConstraints);
533 gridBagConstraints =
new java.awt.GridBagConstraints();
534 gridBagConstraints.gridx = 0;
535 gridBagConstraints.gridy = 4;
536 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
537 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
538 gridBagConstraints.weightx = 1.0;
539 gridBagConstraints.weighty = 1.0;
540 gridBagConstraints.insets =
new java.awt.Insets(15, 0, 15, 25);
541 mainPanel.add(limitPane, gridBagConstraints);
543 startDatePicker.setEnabled(
false);
545 dateRangeLabel.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/calendar.png")));
546 dateRangeLabel.setText(
org.openide.util.NbBundle.getMessage(
FiltersPanel.class,
"FiltersPanel.dateRangeLabel.text"));
548 startCheckBox.setText(
org.openide.util.NbBundle.getMessage(
FiltersPanel.class,
"FiltersPanel.startCheckBox.text"));
549 startCheckBox.addChangeListener(
new javax.swing.event.ChangeListener() {
550 public void stateChanged(javax.swing.event.ChangeEvent evt) {
551 startCheckBoxStateChanged(evt);
555 endCheckBox.setText(
org.openide.util.NbBundle.getMessage(
FiltersPanel.class,
"FiltersPanel.endCheckBox.text"));
556 endCheckBox.addChangeListener(
new javax.swing.event.ChangeListener() {
557 public void stateChanged(javax.swing.event.ChangeEvent evt) {
558 endCheckBoxStateChanged(evt);
562 endDatePicker.setEnabled(
false);
564 javax.swing.GroupLayout dateRangePaneLayout =
new javax.swing.GroupLayout(dateRangePane);
565 dateRangePane.setLayout(dateRangePaneLayout);
566 dateRangePaneLayout.setHorizontalGroup(
567 dateRangePaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
568 .addGroup(dateRangePaneLayout.createSequentialGroup()
569 .addGroup(dateRangePaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
570 .addComponent(dateRangeLabel)
571 .addGroup(dateRangePaneLayout.createSequentialGroup()
573 .addGroup(dateRangePaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
574 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, dateRangePaneLayout.createSequentialGroup()
575 .addComponent(endCheckBox)
577 .addComponent(endDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
578 .addGroup(dateRangePaneLayout.createSequentialGroup()
579 .addComponent(startCheckBox)
581 .addComponent(startDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))))
582 .addGap(0, 0, Short.MAX_VALUE))
585 dateRangePaneLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL,
new java.awt.Component[] {endCheckBox, startCheckBox});
587 dateRangePaneLayout.setVerticalGroup(
588 dateRangePaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
589 .addGroup(dateRangePaneLayout.createSequentialGroup()
590 .addComponent(dateRangeLabel)
592 .addGroup(dateRangePaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
593 .addComponent(startDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
594 .addComponent(startCheckBox))
595 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
596 .addGroup(dateRangePaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
597 .addComponent(endDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
598 .addComponent(endCheckBox)))
601 gridBagConstraints =
new java.awt.GridBagConstraints();
602 gridBagConstraints.gridx = 0;
603 gridBagConstraints.gridy = 3;
604 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
605 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
606 gridBagConstraints.weightx = 1.0;
607 gridBagConstraints.insets =
new java.awt.Insets(15, 0, 0, 25);
608 mainPanel.add(dateRangePane, gridBagConstraints);
610 devicesPane.setPreferredSize(
new java.awt.Dimension(300, 300));
611 devicesPane.setLayout(
new java.awt.GridBagLayout());
613 unCheckAllDevicesButton.setText(
org.openide.util.NbBundle.getMessage(
FiltersPanel.class,
"FiltersPanel.unCheckAllDevicesButton.text"));
614 unCheckAllDevicesButton.addActionListener(
new java.awt.event.ActionListener() {
615 public void actionPerformed(java.awt.event.ActionEvent evt) {
616 unCheckAllDevicesButtonActionPerformed(evt);
619 gridBagConstraints =
new java.awt.GridBagConstraints();
620 gridBagConstraints.gridx = 0;
621 gridBagConstraints.gridy = 2;
622 gridBagConstraints.gridwidth = 2;
623 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
624 gridBagConstraints.weightx = 1.0;
625 gridBagConstraints.insets =
new java.awt.Insets(9, 0, 0, 9);
626 devicesPane.add(unCheckAllDevicesButton, gridBagConstraints);
628 devicesLabel.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/image.png")));
629 devicesLabel.setText(
org.openide.util.NbBundle.getMessage(
FiltersPanel.class,
"FiltersPanel.devicesLabel.text"));
630 gridBagConstraints =
new java.awt.GridBagConstraints();
631 gridBagConstraints.gridx = 0;
632 gridBagConstraints.gridy = 0;
633 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
634 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 9, 0);
635 devicesPane.add(devicesLabel, gridBagConstraints);
637 checkAllDevicesButton.setText(
org.openide.util.NbBundle.getMessage(
FiltersPanel.class,
"FiltersPanel.checkAllDevicesButton.text"));
638 checkAllDevicesButton.addActionListener(
new java.awt.event.ActionListener() {
639 public void actionPerformed(java.awt.event.ActionEvent evt) {
640 checkAllDevicesButtonActionPerformed(evt);
643 gridBagConstraints =
new java.awt.GridBagConstraints();
644 gridBagConstraints.gridx = 2;
645 gridBagConstraints.gridy = 2;
646 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
647 gridBagConstraints.insets =
new java.awt.Insets(9, 0, 0, 0);
648 devicesPane.add(checkAllDevicesButton, gridBagConstraints);
650 devicesScrollPane.setMaximumSize(
new java.awt.Dimension(32767, 30));
651 devicesScrollPane.setMinimumSize(
new java.awt.Dimension(27, 30));
652 devicesScrollPane.setPreferredSize(
new java.awt.Dimension(3, 30));
654 devicesListPane.setMinimumSize(
new java.awt.Dimension(4, 100));
655 devicesListPane.setLayout(
new javax.swing.BoxLayout(devicesListPane, javax.swing.BoxLayout.Y_AXIS));
656 devicesScrollPane.setViewportView(devicesListPane);
658 gridBagConstraints =
new java.awt.GridBagConstraints();
659 gridBagConstraints.gridx = 0;
660 gridBagConstraints.gridy = 1;
661 gridBagConstraints.gridwidth = 3;
662 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
663 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
664 gridBagConstraints.weightx = 1.0;
665 gridBagConstraints.weighty = 1.0;
666 devicesPane.add(devicesScrollPane, gridBagConstraints);
668 deviceRequiredLabel.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/error-icon-16.png")));
669 deviceRequiredLabel.setText(
org.openide.util.NbBundle.getMessage(
FiltersPanel.class,
"FiltersPanel.deviceRequiredLabel.text"));
670 deviceRequiredLabel.setForeground(
new java.awt.Color(255, 0, 0));
671 deviceRequiredLabel.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);
672 gridBagConstraints =
new java.awt.GridBagConstraints();
673 gridBagConstraints.gridx = 1;
674 gridBagConstraints.gridy = 0;
675 gridBagConstraints.gridwidth = 2;
676 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
677 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 9, 0);
678 devicesPane.add(deviceRequiredLabel, gridBagConstraints);
680 gridBagConstraints =
new java.awt.GridBagConstraints();
681 gridBagConstraints.gridx = 0;
682 gridBagConstraints.gridy = 2;
683 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
684 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
685 gridBagConstraints.weightx = 1.0;
686 gridBagConstraints.weighty = 1.0;
687 gridBagConstraints.insets =
new java.awt.Insets(15, 0, 0, 25);
688 mainPanel.add(devicesPane, gridBagConstraints);
690 accountTypesPane.setLayout(
new java.awt.GridBagLayout());
692 unCheckAllAccountTypesButton.setText(
org.openide.util.NbBundle.getMessage(
FiltersPanel.class,
"FiltersPanel.unCheckAllAccountTypesButton.text"));
693 unCheckAllAccountTypesButton.addActionListener(
new java.awt.event.ActionListener() {
694 public void actionPerformed(java.awt.event.ActionEvent evt) {
695 unCheckAllAccountTypesButtonActionPerformed(evt);
698 gridBagConstraints =
new java.awt.GridBagConstraints();
699 gridBagConstraints.gridx = 0;
700 gridBagConstraints.gridy = 2;
701 gridBagConstraints.gridwidth = 2;
702 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
703 gridBagConstraints.weightx = 1.0;
704 gridBagConstraints.insets =
new java.awt.Insets(9, 0, 0, 9);
705 accountTypesPane.add(unCheckAllAccountTypesButton, gridBagConstraints);
707 accountTypesLabel.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/accounts.png")));
708 accountTypesLabel.setText(
org.openide.util.NbBundle.getMessage(
FiltersPanel.class,
"FiltersPanel.accountTypesLabel.text"));
709 gridBagConstraints =
new java.awt.GridBagConstraints();
710 gridBagConstraints.gridx = 0;
711 gridBagConstraints.gridy = 0;
712 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
713 accountTypesPane.add(accountTypesLabel, gridBagConstraints);
715 checkAllAccountTypesButton.setText(
org.openide.util.NbBundle.getMessage(
FiltersPanel.class,
"FiltersPanel.checkAllAccountTypesButton.text"));
716 checkAllAccountTypesButton.addActionListener(
new java.awt.event.ActionListener() {
717 public void actionPerformed(java.awt.event.ActionEvent evt) {
718 checkAllAccountTypesButtonActionPerformed(evt);
721 gridBagConstraints =
new java.awt.GridBagConstraints();
722 gridBagConstraints.gridx = 2;
723 gridBagConstraints.gridy = 2;
724 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
725 gridBagConstraints.insets =
new java.awt.Insets(9, 0, 0, 0);
726 accountTypesPane.add(checkAllAccountTypesButton, gridBagConstraints);
728 accountTypesScrollPane.setMaximumSize(
new java.awt.Dimension(32767, 210));
729 accountTypesScrollPane.setMinimumSize(
new java.awt.Dimension(20, 210));
730 accountTypesScrollPane.setName(
"");
731 accountTypesScrollPane.setPreferredSize(
new java.awt.Dimension(2, 210));
733 accountTypeListPane.setLayout(
new javax.swing.BoxLayout(accountTypeListPane, javax.swing.BoxLayout.PAGE_AXIS));
734 accountTypesScrollPane.setViewportView(accountTypeListPane);
736 gridBagConstraints =
new java.awt.GridBagConstraints();
737 gridBagConstraints.gridx = 0;
738 gridBagConstraints.gridy = 1;
739 gridBagConstraints.gridwidth = 3;
740 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
741 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
742 gridBagConstraints.weightx = 1.0;
743 gridBagConstraints.weighty = 1.0;
744 gridBagConstraints.insets =
new java.awt.Insets(9, 0, 0, 0);
745 accountTypesPane.add(accountTypesScrollPane, gridBagConstraints);
747 accountTypeRequiredLabel.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/error-icon-16.png")));
748 accountTypeRequiredLabel.setText(
org.openide.util.NbBundle.getMessage(
FiltersPanel.class,
"FiltersPanel.accountTypeRequiredLabel.text"));
749 accountTypeRequiredLabel.setForeground(
new java.awt.Color(255, 0, 0));
750 accountTypeRequiredLabel.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);
751 gridBagConstraints =
new java.awt.GridBagConstraints();
752 gridBagConstraints.gridx = 1;
753 gridBagConstraints.gridy = 0;
754 gridBagConstraints.gridwidth = 2;
755 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
756 accountTypesPane.add(accountTypeRequiredLabel, gridBagConstraints);
758 gridBagConstraints =
new java.awt.GridBagConstraints();
759 gridBagConstraints.gridx = 0;
760 gridBagConstraints.gridy = 1;
761 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
762 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
763 gridBagConstraints.weightx = 1.0;
764 gridBagConstraints.insets =
new java.awt.Insets(15, 0, 0, 25);
765 mainPanel.add(accountTypesPane, gridBagConstraints);
767 topPane.setLayout(
new java.awt.GridBagLayout());
769 filtersTitleLabel.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/communications/images/funnel.png")));
770 filtersTitleLabel.setText(
org.openide.util.NbBundle.getMessage(
FiltersPanel.class,
"FiltersPanel.filtersTitleLabel.text"));
771 gridBagConstraints =
new java.awt.GridBagConstraints();
772 gridBagConstraints.gridx = 0;
773 gridBagConstraints.gridy = 0;
774 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
775 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
776 gridBagConstraints.weightx = 1.0;
777 topPane.add(filtersTitleLabel, gridBagConstraints);
779 refreshButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/communications/images/arrow-circle-double-135.png")));
780 refreshButton.setText(
org.openide.util.NbBundle.getMessage(
FiltersPanel.class,
"FiltersPanel.refreshButton.text"));
781 gridBagConstraints =
new java.awt.GridBagConstraints();
782 gridBagConstraints.gridx = 2;
783 gridBagConstraints.gridy = 0;
784 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
785 topPane.add(refreshButton, gridBagConstraints);
787 applyFiltersButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/communications/images/tick.png")));
788 applyFiltersButton.setText(
org.openide.util.NbBundle.getMessage(
FiltersPanel.class,
"FiltersPanel.applyFiltersButton.text"));
789 gridBagConstraints =
new java.awt.GridBagConstraints();
790 gridBagConstraints.gridx = 1;
791 gridBagConstraints.gridy = 0;
792 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
793 gridBagConstraints.weightx = 1.0;
794 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 0, 5);
795 topPane.add(applyFiltersButton, gridBagConstraints);
797 needsRefreshLabel.setText(
org.openide.util.NbBundle.getMessage(
FiltersPanel.class,
"FiltersPanel.needsRefreshLabel.text"));
798 needsRefreshLabel.setForeground(
new java.awt.Color(255, 0, 0));
799 gridBagConstraints =
new java.awt.GridBagConstraints();
800 gridBagConstraints.gridx = 0;
801 gridBagConstraints.gridy = 1;
802 gridBagConstraints.gridwidth = 3;
803 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
804 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
805 gridBagConstraints.weightx = 1.0;
806 topPane.add(needsRefreshLabel, gridBagConstraints);
808 gridBagConstraints =
new java.awt.GridBagConstraints();
809 gridBagConstraints.gridx = 0;
810 gridBagConstraints.gridy = 0;
811 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
812 gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_END;
813 gridBagConstraints.weightx = 1.0;
814 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 0, 25);
815 mainPanel.add(topPane, gridBagConstraints);
817 scrollPane.setViewportView(mainPanel);
819 gridBagConstraints =
new java.awt.GridBagConstraints();
820 gridBagConstraints.gridx = 0;
821 gridBagConstraints.gridy = 0;
822 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
823 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
824 gridBagConstraints.weightx = 1.0;
825 gridBagConstraints.weighty = 1.0;
826 gridBagConstraints.insets =
new java.awt.Insets(9, 15, 0, 0);
827 add(scrollPane, gridBagConstraints);
833 void applyFilters() {
834 needsRefresh =
false;
836 CVTEvents.getCVTEventBus().post(
new CVTEvents.FilterChangeEvent(getFilter(), getStartControlState(), getEndControlState()));
846 CommunicationsFilter commsFilter =
new CommunicationsFilter();
847 commsFilter.addAndFilter(getDeviceFilter());
848 commsFilter.addAndFilter(getAccountTypeFilter());
849 commsFilter.addAndFilter(getDateRangeFilter());
850 commsFilter.addAndFilter(
new CommunicationsFilter.RelationshipTypeFilter(
851 ImmutableSet.of(CALL_LOG, MESSAGE, CONTACT)));
852 commsFilter.addAndFilter(getMostRecentFilter());
862 DeviceFilter deviceFilter =
new DeviceFilter(
863 devicesMap.entrySet().stream()
864 .filter(entry -> entry.getValue().isSelected())
866 .collect(Collectors.toSet()));
876 AccountTypeFilter accountTypeFilter =
new AccountTypeFilter(
877 accountTypeMap.entrySet().stream()
878 .filter(entry -> entry.getValue().isSelected())
879 .map(entry -> entry.getKey())
880 .collect(Collectors.toSet()));
881 return accountTypeFilter;
892 return new DateRangeFilter(startCheckBox.isSelected() ? startDatePicker.getDate().atStartOfDay(zone).toEpochSecond() : 0,
893 endCheckBox.isSelected() ? endDatePicker.getDate().atStartOfDay(zone).toEpochSecond() : 0);
903 String value = (String) limitComboBox.getSelectedItem();
904 if (value.trim().equalsIgnoreCase(
"all")) {
905 return new MostRecentFilter(-1);
908 int count = Integer.parseInt(value);
909 return new MostRecentFilter(count);
910 }
catch (NumberFormatException ex) {
917 return new DateControlState(startDatePicker.getDate(), startCheckBox.isSelected());
921 return new DateControlState(endDatePicker.getDate(), endCheckBox.isSelected());
930 private
void setAllAccountTypesSelected(
boolean selected) {
931 setAllSelected(accountTypeMap, selected);
940 private
void setAllDevicesSelected(
boolean selected) {
941 setAllSelected(devicesMap, selected);
952 private
void setAllSelected(Map<?, JCheckBox> map,
boolean selected) {
953 map.values().forEach(box -> box.setSelected(selected));
957 startDatePicker.setDate(LocalDate.now().minusWeeks(3));
958 endDatePicker.setDate(LocalDate.now());
962 setAllAccountTypesSelected(
false);
966 setAllAccountTypesSelected(
true);
970 setAllDevicesSelected(
false);
974 setAllDevicesSelected(
true);
978 startDatePicker.setEnabled(startCheckBox.isSelected());
983 endDatePicker.setEnabled(endCheckBox.isSelected());
996 final class DateControlState {
998 private final LocalDate date;
999 private final boolean enabled;
1008 protected DateControlState(LocalDate date,
boolean enabled) {
1010 this.enabled = enabled;
1018 public LocalDate getDate() {
1027 public boolean isEnabled() {
1034 private final javax.swing.JPanel accountTypeListPane =
new javax.swing.JPanel();
1035 private final javax.swing.JLabel accountTypeRequiredLabel =
new javax.swing.JLabel();
1036 private final javax.swing.JLabel accountTypesLabel =
new javax.swing.JLabel();
1037 private final javax.swing.JPanel accountTypesPane =
new javax.swing.JPanel();
1038 private final javax.swing.JScrollPane accountTypesScrollPane =
new javax.swing.JScrollPane();
1039 private final javax.swing.JButton applyFiltersButton =
new javax.swing.JButton();
1040 private final javax.swing.JButton checkAllAccountTypesButton =
new javax.swing.JButton();
1041 private final javax.swing.JButton checkAllDevicesButton =
new javax.swing.JButton();
1042 private final javax.swing.JLabel dateRangeLabel =
new javax.swing.JLabel();
1043 private final javax.swing.JPanel dateRangePane =
new javax.swing.JPanel();
1044 private final javax.swing.JLabel deviceRequiredLabel =
new javax.swing.JLabel();
1045 private final javax.swing.JLabel devicesLabel =
new javax.swing.JLabel();
1046 private final javax.swing.JPanel devicesListPane =
new javax.swing.JPanel();
1047 private final javax.swing.JPanel devicesPane =
new javax.swing.JPanel();
1048 private final javax.swing.JScrollPane devicesScrollPane =
new javax.swing.JScrollPane();
1049 private final javax.swing.JCheckBox endCheckBox =
new javax.swing.JCheckBox();
1050 private final com.github.lgooddatepicker.components.DatePicker endDatePicker =
new com.github.lgooddatepicker.components.DatePicker();
1051 private final javax.swing.JLabel filtersTitleLabel =
new javax.swing.JLabel();
1052 private final javax.swing.JComboBox<String> limitComboBox =
new javax.swing.JComboBox<>();
1053 private final javax.swing.JLabel limitErrorMsgLabel =
new javax.swing.JLabel();
1054 private final javax.swing.JLabel limitHeaderLabel =
new javax.swing.JLabel();
1055 private final javax.swing.JPanel limitPane =
new javax.swing.JPanel();
1056 private final javax.swing.JPanel limitTitlePanel =
new javax.swing.JPanel();
1057 private final javax.swing.JPanel mainPanel =
new javax.swing.JPanel();
1058 private final javax.swing.JLabel mostRecentLabel =
new javax.swing.JLabel();
1059 private final javax.swing.JLabel needsRefreshLabel =
new javax.swing.JLabel();
1060 private final javax.swing.JButton refreshButton =
new javax.swing.JButton();
1061 private final javax.swing.JScrollPane scrollPane =
new javax.swing.JScrollPane();
1062 private final javax.swing.JCheckBox startCheckBox =
new javax.swing.JCheckBox();
1063 private final com.github.lgooddatepicker.components.DatePicker startDatePicker =
new com.github.lgooddatepicker.components.DatePicker();
1064 private final javax.swing.JPanel topPane =
new javax.swing.JPanel();
1065 private final javax.swing.JButton unCheckAllAccountTypesButton =
new javax.swing.JButton();
1066 private final javax.swing.JButton unCheckAllDevicesButton =
new javax.swing.JButton();
1074 final class CheckBoxIconPanel
extends JPanel {
1076 private static final long serialVersionUID = 1L;
1078 private final JCheckBox checkbox;
1079 private final JLabel label;
1087 private CheckBoxIconPanel(String labelText, Icon image) {
1088 checkbox =
new JCheckBox();
1089 label =
new JLabel(labelText);
1090 label.setIcon(image);
1091 setLayout(
new BoxLayout(
this, BoxLayout.X_AXIS));
1095 add(Box.createHorizontalGlue());
1103 void setSelected(
boolean selected) {
1104 checkbox.setSelected(selected);
1108 public void setEnabled(
boolean enabled) {
1109 checkbox.setEnabled(enabled);
1117 JCheckBox getCheckBox() {
1126 void addItemListener(ItemListener l) {
1127 checkbox.addItemListener(l);
1136 final class FilterPanelRefresher
extends CVTFilterRefresher {
1138 private final boolean selectNewOption;
1139 private final boolean refreshAfterUpdate;
1141 FilterPanelRefresher(
boolean selectNewOptions,
boolean refreshAfterUpdate) {
1142 this.selectNewOption = selectNewOptions;
1143 this.refreshAfterUpdate = refreshAfterUpdate;
1147 void updateFilterPanel(CVTFilterRefresher.FilterPanelData data) {
1148 updateDateTimePicker(data.getStartTime(), data.getEndTime());
1149 updateDeviceFilterPanel(data.getDataSourceMap(), selectNewOption);
1150 updateAccountTypeFilter(data.getAccountTypesInUse(), selectNewOption);
1152 FiltersPanel.this.repaint();
1154 if (refreshAfterUpdate) {
1162 needsRefreshLabel.setText(
org.openide.util.NbBundle.getMessage(FiltersPanel.class,
"FiltersPanel.needsRefreshLabel.text"));
1174 class DeviceCheckBoxComparator
implements Comparator<JCheckBox> {
1177 public int compare(JCheckBox e1, JCheckBox e2) {
1178 return e1.getText().toLowerCase().compareTo(e2.getText().toLowerCase());
BlackboardArtifact.Type getBlackboardArtifactType()
void unCheckAllDevicesButtonActionPerformed(java.awt.event.ActionEvent evt)
void removeIngestModuleEventListener(final PropertyChangeListener listener)
void updateDeviceFilterPanel(Map< String, DataSource > dataSourceMap, boolean checkNewOnes)
MostRecentFilter getMostRecentFilter()
void setEndDateControlState(DateControlState state)
static synchronized IngestManager getInstance()
void initalizeDeviceAccountType()
void setMostRecentFilter(MostRecentFilter filter)
void setDeviceFilter(DeviceFilter deviceFilter)
void unCheckAllAccountTypesButtonActionPerformed(java.awt.event.ActionEvent evt)
void endCheckBoxStateChanged(javax.swing.event.ChangeEvent evt)
void startCheckBoxStateChanged(javax.swing.event.ChangeEvent evt)
void removeIngestJobEventListener(final PropertyChangeListener listener)
CheckBoxIconPanel createAccoutTypeCheckBoxPanel(Account.Type type, boolean initalState)
void setStartDateControlState(DateControlState state)
void limitComboBoxActionPerformed(java.awt.event.ActionEvent evt)
static final String DISPLAY_TIMES_IN_LOCAL_TIME
void addIngestJobEventListener(final PropertyChangeListener listener)
void setAccountTypeFilter(AccountTypeFilter typeFilter)
CommunicationsFilter getFilter()
void setFilters(CommunicationsFilter commFilter)
void checkAllAccountTypesButtonActionPerformed(java.awt.event.ActionEvent evt)
static ZoneId getUserPreferredZoneId()
DateControlState getStartControlState()
boolean validateLimitValue()
void addIngestModuleEventListener(final PropertyChangeListener listener)
void setDateTimeFiltersToDefault()
DateControlState getEndControlState()
synchronized static Logger getLogger(String name)
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
static void addChangeListener(PreferenceChangeListener listener)
void checkAllDevicesButtonActionPerformed(java.awt.event.ActionEvent evt)
static final String getIconFilePath(Account.Type type)
DeviceFilter getDeviceFilter()
DateRangeFilter getDateRangeFilter()
AccountTypeFilter getAccountTypeFilter()
boolean updateAccountTypeFilter(List< Account.Type > accountTypesInUse, boolean checkNewOnes)
static final String TIME_ZONE_FOR_DISPLAYS
void updateDateTimePicker(Integer start, Integer end)