19 package org.sleuthkit.autopsy.discovery;
21 import java.awt.Component;
22 import java.awt.GridBagConstraints;
23 import java.awt.GridBagLayout;
24 import java.awt.Insets;
25 import java.awt.event.ActionEvent;
26 import java.awt.event.ActionListener;
27 import java.util.ArrayList;
28 import java.util.List;
29 import javax.swing.JPanel;
30 import javax.swing.JSplitPane;
31 import javax.swing.event.ListSelectionEvent;
32 import javax.swing.event.ListSelectionListener;
33 import org.apache.commons.lang3.StringUtils;
39 abstract class AbstractFiltersPanel
extends JPanel implements ActionListener, ListSelectionListener {
41 private boolean isInitialized =
false;
42 private static final double LABEL_WEIGHT = 0;
43 private static final double PANEL_WEIGHT = .1;
44 private static final int LABEL_WIDTH = 1;
45 private static final int PANEL_WIDTH = 2;
46 private static final int LABEL_HEIGHT = 1;
47 private static final int PANEL_HEIGHT = 2;
48 private static final long serialVersionUID = 1L;
49 private final GridBagConstraints constraints =
new GridBagConstraints();
50 private final List<AbstractDiscoveryFilterPanel> filters =
new ArrayList<>();
51 private final JPanel firstColumnPanel =
new JPanel();
52 private final JPanel secondColumnPanel =
new JPanel();
53 private int firstColumnY = 0;
54 private int secondColumnY = 0;
59 AbstractFiltersPanel() {
60 firstColumnPanel.setLayout(
new GridBagLayout());
61 secondColumnPanel.setLayout(
new GridBagLayout());
69 abstract FileSearchData.FileType getFileType();
82 final synchronized void addFilter(AbstractDiscoveryFilterPanel filterPanel,
boolean isSelected,
int[] indicesSelected,
int column) {
84 constraints.gridy = 0;
85 constraints.anchor = GridBagConstraints.FIRST_LINE_START;
86 constraints.insets =
new Insets(8, 8, 8, 8);
90 constraints.gridy = firstColumnY;
92 constraints.gridy = secondColumnY;
94 constraints.gridx = 0;
95 filterPanel.configurePanel(isSelected, indicesSelected);
96 filterPanel.addListeners(
this,
this);
97 filters.add(filterPanel);
98 constraints.fill = GridBagConstraints.VERTICAL;
99 constraints.gridheight = LABEL_HEIGHT;
100 constraints.gridwidth = LABEL_WIDTH;
101 constraints.weightx = LABEL_WEIGHT;
102 constraints.weighty = LABEL_WEIGHT;
103 constraints.gridwidth = LABEL_WIDTH;
104 addToGridBagLayout(filterPanel.getCheckbox(), filterPanel.getAdditionalLabel(), column);
105 if (filterPanel.hasPanel()) {
106 constraints.gridx += constraints.gridwidth;
107 constraints.fill = GridBagConstraints.BOTH;
108 constraints.gridheight = PANEL_HEIGHT;
109 constraints.weightx = PANEL_WEIGHT;
110 constraints.weighty = PANEL_WEIGHT;
111 constraints.gridwidth = PANEL_WIDTH;
112 addToGridBagLayout(filterPanel, null, column);
115 firstColumnY += constraints.gridheight;
117 secondColumnY += constraints.gridheight;
126 final void addPanelsToScrollPane(JSplitPane splitPane) {
127 splitPane.setLeftComponent(firstColumnPanel);
128 splitPane.setRightComponent(secondColumnPanel);
136 final synchronized void clearFilters() {
137 for (AbstractDiscoveryFilterPanel filterPanel : filters) {
138 filterPanel.removeListeners();
153 private void addToGridBagLayout(Component componentToAdd, Component additionalComponentToAdd,
int columnIndex) {
154 addToColumn(componentToAdd, columnIndex);
155 if (additionalComponentToAdd != null) {
156 constraints.gridy += constraints.gridheight;
157 addToColumn(additionalComponentToAdd, columnIndex);
158 constraints.gridy -= constraints.gridheight;
168 private void addToColumn(Component component,
int columnNumber) {
169 if (columnNumber == 0) {
170 firstColumnPanel.add(component, constraints);
172 secondColumnPanel.add(component, constraints);
180 synchronized void validateFields() {
181 String errorString = null;
182 for (AbstractDiscoveryFilterPanel filterPanel : filters) {
183 errorString = filterPanel.checkForError();
184 if (!StringUtils.isBlank(errorString)) {
188 firePropertyChange(
"FilterError", null, errorString);
192 public void actionPerformed(ActionEvent e) {
203 boolean isObjectsFilterSupported() {
204 for (AbstractDiscoveryFilterPanel filter : filters) {
205 if (filter instanceof ObjectDetectedFilterPanel) {
206 return filter.getList().getModel().getSize() > 0;
217 boolean isHashSetFilterSupported() {
218 for (AbstractDiscoveryFilterPanel filter : filters) {
219 if (filter instanceof HashSetFilterPanel) {
220 return filter.getList().getModel().getSize() > 0;
231 boolean isInterestingItemsFilterSupported() {
232 for (AbstractDiscoveryFilterPanel filter : filters) {
233 if (filter instanceof InterestingItemsFilterPanel) {
234 return filter.getList().getModel().getSize() > 0;
245 synchronized List<FileSearchFiltering.FileFilter> getFilters() {
246 List<FileSearchFiltering.FileFilter> filtersToUse =
new ArrayList<>();
247 filtersToUse.add(
new FileSearchFiltering.FileTypeFilter(getFileType()));
248 for (AbstractDiscoveryFilterPanel filterPanel : filters) {
249 if (filterPanel.getCheckbox().isSelected()) {
250 FileSearchFiltering.FileFilter filter = filterPanel.getFilter();
251 if (filter != null) {
252 filtersToUse.add(filter);
260 public void valueChanged(ListSelectionEvent evt) {
261 if (!evt.getValueIsAdjusting()) {