Autopsy  4.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
InterestingItemDefsPanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011-2016 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.modules.interestingitems;
20 
21 import java.awt.EventQueue;
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.HashSet;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.Set;
28 import java.util.SortedSet;
29 import java.util.TreeMap;
30 import java.util.logging.Level;
31 import javax.swing.DefaultListModel;
32 import javax.swing.JButton;
33 import javax.swing.JOptionPane;
34 import javax.swing.event.ListSelectionEvent;
35 import javax.swing.event.ListSelectionListener;
36 import org.apache.tika.mime.MediaType;
37 import org.apache.tika.mime.MimeTypes;
38 import org.netbeans.spi.options.OptionsPanelController;
39 import org.openide.util.NbBundle;
45 
49 final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel implements OptionsPanel {
50 
51  @NbBundle.Messages({
52  "InterestingItemDefsPanel.bytes=Bytes",
53  "InterestingItemDefsPanel.kiloBytes=Kilobytes",
54  "InterestingItemDefsPanel.megaBytes=Megabytes",
55  "InterestingItemDefsPanel.gigaBytes=Gigabytes",
56  "InterestingItemsDefsPanel.loadError=Error loading interesting files sets from file.",
57  "InterestingItemsDefsPanel.saveError=Error saving interesting files sets to file."
58  })
59 
60  private static final SortedSet<MediaType> mediaTypes = MimeTypes.getDefaultMimeTypes().getMediaTypeRegistry().getTypes();
61  private final DefaultListModel<FilesSet> setsListModel = new DefaultListModel<>();
62  private final DefaultListModel<FilesSet.Rule> rulesListModel = new DefaultListModel<>();
63  private final Logger logger = Logger.getLogger(InterestingItemDefsPanel.class.getName());
64  private JButton okButton = new JButton("OK");
65  private JButton cancelButton = new JButton("Cancel");
66 
67  // The following is a map of interesting files set names to interesting
68  // files set definitions. It is a snapshot of the files set definitions
69  // obtained from the interesting item definitions manager at the time the
70  // the panel is loaded. When the panel saves or stores its settings, these
71  // definitions, possibly changed, are submitted back to the interesting item
72  // definitions manager. Note that it is a tree map to aid in displaying
73  // files sets in sorted order by name.
74  private TreeMap<String, FilesSet> filesSets;
75 
79  InterestingItemDefsPanel() {
80  this.initComponents();
81  this.customInit();
82  this.setsList.setModel(setsListModel);
83  this.setsList.addListSelectionListener(new InterestingItemDefsPanel.SetsListSelectionListener());
84  this.rulesList.setModel(rulesListModel);
85  this.rulesList.addListSelectionListener(new InterestingItemDefsPanel.RulesListSelectionListener());
86  }
87 
88  @NbBundle.Messages({"InterestingItemDefsPanel.Title=Global Interesting Items Settings"})
89  private void customInit() {
90  setName(Bundle.InterestingItemDefsPanel_Title());
91 
92  Set<String> fileTypesCollated = new HashSet<>();
93  for (MediaType mediaType : mediaTypes) {
94  fileTypesCollated.add(mediaType.toString());
95  }
96 
97  FileTypeDetector fileTypeDetector;
98  try {
99  fileTypeDetector = new FileTypeDetector();
100  List<String> userDefinedFileTypes = fileTypeDetector.getUserDefinedTypes();
101  fileTypesCollated.addAll(userDefinedFileTypes);
102 
103  } catch (FileTypeDetector.FileTypeDetectorInitException ex) {
104  logger.log(Level.SEVERE, "Unable to get user defined file types", ex);
105  }
106 
107  List<String> toSort = new ArrayList<>(fileTypesCollated);
108  toSort.sort((String string1, String string2) -> {
109  int result = String.CASE_INSENSITIVE_ORDER.compare(string1, string2);
110  if (result == 0) {
111  result = string1.compareTo(string2);
112  }
113  return result;
114  });
115 
116  for (String file : toSort) {
117  mimeTypeComboBox.addItem(file);
118  }
119  this.fileSizeUnitComboBox.setSelectedIndex(1);
120  this.equalitySignComboBox.setSelectedIndex(2);
121  }
122 
126  @Override
127  public void saveSettings() {
128  try {
129  InterestingItemDefsManager.getInstance().setInterestingFilesSets(this.filesSets);
130  } catch (InterestingItemDefsManager.InterestingItemDefsManagerException ex) {
131  MessageNotifyUtil.Message.error(Bundle.InterestingItemsDefsPanel_saveError());
132  }
133  }
134 
138  @Override
139  public void store() {
140  this.saveSettings();
141  }
142 
146  @Override
147  public void load() {
148  this.resetComponents();
149 
150  try {
151  // Get a working copy of the interesting files set definitions and sort
152  // by set name.
153  this.filesSets = new TreeMap<>(InterestingItemDefsManager.getInstance().getInterestingFilesSets());
154  } catch (InterestingItemDefsManager.InterestingItemDefsManagerException ex) {
155  MessageNotifyUtil.Message.error(Bundle.InterestingItemsDefsPanel_loadError());
156  this.filesSets = new TreeMap<>();
157  }
158 
159  // Populate the list model for the interesting files sets list
160  // component.
161  for (FilesSet set : this.filesSets.values()) {
162  this.setsListModel.addElement(set);
163  }
164 
165  if (!this.filesSets.isEmpty()) {
166  // Select the first files set by default. The list selections
167  // listeners will then populate the other components.
168  EventQueue.invokeLater(() -> {
169  InterestingItemDefsPanel.this.setsList.setSelectedIndex(0);
170  });
171  }
172  }
173 
177  private void resetComponents() {
178  this.resetRuleComponents();
179  this.setsListModel.clear();
180  this.setDescriptionTextArea.setText("");
181  this.ignoreKnownFilesCheckbox.setSelected(true);
182  this.newSetButton.setEnabled(true);
183  this.editSetButton.setEnabled(false);
184  this.deleteSetButton.setEnabled(false);
185  }
186 
191  private void resetRuleComponents() {
192  this.fileNameTextField.setText("");
193  this.fileNameRadioButton.setSelected(true);
194  this.fileNameRegexCheckbox.setSelected(false);
195  this.filesRadioButton.setSelected(true);
196  this.rulePathConditionTextField.setText("");
197  this.rulePathConditionRegexCheckBox.setSelected(false);
198  this.mimeTypeComboBox.setSelectedIndex(0);
199  this.equalitySignComboBox.setSelectedIndex(2);
200  this.fileSizeUnitComboBox.setSelectedIndex(1);
201  this.fileSizeSpinner.setValue(0);
202  this.newRuleButton.setEnabled(!this.setsListModel.isEmpty());
203  this.editRuleButton.setEnabled(false);
204  this.deleteRuleButton.setEnabled(false);
205  }
206 
210  private final class SetsListSelectionListener implements ListSelectionListener {
211 
212  @Override
213  public void valueChanged(ListSelectionEvent e) {
214  if (e.getValueIsAdjusting()) {
215  return;
216  }
217 
218  InterestingItemDefsPanel.this.rulesListModel.clear();
219  InterestingItemDefsPanel.this.resetRuleComponents();
220 
221  // Get the selected interesting files set and populate the set
222  // components.
223  FilesSet selectedSet = InterestingItemDefsPanel.this.setsList.getSelectedValue();
224  if (selectedSet != null) {
225  // Populate the components that display the properties of the
226  // selected files set.
227  InterestingItemDefsPanel.this.setDescriptionTextArea.setText(selectedSet.getDescription());
228  InterestingItemDefsPanel.this.ignoreKnownFilesCheckbox.setSelected(selectedSet.ignoresKnownFiles());
229 
230  // Enable the new, edit and delete set buttons.
231  InterestingItemDefsPanel.this.newSetButton.setEnabled(true);
232  InterestingItemDefsPanel.this.editSetButton.setEnabled(true);
233  InterestingItemDefsPanel.this.deleteSetButton.setEnabled(true);
234 
235  // Populate the rule definitions list, sorted by name.
236  TreeMap<String, FilesSet.Rule> rules = new TreeMap<>(selectedSet.getRules());
237  for (FilesSet.Rule rule : rules.values()) {
238  InterestingItemDefsPanel.this.rulesListModel.addElement(rule);
239  }
240 
241  // Select the first rule by default.
242  if (!InterestingItemDefsPanel.this.rulesListModel.isEmpty()) {
243  InterestingItemDefsPanel.this.rulesList.setSelectedIndex(0);
244  }
245  }
246  }
247 
248  }
249 
254  private final class RulesListSelectionListener implements ListSelectionListener {
255 
256  @Override
257  public void valueChanged(ListSelectionEvent e) {
258  if (e.getValueIsAdjusting()) {
259  return;
260  }
261 
262  // Get the selected rule and populate the rule components.
263  FilesSet.Rule rule = InterestingItemDefsPanel.this.rulesList.getSelectedValue();
264  if (rule != null) {
265  // Get the conditions that make up the rule.
266  FilesSet.Rule.FileNameCondition nameCondition = rule.getFileNameCondition();
267  FilesSet.Rule.MetaTypeCondition typeCondition = rule.getMetaTypeCondition();
268  FilesSet.Rule.ParentPathCondition pathCondition = rule.getPathCondition();
269  FilesSet.Rule.MimeTypeCondition mimeTypeCondition = rule.getMimeTypeCondition();
270  FilesSet.Rule.FileSizeCondition fileSizeCondition = rule.getFileSizeCondition();
271 
272  // Populate the components that display the properties of the
273  // selected rule.
274  if (nameCondition != null) {
275  InterestingItemDefsPanel.this.fileNameTextField.setText(nameCondition.getTextToMatch());
276  InterestingItemDefsPanel.this.fileNameRadioButton.setSelected(nameCondition instanceof FilesSet.Rule.FullNameCondition);
277  InterestingItemDefsPanel.this.fileNameExtensionRadioButton.setSelected(nameCondition instanceof FilesSet.Rule.ExtensionCondition);
278  InterestingItemDefsPanel.this.fileNameRegexCheckbox.setSelected(nameCondition.isRegex());
279  } else {
280  InterestingItemDefsPanel.this.fileNameTextField.setText("");
281  InterestingItemDefsPanel.this.fileNameRadioButton.setSelected(true);
282  InterestingItemDefsPanel.this.fileNameExtensionRadioButton.setSelected(false);
283  InterestingItemDefsPanel.this.fileNameRegexCheckbox.setSelected(false);
284  }
285  switch (typeCondition.getMetaType()) {
286  case FILES:
287  InterestingItemDefsPanel.this.filesRadioButton.setSelected(true);
288  break;
289  case DIRECTORIES:
290  InterestingItemDefsPanel.this.dirsRadioButton.setSelected(true);
291  break;
292  case FILES_AND_DIRECTORIES:
293  InterestingItemDefsPanel.this.bothRadioButton.setSelected(true);
294  break;
295  }
296  if (pathCondition != null) {
297  InterestingItemDefsPanel.this.rulePathConditionTextField.setText(pathCondition.getTextToMatch());
298  InterestingItemDefsPanel.this.rulePathConditionRegexCheckBox.setSelected(pathCondition.isRegex());
299  } else {
300  InterestingItemDefsPanel.this.rulePathConditionTextField.setText("");
301  InterestingItemDefsPanel.this.rulePathConditionRegexCheckBox.setSelected(false);
302  }
303  if (mimeTypeCondition != null) {
304  InterestingItemDefsPanel.this.mimeTypeComboBox.setSelectedItem(mimeTypeCondition.getMimeType());
305  } else {
306  InterestingItemDefsPanel.this.mimeTypeComboBox.setSelectedIndex(0);
307  }
308  if (fileSizeCondition != null) {
309  InterestingItemDefsPanel.this.fileSizeUnitComboBox.setSelectedItem(fileSizeCondition.getUnit().getName());
310  InterestingItemDefsPanel.this.equalitySignComboBox.setSelectedItem(fileSizeCondition.getComparator().getSymbol());
311  InterestingItemDefsPanel.this.fileSizeSpinner.setValue(fileSizeCondition.getSizeValue());
312  } else {
313  InterestingItemDefsPanel.this.fileSizeUnitComboBox.setSelectedIndex(1);
314  InterestingItemDefsPanel.this.equalitySignComboBox.setSelectedIndex(2);
315  InterestingItemDefsPanel.this.fileSizeSpinner.setValue(0);
316  }
317 
318  // Enable the new, edit and delete rule buttons.
319  InterestingItemDefsPanel.this.newRuleButton.setEnabled(true);
320  InterestingItemDefsPanel.this.editRuleButton.setEnabled(true);
321  InterestingItemDefsPanel.this.deleteRuleButton.setEnabled(true);
322  } else {
323  InterestingItemDefsPanel.this.resetRuleComponents();
324  }
325  }
326 
327  }
328 
337  private void doFileSetsDialog(FilesSet selectedSet) {
338  // Create a files set defintion panle.
339  FilesSetPanel panel;
340  if (selectedSet != null) {
341  // Editing an existing set definition.
342  panel = new FilesSetPanel(selectedSet);
343  } else {
344  // Creating a new set definition.
345  panel = new FilesSetPanel();
346  }
347 
348  // Do a dialog box with the files set panel until the user either enters
349  // a valid definition or cancels. Note that the panel gives the user
350  // feedback when isValidDefinition() is called.
351  int option = JOptionPane.OK_OPTION;
352  do {
353  option = JOptionPane.showConfirmDialog(null, panel, NbBundle.getMessage(FilesSetPanel.class, "FilesSetPanel.title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
354  } while (option == JOptionPane.OK_OPTION && !panel.isValidDefinition());
355 
356  // While adding new ruleset(selectedSet == null), if rule set with same name already exists, do not add to the filesSets hashMap.
357  // In case of editing an existing ruleset(selectedSet != null), following check is not performed.
358  if (this.filesSets.containsKey(panel.getFilesSetName()) && selectedSet == null) {
359  MessageNotifyUtil.Message.error(NbBundle.getMessage(this.getClass(),
360  "InterestingItemDefsPanel.doFileSetsDialog.duplicateRuleSet.text",
361  panel.getFilesSetName()));
362  return;
363  }
364 
365  if (option == JOptionPane.OK_OPTION) {
366  Map<String, FilesSet.Rule> rules = new HashMap<>();
367  if (selectedSet != null) {
368  // Interesting file sets are immutable for thread safety,
369  // so editing a files set definition is a replacement operation.
370  // Preserve the existing rules from the set being edited.
371  rules.putAll(selectedSet.getRules());
372  }
373  this.replaceFilesSet(selectedSet, panel.getFilesSetName(), panel.getFilesSetDescription(), panel.getFileSetIgnoresKnownFiles(), rules);
374  }
375  }
376 
384  private void doFilesSetRuleDialog(FilesSet.Rule selectedRule) {
385  // Create a files set rule panel.
386  FilesSetRulePanel panel;
387  if (selectedRule != null) {
388  // Editing an existing rule definition.
389  panel = new FilesSetRulePanel(selectedRule, okButton, cancelButton);
390  } else {
391  // Creating a new rule definition.
392  panel = new FilesSetRulePanel(okButton, cancelButton);
393  }
394  // Do a dialog box with the files set panel until the user either enters
395  // a valid definition or cancels. Note that the panel gives the user
396  // feedback when isValidDefinition() is called.
397  int option = JOptionPane.OK_OPTION;
398  do {
399  option = JOptionPane.showOptionDialog(null, panel, NbBundle.getMessage(FilesSetPanel.class, "FilesSetPanel.title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, new Object[]{okButton, cancelButton}, okButton);
400  } while (option == JOptionPane.OK_OPTION && !panel.isValidRuleDefinition());
401 
402  if (option == JOptionPane.OK_OPTION) {
403  // Interesting file sets are immutable for thread safety,
404  // so editing a files set rule definition is a replacement
405  // operation. Preserve the existing rules from the set being edited.
406  FilesSet selectedSet = this.setsList.getSelectedValue();
407  Map<String, FilesSet.Rule> rules = new HashMap<>(selectedSet.getRules());
408 
409  // Remove the "old" rule definition and add the new/edited
410  // definition.
411  if (selectedRule != null) {
412  rules.remove(selectedRule.getUuid());
413  }
414  FilesSet.Rule newRule = new FilesSet.Rule(panel.getRuleName(), panel.getFileNameCondition(), panel.getMetaTypeCondition(), panel.getPathCondition(), panel.getMimeTypeCondition(), panel.getFileSizeCondition());
415  rules.put(newRule.getUuid(), newRule);
416 
417  // Add the new/edited files set definition, replacing any previous
418  // definition with the same name and refreshing the display.
419  this.replaceFilesSet(selectedSet, selectedSet.getName(), selectedSet.getDescription(), selectedSet.ignoresKnownFiles(), rules);
420 
421  // Select the new/edited rule. Queue it up so it happens after the
422  // selection listeners react to the selection of the "new" files
423  // set.
424  EventQueue.invokeLater(() -> {
425  this.rulesList.setSelectedValue(newRule, true);
426  });
427  }
428  }
429 
443  void replaceFilesSet(FilesSet oldSet, String name, String description, boolean ignoresKnownFiles, Map<String, FilesSet.Rule> rules) {
444  if (oldSet != null) {
445  // Remove the set to be replaced from the working copy if the files
446  // set definitions.
447  this.filesSets.remove(oldSet.getName());
448  }
449 
450  // Make the new/edited set definition and add it to the working copy of
451  // the files set definitions.
452  FilesSet newSet = new FilesSet(name, description, ignoresKnownFiles, rules);
453  this.filesSets.put(newSet.getName(), newSet);
454 
455  // Redo the list model for the files set list component, which will make
456  // everything stays sorted as in the working copy tree set.
457  InterestingItemDefsPanel.this.setsListModel.clear();
458  for (FilesSet set : this.filesSets.values()) {
459  this.setsListModel.addElement(set);
460  }
461 
462  // Select the new/edited files set definition in the set definitions
463  // list. This will cause the selection listeners to repopulate the
464  // subordinate components.
465  this.setsList.setSelectedValue(newSet, true);
466  }
467 
473  @SuppressWarnings("unchecked")
474  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
475  private void initComponents() {
476 
477  fileNameButtonGroup = new javax.swing.ButtonGroup();
478  typeButtonGroup = new javax.swing.ButtonGroup();
479  jScrollPane1 = new javax.swing.JScrollPane();
480  jPanel1 = new javax.swing.JPanel();
481  jLabel6 = new javax.swing.JLabel();
482  newRuleButton = new javax.swing.JButton();
483  filesRadioButton = new javax.swing.JRadioButton();
484  editRuleButton = new javax.swing.JButton();
485  rulesListLabel = new javax.swing.JLabel();
486  rulesListScrollPane = new javax.swing.JScrollPane();
487  rulesList = new javax.swing.JList<>();
488  setDescScrollPanel = new javax.swing.JScrollPane();
489  setDescriptionTextArea = new javax.swing.JTextArea();
490  editSetButton = new javax.swing.JButton();
491  setsListScrollPane = new javax.swing.JScrollPane();
492  setsList = new javax.swing.JList<>();
493  fileNameExtensionRadioButton = new javax.swing.JRadioButton();
494  jLabel3 = new javax.swing.JLabel();
495  fileNameTextField = new javax.swing.JTextField();
496  jLabel5 = new javax.swing.JLabel();
497  fileNameRadioButton = new javax.swing.JRadioButton();
498  rulePathConditionTextField = new javax.swing.JTextField();
499  ignoreKnownFilesCheckbox = new javax.swing.JCheckBox();
500  fileNameRegexCheckbox = new javax.swing.JCheckBox();
501  separator = new javax.swing.JSeparator();
502  setsListLabel = new javax.swing.JLabel();
503  bothRadioButton = new javax.swing.JRadioButton();
504  deleteSetButton = new javax.swing.JButton();
505  deleteRuleButton = new javax.swing.JButton();
506  newSetButton = new javax.swing.JButton();
507  jLabel2 = new javax.swing.JLabel();
508  dirsRadioButton = new javax.swing.JRadioButton();
509  jLabel1 = new javax.swing.JLabel();
510  jLabel4 = new javax.swing.JLabel();
511  rulePathConditionRegexCheckBox = new javax.swing.JCheckBox();
512  jScrollPane2 = new javax.swing.JScrollPane();
513  jTextArea1 = new javax.swing.JTextArea();
514  jLabel7 = new javax.swing.JLabel();
515  mimeTypeComboBox = new javax.swing.JComboBox<>();
516  jLabel8 = new javax.swing.JLabel();
517  equalitySignComboBox = new javax.swing.JComboBox<String>();
518  fileSizeSpinner = new javax.swing.JSpinner();
519  fileSizeUnitComboBox = new javax.swing.JComboBox<String>();
520 
521  setFont(getFont().deriveFont(getFont().getStyle() & ~java.awt.Font.BOLD, 11));
522 
523  jScrollPane1.setFont(jScrollPane1.getFont().deriveFont(jScrollPane1.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
524 
525  jPanel1.setFont(jPanel1.getFont().deriveFont(jPanel1.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
526 
527  jLabel6.setFont(jLabel6.getFont().deriveFont(jLabel6.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
528  org.openide.awt.Mnemonics.setLocalizedText(jLabel6, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.jLabel6.text")); // NOI18N
529 
530  newRuleButton.setFont(newRuleButton.getFont().deriveFont(newRuleButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
531  newRuleButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/add16.png"))); // NOI18N
532  org.openide.awt.Mnemonics.setLocalizedText(newRuleButton, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.newRuleButton.text")); // NOI18N
533  newRuleButton.addActionListener(new java.awt.event.ActionListener() {
534  public void actionPerformed(java.awt.event.ActionEvent evt) {
535  newRuleButtonActionPerformed(evt);
536  }
537  });
538 
539  typeButtonGroup.add(filesRadioButton);
540  filesRadioButton.setFont(filesRadioButton.getFont().deriveFont(filesRadioButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
541  filesRadioButton.setSelected(true);
542  org.openide.awt.Mnemonics.setLocalizedText(filesRadioButton, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.filesRadioButton.text")); // NOI18N
543  filesRadioButton.setEnabled(false);
544 
545  editRuleButton.setFont(editRuleButton.getFont().deriveFont(editRuleButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
546  editRuleButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/edit16.png"))); // NOI18N
547  org.openide.awt.Mnemonics.setLocalizedText(editRuleButton, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.editRuleButton.text")); // NOI18N
548  editRuleButton.setEnabled(false);
549  editRuleButton.addActionListener(new java.awt.event.ActionListener() {
550  public void actionPerformed(java.awt.event.ActionEvent evt) {
551  editRuleButtonActionPerformed(evt);
552  }
553  });
554 
555  rulesListLabel.setFont(rulesListLabel.getFont().deriveFont(rulesListLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
556  org.openide.awt.Mnemonics.setLocalizedText(rulesListLabel, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.rulesListLabel.text")); // NOI18N
557 
558  rulesListScrollPane.setFont(rulesListScrollPane.getFont().deriveFont(rulesListScrollPane.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
559 
560  rulesList.setFont(rulesList.getFont().deriveFont(rulesList.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
561  rulesList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
562  rulesListScrollPane.setViewportView(rulesList);
563 
564  setDescScrollPanel.setFont(setDescScrollPanel.getFont().deriveFont(setDescScrollPanel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
565 
566  setDescriptionTextArea.setEditable(false);
567  setDescriptionTextArea.setBackground(new java.awt.Color(240, 240, 240));
568  setDescriptionTextArea.setColumns(20);
569  setDescriptionTextArea.setFont(setDescriptionTextArea.getFont().deriveFont(setDescriptionTextArea.getFont().getStyle() & ~java.awt.Font.BOLD, 13));
570  setDescriptionTextArea.setLineWrap(true);
571  setDescriptionTextArea.setRows(2);
572  setDescriptionTextArea.setMinimumSize(new java.awt.Dimension(10, 22));
573  setDescriptionTextArea.setPreferredSize(new java.awt.Dimension(14, 40));
574  setDescScrollPanel.setViewportView(setDescriptionTextArea);
575 
576  editSetButton.setFont(editSetButton.getFont().deriveFont(editSetButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
577  editSetButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/edit16.png"))); // NOI18N
578  org.openide.awt.Mnemonics.setLocalizedText(editSetButton, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.editSetButton.text")); // NOI18N
579  editSetButton.setEnabled(false);
580  editSetButton.addActionListener(new java.awt.event.ActionListener() {
581  public void actionPerformed(java.awt.event.ActionEvent evt) {
582  editSetButtonActionPerformed(evt);
583  }
584  });
585 
586  setsListScrollPane.setFont(setsListScrollPane.getFont().deriveFont(setsListScrollPane.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
587 
588  setsList.setFont(setsList.getFont().deriveFont(setsList.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
589  setsList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
590  setsListScrollPane.setViewportView(setsList);
591 
592  fileNameButtonGroup.add(fileNameExtensionRadioButton);
593  fileNameExtensionRadioButton.setFont(fileNameExtensionRadioButton.getFont().deriveFont(fileNameExtensionRadioButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
594  org.openide.awt.Mnemonics.setLocalizedText(fileNameExtensionRadioButton, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.fileNameExtensionRadioButton.text")); // NOI18N
595  fileNameExtensionRadioButton.setEnabled(false);
596 
597  jLabel3.setFont(jLabel3.getFont().deriveFont(jLabel3.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
598  org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.jLabel3.text")); // NOI18N
599 
600  fileNameTextField.setEditable(false);
601  fileNameTextField.setFont(fileNameTextField.getFont().deriveFont(fileNameTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
602  fileNameTextField.setText(org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.fileNameTextField.text")); // NOI18N
603  fileNameTextField.addActionListener(new java.awt.event.ActionListener() {
604  public void actionPerformed(java.awt.event.ActionEvent evt) {
605  fileNameTextFieldActionPerformed(evt);
606  }
607  });
608 
609  jLabel5.setFont(jLabel5.getFont().deriveFont(jLabel5.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
610  org.openide.awt.Mnemonics.setLocalizedText(jLabel5, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.jLabel5.text")); // NOI18N
611 
612  fileNameButtonGroup.add(fileNameRadioButton);
613  fileNameRadioButton.setFont(fileNameRadioButton.getFont().deriveFont(fileNameRadioButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
614  org.openide.awt.Mnemonics.setLocalizedText(fileNameRadioButton, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.fileNameRadioButton.text")); // NOI18N
615  fileNameRadioButton.setEnabled(false);
616 
617  rulePathConditionTextField.setEditable(false);
618  rulePathConditionTextField.setFont(rulePathConditionTextField.getFont().deriveFont(rulePathConditionTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
619  rulePathConditionTextField.setText(org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.rulePathConditionTextField.text")); // NOI18N
620 
621  ignoreKnownFilesCheckbox.setFont(ignoreKnownFilesCheckbox.getFont().deriveFont(ignoreKnownFilesCheckbox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
622  org.openide.awt.Mnemonics.setLocalizedText(ignoreKnownFilesCheckbox, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.ignoreKnownFilesCheckbox.text")); // NOI18N
623  ignoreKnownFilesCheckbox.setEnabled(false);
624  ignoreKnownFilesCheckbox.addActionListener(new java.awt.event.ActionListener() {
625  public void actionPerformed(java.awt.event.ActionEvent evt) {
626  ignoreKnownFilesCheckboxActionPerformed(evt);
627  }
628  });
629 
630  fileNameRegexCheckbox.setFont(fileNameRegexCheckbox.getFont().deriveFont(fileNameRegexCheckbox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
631  org.openide.awt.Mnemonics.setLocalizedText(fileNameRegexCheckbox, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.fileNameRegexCheckbox.text")); // NOI18N
632  fileNameRegexCheckbox.setEnabled(false);
633 
634  separator.setOrientation(javax.swing.SwingConstants.VERTICAL);
635 
636  setsListLabel.setFont(setsListLabel.getFont().deriveFont(setsListLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
637  org.openide.awt.Mnemonics.setLocalizedText(setsListLabel, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.setsListLabel.text")); // NOI18N
638 
639  typeButtonGroup.add(bothRadioButton);
640  bothRadioButton.setFont(bothRadioButton.getFont().deriveFont(bothRadioButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
641  org.openide.awt.Mnemonics.setLocalizedText(bothRadioButton, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.bothRadioButton.text")); // NOI18N
642  bothRadioButton.setEnabled(false);
643 
644  deleteSetButton.setFont(deleteSetButton.getFont().deriveFont(deleteSetButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
645  deleteSetButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/delete16.png"))); // NOI18N
646  org.openide.awt.Mnemonics.setLocalizedText(deleteSetButton, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.deleteSetButton.text")); // NOI18N
647  deleteSetButton.setEnabled(false);
648  deleteSetButton.addActionListener(new java.awt.event.ActionListener() {
649  public void actionPerformed(java.awt.event.ActionEvent evt) {
650  deleteSetButtonActionPerformed(evt);
651  }
652  });
653 
654  deleteRuleButton.setFont(deleteRuleButton.getFont().deriveFont(deleteRuleButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
655  deleteRuleButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/delete16.png"))); // NOI18N
656  org.openide.awt.Mnemonics.setLocalizedText(deleteRuleButton, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.deleteRuleButton.text")); // NOI18N
657  deleteRuleButton.setEnabled(false);
658  deleteRuleButton.addActionListener(new java.awt.event.ActionListener() {
659  public void actionPerformed(java.awt.event.ActionEvent evt) {
660  deleteRuleButtonActionPerformed(evt);
661  }
662  });
663 
664  newSetButton.setFont(newSetButton.getFont().deriveFont(newSetButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
665  newSetButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/add16.png"))); // NOI18N
666  org.openide.awt.Mnemonics.setLocalizedText(newSetButton, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.newSetButton.text")); // NOI18N
667  newSetButton.addActionListener(new java.awt.event.ActionListener() {
668  public void actionPerformed(java.awt.event.ActionEvent evt) {
669  newSetButtonActionPerformed(evt);
670  }
671  });
672 
673  jLabel2.setFont(jLabel2.getFont().deriveFont(jLabel2.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
674  org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.jLabel2.text")); // NOI18N
675 
676  typeButtonGroup.add(dirsRadioButton);
677  dirsRadioButton.setFont(dirsRadioButton.getFont().deriveFont(dirsRadioButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
678  org.openide.awt.Mnemonics.setLocalizedText(dirsRadioButton, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.dirsRadioButton.text")); // NOI18N
679  dirsRadioButton.setEnabled(false);
680  dirsRadioButton.addActionListener(new java.awt.event.ActionListener() {
681  public void actionPerformed(java.awt.event.ActionEvent evt) {
682  dirsRadioButtonActionPerformed(evt);
683  }
684  });
685 
686  jLabel1.setFont(jLabel1.getFont().deriveFont(jLabel1.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
687  org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.jLabel1.text")); // NOI18N
688 
689  jLabel4.setFont(jLabel4.getFont().deriveFont(jLabel4.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
690  org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.jLabel4.text")); // NOI18N
691 
692  rulePathConditionRegexCheckBox.setFont(rulePathConditionRegexCheckBox.getFont().deriveFont(rulePathConditionRegexCheckBox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
693  org.openide.awt.Mnemonics.setLocalizedText(rulePathConditionRegexCheckBox, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.rulePathConditionRegexCheckBox.text")); // NOI18N
694  rulePathConditionRegexCheckBox.setEnabled(false);
695 
696  jScrollPane2.setFont(jScrollPane2.getFont().deriveFont(jScrollPane2.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
697 
698  jTextArea1.setEditable(false);
699  jTextArea1.setBackground(new java.awt.Color(240, 240, 240));
700  jTextArea1.setColumns(20);
701  jTextArea1.setFont(jTextArea1.getFont().deriveFont(jTextArea1.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
702  jTextArea1.setLineWrap(true);
703  jTextArea1.setRows(3);
704  jTextArea1.setText(org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.jTextArea1.text")); // NOI18N
705  jTextArea1.setWrapStyleWord(true);
706  jScrollPane2.setViewportView(jTextArea1);
707 
708  org.openide.awt.Mnemonics.setLocalizedText(jLabel7, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.jLabel7.text")); // NOI18N
709 
710  mimeTypeComboBox.setEditable(true);
711  mimeTypeComboBox.setModel(new javax.swing.DefaultComboBoxModel<String>(new String[] {""}));
712  mimeTypeComboBox.setEnabled(false);
713  mimeTypeComboBox.setMinimumSize(new java.awt.Dimension(0, 20));
714  mimeTypeComboBox.setPreferredSize(new java.awt.Dimension(12, 20));
715 
716  org.openide.awt.Mnemonics.setLocalizedText(jLabel8, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.jLabel8.text")); // NOI18N
717 
718  equalitySignComboBox.setModel(new javax.swing.DefaultComboBoxModel<String>(new String[] { "=", ">", "≥", "<", "≤" }));
719  equalitySignComboBox.setEnabled(false);
720 
721  fileSizeSpinner.setEnabled(false);
722  fileSizeSpinner.setMinimumSize(new java.awt.Dimension(2, 20));
723 
724  fileSizeUnitComboBox.setModel(new javax.swing.DefaultComboBoxModel<String>(new String[] { Bundle.InterestingItemDefsPanel_bytes(), Bundle.InterestingItemDefsPanel_kiloBytes(), Bundle.InterestingItemDefsPanel_megaBytes(), Bundle.InterestingItemDefsPanel_gigaBytes() }));
725  fileSizeUnitComboBox.setEnabled(false);
726 
727  javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
728  jPanel1.setLayout(jPanel1Layout);
729  jPanel1Layout.setHorizontalGroup(
730  jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
731  .addGroup(jPanel1Layout.createSequentialGroup()
732  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
733  .addGroup(jPanel1Layout.createSequentialGroup()
734  .addGap(360, 360, 360)
735  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
736  .addComponent(rulesListLabel)
737  .addComponent(jLabel5)
738  .addComponent(ignoreKnownFilesCheckbox)
739  .addComponent(jLabel6))
740  .addGap(0, 0, Short.MAX_VALUE))
741  .addGroup(jPanel1Layout.createSequentialGroup()
742  .addContainerGap()
743  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
744  .addGroup(jPanel1Layout.createSequentialGroup()
745  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
746  .addComponent(setsListLabel)
747  .addComponent(setsListScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 314, javax.swing.GroupLayout.PREFERRED_SIZE)
748  .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 314, javax.swing.GroupLayout.PREFERRED_SIZE))
749  .addGap(18, 18, 18)
750  .addComponent(separator, javax.swing.GroupLayout.PREFERRED_SIZE, 6, javax.swing.GroupLayout.PREFERRED_SIZE))
751  .addGroup(jPanel1Layout.createSequentialGroup()
752  .addComponent(newSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, 93, javax.swing.GroupLayout.PREFERRED_SIZE)
753  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
754  .addComponent(editSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE)
755  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
756  .addComponent(deleteSetButton)))
757  .addGap(12, 12, 12)
758  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
759  .addGroup(jPanel1Layout.createSequentialGroup()
760  .addGap(20, 20, 20)
761  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
762  .addGroup(jPanel1Layout.createSequentialGroup()
763  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
764  .addGroup(jPanel1Layout.createSequentialGroup()
765  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
766  .addComponent(jLabel3)
767  .addComponent(jLabel2))
768  .addGap(6, 6, 6))
769  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
770  .addComponent(jLabel4)
771  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)))
772  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
773  .addComponent(rulePathConditionTextField, javax.swing.GroupLayout.Alignment.LEADING)
774  .addComponent(fileNameTextField)))
775  .addGroup(jPanel1Layout.createSequentialGroup()
776  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
777  .addComponent(jLabel7)
778  .addComponent(jLabel8))
779  .addGap(6, 6, 6)
780  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
781  .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
782  .addComponent(equalitySignComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE)
783  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
784  .addComponent(fileSizeSpinner, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
785  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
786  .addComponent(fileSizeUnitComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
787  .addGap(8, 8, 8))
788  .addComponent(mimeTypeComboBox, javax.swing.GroupLayout.Alignment.LEADING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))))
789  .addGroup(jPanel1Layout.createSequentialGroup()
790  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
791  .addComponent(setDescScrollPanel)
792  .addComponent(rulesListScrollPane))
793  .addGap(7, 7, 7))
794  .addGroup(jPanel1Layout.createSequentialGroup()
795  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
796  .addComponent(jLabel1)
797  .addGroup(jPanel1Layout.createSequentialGroup()
798  .addGap(92, 92, 92)
799  .addComponent(filesRadioButton, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE)
800  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
801  .addComponent(dirsRadioButton)
802  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
803  .addComponent(bothRadioButton))
804  .addGroup(jPanel1Layout.createSequentialGroup()
805  .addComponent(newRuleButton)
806  .addGap(18, 18, 18)
807  .addComponent(editRuleButton)
808  .addGap(18, 18, 18)
809  .addComponent(deleteRuleButton))
810  .addGroup(jPanel1Layout.createSequentialGroup()
811  .addGap(96, 96, 96)
812  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
813  .addGroup(jPanel1Layout.createSequentialGroup()
814  .addComponent(fileNameRadioButton)
815  .addGap(4, 4, 4)
816  .addComponent(fileNameExtensionRadioButton)
817  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
818  .addComponent(fileNameRegexCheckbox))
819  .addComponent(rulePathConditionRegexCheckBox))))
820  .addGap(4, 4, 4)))))
821  .addGap(23, 23, 23))
822  );
823  jPanel1Layout.setVerticalGroup(
824  jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
825  .addGroup(jPanel1Layout.createSequentialGroup()
826  .addContainerGap()
827  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
828  .addComponent(separator)
829  .addGroup(jPanel1Layout.createSequentialGroup()
830  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
831  .addGroup(jPanel1Layout.createSequentialGroup()
832  .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
833  .addGap(18, 18, 18)
834  .addComponent(setsListLabel)
835  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
836  .addComponent(setsListScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 354, Short.MAX_VALUE)
837  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
838  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
839  .addComponent(newSetButton)
840  .addComponent(editSetButton)
841  .addComponent(deleteSetButton)))
842  .addGroup(jPanel1Layout.createSequentialGroup()
843  .addComponent(jLabel6)
844  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
845  .addComponent(jLabel5)
846  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
847  .addComponent(setDescScrollPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
848  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
849  .addComponent(ignoreKnownFilesCheckbox)
850  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
851  .addComponent(rulesListLabel)
852  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
853  .addComponent(rulesListScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 67, Short.MAX_VALUE)
854  .addGap(10, 10, 10)
855  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
856  .addComponent(newRuleButton)
857  .addComponent(editRuleButton)
858  .addComponent(deleteRuleButton))
859  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
860  .addComponent(jLabel1)
861  .addGap(2, 2, 2)
862  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
863  .addComponent(jLabel2)
864  .addComponent(filesRadioButton)
865  .addComponent(dirsRadioButton)
866  .addComponent(bothRadioButton))
867  .addGap(16, 16, 16)
868  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
869  .addComponent(jLabel3)
870  .addComponent(fileNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
871  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
872  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
873  .addComponent(fileNameRadioButton)
874  .addComponent(fileNameExtensionRadioButton)
875  .addComponent(fileNameRegexCheckbox))
876  .addGap(14, 14, 14)
877  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
878  .addComponent(jLabel4)
879  .addComponent(rulePathConditionTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
880  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
881  .addComponent(rulePathConditionRegexCheckBox)
882  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
883  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
884  .addComponent(jLabel7)
885  .addComponent(mimeTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
886  .addGap(16, 16, 16)
887  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
888  .addComponent(jLabel8)
889  .addComponent(equalitySignComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
890  .addComponent(fileSizeSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
891  .addComponent(fileSizeUnitComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
892  .addGap(13, 13, 13)))
893  .addGap(5, 5, 5))))
894  );
895 
896  jPanel1Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {deleteRuleButton, deleteSetButton, editRuleButton, editSetButton, newRuleButton, newSetButton});
897 
898  jScrollPane1.setViewportView(jPanel1);
899 
900  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
901  this.setLayout(layout);
902  layout.setHorizontalGroup(
903  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
904  .addComponent(jScrollPane1)
905  );
906  layout.setVerticalGroup(
907  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
908  .addComponent(jScrollPane1)
909  );
910  }// </editor-fold>//GEN-END:initComponents
911 
912  private void dirsRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dirsRadioButtonActionPerformed
913  // TODO add your handling code here:
914  }//GEN-LAST:event_dirsRadioButtonActionPerformed
915 
916  private void newSetButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newSetButtonActionPerformed
917  this.doFileSetsDialog(null);
918  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
919  }//GEN-LAST:event_newSetButtonActionPerformed
920 
921  private void deleteRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteRuleButtonActionPerformed
922  // Interesting file sets are immutable for thread safety,
923  // so editing a files set rule definition is a replacement
924  // operation. Preserve the existing rules from the set being
925  // edited, except for the deleted rule.
926  FilesSet oldSet = this.setsList.getSelectedValue();
927  Map<String, FilesSet.Rule> rules = new HashMap<>(oldSet.getRules());
928  FilesSet.Rule selectedRule = this.rulesList.getSelectedValue();
929  rules.remove(selectedRule.getUuid());
930  this.replaceFilesSet(oldSet, oldSet.getName(), oldSet.getDescription(), oldSet.ignoresKnownFiles(), rules);
931  if (!this.rulesListModel.isEmpty()) {
932  this.rulesList.setSelectedIndex(0);
933  } else {
934  this.resetRuleComponents();
935  }
936  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
937  }//GEN-LAST:event_deleteRuleButtonActionPerformed
938 
939  private void deleteSetButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteSetButtonActionPerformed
940  FilesSet selectedSet = this.setsList.getSelectedValue();
941  this.filesSets.remove(selectedSet.getName());
942  this.setsListModel.removeElement(selectedSet);
943 
944  // Select the first of the remaining set definitions. This will cause
945  // the selection listeners to repopulate the subordinate components.
946  if (!this.filesSets.isEmpty()) {
947  this.setsList.setSelectedIndex(0);
948  } else {
949  this.resetComponents();
950  }
951  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
952  }//GEN-LAST:event_deleteSetButtonActionPerformed
953 
954  private void ignoreKnownFilesCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ignoreKnownFilesCheckboxActionPerformed
955  // TODO add your handling code here:
956  }//GEN-LAST:event_ignoreKnownFilesCheckboxActionPerformed
957 
958  private void editSetButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editSetButtonActionPerformed
959  this.doFileSetsDialog(this.setsList.getSelectedValue());
960  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
961  }//GEN-LAST:event_editSetButtonActionPerformed
962 
963  private void editRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editRuleButtonActionPerformed
964  this.doFilesSetRuleDialog(this.rulesList.getSelectedValue());
965  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
966  }//GEN-LAST:event_editRuleButtonActionPerformed
967 
968  private void newRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newRuleButtonActionPerformed
969  this.doFilesSetRuleDialog(null);
970  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
971  }//GEN-LAST:event_newRuleButtonActionPerformed
972 
973  private void fileNameTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileNameTextFieldActionPerformed
974  // TODO add your handling code here:
975  }//GEN-LAST:event_fileNameTextFieldActionPerformed
976 
977  // Variables declaration - do not modify//GEN-BEGIN:variables
978  private javax.swing.JRadioButton bothRadioButton;
979  private javax.swing.JButton deleteRuleButton;
980  private javax.swing.JButton deleteSetButton;
981  private javax.swing.JRadioButton dirsRadioButton;
982  private javax.swing.JButton editRuleButton;
983  private javax.swing.JButton editSetButton;
984  private javax.swing.JComboBox<String> equalitySignComboBox;
985  private javax.swing.ButtonGroup fileNameButtonGroup;
986  private javax.swing.JRadioButton fileNameExtensionRadioButton;
987  private javax.swing.JRadioButton fileNameRadioButton;
988  private javax.swing.JCheckBox fileNameRegexCheckbox;
989  private javax.swing.JTextField fileNameTextField;
990  private javax.swing.JSpinner fileSizeSpinner;
991  private javax.swing.JComboBox<String> fileSizeUnitComboBox;
992  private javax.swing.JRadioButton filesRadioButton;
993  private javax.swing.JCheckBox ignoreKnownFilesCheckbox;
994  private javax.swing.JLabel jLabel1;
995  private javax.swing.JLabel jLabel2;
996  private javax.swing.JLabel jLabel3;
997  private javax.swing.JLabel jLabel4;
998  private javax.swing.JLabel jLabel5;
999  private javax.swing.JLabel jLabel6;
1000  private javax.swing.JLabel jLabel7;
1001  private javax.swing.JLabel jLabel8;
1002  private javax.swing.JPanel jPanel1;
1003  private javax.swing.JScrollPane jScrollPane1;
1004  private javax.swing.JScrollPane jScrollPane2;
1005  private javax.swing.JTextArea jTextArea1;
1006  private javax.swing.JComboBox<String> mimeTypeComboBox;
1007  private javax.swing.JButton newRuleButton;
1008  private javax.swing.JButton newSetButton;
1009  private javax.swing.JCheckBox rulePathConditionRegexCheckBox;
1010  private javax.swing.JTextField rulePathConditionTextField;
1011  private javax.swing.JList<FilesSet.Rule> rulesList;
1012  private javax.swing.JLabel rulesListLabel;
1013  private javax.swing.JScrollPane rulesListScrollPane;
1014  private javax.swing.JSeparator separator;
1015  private javax.swing.JScrollPane setDescScrollPanel;
1016  private javax.swing.JTextArea setDescriptionTextArea;
1017  private javax.swing.JList<FilesSet> setsList;
1018  private javax.swing.JLabel setsListLabel;
1019  private javax.swing.JScrollPane setsListScrollPane;
1020  private javax.swing.ButtonGroup typeButtonGroup;
1021  // End of variables declaration//GEN-END:variables
1022 
1023 }

Copyright © 2012-2016 Basis Technology. Generated on: Tue Oct 25 2016
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.