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.JList;
28 import org.openide.util.NbBundle;
35 final class ParentFolderFilterPanel
extends AbstractDiscoveryFilterPanel {
37 private static final long serialVersionUID = 1L;
39 private static final String[] DEFAULT_IGNORED_PATHS = {
"/Windows/",
"/Program Files/"};
44 ParentFolderFilterPanel() {
46 setUpParentPathFilter();
52 private void setUpParentPathFilter() {
53 fullRadioButton.setSelected(
true);
54 includeRadioButton.setSelected(
true);
55 parentListModel = (DefaultListModel<SearchFiltering.ParentSearchTerm>) parentList.getModel();
56 for (String ignorePath : DEFAULT_IGNORED_PATHS) {
57 parentListModel.add(parentListModel.size(),
new ParentSearchTerm(ignorePath,
false,
false));
66 @SuppressWarnings(
"unchecked")
68 private
void initComponents() {
70 parentCheckbox =
new javax.swing.JCheckBox();
71 parentLabel =
new javax.swing.JLabel();
72 javax.swing.ButtonGroup includeButtonGroup =
new javax.swing.ButtonGroup();
73 javax.swing.ButtonGroup pathTypeButtonGroup =
new javax.swing.ButtonGroup();
74 parentScrollPane =
new javax.swing.JScrollPane();
75 parentList =
new javax.swing.JList<>();
76 fullRadioButton =
new javax.swing.JRadioButton();
77 includeRadioButton =
new javax.swing.JRadioButton();
78 substringRadioButton =
new javax.swing.JRadioButton();
79 excludeRadioButton =
new javax.swing.JRadioButton();
80 deleteButton =
new javax.swing.JButton();
81 addButton =
new javax.swing.JButton();
82 parentTextField =
new javax.swing.JTextField();
84 org.openide.awt.Mnemonics.setLocalizedText(parentCheckbox,
org.openide.util.NbBundle.getMessage(ParentFolderFilterPanel.class,
"ParentFolderFilterPanel.parentCheckbox.text_1"));
85 parentCheckbox.setMaximumSize(
new java.awt.Dimension(150, 25));
86 parentCheckbox.setMinimumSize(
new java.awt.Dimension(150, 25));
87 parentCheckbox.setPreferredSize(
new java.awt.Dimension(150, 25));
88 parentCheckbox.addActionListener(
new java.awt.event.ActionListener() {
89 public void actionPerformed(java.awt.event.ActionEvent evt) {
90 parentCheckboxActionPerformed(evt);
94 org.openide.awt.Mnemonics.setLocalizedText(parentLabel,
org.openide.util.NbBundle.getMessage(ParentFolderFilterPanel.class,
"ParentFolderFilterPanel.parentLabel.text_1"));
95 parentLabel.setMaximumSize(
new java.awt.Dimension(150, 25));
96 parentLabel.setMinimumSize(
new java.awt.Dimension(150, 25));
97 parentLabel.setPreferredSize(
new java.awt.Dimension(150, 25));
99 setMinimumSize(
new java.awt.Dimension(250, 120));
100 setPreferredSize(
new java.awt.Dimension(250, 120));
102 parentScrollPane.setPreferredSize(
new java.awt.Dimension(27, 27));
104 parentList.setModel(
new DefaultListModel<ParentSearchTerm>());
105 parentList.setEnabled(
false);
106 parentList.setVisibleRowCount(4);
107 parentList.addListSelectionListener(
new javax.swing.event.ListSelectionListener() {
108 public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
109 parentListValueChanged(evt);
112 parentScrollPane.setViewportView(parentList);
114 pathTypeButtonGroup.add(fullRadioButton);
115 fullRadioButton.setSelected(
true);
116 org.openide.awt.Mnemonics.setLocalizedText(fullRadioButton,
org.openide.util.NbBundle.getMessage(ParentFolderFilterPanel.class,
"ParentFolderFilterPanel.fullRadioButton.text_1"));
117 fullRadioButton.setEnabled(
false);
119 includeButtonGroup.add(includeRadioButton);
120 includeRadioButton.setSelected(
true);
121 org.openide.awt.Mnemonics.setLocalizedText(includeRadioButton,
org.openide.util.NbBundle.getMessage(ParentFolderFilterPanel.class,
"ParentFolderFilterPanel.includeRadioButton.text_1"));
122 includeRadioButton.setEnabled(
false);
124 pathTypeButtonGroup.add(substringRadioButton);
125 org.openide.awt.Mnemonics.setLocalizedText(substringRadioButton,
org.openide.util.NbBundle.getMessage(ParentFolderFilterPanel.class,
"ParentFolderFilterPanel.substringRadioButton.text_1"));
126 substringRadioButton.setEnabled(
false);
128 includeButtonGroup.add(excludeRadioButton);
129 org.openide.awt.Mnemonics.setLocalizedText(excludeRadioButton,
org.openide.util.NbBundle.getMessage(ParentFolderFilterPanel.class,
"ParentFolderFilterPanel.excludeRadioButton.text_1"));
130 excludeRadioButton.setEnabled(
false);
132 org.openide.awt.Mnemonics.setLocalizedText(deleteButton,
org.openide.util.NbBundle.getMessage(ParentFolderFilterPanel.class,
"ParentFolderFilterPanel.deleteButton.text_1"));
133 deleteButton.setEnabled(
false);
134 deleteButton.setMaximumSize(
new java.awt.Dimension(70, 23));
135 deleteButton.setMinimumSize(
new java.awt.Dimension(70, 23));
136 deleteButton.setPreferredSize(
new java.awt.Dimension(70, 23));
137 deleteButton.addActionListener(
new java.awt.event.ActionListener() {
138 public void actionPerformed(java.awt.event.ActionEvent evt) {
139 deleteButtonActionPerformed(evt);
143 org.openide.awt.Mnemonics.setLocalizedText(addButton,
org.openide.util.NbBundle.getMessage(ParentFolderFilterPanel.class,
"ParentFolderFilterPanel.addButton.text_1"));
144 addButton.setEnabled(
false);
145 addButton.setMaximumSize(
new java.awt.Dimension(70, 23));
146 addButton.setMinimumSize(
new java.awt.Dimension(70, 23));
147 addButton.setPreferredSize(
new java.awt.Dimension(70, 23));
148 addButton.addActionListener(
new java.awt.event.ActionListener() {
149 public void actionPerformed(java.awt.event.ActionEvent evt) {
150 addButtonActionPerformed(evt);
154 parentTextField.setEnabled(
false);
156 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
157 this.setLayout(layout);
158 layout.setHorizontalGroup(
159 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
160 .addGroup(layout.createSequentialGroup()
162 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
163 .addComponent(includeRadioButton)
164 .addComponent(fullRadioButton))
165 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
166 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
167 .addComponent(substringRadioButton)
168 .addComponent(excludeRadioButton)))
169 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
170 .addComponent(parentScrollPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
171 .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
172 .addComponent(parentTextField)
173 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
174 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
175 .addComponent(deleteButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
176 .addComponent(addButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
178 layout.setVerticalGroup(
179 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
180 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
181 .addComponent(parentScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
182 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
183 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
184 .addComponent(fullRadioButton)
185 .addComponent(substringRadioButton))
186 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
187 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
188 .addComponent(includeRadioButton)
189 .addComponent(excludeRadioButton)
190 .addComponent(deleteButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
191 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
192 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
193 .addComponent(parentTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
194 .addComponent(addButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
199 private void parentCheckboxActionPerformed(java.awt.event.ActionEvent evt) {
200 configurePanel(parentCheckbox.isSelected(), null);
203 private void parentListValueChanged(javax.swing.event.ListSelectionEvent evt) {
204 if (parentList.getSelectedValuesList().isEmpty()) {
205 deleteButton.setEnabled(
false);
207 deleteButton.setEnabled(
true);
211 private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {
212 int index = parentList.getSelectedIndex();
214 parentListModel.remove(index);
218 private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {
219 if (!parentTextField.getText().isEmpty()) {
220 ParentSearchTerm searchTerm;
221 searchTerm =
new ParentSearchTerm(parentTextField.getText(), fullRadioButton.isSelected(), includeRadioButton.isSelected());
222 parentListModel.add(parentListModel.size(), searchTerm);
223 parentTextField.setText(
"");
229 private javax.swing.JButton addButton;
230 private javax.swing.JButton deleteButton;
231 private javax.swing.JRadioButton excludeRadioButton;
232 private javax.swing.JRadioButton fullRadioButton;
233 private javax.swing.JRadioButton includeRadioButton;
234 private javax.swing.JCheckBox parentCheckbox;
235 private javax.swing.JLabel parentLabel;
236 private javax.swing.JList<ParentSearchTerm> parentList;
237 private javax.swing.JScrollPane parentScrollPane;
238 private javax.swing.JTextField parentTextField;
239 private javax.swing.JRadioButton substringRadioButton;
243 void configurePanel(
boolean selected,
int[] indicesSelected) {
244 parentCheckbox.setSelected(selected);
245 if (parentCheckbox.isEnabled() && parentCheckbox.isSelected()) {
246 parentScrollPane.setEnabled(
true);
247 parentLabel.setEnabled(
true);
248 includeRadioButton.setEnabled(
true);
249 excludeRadioButton.setEnabled(
true);
250 fullRadioButton.setEnabled(
true);
251 substringRadioButton.setEnabled(
true);
252 addButton.setEnabled(
true);
253 deleteButton.setEnabled(!parentListModel.isEmpty());
254 parentList.setEnabled(
true);
255 parentTextField.setEnabled(
true);
256 if (indicesSelected != null) {
257 parentList.setSelectedIndices(indicesSelected);
260 parentScrollPane.setEnabled(
false);
261 parentLabel.setEnabled(
false);
262 parentList.setEnabled(
false);
263 includeRadioButton.setEnabled(
false);
264 excludeRadioButton.setEnabled(
false);
265 fullRadioButton.setEnabled(
false);
266 substringRadioButton.setEnabled(
false);
267 addButton.setEnabled(
false);
268 deleteButton.setEnabled(
false);
269 parentTextField.setEnabled(
false);
274 JCheckBox getCheckbox() {
275 return parentCheckbox;
279 JLabel getAdditionalLabel() {
283 @NbBundle.Messages({
"ParentFolderFilterPanel.error.text=At least one parent path must be entered."})
285 String checkForError() {
287 if (parentCheckbox.isSelected() && getParentPaths().isEmpty()) {
288 return Bundle.ParentFolderFilterPanel_error_text();
298 private List<SearchFiltering.ParentSearchTerm> getParentPaths() {
299 List<SearchFiltering.ParentSearchTerm> results =
new ArrayList<>();
300 for (
int i = 0; i < parentListModel.getSize(); i++) {
301 results.add(parentListModel.get(i));
312 AbstractFilter getFilter() {
313 if (parentCheckbox.isSelected()) {
314 return new SearchFiltering.ParentFilter(getParentPaths());
ParentSearchTerm(String searchStr, boolean isFullPath, boolean isIncluded)