19 package org.sleuthkit.autopsy.discovery.ui;
22 import java.util.ArrayList;
23 import java.util.List;
24 import javax.swing.DefaultListModel;
25 import javax.swing.JCheckBox;
26 import javax.swing.JLabel;
27 import javax.swing.event.ListSelectionListener;
28 import org.openide.util.NbBundle;
36 final class ParentFolderFilterPanel
extends AbstractDiscoveryFilterPanel {
38 private static final long serialVersionUID = 1L;
40 private static final String[] DEFAULT_IGNORED_PATHS = {
"/Windows/",
"/Program Files/"};
45 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
46 ParentFolderFilterPanel() {
48 setUpParentPathFilter();
54 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
55 private
void setUpParentPathFilter() {
56 fullRadioButton.setSelected(
true);
57 includeRadioButton.setSelected(
true);
58 parentListModel = (DefaultListModel<SearchFiltering.ParentSearchTerm>) parentList.getModel();
59 for (String ignorePath : DEFAULT_IGNORED_PATHS) {
60 parentListModel.add(parentListModel.size(),
new ParentSearchTerm(ignorePath,
false,
false));
69 @SuppressWarnings(
"unchecked")
71 private
void initComponents() {
73 parentCheckbox =
new javax.swing.JCheckBox();
74 parentLabel =
new javax.swing.JLabel();
75 javax.swing.ButtonGroup includeButtonGroup =
new javax.swing.ButtonGroup();
76 javax.swing.ButtonGroup pathTypeButtonGroup =
new javax.swing.ButtonGroup();
77 parentScrollPane =
new javax.swing.JScrollPane();
78 parentList =
new javax.swing.JList<>();
79 fullRadioButton =
new javax.swing.JRadioButton();
80 includeRadioButton =
new javax.swing.JRadioButton();
81 substringRadioButton =
new javax.swing.JRadioButton();
82 excludeRadioButton =
new javax.swing.JRadioButton();
83 deleteButton =
new javax.swing.JButton();
84 addButton =
new javax.swing.JButton();
85 parentTextField =
new javax.swing.JTextField();
87 org.openide.awt.Mnemonics.setLocalizedText(parentCheckbox,
org.openide.util.NbBundle.getMessage(ParentFolderFilterPanel.class,
"ParentFolderFilterPanel.parentCheckbox.text_1"));
88 parentCheckbox.setMaximumSize(
new java.awt.Dimension(150, 25));
89 parentCheckbox.setMinimumSize(
new java.awt.Dimension(150, 25));
90 parentCheckbox.setPreferredSize(
new java.awt.Dimension(150, 25));
91 parentCheckbox.addActionListener(
new java.awt.event.ActionListener() {
92 public void actionPerformed(java.awt.event.ActionEvent evt) {
93 parentCheckboxActionPerformed(evt);
97 org.openide.awt.Mnemonics.setLocalizedText(parentLabel,
org.openide.util.NbBundle.getMessage(ParentFolderFilterPanel.class,
"ParentFolderFilterPanel.parentLabel.text_1"));
98 parentLabel.setMaximumSize(
new java.awt.Dimension(150, 25));
99 parentLabel.setMinimumSize(
new java.awt.Dimension(150, 25));
100 parentLabel.setPreferredSize(
new java.awt.Dimension(150, 25));
102 setMinimumSize(
new java.awt.Dimension(250, 120));
103 setPreferredSize(
new java.awt.Dimension(250, 120));
105 parentScrollPane.setPreferredSize(
new java.awt.Dimension(27, 27));
107 parentList.setModel(
new DefaultListModel<ParentSearchTerm>());
108 parentList.setEnabled(
false);
109 parentList.setVisibleRowCount(4);
110 parentList.addListSelectionListener(
new javax.swing.event.ListSelectionListener() {
111 public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
112 parentListValueChanged(evt);
115 parentScrollPane.setViewportView(parentList);
117 pathTypeButtonGroup.add(fullRadioButton);
118 fullRadioButton.setSelected(
true);
119 org.openide.awt.Mnemonics.setLocalizedText(fullRadioButton,
org.openide.util.NbBundle.getMessage(ParentFolderFilterPanel.class,
"ParentFolderFilterPanel.fullRadioButton.text_1"));
120 fullRadioButton.setEnabled(
false);
122 includeButtonGroup.add(includeRadioButton);
123 includeRadioButton.setSelected(
true);
124 org.openide.awt.Mnemonics.setLocalizedText(includeRadioButton,
org.openide.util.NbBundle.getMessage(ParentFolderFilterPanel.class,
"ParentFolderFilterPanel.includeRadioButton.text_1"));
125 includeRadioButton.setEnabled(
false);
127 pathTypeButtonGroup.add(substringRadioButton);
128 org.openide.awt.Mnemonics.setLocalizedText(substringRadioButton,
org.openide.util.NbBundle.getMessage(ParentFolderFilterPanel.class,
"ParentFolderFilterPanel.substringRadioButton.text_1"));
129 substringRadioButton.setEnabled(
false);
131 includeButtonGroup.add(excludeRadioButton);
132 org.openide.awt.Mnemonics.setLocalizedText(excludeRadioButton,
org.openide.util.NbBundle.getMessage(ParentFolderFilterPanel.class,
"ParentFolderFilterPanel.excludeRadioButton.text_1"));
133 excludeRadioButton.setEnabled(
false);
135 org.openide.awt.Mnemonics.setLocalizedText(deleteButton,
org.openide.util.NbBundle.getMessage(ParentFolderFilterPanel.class,
"ParentFolderFilterPanel.deleteButton.text_1"));
136 deleteButton.setEnabled(
false);
137 deleteButton.setMaximumSize(
new java.awt.Dimension(70, 23));
138 deleteButton.setMinimumSize(
new java.awt.Dimension(70, 23));
139 deleteButton.setPreferredSize(
new java.awt.Dimension(70, 23));
140 deleteButton.addActionListener(
new java.awt.event.ActionListener() {
141 public void actionPerformed(java.awt.event.ActionEvent evt) {
142 deleteButtonActionPerformed(evt);
146 org.openide.awt.Mnemonics.setLocalizedText(addButton,
org.openide.util.NbBundle.getMessage(ParentFolderFilterPanel.class,
"ParentFolderFilterPanel.addButton.text_1"));
147 addButton.setEnabled(
false);
148 addButton.setMaximumSize(
new java.awt.Dimension(70, 23));
149 addButton.setMinimumSize(
new java.awt.Dimension(70, 23));
150 addButton.setPreferredSize(
new java.awt.Dimension(70, 23));
151 addButton.addActionListener(
new java.awt.event.ActionListener() {
152 public void actionPerformed(java.awt.event.ActionEvent evt) {
153 addButtonActionPerformed(evt);
157 parentTextField.setEnabled(
false);
159 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
160 this.setLayout(layout);
161 layout.setHorizontalGroup(
162 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
163 .addGroup(layout.createSequentialGroup()
165 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
166 .addComponent(includeRadioButton)
167 .addComponent(fullRadioButton))
168 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
169 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
170 .addComponent(substringRadioButton)
171 .addComponent(excludeRadioButton)))
172 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
173 .addComponent(parentScrollPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
174 .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
175 .addComponent(parentTextField)
176 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
177 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
178 .addComponent(deleteButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
179 .addComponent(addButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
181 layout.setVerticalGroup(
182 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
183 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
184 .addComponent(parentScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
185 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
186 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
187 .addComponent(fullRadioButton)
188 .addComponent(substringRadioButton))
189 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
190 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
191 .addComponent(includeRadioButton)
192 .addComponent(excludeRadioButton)
193 .addComponent(deleteButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
194 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
195 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
196 .addComponent(parentTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
197 .addComponent(addButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
202 private void parentCheckboxActionPerformed(java.awt.event.ActionEvent evt) {
203 configurePanel(parentCheckbox.isSelected(), null);
206 private void parentListValueChanged(javax.swing.event.ListSelectionEvent evt) {
207 if (parentList.getSelectedValuesList().isEmpty()) {
208 deleteButton.setEnabled(
false);
210 deleteButton.setEnabled(
true);
214 private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {
215 int index = parentList.getSelectedIndex();
217 parentListModel.remove(index);
221 private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {
222 if (!parentTextField.getText().isEmpty()) {
223 ParentSearchTerm searchTerm;
224 searchTerm =
new ParentSearchTerm(parentTextField.getText(), fullRadioButton.isSelected(), includeRadioButton.isSelected());
225 parentListModel.add(parentListModel.size(), searchTerm);
226 parentTextField.setText(
"");
232 private javax.swing.JButton addButton;
233 private javax.swing.JButton deleteButton;
234 private javax.swing.JRadioButton excludeRadioButton;
235 private javax.swing.JRadioButton fullRadioButton;
236 private javax.swing.JRadioButton includeRadioButton;
237 private javax.swing.JCheckBox parentCheckbox;
238 private javax.swing.JLabel parentLabel;
239 private javax.swing.JList<ParentSearchTerm> parentList;
240 private javax.swing.JScrollPane parentScrollPane;
241 private javax.swing.JTextField parentTextField;
242 private javax.swing.JRadioButton substringRadioButton;
245 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
247 void configurePanel(
boolean selected, List<?> selectedItems) {
248 parentCheckbox.setSelected(selected);
249 if (parentCheckbox.isEnabled() && parentCheckbox.isSelected()) {
250 parentScrollPane.setEnabled(
true);
251 parentLabel.setEnabled(
true);
252 includeRadioButton.setEnabled(
true);
253 excludeRadioButton.setEnabled(
true);
254 fullRadioButton.setEnabled(
true);
255 substringRadioButton.setEnabled(
true);
256 addButton.setEnabled(
true);
257 deleteButton.setEnabled(!parentListModel.isEmpty());
258 parentList.setEnabled(
true);
259 parentTextField.setEnabled(
true);
261 parentScrollPane.setEnabled(
false);
262 parentLabel.setEnabled(
false);
263 parentList.setEnabled(
false);
264 includeRadioButton.setEnabled(
false);
265 excludeRadioButton.setEnabled(
false);
266 fullRadioButton.setEnabled(
false);
267 substringRadioButton.setEnabled(
false);
268 addButton.setEnabled(
false);
269 deleteButton.setEnabled(
false);
270 parentTextField.setEnabled(
false);
274 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
276 JCheckBox getCheckbox() {
277 return parentCheckbox;
280 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
282 JLabel getAdditionalLabel() {
286 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
287 @NbBundle.Messages({
"ParentFolderFilterPanel.error.text=At least one parent path must be entered."})
289 String checkForError() {
291 if (parentCheckbox.isSelected() && getParentPaths().isEmpty()) {
292 return Bundle.ParentFolderFilterPanel_error_text();
297 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
303 private List<SearchFiltering.ParentSearchTerm> getParentPaths() {
304 List<SearchFiltering.ParentSearchTerm> results =
new ArrayList<>();
305 for (
int i = 0; i < parentListModel.getSize(); i++) {
306 results.add(parentListModel.get(i));
311 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
313 AbstractFilter getFilter() {
314 if (parentCheckbox.isSelected()) {
315 return new SearchFiltering.ParentFilter(getParentPaths());
321 void addListSelectionListener(ListSelectionListener listener) {
322 parentList.addListSelectionListener(listener);
326 boolean isFilterSupported() {
ParentSearchTerm(String searchStr, boolean isFullPath, boolean isIncluded)