19 package org.sleuthkit.autopsy.modules.interestingitems;
 
   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;
 
   28 import java.util.TreeMap;
 
   29 import java.util.logging.Level;
 
   30 import javax.swing.DefaultListModel;
 
   31 import javax.swing.JButton;
 
   32 import javax.swing.JOptionPane;
 
   33 import javax.swing.event.ListSelectionEvent;
 
   34 import javax.swing.event.ListSelectionListener;
 
   35 import org.netbeans.spi.options.OptionsPanelController;
 
   36 import org.openide.util.NbBundle;
 
   46 final class InterestingItemDefsPanel 
extends IngestModuleGlobalSettingsPanel implements OptionsPanel {
 
   49         "InterestingItemDefsPanel.bytes=Bytes",
 
   50         "InterestingItemDefsPanel.kiloBytes=Kilobytes",
 
   51         "InterestingItemDefsPanel.megaBytes=Megabytes",
 
   52         "InterestingItemDefsPanel.gigaBytes=Gigabytes",
 
   53         "InterestingItemsDefsPanel.loadError=Error loading interesting files sets from file.",
 
   54         "InterestingItemsDefsPanel.saveError=Error saving interesting files sets to file." 
   57     private final DefaultListModel<FilesSet> setsListModel = 
new DefaultListModel<>();
 
   58     private final DefaultListModel<FilesSet.Rule> rulesListModel = 
new DefaultListModel<>();
 
   59     private final Logger logger = Logger.getLogger(InterestingItemDefsPanel.class.getName());
 
   60     private final JButton okButton = 
new JButton(
"OK");
 
   61     private final JButton cancelButton = 
new JButton(
"Cancel");
 
   70     private TreeMap<String, FilesSet> filesSets;
 
   75     InterestingItemDefsPanel() {
 
   76         this.initComponents();
 
   78         this.setsList.setModel(setsListModel);
 
   79         this.setsList.addListSelectionListener(
new InterestingItemDefsPanel.SetsListSelectionListener());
 
   80         this.rulesList.setModel(rulesListModel);
 
   81         this.rulesList.addListSelectionListener(
new InterestingItemDefsPanel.RulesListSelectionListener());
 
   84     @NbBundle.Messages({
"InterestingItemDefsPanel.Title=Global Interesting Items Settings"})
 
   85     private void customInit() {
 
   86         setName(Bundle.InterestingItemDefsPanel_Title());
 
   88         Set<String> fileTypesCollated = 
new HashSet<>();
 
   89         for (String mediaType : FileTypeDetector.getStandardDetectedTypes()) {
 
   90             fileTypesCollated.add(mediaType);
 
   93         FileTypeDetector fileTypeDetector;
 
   95             fileTypeDetector = 
new FileTypeDetector();
 
   96             List<String> userDefinedFileTypes = fileTypeDetector.getUserDefinedTypes();
 
   97             fileTypesCollated.addAll(userDefinedFileTypes);
 
   99         } 
catch (FileTypeDetector.FileTypeDetectorInitException ex) {
 
  100             logger.log(Level.SEVERE, 
"Unable to get user defined file types", ex);
 
  103         List<String> toSort = 
new ArrayList<>(fileTypesCollated);
 
  104         toSort.sort((String string1, String string2) -> {
 
  105             int result = String.CASE_INSENSITIVE_ORDER.compare(string1, string2);
 
  107                 result = string1.compareTo(string2);
 
  112         for (String file : toSort) {
 
  113             mimeTypeComboBox.addItem(file);
 
  115         this.fileSizeUnitComboBox.setSelectedIndex(1);
 
  116         this.equalitySignComboBox.setSelectedIndex(2);
 
  123     public void saveSettings() {
 
  125             InterestingItemDefsManager.getInstance().setInterestingFilesSets(this.filesSets);
 
  126         } 
catch (InterestingItemDefsManager.InterestingItemDefsManagerException ex) {
 
  127             MessageNotifyUtil.Message.error(Bundle.InterestingItemsDefsPanel_saveError());
 
  135     public void store() {
 
  144         this.resetComponents();
 
  149             this.filesSets = 
new TreeMap<>(InterestingItemDefsManager.getInstance().getInterestingFilesSets());
 
  150         } 
catch (InterestingItemDefsManager.InterestingItemDefsManagerException ex) {
 
  151             MessageNotifyUtil.Message.error(Bundle.InterestingItemsDefsPanel_loadError());
 
  152             this.filesSets = 
new TreeMap<>();
 
  157         for (FilesSet set : this.filesSets.values()) {
 
  158             this.setsListModel.addElement(set);
 
  161         if (!this.filesSets.isEmpty()) {
 
  164             EventQueue.invokeLater(() -> {
 
  165                 InterestingItemDefsPanel.this.setsList.setSelectedIndex(0);
 
  173     private void resetComponents() {
 
  174         this.resetRuleComponents();
 
  175         this.setsListModel.clear();
 
  176         this.setDescriptionTextArea.setText(
"");
 
  177         this.ignoreKnownFilesCheckbox.setSelected(
true);
 
  178         this.newSetButton.setEnabled(
true);
 
  179         this.editSetButton.setEnabled(
false);
 
  180         this.deleteSetButton.setEnabled(
false);
 
  187     private void resetRuleComponents() {
 
  188         this.fileNameTextField.setText(
"");
 
  189         this.fileNameRadioButton.setSelected(
true);
 
  190         this.fileNameRegexCheckbox.setSelected(
false);
 
  191         this.filesRadioButton.setSelected(
true);
 
  192         this.rulePathConditionTextField.setText(
"");
 
  193         this.rulePathConditionRegexCheckBox.setSelected(
false);
 
  194         this.mimeTypeComboBox.setSelectedIndex(0);
 
  195         this.equalitySignComboBox.setSelectedIndex(2);
 
  196         this.fileSizeUnitComboBox.setSelectedIndex(1);
 
  197         this.fileSizeSpinner.setValue(0);
 
  198         this.newRuleButton.setEnabled(!this.setsListModel.isEmpty());
 
  199         this.editRuleButton.setEnabled(
false);
 
  200         this.deleteRuleButton.setEnabled(
false);
 
  210             if (e.getValueIsAdjusting()) {
 
  214             InterestingItemDefsPanel.this.rulesListModel.clear();
 
  215             InterestingItemDefsPanel.this.resetRuleComponents();
 
  219             FilesSet selectedSet = InterestingItemDefsPanel.this.setsList.getSelectedValue();
 
  220             if (selectedSet != null) {
 
  223                 InterestingItemDefsPanel.this.setDescriptionTextArea.setText(selectedSet.getDescription());
 
  224                 InterestingItemDefsPanel.this.ignoreKnownFilesCheckbox.setSelected(selectedSet.ignoresKnownFiles());
 
  227                 InterestingItemDefsPanel.this.newSetButton.setEnabled(
true);
 
  228                 InterestingItemDefsPanel.this.editSetButton.setEnabled(
true);
 
  229                 InterestingItemDefsPanel.this.deleteSetButton.setEnabled(
true);
 
  232                 TreeMap<String, FilesSet.Rule> rules = 
new TreeMap<>(selectedSet.getRules());
 
  233                 for (FilesSet.Rule rule : rules.values()) {
 
  234                     InterestingItemDefsPanel.this.rulesListModel.addElement(rule);
 
  238                 if (!InterestingItemDefsPanel.this.rulesListModel.isEmpty()) {
 
  239                     InterestingItemDefsPanel.this.rulesList.setSelectedIndex(0);
 
  254             if (e.getValueIsAdjusting()) {
 
  259             FilesSet.Rule rule = InterestingItemDefsPanel.this.rulesList.getSelectedValue();
 
  262                 FilesSet.Rule.FileNameCondition nameCondition = rule.getFileNameCondition();
 
  263                 FilesSet.Rule.MetaTypeCondition typeCondition = rule.getMetaTypeCondition();
 
  264                 FilesSet.Rule.ParentPathCondition pathCondition = rule.getPathCondition();
 
  265                 FilesSet.Rule.MimeTypeCondition mimeTypeCondition = rule.getMimeTypeCondition();
 
  266                 FilesSet.Rule.FileSizeCondition fileSizeCondition = rule.getFileSizeCondition();
 
  270                 if (nameCondition != null) {
 
  271                     InterestingItemDefsPanel.this.fileNameTextField.setText(nameCondition.getTextToMatch());
 
  272                     InterestingItemDefsPanel.this.fileNameRadioButton.setSelected(nameCondition instanceof FilesSet.Rule.FullNameCondition);
 
  273                     InterestingItemDefsPanel.this.fileNameExtensionRadioButton.setSelected(nameCondition instanceof FilesSet.Rule.ExtensionCondition);
 
  274                     InterestingItemDefsPanel.this.fileNameRegexCheckbox.setSelected(nameCondition.isRegex());
 
  276                     InterestingItemDefsPanel.this.fileNameTextField.setText(
"");
 
  277                     InterestingItemDefsPanel.this.fileNameRadioButton.setSelected(
true);
 
  278                     InterestingItemDefsPanel.this.fileNameExtensionRadioButton.setSelected(
false);
 
  279                     InterestingItemDefsPanel.this.fileNameRegexCheckbox.setSelected(
false);
 
  281                 switch (typeCondition.getMetaType()) {
 
  283                         InterestingItemDefsPanel.this.filesRadioButton.setSelected(
true);
 
  286                         InterestingItemDefsPanel.this.dirsRadioButton.setSelected(
true);
 
  288                     case FILES_AND_DIRECTORIES:
 
  289                         InterestingItemDefsPanel.this.bothRadioButton.setSelected(
true);
 
  292                 if (pathCondition != null) {
 
  293                     InterestingItemDefsPanel.this.rulePathConditionTextField.setText(pathCondition.getTextToMatch());
 
  294                     InterestingItemDefsPanel.this.rulePathConditionRegexCheckBox.setSelected(pathCondition.isRegex());
 
  296                     InterestingItemDefsPanel.this.rulePathConditionTextField.setText(
"");
 
  297                     InterestingItemDefsPanel.this.rulePathConditionRegexCheckBox.setSelected(
false);
 
  299                 if (mimeTypeCondition != null) {
 
  300                     InterestingItemDefsPanel.this.mimeTypeComboBox.setSelectedItem(mimeTypeCondition.getMimeType());
 
  302                     InterestingItemDefsPanel.this.mimeTypeComboBox.setSelectedIndex(0);
 
  304                 if (fileSizeCondition != null) {
 
  305                     InterestingItemDefsPanel.this.fileSizeUnitComboBox.setSelectedItem(fileSizeCondition.getUnit().getName());
 
  306                     InterestingItemDefsPanel.this.equalitySignComboBox.setSelectedItem(fileSizeCondition.getComparator().getSymbol());
 
  307                     InterestingItemDefsPanel.this.fileSizeSpinner.setValue(fileSizeCondition.getSizeValue());
 
  309                     InterestingItemDefsPanel.this.fileSizeUnitComboBox.setSelectedIndex(1);
 
  310                     InterestingItemDefsPanel.this.equalitySignComboBox.setSelectedIndex(2);
 
  311                     InterestingItemDefsPanel.this.fileSizeSpinner.setValue(0);
 
  315                 InterestingItemDefsPanel.this.newRuleButton.setEnabled(
true);
 
  316                 InterestingItemDefsPanel.this.editRuleButton.setEnabled(
true);
 
  317                 InterestingItemDefsPanel.this.deleteRuleButton.setEnabled(
true);
 
  319                 InterestingItemDefsPanel.this.resetRuleComponents();
 
  333     private void doFileSetsDialog(FilesSet selectedSet) {
 
  336         if (selectedSet != null) {
 
  341             panel = 
new FilesSetPanel();
 
  347         int option = JOptionPane.OK_OPTION;
 
  349             option = JOptionPane.showConfirmDialog(null, panel, NbBundle.getMessage(FilesSetPanel.class, 
"FilesSetPanel.title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
 
  350         } 
while (option == JOptionPane.OK_OPTION && !panel.isValidDefinition());
 
  354         if (this.filesSets.containsKey(panel.getFilesSetName()) && selectedSet == null) {
 
  355             MessageNotifyUtil.Message.error(NbBundle.getMessage(
this.getClass(),
 
  356                     "InterestingItemDefsPanel.doFileSetsDialog.duplicateRuleSet.text",
 
  357                     panel.getFilesSetName()));
 
  361         if (option == JOptionPane.OK_OPTION) {
 
  362             Map<String, FilesSet.Rule> rules = 
new HashMap<>();
 
  363             if (selectedSet != null) {
 
  367                 rules.putAll(selectedSet.getRules());
 
  369             this.replaceFilesSet(selectedSet, panel.getFilesSetName(), panel.getFilesSetDescription(), panel.getFileSetIgnoresKnownFiles(), rules);
 
  380     private void doFilesSetRuleDialog(FilesSet.Rule selectedRule) {
 
  382         FilesSetRulePanel panel;
 
  383         if (selectedRule != null) {
 
  385             panel = 
new FilesSetRulePanel(selectedRule, okButton, cancelButton);
 
  388             panel = 
new FilesSetRulePanel(okButton, cancelButton);
 
  393         int option = JOptionPane.OK_OPTION;
 
  395             option = JOptionPane.showOptionDialog(null, panel, NbBundle.getMessage(FilesSetPanel.class, 
"FilesSetPanel.title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, 
new Object[]{okButton, cancelButton}, okButton);
 
  396         } 
while (option == JOptionPane.OK_OPTION && !panel.isValidRuleDefinition());
 
  398         if (option == JOptionPane.OK_OPTION) {
 
  402             FilesSet selectedSet = this.setsList.getSelectedValue();
 
  403             Map<String, FilesSet.Rule> rules = 
new HashMap<>(selectedSet.getRules());
 
  407             if (selectedRule != null) {
 
  408                 rules.remove(selectedRule.getUuid());
 
  410             FilesSet.Rule newRule = 
new FilesSet.Rule(panel.getRuleName(), panel.getFileNameCondition(), panel.getMetaTypeCondition(), panel.getPathCondition(), panel.getMimeTypeCondition(), panel.getFileSizeCondition());
 
  411             rules.put(newRule.getUuid(), newRule);
 
  415             this.replaceFilesSet(selectedSet, selectedSet.getName(), selectedSet.getDescription(), selectedSet.ignoresKnownFiles(), rules);
 
  420             EventQueue.invokeLater(() -> {
 
  421                 this.rulesList.setSelectedValue(newRule, 
true);
 
  439     void replaceFilesSet(FilesSet oldSet, String name, String description, 
boolean ignoresKnownFiles, Map<String, FilesSet.Rule> rules) {
 
  440         if (oldSet != null) {
 
  443             this.filesSets.remove(oldSet.getName());
 
  448         FilesSet newSet = 
new FilesSet(name, description, ignoresKnownFiles, rules);
 
  449         this.filesSets.put(newSet.getName(), newSet);
 
  453         InterestingItemDefsPanel.this.setsListModel.clear();
 
  454         for (FilesSet set : this.filesSets.values()) {
 
  455             this.setsListModel.addElement(set);
 
  461         this.setsList.setSelectedValue(newSet, 
true);
 
  469     @SuppressWarnings(
"unchecked")
 
  471     private 
void initComponents() {
 
  473         fileNameButtonGroup = 
new javax.swing.ButtonGroup();
 
  474         typeButtonGroup = 
new javax.swing.ButtonGroup();
 
  475         jScrollPane1 = 
new javax.swing.JScrollPane();
 
  476         jPanel1 = 
new javax.swing.JPanel();
 
  477         jLabel6 = 
new javax.swing.JLabel();
 
  478         newRuleButton = 
new javax.swing.JButton();
 
  479         filesRadioButton = 
new javax.swing.JRadioButton();
 
  480         editRuleButton = 
new javax.swing.JButton();
 
  481         rulesListLabel = 
new javax.swing.JLabel();
 
  482         rulesListScrollPane = 
new javax.swing.JScrollPane();
 
  483         rulesList = 
new javax.swing.JList<>();
 
  484         setDescScrollPanel = 
new javax.swing.JScrollPane();
 
  485         setDescriptionTextArea = 
new javax.swing.JTextArea();
 
  486         editSetButton = 
new javax.swing.JButton();
 
  487         setsListScrollPane = 
new javax.swing.JScrollPane();
 
  488         setsList = 
new javax.swing.JList<>();
 
  489         fileNameExtensionRadioButton = 
new javax.swing.JRadioButton();
 
  490         jLabel3 = 
new javax.swing.JLabel();
 
  491         fileNameTextField = 
new javax.swing.JTextField();
 
  492         jLabel5 = 
new javax.swing.JLabel();
 
  493         fileNameRadioButton = 
new javax.swing.JRadioButton();
 
  494         rulePathConditionTextField = 
new javax.swing.JTextField();
 
  495         ignoreKnownFilesCheckbox = 
new javax.swing.JCheckBox();
 
  496         fileNameRegexCheckbox = 
new javax.swing.JCheckBox();
 
  497         separator = 
new javax.swing.JSeparator();
 
  498         setsListLabel = 
new javax.swing.JLabel();
 
  499         bothRadioButton = 
new javax.swing.JRadioButton();
 
  500         deleteSetButton = 
new javax.swing.JButton();
 
  501         deleteRuleButton = 
new javax.swing.JButton();
 
  502         newSetButton = 
new javax.swing.JButton();
 
  503         jLabel2 = 
new javax.swing.JLabel();
 
  504         dirsRadioButton = 
new javax.swing.JRadioButton();
 
  505         jLabel1 = 
new javax.swing.JLabel();
 
  506         jLabel4 = 
new javax.swing.JLabel();
 
  507         rulePathConditionRegexCheckBox = 
new javax.swing.JCheckBox();
 
  508         jScrollPane2 = 
new javax.swing.JScrollPane();
 
  509         jTextArea1 = 
new javax.swing.JTextArea();
 
  510         jLabel7 = 
new javax.swing.JLabel();
 
  511         mimeTypeComboBox = 
new javax.swing.JComboBox<>();
 
  512         jLabel8 = 
new javax.swing.JLabel();
 
  513         equalitySignComboBox = 
new javax.swing.JComboBox<String>();
 
  514         fileSizeSpinner = 
new javax.swing.JSpinner();
 
  515         fileSizeUnitComboBox = 
new javax.swing.JComboBox<String>();
 
  517         setFont(getFont().deriveFont(getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  519         jScrollPane1.setFont(jScrollPane1.getFont().deriveFont(jScrollPane1.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  521         jPanel1.setFont(jPanel1.getFont().deriveFont(jPanel1.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  523         jLabel6.setFont(jLabel6.getFont().deriveFont(jLabel6.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  524         org.openide.awt.Mnemonics.setLocalizedText(jLabel6, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.jLabel6.text")); 
 
  526         newRuleButton.setFont(newRuleButton.getFont().deriveFont(newRuleButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  527         newRuleButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/add16.png"))); 
 
  528         org.openide.awt.Mnemonics.setLocalizedText(newRuleButton, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.newRuleButton.text")); 
 
  529         newRuleButton.addActionListener(
new java.awt.event.ActionListener() {
 
  530             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  531                 newRuleButtonActionPerformed(evt);
 
  535         typeButtonGroup.add(filesRadioButton);
 
  536         filesRadioButton.setFont(filesRadioButton.getFont().deriveFont(filesRadioButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  537         filesRadioButton.setSelected(
true);
 
  538         org.openide.awt.Mnemonics.setLocalizedText(filesRadioButton, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.filesRadioButton.text")); 
 
  539         filesRadioButton.setEnabled(
false);
 
  541         editRuleButton.setFont(editRuleButton.getFont().deriveFont(editRuleButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  542         editRuleButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/edit16.png"))); 
 
  543         org.openide.awt.Mnemonics.setLocalizedText(editRuleButton, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.editRuleButton.text")); 
 
  544         editRuleButton.setEnabled(
false);
 
  545         editRuleButton.addActionListener(
new java.awt.event.ActionListener() {
 
  546             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  547                 editRuleButtonActionPerformed(evt);
 
  551         rulesListLabel.setFont(rulesListLabel.getFont().deriveFont(rulesListLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  552         org.openide.awt.Mnemonics.setLocalizedText(rulesListLabel, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.rulesListLabel.text")); 
 
  554         rulesListScrollPane.setFont(rulesListScrollPane.getFont().deriveFont(rulesListScrollPane.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  556         rulesList.setFont(rulesList.getFont().deriveFont(rulesList.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  557         rulesList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
 
  558         rulesListScrollPane.setViewportView(rulesList);
 
  560         setDescScrollPanel.setFont(setDescScrollPanel.getFont().deriveFont(setDescScrollPanel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  562         setDescriptionTextArea.setEditable(
false);
 
  563         setDescriptionTextArea.setBackground(
new java.awt.Color(240, 240, 240));
 
  564         setDescriptionTextArea.setColumns(20);
 
  565         setDescriptionTextArea.setFont(setDescriptionTextArea.getFont().deriveFont(setDescriptionTextArea.getFont().getStyle() & ~java.awt.Font.BOLD, 13));
 
  566         setDescriptionTextArea.setLineWrap(
true);
 
  567         setDescriptionTextArea.setRows(2);
 
  568         setDescriptionTextArea.setMinimumSize(
new java.awt.Dimension(10, 22));
 
  569         setDescriptionTextArea.setPreferredSize(
new java.awt.Dimension(14, 40));
 
  570         setDescScrollPanel.setViewportView(setDescriptionTextArea);
 
  572         editSetButton.setFont(editSetButton.getFont().deriveFont(editSetButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  573         editSetButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/edit16.png"))); 
 
  574         org.openide.awt.Mnemonics.setLocalizedText(editSetButton, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.editSetButton.text")); 
 
  575         editSetButton.setEnabled(
false);
 
  576         editSetButton.addActionListener(
new java.awt.event.ActionListener() {
 
  577             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  578                 editSetButtonActionPerformed(evt);
 
  582         setsListScrollPane.setFont(setsListScrollPane.getFont().deriveFont(setsListScrollPane.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  584         setsList.setFont(setsList.getFont().deriveFont(setsList.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  585         setsList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
 
  586         setsListScrollPane.setViewportView(setsList);
 
  588         fileNameButtonGroup.add(fileNameExtensionRadioButton);
 
  589         fileNameExtensionRadioButton.setFont(fileNameExtensionRadioButton.getFont().deriveFont(fileNameExtensionRadioButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  590         org.openide.awt.Mnemonics.setLocalizedText(fileNameExtensionRadioButton, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.fileNameExtensionRadioButton.text")); 
 
  591         fileNameExtensionRadioButton.setEnabled(
false);
 
  593         jLabel3.setFont(jLabel3.getFont().deriveFont(jLabel3.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  594         org.openide.awt.Mnemonics.setLocalizedText(jLabel3, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.jLabel3.text")); 
 
  596         fileNameTextField.setEditable(
false);
 
  597         fileNameTextField.setFont(fileNameTextField.getFont().deriveFont(fileNameTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  598         fileNameTextField.setText(
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.fileNameTextField.text")); 
 
  599         fileNameTextField.addActionListener(
new java.awt.event.ActionListener() {
 
  600             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  601                 fileNameTextFieldActionPerformed(evt);
 
  605         jLabel5.setFont(jLabel5.getFont().deriveFont(jLabel5.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  606         org.openide.awt.Mnemonics.setLocalizedText(jLabel5, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.jLabel5.text")); 
 
  608         fileNameButtonGroup.add(fileNameRadioButton);
 
  609         fileNameRadioButton.setFont(fileNameRadioButton.getFont().deriveFont(fileNameRadioButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  610         org.openide.awt.Mnemonics.setLocalizedText(fileNameRadioButton, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.fileNameRadioButton.text")); 
 
  611         fileNameRadioButton.setEnabled(
false);
 
  613         rulePathConditionTextField.setEditable(
false);
 
  614         rulePathConditionTextField.setFont(rulePathConditionTextField.getFont().deriveFont(rulePathConditionTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  615         rulePathConditionTextField.setText(
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.rulePathConditionTextField.text")); 
 
  617         ignoreKnownFilesCheckbox.setFont(ignoreKnownFilesCheckbox.getFont().deriveFont(ignoreKnownFilesCheckbox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  618         org.openide.awt.Mnemonics.setLocalizedText(ignoreKnownFilesCheckbox, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.ignoreKnownFilesCheckbox.text")); 
 
  619         ignoreKnownFilesCheckbox.setEnabled(
false);
 
  620         ignoreKnownFilesCheckbox.addActionListener(
new java.awt.event.ActionListener() {
 
  621             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  622                 ignoreKnownFilesCheckboxActionPerformed(evt);
 
  626         fileNameRegexCheckbox.setFont(fileNameRegexCheckbox.getFont().deriveFont(fileNameRegexCheckbox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  627         org.openide.awt.Mnemonics.setLocalizedText(fileNameRegexCheckbox, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.fileNameRegexCheckbox.text")); 
 
  628         fileNameRegexCheckbox.setEnabled(
false);
 
  630         separator.setOrientation(javax.swing.SwingConstants.VERTICAL);
 
  632         setsListLabel.setFont(setsListLabel.getFont().deriveFont(setsListLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  633         org.openide.awt.Mnemonics.setLocalizedText(setsListLabel, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.setsListLabel.text")); 
 
  635         typeButtonGroup.add(bothRadioButton);
 
  636         bothRadioButton.setFont(bothRadioButton.getFont().deriveFont(bothRadioButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  637         org.openide.awt.Mnemonics.setLocalizedText(bothRadioButton, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.bothRadioButton.text")); 
 
  638         bothRadioButton.setEnabled(
false);
 
  640         deleteSetButton.setFont(deleteSetButton.getFont().deriveFont(deleteSetButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  641         deleteSetButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/delete16.png"))); 
 
  642         org.openide.awt.Mnemonics.setLocalizedText(deleteSetButton, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.deleteSetButton.text")); 
 
  643         deleteSetButton.setEnabled(
false);
 
  644         deleteSetButton.addActionListener(
new java.awt.event.ActionListener() {
 
  645             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  646                 deleteSetButtonActionPerformed(evt);
 
  650         deleteRuleButton.setFont(deleteRuleButton.getFont().deriveFont(deleteRuleButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  651         deleteRuleButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/delete16.png"))); 
 
  652         org.openide.awt.Mnemonics.setLocalizedText(deleteRuleButton, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.deleteRuleButton.text")); 
 
  653         deleteRuleButton.setEnabled(
false);
 
  654         deleteRuleButton.addActionListener(
new java.awt.event.ActionListener() {
 
  655             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  656                 deleteRuleButtonActionPerformed(evt);
 
  660         newSetButton.setFont(newSetButton.getFont().deriveFont(newSetButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  661         newSetButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/add16.png"))); 
 
  662         org.openide.awt.Mnemonics.setLocalizedText(newSetButton, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.newSetButton.text")); 
 
  663         newSetButton.addActionListener(
new java.awt.event.ActionListener() {
 
  664             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  665                 newSetButtonActionPerformed(evt);
 
  669         jLabel2.setFont(jLabel2.getFont().deriveFont(jLabel2.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  670         org.openide.awt.Mnemonics.setLocalizedText(jLabel2, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.jLabel2.text")); 
 
  672         typeButtonGroup.add(dirsRadioButton);
 
  673         dirsRadioButton.setFont(dirsRadioButton.getFont().deriveFont(dirsRadioButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  674         org.openide.awt.Mnemonics.setLocalizedText(dirsRadioButton, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.dirsRadioButton.text")); 
 
  675         dirsRadioButton.setEnabled(
false);
 
  676         dirsRadioButton.addActionListener(
new java.awt.event.ActionListener() {
 
  677             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  678                 dirsRadioButtonActionPerformed(evt);
 
  682         jLabel1.setFont(jLabel1.getFont().deriveFont(jLabel1.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  683         org.openide.awt.Mnemonics.setLocalizedText(jLabel1, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.jLabel1.text")); 
 
  685         jLabel4.setFont(jLabel4.getFont().deriveFont(jLabel4.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  686         org.openide.awt.Mnemonics.setLocalizedText(jLabel4, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.jLabel4.text")); 
 
  688         rulePathConditionRegexCheckBox.setFont(rulePathConditionRegexCheckBox.getFont().deriveFont(rulePathConditionRegexCheckBox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  689         org.openide.awt.Mnemonics.setLocalizedText(rulePathConditionRegexCheckBox, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.rulePathConditionRegexCheckBox.text")); 
 
  690         rulePathConditionRegexCheckBox.setEnabled(
false);
 
  692         jScrollPane2.setFont(jScrollPane2.getFont().deriveFont(jScrollPane2.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  694         jTextArea1.setEditable(
false);
 
  695         jTextArea1.setBackground(
new java.awt.Color(240, 240, 240));
 
  696         jTextArea1.setColumns(20);
 
  697         jTextArea1.setFont(jTextArea1.getFont().deriveFont(jTextArea1.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  698         jTextArea1.setLineWrap(
true);
 
  699         jTextArea1.setRows(3);
 
  700         jTextArea1.setText(
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.jTextArea1.text")); 
 
  701         jTextArea1.setWrapStyleWord(
true);
 
  702         jScrollPane2.setViewportView(jTextArea1);
 
  704         org.openide.awt.Mnemonics.setLocalizedText(jLabel7, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.jLabel7.text")); 
 
  706         mimeTypeComboBox.setEditable(
true);
 
  707         mimeTypeComboBox.setModel(
new javax.swing.DefaultComboBoxModel<String>(
new String[] {
""}));
 
  708         mimeTypeComboBox.setEnabled(
false);
 
  709         mimeTypeComboBox.setMinimumSize(
new java.awt.Dimension(0, 20));
 
  710         mimeTypeComboBox.setPreferredSize(
new java.awt.Dimension(12, 20));
 
  712         org.openide.awt.Mnemonics.setLocalizedText(jLabel8, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.jLabel8.text")); 
 
  714         equalitySignComboBox.setModel(
new javax.swing.DefaultComboBoxModel<String>(
new String[] { 
"=", 
">", 
"≥", 
"<", 
"≤" }));
 
  715         equalitySignComboBox.setEnabled(
false);
 
  717         fileSizeSpinner.setEnabled(
false);
 
  718         fileSizeSpinner.setMinimumSize(
new java.awt.Dimension(2, 20));
 
  720         fileSizeUnitComboBox.setModel(
new javax.swing.DefaultComboBoxModel<String>(
new String[] { Bundle.InterestingItemDefsPanel_bytes(), Bundle.InterestingItemDefsPanel_kiloBytes(), Bundle.InterestingItemDefsPanel_megaBytes(), Bundle.InterestingItemDefsPanel_gigaBytes() }));
 
  721         fileSizeUnitComboBox.setEnabled(
false);
 
  723         javax.swing.GroupLayout jPanel1Layout = 
new javax.swing.GroupLayout(jPanel1);
 
  724         jPanel1.setLayout(jPanel1Layout);
 
  725         jPanel1Layout.setHorizontalGroup(
 
  726             jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  727             .addGroup(jPanel1Layout.createSequentialGroup()
 
  728                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  729                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  730                         .addGap(360, 360, 360)
 
  731                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  732                             .addComponent(rulesListLabel)
 
  733                             .addComponent(jLabel5)
 
  734                             .addComponent(ignoreKnownFilesCheckbox)
 
  735                             .addComponent(jLabel6))
 
  736                         .addGap(0, 0, Short.MAX_VALUE))
 
  737                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  739                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  740                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  741                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  742                                     .addComponent(setsListLabel)
 
  743                                     .addComponent(setsListScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 314, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  744                                     .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 314, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  746                                 .addComponent(separator, javax.swing.GroupLayout.PREFERRED_SIZE, 6, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  747                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  748                                 .addComponent(newSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, 93, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  749                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  750                                 .addComponent(editSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  751                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  752                                 .addComponent(deleteSetButton)))
 
  754                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  755                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  757                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  758                                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  759                                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  760                                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  761                                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  762                                                     .addComponent(jLabel3)
 
  763                                                     .addComponent(jLabel2))
 
  765                                             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
 
  766                                                 .addComponent(jLabel4)
 
  767                                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)))
 
  768                                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
 
  769                                             .addComponent(rulePathConditionTextField, javax.swing.GroupLayout.Alignment.LEADING)
 
  770                                             .addComponent(fileNameTextField)))
 
  771                                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  772                                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  773                                             .addComponent(jLabel7)
 
  774                                             .addComponent(jLabel8))
 
  776                                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
 
  777                                             .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
 
  778                                                 .addComponent(equalitySignComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  779                                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  780                                                 .addComponent(fileSizeSpinner, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  781                                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  782                                                 .addComponent(fileSizeUnitComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  784                                             .addComponent(mimeTypeComboBox, javax.swing.GroupLayout.Alignment.LEADING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))))
 
  785                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  786                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  787                                     .addComponent(setDescScrollPanel)
 
  788                                     .addComponent(rulesListScrollPane))
 
  790                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  791                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  792                                     .addComponent(jLabel1)
 
  793                                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  795                                         .addComponent(filesRadioButton, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  796                                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  797                                         .addComponent(dirsRadioButton)
 
  798                                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  799                                         .addComponent(bothRadioButton))
 
  800                                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  801                                         .addComponent(newRuleButton)
 
  803                                         .addComponent(editRuleButton)
 
  805                                         .addComponent(deleteRuleButton))
 
  806                                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  808                                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  809                                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  810                                                 .addComponent(fileNameRadioButton)
 
  812                                                 .addComponent(fileNameExtensionRadioButton)
 
  813                                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  814                                                 .addComponent(fileNameRegexCheckbox))
 
  815                                             .addComponent(rulePathConditionRegexCheckBox))))
 
  819         jPanel1Layout.setVerticalGroup(
 
  820             jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  821             .addGroup(jPanel1Layout.createSequentialGroup()
 
  823                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  824                     .addComponent(separator)
 
  825                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  826                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  827                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  828                                 .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  830                                 .addComponent(setsListLabel)
 
  831                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  832                                 .addComponent(setsListScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 354, Short.MAX_VALUE)
 
  833                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  834                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  835                                     .addComponent(newSetButton)
 
  836                                     .addComponent(editSetButton)
 
  837                                     .addComponent(deleteSetButton)))
 
  838                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  839                                 .addComponent(jLabel6)
 
  840                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  841                                 .addComponent(jLabel5)
 
  842                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  843                                 .addComponent(setDescScrollPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  844                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  845                                 .addComponent(ignoreKnownFilesCheckbox)
 
  846                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  847                                 .addComponent(rulesListLabel)
 
  848                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  849                                 .addComponent(rulesListScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 67, Short.MAX_VALUE)
 
  851                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  852                                     .addComponent(newRuleButton)
 
  853                                     .addComponent(editRuleButton)
 
  854                                     .addComponent(deleteRuleButton))
 
  855                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  856                                 .addComponent(jLabel1)
 
  858                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  859                                     .addComponent(jLabel2)
 
  860                                     .addComponent(filesRadioButton)
 
  861                                     .addComponent(dirsRadioButton)
 
  862                                     .addComponent(bothRadioButton))
 
  864                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  865                                     .addComponent(jLabel3)
 
  866                                     .addComponent(fileNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  867                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  868                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  869                                     .addComponent(fileNameRadioButton)
 
  870                                     .addComponent(fileNameExtensionRadioButton)
 
  871                                     .addComponent(fileNameRegexCheckbox))
 
  873                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  874                                     .addComponent(jLabel4)
 
  875                                     .addComponent(rulePathConditionTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  876                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  877                                 .addComponent(rulePathConditionRegexCheckBox)
 
  878                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  879                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  880                                     .addComponent(jLabel7)
 
  881                                     .addComponent(mimeTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  883                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  884                                     .addComponent(jLabel8)
 
  885                                     .addComponent(equalitySignComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  886                                     .addComponent(fileSizeSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  887                                     .addComponent(fileSizeUnitComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  888                                 .addGap(13, 13, 13)))
 
  892         jPanel1Layout.linkSize(javax.swing.SwingConstants.VERTICAL, 
new java.awt.Component[] {deleteRuleButton, deleteSetButton, editRuleButton, editSetButton, newRuleButton, newSetButton});
 
  894         jScrollPane1.setViewportView(jPanel1);
 
  896         javax.swing.GroupLayout layout = 
new javax.swing.GroupLayout(
this);
 
  897         this.setLayout(layout);
 
  898         layout.setHorizontalGroup(
 
  899             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  900             .addComponent(jScrollPane1)
 
  902         layout.setVerticalGroup(
 
  903             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  904             .addComponent(jScrollPane1)
 
  908     private void dirsRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  912     private void newSetButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  913         this.doFileSetsDialog(null);
 
  914         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  917     private void deleteRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  922         FilesSet oldSet = this.setsList.getSelectedValue();
 
  923         Map<String, FilesSet.Rule> rules = 
new HashMap<>(oldSet.getRules());
 
  924         FilesSet.Rule selectedRule = this.rulesList.getSelectedValue();
 
  925         rules.remove(selectedRule.getUuid());
 
  926         this.replaceFilesSet(oldSet, oldSet.getName(), oldSet.getDescription(), oldSet.ignoresKnownFiles(), rules);
 
  927         if (!this.rulesListModel.isEmpty()) {
 
  928             this.rulesList.setSelectedIndex(0);
 
  930             this.resetRuleComponents();
 
  932         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  935     private void deleteSetButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  936         FilesSet selectedSet = this.setsList.getSelectedValue();
 
  937         this.filesSets.remove(selectedSet.getName());
 
  938         this.setsListModel.removeElement(selectedSet);
 
  942         if (!this.filesSets.isEmpty()) {
 
  943             this.setsList.setSelectedIndex(0);
 
  945             this.resetComponents();
 
  947         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  950     private void ignoreKnownFilesCheckboxActionPerformed(java.awt.event.ActionEvent evt) {
 
  954     private void editSetButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  955         this.doFileSetsDialog(this.setsList.getSelectedValue());
 
  956         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  959     private void editRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  960         this.doFilesSetRuleDialog(this.rulesList.getSelectedValue());
 
  961         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  964     private void newRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  965         this.doFilesSetRuleDialog(null);
 
  966         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  969     private void fileNameTextFieldActionPerformed(java.awt.event.ActionEvent evt) {
 
  974     private javax.swing.JRadioButton bothRadioButton;
 
  975     private javax.swing.JButton deleteRuleButton;
 
  976     private javax.swing.JButton deleteSetButton;
 
  977     private javax.swing.JRadioButton dirsRadioButton;
 
  978     private javax.swing.JButton editRuleButton;
 
  979     private javax.swing.JButton editSetButton;
 
  980     private javax.swing.JComboBox<String> equalitySignComboBox;
 
  981     private javax.swing.ButtonGroup fileNameButtonGroup;
 
  982     private javax.swing.JRadioButton fileNameExtensionRadioButton;
 
  983     private javax.swing.JRadioButton fileNameRadioButton;
 
  984     private javax.swing.JCheckBox fileNameRegexCheckbox;
 
  985     private javax.swing.JTextField fileNameTextField;
 
  986     private javax.swing.JSpinner fileSizeSpinner;
 
  987     private javax.swing.JComboBox<String> fileSizeUnitComboBox;
 
  988     private javax.swing.JRadioButton filesRadioButton;
 
  989     private javax.swing.JCheckBox ignoreKnownFilesCheckbox;
 
  990     private javax.swing.JLabel jLabel1;
 
  991     private javax.swing.JLabel jLabel2;
 
  992     private javax.swing.JLabel jLabel3;
 
  993     private javax.swing.JLabel jLabel4;
 
  994     private javax.swing.JLabel jLabel5;
 
  995     private javax.swing.JLabel jLabel6;
 
  996     private javax.swing.JLabel jLabel7;
 
  997     private javax.swing.JLabel jLabel8;
 
  998     private javax.swing.JPanel jPanel1;
 
  999     private javax.swing.JScrollPane jScrollPane1;
 
 1000     private javax.swing.JScrollPane jScrollPane2;
 
 1001     private javax.swing.JTextArea jTextArea1;
 
 1002     private javax.swing.JComboBox<String> mimeTypeComboBox;
 
 1003     private javax.swing.JButton newRuleButton;
 
 1004     private javax.swing.JButton newSetButton;
 
 1005     private javax.swing.JCheckBox rulePathConditionRegexCheckBox;
 
 1006     private javax.swing.JTextField rulePathConditionTextField;
 
 1007     private javax.swing.JList<FilesSet.Rule> rulesList;
 
 1008     private javax.swing.JLabel rulesListLabel;
 
 1009     private javax.swing.JScrollPane rulesListScrollPane;
 
 1010     private javax.swing.JSeparator separator;
 
 1011     private javax.swing.JScrollPane setDescScrollPanel;
 
 1012     private javax.swing.JTextArea setDescriptionTextArea;
 
 1013     private javax.swing.JList<FilesSet> setsList;
 
 1014     private javax.swing.JLabel setsListLabel;
 
 1015     private javax.swing.JScrollPane setsListScrollPane;
 
 1016     private javax.swing.ButtonGroup typeButtonGroup;
 
void valueChanged(ListSelectionEvent e)
void valueChanged(ListSelectionEvent e)