19 package org.sleuthkit.autopsy.discovery.ui;
22 import java.awt.Component;
23 import java.awt.GridBagConstraints;
24 import java.awt.GridBagLayout;
25 import java.awt.Insets;
26 import java.awt.event.ActionEvent;
27 import java.awt.event.ActionListener;
28 import java.util.ArrayList;
29 import java.util.List;
30 import javax.swing.JPanel;
31 import javax.swing.JSplitPane;
32 import javax.swing.SwingUtilities;
33 import javax.swing.event.ListSelectionEvent;
34 import javax.swing.event.ListSelectionListener;
35 import org.apache.commons.lang3.StringUtils;
47 abstract class AbstractFiltersPanel
extends JPanel implements ActionListener, ListSelectionListener {
49 private boolean isInitialized =
false;
50 private static final double LABEL_WEIGHT = 0;
51 private static final double PANEL_WEIGHT = .1;
52 private static final int LABEL_WIDTH = 1;
53 private static final int PANEL_WIDTH = 2;
54 private static final int LABEL_HEIGHT = 1;
55 private static final int PANEL_HEIGHT = 2;
56 private static final long serialVersionUID = 1L;
57 private final GridBagConstraints constraints =
new GridBagConstraints();
58 private final List<AbstractDiscoveryFilterPanel> filters =
new ArrayList<>();
59 private final JPanel firstColumnPanel =
new JPanel();
60 private final JPanel secondColumnPanel =
new JPanel();
61 private int firstColumnY = 0;
62 private int secondColumnY = 0;
63 private SortingMethod lastSortingMethod = SortingMethod.BY_FILE_NAME;
64 private GroupingAttributeType lastGroupingAttributeType = GroupingAttributeType.PARENT_PATH;
65 private Group.GroupSortingAlgorithm lastGroupSortingAlg = Group.GroupSortingAlgorithm.BY_GROUP_SIZE;
70 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
71 AbstractFiltersPanel() {
72 firstColumnPanel.setLayout(
new GridBagLayout());
73 secondColumnPanel.setLayout(
new GridBagLayout());
81 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
82 abstract SearchData.Type getType();
95 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
96 final
void addFilter(AbstractDiscoveryFilterPanel filterPanel,
boolean isSelected, List<?> selectedItems,
int column) {
98 constraints.gridy = 0;
99 constraints.anchor = GridBagConstraints.FIRST_LINE_START;
100 constraints.insets =
new Insets(8, 8, 8, 8);
101 isInitialized =
true;
104 constraints.gridy = firstColumnY;
106 constraints.gridy = secondColumnY;
108 constraints.gridx = 0;
109 filterPanel.configurePanel(isSelected, selectedItems);
110 filterPanel.addListeners(
this,
this);
111 filters.add(filterPanel);
112 constraints.fill = GridBagConstraints.VERTICAL;
113 constraints.gridheight = LABEL_HEIGHT;
114 constraints.gridwidth = LABEL_WIDTH;
115 constraints.weightx = LABEL_WEIGHT;
116 constraints.weighty = LABEL_WEIGHT;
117 constraints.gridwidth = LABEL_WIDTH;
118 if (filterPanel.hasPanel()) {
119 addToGridBagLayout(filterPanel.getCheckbox(), filterPanel.getAdditionalLabel(), column);
120 constraints.gridx += constraints.gridwidth;
121 constraints.fill = GridBagConstraints.BOTH;
122 constraints.gridheight = PANEL_HEIGHT;
123 constraints.weightx = PANEL_WEIGHT;
124 constraints.weighty = PANEL_WEIGHT;
125 constraints.gridwidth = PANEL_WIDTH;
126 addToGridBagLayout(filterPanel, null, column);
128 constraints.weightx = PANEL_WEIGHT;
129 constraints.fill = GridBagConstraints.BOTH;
130 constraints.gridwidth = PANEL_WIDTH + LABEL_WIDTH;
131 addToGridBagLayout(filterPanel.getCheckbox(), filterPanel.getAdditionalLabel(), column);
134 firstColumnY += constraints.gridheight;
136 secondColumnY += constraints.gridheight;
145 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
146 final
void addPanelsToScrollPane(JSplitPane splitPane) {
147 splitPane.setLeftComponent(firstColumnPanel);
148 splitPane.setRightComponent(secondColumnPanel);
163 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
164 private
void addToGridBagLayout(Component componentToAdd, Component additionalComponentToAdd,
int columnIndex) {
165 addToColumn(componentToAdd, columnIndex);
166 if (additionalComponentToAdd != null) {
167 constraints.gridy += constraints.gridheight;
168 addToColumn(additionalComponentToAdd, columnIndex);
169 constraints.gridy -= constraints.gridheight;
179 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
180 private
void addToColumn(Component component,
int columnNumber) {
181 if (columnNumber == 0) {
182 firstColumnPanel.add(component, constraints);
184 secondColumnPanel.add(component, constraints);
192 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
193 void validateFields() {
194 String errorString = null;
195 for (AbstractDiscoveryFilterPanel filterPanel : filters) {
196 errorString = filterPanel.checkForError();
197 if (!StringUtils.isBlank(errorString)) {
201 firePropertyChange(
"FilterError", null, errorString);
204 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
206 public void actionPerformed(ActionEvent e) {
208 SwingUtilities.invokeLater(
new Runnable() {
223 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
224 boolean isObjectsFilterSupported() {
225 for (AbstractDiscoveryFilterPanel filter : filters) {
226 if (filter instanceof ObjectDetectedFilterPanel) {
227 return filter.isFilterSupported();
238 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
239 boolean isHashSetFilterSupported() {
240 for (AbstractDiscoveryFilterPanel filter : filters) {
241 if (filter instanceof HashSetFilterPanel) {
242 return filter.isFilterSupported();
253 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
254 boolean isInterestingItemsFilterSupported() {
255 for (AbstractDiscoveryFilterPanel filter : filters) {
256 if (filter instanceof InterestingItemsFilterPanel) {
257 return filter.isFilterSupported();
268 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
269 List<AbstractFilter> getFilters() {
270 List<AbstractFilter> filtersToUse =
new ArrayList<>();
271 if (getType() != SearchData.Type.DOMAIN) {
272 filtersToUse.add(
new SearchFiltering.FileTypeFilter(getType()));
274 for (AbstractDiscoveryFilterPanel filterPanel : filters) {
275 if (filterPanel.getCheckbox().isSelected()) {
276 AbstractFilter filter = filterPanel.getFilter();
277 if (filter != null) {
278 filtersToUse.add(filter);
285 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
287 public void valueChanged(ListSelectionEvent evt) {
288 if (!evt.getValueIsAdjusting()) {
290 SwingUtilities.invokeLater(
new Runnable() {
306 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
307 SortingMethod getLastSortingMethod() {
308 return lastSortingMethod;
316 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
317 final
void setLastSortingMethod(SortingMethod lastSortingMethod) {
318 this.lastSortingMethod = lastSortingMethod;
326 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
327 GroupingAttributeType getLastGroupingAttributeType() {
328 return lastGroupingAttributeType;
337 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
338 final
void setLastGroupingAttributeType(GroupingAttributeType lastGroupingAttributeType) {
339 this.lastGroupingAttributeType = lastGroupingAttributeType;
347 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
348 Group.GroupSortingAlgorithm getLastGroupSortingAlg() {
349 return lastGroupSortingAlg;
358 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
359 final
void setLastGroupSortingAlg(Group.GroupSortingAlgorithm lastGroupSortingAlg) {
360 this.lastGroupSortingAlg = lastGroupSortingAlg;