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.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;
 
   49 final class InterestingItemDefsPanel 
extends IngestModuleGlobalSettingsPanel implements OptionsPanel {
 
   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." 
   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");
 
   74     private TreeMap<String, FilesSet> filesSets;
 
   79     InterestingItemDefsPanel() {
 
   80         this.initComponents();
 
   82         this.setsList.setModel(setsListModel);
 
   83         this.setsList.addListSelectionListener(
new InterestingItemDefsPanel.SetsListSelectionListener());
 
   84         this.rulesList.setModel(rulesListModel);
 
   85         this.rulesList.addListSelectionListener(
new InterestingItemDefsPanel.RulesListSelectionListener());
 
   88     @NbBundle.Messages({
"InterestingItemDefsPanel.Title=Global Interesting Items Settings"})
 
   89     private void customInit() {
 
   90         setName(Bundle.InterestingItemDefsPanel_Title());
 
   92         Set<String> fileTypesCollated = 
new HashSet<>();
 
   93         for (MediaType mediaType : mediaTypes) {
 
   94             fileTypesCollated.add(mediaType.toString());
 
   97         FileTypeDetector fileTypeDetector;
 
   99             fileTypeDetector = 
new FileTypeDetector();
 
  100             List<String> userDefinedFileTypes = fileTypeDetector.getUserDefinedTypes();
 
  101             fileTypesCollated.addAll(userDefinedFileTypes);
 
  103         } 
catch (FileTypeDetector.FileTypeDetectorInitException ex) {
 
  104             logger.log(Level.SEVERE, 
"Unable to get user defined file types", ex);
 
  107         List<String> toSort = 
new ArrayList<>(fileTypesCollated);
 
  108         toSort.sort((String string1, String string2) -> {
 
  109             int result = String.CASE_INSENSITIVE_ORDER.compare(string1, string2);
 
  111                 result = string1.compareTo(string2);
 
  116         for (String file : toSort) {
 
  117             mimeTypeComboBox.addItem(file);
 
  119         this.fileSizeUnitComboBox.setSelectedIndex(1);
 
  120         this.equalitySignComboBox.setSelectedIndex(2);
 
  127     public void saveSettings() {
 
  129             InterestingItemDefsManager.getInstance().setInterestingFilesSets(this.filesSets);
 
  130         } 
catch (InterestingItemDefsManager.InterestingItemDefsManagerException ex) {
 
  131             MessageNotifyUtil.Message.error(Bundle.InterestingItemsDefsPanel_saveError());
 
  139     public void store() {
 
  148         this.resetComponents();
 
  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<>();
 
  161         for (FilesSet set : this.filesSets.values()) {
 
  162             this.setsListModel.addElement(set);
 
  165         if (!this.filesSets.isEmpty()) {
 
  168             EventQueue.invokeLater(() -> {
 
  169                 InterestingItemDefsPanel.this.setsList.setSelectedIndex(0);
 
  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);
 
  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);
 
  214             if (e.getValueIsAdjusting()) {
 
  218             InterestingItemDefsPanel.this.rulesListModel.clear();
 
  219             InterestingItemDefsPanel.this.resetRuleComponents();
 
  223             FilesSet selectedSet = InterestingItemDefsPanel.this.setsList.getSelectedValue();
 
  224             if (selectedSet != null) {
 
  227                 InterestingItemDefsPanel.this.setDescriptionTextArea.setText(selectedSet.getDescription());
 
  228                 InterestingItemDefsPanel.this.ignoreKnownFilesCheckbox.setSelected(selectedSet.ignoresKnownFiles());
 
  231                 InterestingItemDefsPanel.this.newSetButton.setEnabled(
true);
 
  232                 InterestingItemDefsPanel.this.editSetButton.setEnabled(
true);
 
  233                 InterestingItemDefsPanel.this.deleteSetButton.setEnabled(
true);
 
  236                 TreeMap<String, FilesSet.Rule> rules = 
new TreeMap<>(selectedSet.getRules());
 
  237                 for (FilesSet.Rule rule : rules.values()) {
 
  238                     InterestingItemDefsPanel.this.rulesListModel.addElement(rule);
 
  242                 if (!InterestingItemDefsPanel.this.rulesListModel.isEmpty()) {
 
  243                     InterestingItemDefsPanel.this.rulesList.setSelectedIndex(0);
 
  258             if (e.getValueIsAdjusting()) {
 
  263             FilesSet.Rule rule = InterestingItemDefsPanel.this.rulesList.getSelectedValue();
 
  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();
 
  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());
 
  280                     InterestingItemDefsPanel.this.fileNameTextField.setText(
"");
 
  281                     InterestingItemDefsPanel.this.fileNameRadioButton.setSelected(
true);
 
  282                     InterestingItemDefsPanel.this.fileNameExtensionRadioButton.setSelected(
false);
 
  283                     InterestingItemDefsPanel.this.fileNameRegexCheckbox.setSelected(
false);
 
  285                 switch (typeCondition.getMetaType()) {
 
  287                         InterestingItemDefsPanel.this.filesRadioButton.setSelected(
true);
 
  290                         InterestingItemDefsPanel.this.dirsRadioButton.setSelected(
true);
 
  292                     case FILES_AND_DIRECTORIES:
 
  293                         InterestingItemDefsPanel.this.bothRadioButton.setSelected(
true);
 
  296                 if (pathCondition != null) {
 
  297                     InterestingItemDefsPanel.this.rulePathConditionTextField.setText(pathCondition.getTextToMatch());
 
  298                     InterestingItemDefsPanel.this.rulePathConditionRegexCheckBox.setSelected(pathCondition.isRegex());
 
  300                     InterestingItemDefsPanel.this.rulePathConditionTextField.setText(
"");
 
  301                     InterestingItemDefsPanel.this.rulePathConditionRegexCheckBox.setSelected(
false);
 
  303                 if (mimeTypeCondition != null) {
 
  304                     InterestingItemDefsPanel.this.mimeTypeComboBox.setSelectedItem(mimeTypeCondition.getMimeType());
 
  306                     InterestingItemDefsPanel.this.mimeTypeComboBox.setSelectedIndex(0);
 
  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());
 
  313                     InterestingItemDefsPanel.this.fileSizeUnitComboBox.setSelectedIndex(1);
 
  314                     InterestingItemDefsPanel.this.equalitySignComboBox.setSelectedIndex(2);
 
  315                     InterestingItemDefsPanel.this.fileSizeSpinner.setValue(0);
 
  319                 InterestingItemDefsPanel.this.newRuleButton.setEnabled(
true);
 
  320                 InterestingItemDefsPanel.this.editRuleButton.setEnabled(
true);
 
  321                 InterestingItemDefsPanel.this.deleteRuleButton.setEnabled(
true);
 
  323                 InterestingItemDefsPanel.this.resetRuleComponents();
 
  337     private void doFileSetsDialog(FilesSet selectedSet) {
 
  340         if (selectedSet != null) {
 
  345             panel = 
new FilesSetPanel();
 
  351         int option = JOptionPane.OK_OPTION;
 
  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());
 
  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()));
 
  365         if (option == JOptionPane.OK_OPTION) {
 
  366             Map<String, FilesSet.Rule> rules = 
new HashMap<>();
 
  367             if (selectedSet != null) {
 
  371                 rules.putAll(selectedSet.getRules());
 
  373             this.replaceFilesSet(selectedSet, panel.getFilesSetName(), panel.getFilesSetDescription(), panel.getFileSetIgnoresKnownFiles(), rules);
 
  384     private void doFilesSetRuleDialog(FilesSet.Rule selectedRule) {
 
  386         FilesSetRulePanel panel;
 
  387         if (selectedRule != null) {
 
  389             panel = 
new FilesSetRulePanel(selectedRule, okButton, cancelButton);
 
  392             panel = 
new FilesSetRulePanel(okButton, cancelButton);
 
  397         int option = JOptionPane.OK_OPTION;
 
  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());
 
  402         if (option == JOptionPane.OK_OPTION) {
 
  406             FilesSet selectedSet = this.setsList.getSelectedValue();
 
  407             Map<String, FilesSet.Rule> rules = 
new HashMap<>(selectedSet.getRules());
 
  411             if (selectedRule != null) {
 
  412                 rules.remove(selectedRule.getUuid());
 
  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);
 
  419             this.replaceFilesSet(selectedSet, selectedSet.getName(), selectedSet.getDescription(), selectedSet.ignoresKnownFiles(), rules);
 
  424             EventQueue.invokeLater(() -> {
 
  425                 this.rulesList.setSelectedValue(newRule, 
true);
 
  443     void replaceFilesSet(FilesSet oldSet, String name, String description, 
boolean ignoresKnownFiles, Map<String, FilesSet.Rule> rules) {
 
  444         if (oldSet != null) {
 
  447             this.filesSets.remove(oldSet.getName());
 
  452         FilesSet newSet = 
new FilesSet(name, description, ignoresKnownFiles, rules);
 
  453         this.filesSets.put(newSet.getName(), newSet);
 
  457         InterestingItemDefsPanel.this.setsListModel.clear();
 
  458         for (FilesSet set : this.filesSets.values()) {
 
  459             this.setsListModel.addElement(set);
 
  465         this.setsList.setSelectedValue(newSet, 
true);
 
  473     @SuppressWarnings(
"unchecked")
 
  475     private 
void initComponents() {
 
  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>();
 
  521         setFont(getFont().deriveFont(getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  523         jScrollPane1.setFont(jScrollPane1.getFont().deriveFont(jScrollPane1.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  525         jPanel1.setFont(jPanel1.getFont().deriveFont(jPanel1.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  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")); 
 
  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"))); 
 
  532         org.openide.awt.Mnemonics.setLocalizedText(newRuleButton, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.newRuleButton.text")); 
 
  533         newRuleButton.addActionListener(
new java.awt.event.ActionListener() {
 
  534             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  535                 newRuleButtonActionPerformed(evt);
 
  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")); 
 
  543         filesRadioButton.setEnabled(
false);
 
  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"))); 
 
  547         org.openide.awt.Mnemonics.setLocalizedText(editRuleButton, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.editRuleButton.text")); 
 
  548         editRuleButton.setEnabled(
false);
 
  549         editRuleButton.addActionListener(
new java.awt.event.ActionListener() {
 
  550             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  551                 editRuleButtonActionPerformed(evt);
 
  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")); 
 
  558         rulesListScrollPane.setFont(rulesListScrollPane.getFont().deriveFont(rulesListScrollPane.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  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);
 
  564         setDescScrollPanel.setFont(setDescScrollPanel.getFont().deriveFont(setDescScrollPanel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  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);
 
  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"))); 
 
  578         org.openide.awt.Mnemonics.setLocalizedText(editSetButton, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.editSetButton.text")); 
 
  579         editSetButton.setEnabled(
false);
 
  580         editSetButton.addActionListener(
new java.awt.event.ActionListener() {
 
  581             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  582                 editSetButtonActionPerformed(evt);
 
  586         setsListScrollPane.setFont(setsListScrollPane.getFont().deriveFont(setsListScrollPane.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  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);
 
  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")); 
 
  595         fileNameExtensionRadioButton.setEnabled(
false);
 
  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")); 
 
  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")); 
 
  603         fileNameTextField.addActionListener(
new java.awt.event.ActionListener() {
 
  604             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  605                 fileNameTextFieldActionPerformed(evt);
 
  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")); 
 
  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")); 
 
  615         fileNameRadioButton.setEnabled(
false);
 
  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")); 
 
  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")); 
 
  623         ignoreKnownFilesCheckbox.setEnabled(
false);
 
  624         ignoreKnownFilesCheckbox.addActionListener(
new java.awt.event.ActionListener() {
 
  625             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  626                 ignoreKnownFilesCheckboxActionPerformed(evt);
 
  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")); 
 
  632         fileNameRegexCheckbox.setEnabled(
false);
 
  634         separator.setOrientation(javax.swing.SwingConstants.VERTICAL);
 
  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")); 
 
  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")); 
 
  642         bothRadioButton.setEnabled(
false);
 
  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"))); 
 
  646         org.openide.awt.Mnemonics.setLocalizedText(deleteSetButton, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.deleteSetButton.text")); 
 
  647         deleteSetButton.setEnabled(
false);
 
  648         deleteSetButton.addActionListener(
new java.awt.event.ActionListener() {
 
  649             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  650                 deleteSetButtonActionPerformed(evt);
 
  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"))); 
 
  656         org.openide.awt.Mnemonics.setLocalizedText(deleteRuleButton, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.deleteRuleButton.text")); 
 
  657         deleteRuleButton.setEnabled(
false);
 
  658         deleteRuleButton.addActionListener(
new java.awt.event.ActionListener() {
 
  659             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  660                 deleteRuleButtonActionPerformed(evt);
 
  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"))); 
 
  666         org.openide.awt.Mnemonics.setLocalizedText(newSetButton, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.newSetButton.text")); 
 
  667         newSetButton.addActionListener(
new java.awt.event.ActionListener() {
 
  668             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  669                 newSetButtonActionPerformed(evt);
 
  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")); 
 
  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")); 
 
  679         dirsRadioButton.setEnabled(
false);
 
  680         dirsRadioButton.addActionListener(
new java.awt.event.ActionListener() {
 
  681             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  682                 dirsRadioButtonActionPerformed(evt);
 
  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")); 
 
  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")); 
 
  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")); 
 
  694         rulePathConditionRegexCheckBox.setEnabled(
false);
 
  696         jScrollPane2.setFont(jScrollPane2.getFont().deriveFont(jScrollPane2.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  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")); 
 
  705         jTextArea1.setWrapStyleWord(
true);
 
  706         jScrollPane2.setViewportView(jTextArea1);
 
  708         org.openide.awt.Mnemonics.setLocalizedText(jLabel7, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.jLabel7.text")); 
 
  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));
 
  716         org.openide.awt.Mnemonics.setLocalizedText(jLabel8, 
org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, 
"InterestingItemDefsPanel.jLabel8.text")); 
 
  718         equalitySignComboBox.setModel(
new javax.swing.DefaultComboBoxModel<String>(
new String[] { 
"=", 
">", 
"≥", 
"<", 
"≤" }));
 
  719         equalitySignComboBox.setEnabled(
false);
 
  721         fileSizeSpinner.setEnabled(
false);
 
  722         fileSizeSpinner.setMinimumSize(
new java.awt.Dimension(2, 20));
 
  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);
 
  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()
 
  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))
 
  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)))
 
  758                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  759                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  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))
 
  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))
 
  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)
 
  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))
 
  794                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  795                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  796                                     .addComponent(jLabel1)
 
  797                                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  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)
 
  807                                         .addComponent(editRuleButton)
 
  809                                         .addComponent(deleteRuleButton))
 
  810                                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  812                                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  813                                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  814                                                 .addComponent(fileNameRadioButton)
 
  816                                                 .addComponent(fileNameExtensionRadioButton)
 
  817                                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  818                                                 .addComponent(fileNameRegexCheckbox))
 
  819                                             .addComponent(rulePathConditionRegexCheckBox))))
 
  823         jPanel1Layout.setVerticalGroup(
 
  824             jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  825             .addGroup(jPanel1Layout.createSequentialGroup()
 
  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)
 
  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)
 
  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)
 
  862                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  863                                     .addComponent(jLabel2)
 
  864                                     .addComponent(filesRadioButton)
 
  865                                     .addComponent(dirsRadioButton)
 
  866                                     .addComponent(bothRadioButton))
 
  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))
 
  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))
 
  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)))
 
  896         jPanel1Layout.linkSize(javax.swing.SwingConstants.VERTICAL, 
new java.awt.Component[] {deleteRuleButton, deleteSetButton, editRuleButton, editSetButton, newRuleButton, newSetButton});
 
  898         jScrollPane1.setViewportView(jPanel1);
 
  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)
 
  906         layout.setVerticalGroup(
 
  907             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  908             .addComponent(jScrollPane1)
 
  912     private void dirsRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  916     private void newSetButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  917         this.doFileSetsDialog(null);
 
  918         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  921     private void deleteRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  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);
 
  934             this.resetRuleComponents();
 
  936         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  939     private void deleteSetButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  940         FilesSet selectedSet = this.setsList.getSelectedValue();
 
  941         this.filesSets.remove(selectedSet.getName());
 
  942         this.setsListModel.removeElement(selectedSet);
 
  946         if (!this.filesSets.isEmpty()) {
 
  947             this.setsList.setSelectedIndex(0);
 
  949             this.resetComponents();
 
  951         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  954     private void ignoreKnownFilesCheckboxActionPerformed(java.awt.event.ActionEvent evt) {
 
  958     private void editSetButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  959         this.doFileSetsDialog(this.setsList.getSelectedValue());
 
  960         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  963     private void editRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  964         this.doFilesSetRuleDialog(this.rulesList.getSelectedValue());
 
  965         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  968     private void newRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  969         this.doFilesSetRuleDialog(null);
 
  970         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  973     private void fileNameTextFieldActionPerformed(java.awt.event.ActionEvent evt) {
 
  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;
 
void valueChanged(ListSelectionEvent e)
void valueChanged(ListSelectionEvent e)