19 package org.sleuthkit.autopsy.logicalimager.configuration;
 
   21 import java.io.IOException;
 
   22 import java.util.ArrayList;
 
   23 import java.util.Collections;
 
   24 import java.util.Comparator;
 
   25 import java.util.List;
 
   26 import javax.swing.JButton;
 
   27 import javax.swing.JOptionPane;
 
   28 import javax.swing.JPanel;
 
   29 import javax.swing.JTable;
 
   30 import javax.swing.table.AbstractTableModel;
 
   31 import org.apache.commons.lang3.tuple.ImmutablePair;
 
   32 import org.openide.util.NbBundle;
 
   33 import org.openide.util.NbBundle.Messages;
 
   39     "ConfigVisualPanel2.ok=OK",
 
   40     "ConfigVisualPanel2.cancel=Cancel" 
   42 @SuppressWarnings(
"PMD.SingularField") 
 
   43 final class ConfigVisualPanel2 
extends JPanel {
 
   45     private static final long serialVersionUID = 1L;
 
   46     private String configFilename;
 
   47     private LogicalImagerConfig config = null;
 
   48     private final JButton okButton = 
new JButton(Bundle.ConfigVisualPanel2_ok());
 
   49     private final JButton cancelButton = 
new JButton(Bundle.ConfigVisualPanel2_cancel());
 
   50     private boolean flagEncryptionPrograms = 
false;
 
   55     ConfigVisualPanel2() {
 
   58             updatePanel(configFilename, config);
 
   63         "ConfigVisualPanel2.editConfiguration=Configure imager" 
   66     public String getName() {
 
   67         return Bundle.ConfigVisualPanel2_editConfiguration();
 
   76     private void initComponents() {
 
   78         modifiedDateLabel = 
new javax.swing.JLabel();
 
   79         modifiedWithinTextField = 
new javax.swing.JTextField();
 
   80         daysIncludedLabel = 
new javax.swing.JLabel();
 
   81         fullPathsLabel = 
new javax.swing.JLabel();
 
   82         flagEncryptionProgramsCheckBox = 
new javax.swing.JCheckBox();
 
   83         ruleNameLabel = 
new javax.swing.JLabel();
 
   84         ruleNameEditTextField = 
new javax.swing.JTextField();
 
   85         newRuleButton = 
new javax.swing.JButton();
 
   86         descriptionLabel = 
new javax.swing.JLabel();
 
   87         editRuleButton = 
new javax.swing.JButton();
 
   88         descriptionEditTextField = 
new javax.swing.JTextField();
 
   89         deleteRuleButton = 
new javax.swing.JButton();
 
   90         fullPathsScrollPane = 
new javax.swing.JScrollPane();
 
   91         fullPathsTable = 
new javax.swing.JTable();
 
   92         filenamesScrollPane = 
new javax.swing.JScrollPane();
 
   93         filenamesTable = 
new javax.swing.JTable();
 
   94         shouldSaveCheckBox = 
new javax.swing.JCheckBox();
 
   95         shouldAlertCheckBox = 
new javax.swing.JCheckBox();
 
   96         folderNamesScrollPane = 
new javax.swing.JScrollPane();
 
   97         folderNamesTable = 
new javax.swing.JTable();
 
   98         extensionsLabel = 
new javax.swing.JLabel();
 
   99         extensionsTextField = 
new javax.swing.JTextField();
 
  100         filenamesLabel = 
new javax.swing.JLabel();
 
  101         configFileTextField = 
new javax.swing.JTextField();
 
  102         ruleSetFileLabel = 
new javax.swing.JLabel();
 
  103         finalizeImageWriter = 
new javax.swing.JCheckBox();
 
  104         rulesScrollPane = 
new javax.swing.JScrollPane();
 
  105         rulesTable = 
new javax.swing.JTable();
 
  106         folderNamesLabel = 
new javax.swing.JLabel();
 
  107         fileSizeLabel = 
new javax.swing.JLabel();
 
  108         jSeparator1 = 
new javax.swing.JSeparator();
 
  109         minSizeLabel = 
new javax.swing.JLabel();
 
  110         minSizeTextField = 
new javax.swing.JFormattedTextField();
 
  111         maxSizeLabel = 
new javax.swing.JLabel();
 
  112         maxSizeTextField = 
new javax.swing.JFormattedTextField();
 
  113         promptBeforeExit = 
new javax.swing.JCheckBox();
 
  114         createVHDCheckBox = 
new javax.swing.JCheckBox();
 
  116         org.openide.awt.Mnemonics.setLocalizedText(modifiedDateLabel, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.modifiedDateLabel.text")); 
 
  118         modifiedWithinTextField.setEditable(
false);
 
  119         modifiedWithinTextField.setHorizontalAlignment(javax.swing.JTextField.TRAILING);
 
  120         modifiedWithinTextField.setEnabled(
false);
 
  121         modifiedWithinTextField.setMinimumSize(
new java.awt.Dimension(60, 20));
 
  122         modifiedWithinTextField.setPreferredSize(
new java.awt.Dimension(60, 20));
 
  124         org.openide.awt.Mnemonics.setLocalizedText(daysIncludedLabel, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.daysIncludedLabel.text")); 
 
  126         org.openide.awt.Mnemonics.setLocalizedText(fullPathsLabel, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.fullPathsLabel.text")); 
 
  128         org.openide.awt.Mnemonics.setLocalizedText(flagEncryptionProgramsCheckBox, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.flagEncryptionProgramsCheckBox.text")); 
 
  129         flagEncryptionProgramsCheckBox.addActionListener(
new java.awt.event.ActionListener() {
 
  130             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  131                 flagEncryptionProgramsCheckBoxActionPerformed(evt);
 
  135         org.openide.awt.Mnemonics.setLocalizedText(ruleNameLabel, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.ruleNameLabel.text")); 
 
  137         ruleNameEditTextField.setEnabled(
false);
 
  139         newRuleButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/add16.png"))); 
 
  140         org.openide.awt.Mnemonics.setLocalizedText(newRuleButton, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.newRuleButton.text")); 
 
  141         newRuleButton.addActionListener(
new java.awt.event.ActionListener() {
 
  142             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  143                 newRuleButtonActionPerformed(evt);
 
  147         org.openide.awt.Mnemonics.setLocalizedText(descriptionLabel, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.descriptionLabel.text")); 
 
  149         editRuleButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/edit16.png"))); 
 
  150         org.openide.awt.Mnemonics.setLocalizedText(editRuleButton, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.editRuleButton.text")); 
 
  151         editRuleButton.addActionListener(
new java.awt.event.ActionListener() {
 
  152             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  153                 editRuleButtonActionPerformed(evt);
 
  157         descriptionEditTextField.setEnabled(
false);
 
  159         deleteRuleButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/delete16.png"))); 
 
  160         org.openide.awt.Mnemonics.setLocalizedText(deleteRuleButton, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.deleteRuleButton.text")); 
 
  161         deleteRuleButton.addActionListener(
new java.awt.event.ActionListener() {
 
  162             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  163                 deleteRuleButtonActionPerformed(evt);
 
  167         fullPathsTable.setColumnSelectionAllowed(
true);
 
  168         fullPathsTable.setEnabled(
false);
 
  169         fullPathsTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
 
  170         fullPathsTable.setShowHorizontalLines(
false);
 
  171         fullPathsTable.setShowVerticalLines(
false);
 
  172         fullPathsTable.getTableHeader().setReorderingAllowed(
false);
 
  173         fullPathsScrollPane.setViewportView(fullPathsTable);
 
  174         fullPathsTable.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_INTERVAL_SELECTION);
 
  175         if (fullPathsTable.getColumnModel().getColumnCount() > 0) {
 
  176             fullPathsTable.getColumnModel().getColumn(0).setHeaderValue(
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.fullPathsTable.columnModel.title0")); 
 
  179         filenamesTable.setEnabled(
false);
 
  180         filenamesTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
 
  181         filenamesTable.setShowHorizontalLines(
false);
 
  182         filenamesTable.setShowVerticalLines(
false);
 
  183         filenamesTable.getTableHeader().setReorderingAllowed(
false);
 
  184         filenamesScrollPane.setViewportView(filenamesTable);
 
  185         if (filenamesTable.getColumnModel().getColumnCount() > 0) {
 
  186             filenamesTable.getColumnModel().getColumn(0).setHeaderValue(
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.filenamesTable.columnModel.title0")); 
 
  189         org.openide.awt.Mnemonics.setLocalizedText(shouldSaveCheckBox, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.shouldSaveCheckBox.text")); 
 
  190         shouldSaveCheckBox.setToolTipText(
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.shouldSaveCheckBox.toolTipText")); 
 
  191         shouldSaveCheckBox.setEnabled(
false);
 
  193         org.openide.awt.Mnemonics.setLocalizedText(shouldAlertCheckBox, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.shouldAlertCheckBox.text")); 
 
  194         shouldAlertCheckBox.setEnabled(
false);
 
  196         folderNamesTable.setEnabled(
false);
 
  197         folderNamesTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
 
  198         folderNamesTable.setShowHorizontalLines(
false);
 
  199         folderNamesTable.setShowVerticalLines(
false);
 
  200         folderNamesTable.getTableHeader().setReorderingAllowed(
false);
 
  201         folderNamesScrollPane.setViewportView(folderNamesTable);
 
  202         if (folderNamesTable.getColumnModel().getColumnCount() > 0) {
 
  203             folderNamesTable.getColumnModel().getColumn(0).setHeaderValue(
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.folderNamesTable.columnModel.title0")); 
 
  206         org.openide.awt.Mnemonics.setLocalizedText(extensionsLabel, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.extensionsLabel.text")); 
 
  208         extensionsTextField.setEnabled(
false);
 
  210         org.openide.awt.Mnemonics.setLocalizedText(filenamesLabel, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.filenamesLabel.text")); 
 
  212         configFileTextField.setToolTipText(
"");
 
  213         configFileTextField.setEnabled(
false);
 
  215         org.openide.awt.Mnemonics.setLocalizedText(ruleSetFileLabel, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.ruleSetFileLabel.text")); 
 
  217         org.openide.awt.Mnemonics.setLocalizedText(finalizeImageWriter, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.finalizeImageWriter.text")); 
 
  218         finalizeImageWriter.setEnabled(
false);
 
  219         finalizeImageWriter.addActionListener(
new java.awt.event.ActionListener() {
 
  220             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  221                 finalizeImageWriterActionPerformed(evt);
 
  225         rulesTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS);
 
  226         rulesTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
 
  227         rulesTable.setShowHorizontalLines(
false);
 
  228         rulesTable.setShowVerticalLines(
false);
 
  229         rulesTable.getTableHeader().setReorderingAllowed(
false);
 
  230         rulesTable.addMouseListener(
new java.awt.event.MouseAdapter() {
 
  231             public void mouseReleased(java.awt.event.MouseEvent evt) {
 
  232                 rulesTableMouseReleased(evt);
 
  235         rulesTable.addKeyListener(
new java.awt.event.KeyAdapter() {
 
  236             public void keyReleased(java.awt.event.KeyEvent evt) {
 
  237                 rulesTableKeyReleased(evt);
 
  240         rulesScrollPane.setViewportView(rulesTable);
 
  241         if (rulesTable.getColumnModel().getColumnCount() > 0) {
 
  242             rulesTable.getColumnModel().getColumn(0).setHeaderValue(
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.rulesTable.columnModel.title0")); 
 
  243             rulesTable.getColumnModel().getColumn(1).setHeaderValue(
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.rulesTable.columnModel.title1")); 
 
  246         org.openide.awt.Mnemonics.setLocalizedText(folderNamesLabel, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.folderNamesLabel.text")); 
 
  248         org.openide.awt.Mnemonics.setLocalizedText(fileSizeLabel, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.fileSizeLabel.text")); 
 
  250         org.openide.awt.Mnemonics.setLocalizedText(minSizeLabel, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.minSizeLabel.text")); 
 
  252         minSizeTextField.setFormatterFactory(
new javax.swing.text.DefaultFormatterFactory(
new javax.swing.text.NumberFormatter(
new java.text.DecimalFormat(
"#,###; "))));
 
  253         minSizeTextField.setEnabled(
false);
 
  255         org.openide.awt.Mnemonics.setLocalizedText(maxSizeLabel, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.maxSizeLabel.text")); 
 
  257         maxSizeTextField.setFormatterFactory(
new javax.swing.text.DefaultFormatterFactory(
new javax.swing.text.NumberFormatter(
new java.text.DecimalFormat(
"#,###; "))));
 
  258         maxSizeTextField.setEnabled(
false);
 
  260         promptBeforeExit.setSelected(
true);
 
  261         org.openide.awt.Mnemonics.setLocalizedText(promptBeforeExit, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.promptBeforeExit.text")); 
 
  262         promptBeforeExit.setActionCommand(
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.promptBeforeExit.actionCommand")); 
 
  263         promptBeforeExit.addActionListener(
new java.awt.event.ActionListener() {
 
  264             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  265                 promptBeforeExitActionPerformed(evt);
 
  269         org.openide.awt.Mnemonics.setLocalizedText(createVHDCheckBox, 
org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, 
"ConfigVisualPanel2.createVHDCheckBox.text")); 
 
  270         createVHDCheckBox.addActionListener(
new java.awt.event.ActionListener() {
 
  271             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  272                 createVHDCheckBoxActionPerformed(evt);
 
  276         javax.swing.GroupLayout layout = 
new javax.swing.GroupLayout(
this);
 
  277         this.setLayout(layout);
 
  278         layout.setHorizontalGroup(
 
  279             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  280             .addGroup(layout.createSequentialGroup()
 
  282                 .addComponent(ruleSetFileLabel)
 
  284                 .addComponent(configFileTextField)
 
  286             .addGroup(layout.createSequentialGroup()
 
  288                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  289                     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
 
  290                         .addComponent(newRuleButton)
 
  291                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  292                         .addComponent(editRuleButton)
 
  293                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  294                         .addComponent(deleteRuleButton))
 
  295                     .addComponent(rulesScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 341, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  296                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  297                     .addGroup(layout.createSequentialGroup()
 
  299                         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  300                             .addGroup(layout.createSequentialGroup()
 
  301                                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  302                                     .addComponent(extensionsLabel)
 
  303                                     .addComponent(filenamesLabel)
 
  304                                     .addComponent(descriptionLabel)
 
  305                                     .addComponent(ruleNameLabel)
 
  306                                     .addComponent(fullPathsLabel)
 
  307                                     .addComponent(folderNamesLabel))
 
  308                                 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
 
  309                             .addGroup(layout.createSequentialGroup()
 
  310                                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  311                                     .addGroup(layout.createSequentialGroup()
 
  312                                         .addGap(129, 129, 129)
 
  313                                         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
 
  314                                             .addComponent(ruleNameEditTextField, javax.swing.GroupLayout.Alignment.LEADING)
 
  315                                             .addComponent(descriptionEditTextField, javax.swing.GroupLayout.Alignment.LEADING)
 
  316                                             .addComponent(extensionsTextField, javax.swing.GroupLayout.Alignment.LEADING)
 
  317                                             .addComponent(fullPathsScrollPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
 
  318                                             .addComponent(filenamesScrollPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
 
  319                                             .addComponent(folderNamesScrollPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)))
 
  320                                     .addGroup(layout.createSequentialGroup()
 
  321                                         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  322                                             .addComponent(shouldSaveCheckBox)
 
  323                                             .addComponent(shouldAlertCheckBox)
 
  324                                             .addGroup(layout.createSequentialGroup()
 
  325                                                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  326                                                     .addComponent(modifiedDateLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  327                                                     .addComponent(fileSizeLabel))
 
  329                                                 .addComponent(minSizeLabel)
 
  330                                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  331                                                 .addComponent(minSizeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  333                                                 .addComponent(maxSizeLabel)
 
  334                                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  335                                                 .addComponent(maxSizeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  336                                             .addGroup(layout.createSequentialGroup()
 
  337                                                 .addGap(129, 129, 129)
 
  338                                                 .addComponent(modifiedWithinTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  339                                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  340                                                 .addComponent(daysIncludedLabel)))
 
  341                                         .addGap(0, 0, Short.MAX_VALUE)))
 
  342                                 .addContainerGap())))
 
  343                     .addGroup(layout.createSequentialGroup()
 
  344                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  345                         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  346                             .addGroup(layout.createSequentialGroup()
 
  347                                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  348                                     .addComponent(flagEncryptionProgramsCheckBox)
 
  349                                     .addComponent(createVHDCheckBox)
 
  350                                     .addComponent(promptBeforeExit)
 
  351                                     .addGroup(layout.createSequentialGroup()
 
  353                                         .addComponent(finalizeImageWriter)))
 
  354                                 .addGap(0, 0, Short.MAX_VALUE))
 
  355                             .addComponent(jSeparator1)))))
 
  358         layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, 
new java.awt.Component[] {deleteRuleButton, editRuleButton, newRuleButton});
 
  360         layout.setVerticalGroup(
 
  361             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  362             .addGroup(layout.createSequentialGroup()
 
  364                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  365                     .addComponent(configFileTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  366                     .addComponent(ruleSetFileLabel))
 
  367                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  368                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  369                     .addGroup(layout.createSequentialGroup()
 
  370                         .addComponent(rulesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 478, Short.MAX_VALUE)
 
  371                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  372                         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  373                             .addComponent(newRuleButton)
 
  374                             .addComponent(editRuleButton)
 
  375                             .addComponent(deleteRuleButton))
 
  377                     .addGroup(layout.createSequentialGroup()
 
  378                         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  379                             .addGroup(layout.createSequentialGroup()
 
  381                                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  382                                     .addComponent(descriptionEditTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  383                                     .addComponent(descriptionLabel))
 
  385                                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  386                                     .addComponent(extensionsTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  387                                     .addComponent(extensionsLabel)))
 
  388                             .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  389                                 .addComponent(ruleNameEditTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  390                                 .addComponent(ruleNameLabel)))
 
  391                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  392                         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  393                             .addComponent(filenamesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
 
  394                             .addComponent(filenamesLabel))
 
  396                         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  397                             .addComponent(folderNamesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
 
  398                             .addComponent(folderNamesLabel))
 
  400                         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  401                             .addComponent(fullPathsLabel)
 
  402                             .addComponent(fullPathsScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
 
  403                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  404                         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
 
  405                             .addComponent(minSizeLabel)
 
  406                             .addComponent(minSizeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  407                             .addComponent(maxSizeLabel)
 
  408                             .addComponent(maxSizeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  409                             .addComponent(fileSizeLabel))
 
  410                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  411                         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
 
  412                             .addComponent(modifiedDateLabel)
 
  413                             .addComponent(modifiedWithinTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  414                             .addComponent(daysIncludedLabel))
 
  415                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  416                         .addComponent(shouldSaveCheckBox)
 
  417                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  418                         .addComponent(shouldAlertCheckBox)
 
  420                         .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  421                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  422                         .addComponent(flagEncryptionProgramsCheckBox)
 
  423                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  424                         .addComponent(createVHDCheckBox)
 
  425                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  426                         .addComponent(finalizeImageWriter)
 
  427                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  428                         .addComponent(promptBeforeExit)
 
  429                         .addGap(19, 19, 19))))
 
  433     private void rulesTableKeyReleased(java.awt.event.KeyEvent evt) {
 
  434         updateForSelectedRule();
 
  438         "ConfigVisualPanel2.editRuleSet=Edit Rule",
 
  439         "ConfigVisualPanel2.editRuleError=Edit rule error" 
  441     private void editRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  442         int row = rulesTable.getSelectedRow();
 
  444             String ruleName = (String) rulesTable.getModel().getValueAt(row, 0);
 
  445             LogicalImagerRule rule = getRuleSetFromCurrentConfig().getRules().get(row);
 
  446             EditRulePanel editPanel = 
new EditRulePanel(okButton, cancelButton, ruleName, rule);
 
  447             editPanel.setEnabled(
true);
 
  448             editPanel.setVisible(
true);
 
  451                 int option = JOptionPane.showOptionDialog(
this, editPanel.getPanel(), Bundle.ConfigVisualPanel2_editRuleSet(),
 
  452                         JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE,
 
  453                         null, 
new Object[]{okButton, cancelButton}, okButton);
 
  454                 if (option == JOptionPane.OK_OPTION) {
 
  456                         ImmutablePair<String, LogicalImagerRule> ruleMap = editPanel.toRule();
 
  457                         if (!ruleName.equals(ruleMap.getKey()) && ruleExists(ruleMap)) {
 
  458                             JOptionPane.showMessageDialog(
this,
 
  459                                     Bundle.ConfigVisualPanel2_newRuleError_duplicateName(ruleMap.getKey()),
 
  460                                     Bundle.ConfigVisualPanel2_editRuleError(),
 
  461                                     JOptionPane.ERROR_MESSAGE);
 
  464                         updateRow(row, ruleMap);
 
  466                     } 
catch (IOException | NumberFormatException ex) {
 
  467                         JOptionPane.showMessageDialog(
this,
 
  469                                 Bundle.ConfigVisualPanel2_editRuleError(),
 
  470                                 JOptionPane.ERROR_MESSAGE);
 
  480     @Messages({
"ConfigVisualPanel2.newRule.name=New Rule",
 
  481         "ConfigVisualPanel2.newRuleError.title=New rule error",
 
  483         "ConfigVisualPanel2.newRuleError.duplicateName=A rule with name \"{0}\" already exists. Please enter a different rule name"})
 
  484     private void newRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  486         panel = 
new NewRulePanel(okButton, cancelButton);
 
  487         panel.setEnabled(
true);
 
  488         panel.setVisible(
true);
 
  491             int option = JOptionPane.showOptionDialog(
this, panel, Bundle.ConfigVisualPanel2_newRule_name(),
 
  492                     JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE,
 
  493                     null, 
new Object[]{okButton, cancelButton}, okButton);
 
  494             if (option == JOptionPane.OK_OPTION) {
 
  497                     ImmutablePair<String, LogicalImagerRule> ruleMap = panel.toRule();
 
  498                     if (ruleExists(ruleMap)) {
 
  499                         JOptionPane.showMessageDialog(
this,
 
  500                                 Bundle.ConfigVisualPanel2_newRuleError_duplicateName(ruleMap.getKey()),
 
  501                                 Bundle.ConfigVisualPanel2_newRuleError_title(),
 
  502                                 JOptionPane.ERROR_MESSAGE);
 
  508                 } 
catch (IOException | NumberFormatException ex) {
 
  509                     JOptionPane.showMessageDialog(
this,
 
  511                             Bundle.ConfigVisualPanel2_newRuleError_title(),
 
  512                             JOptionPane.ERROR_MESSAGE);
 
  522         "ConfigVisualPanel2.deleteRuleSet=Delete rule ",
 
  523         "ConfigVisualPanel2.deleteRuleSetConfirmation=Delete rule confirmation",})
 
  524     private void deleteRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  525         int index = rulesTable.getSelectedRow();
 
  527             String ruleName = (String) rulesTable.getModel().getValueAt(index, 0);
 
  529             int option = JOptionPane.showOptionDialog(
this,
 
  530                     Bundle.ConfigVisualPanel2_deleteRuleSet() + ruleName,
 
  531                     Bundle.ConfigVisualPanel2_deleteRuleSetConfirmation(),
 
  532                     JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null);
 
  533             if (option == JOptionPane.NO_OPTION) {
 
  537             getRuleSetFromCurrentConfig().getRules().remove(index);
 
  538             updatePanel(configFilename, config);
 
  539             if (rulesTable.getRowCount() > 0) {
 
  540                 rulesTable.setRowSelectionInterval(0, 0);
 
  541                 updateForSelectedRule();
 
  546     private void rulesTableMouseReleased(java.awt.event.MouseEvent evt) {
 
  547         updateForSelectedRule();
 
  550     private void flagEncryptionProgramsCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {
 
  551         flagEncryptionPrograms = flagEncryptionProgramsCheckBox.isSelected();
 
  552         setEnabledEncryptionProgramsRule(flagEncryptionPrograms);
 
  555     private void finalizeImageWriterActionPerformed(java.awt.event.ActionEvent evt) {
 
  556         config.setFinalizeImageWriter(finalizeImageWriter.isSelected());
 
  559     private void promptBeforeExitActionPerformed(java.awt.event.ActionEvent evt) {
 
  560         config.setPromptBeforeExit(promptBeforeExit.isSelected());
 
  563     private void createVHDCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {
 
  564         config.setCreateVHD(createVHDCheckBox.isSelected());
 
  565         finalizeImageWriter.setEnabled(createVHDCheckBox.isSelected());
 
  575     private void setEnabledEncryptionProgramsRule(
boolean flagEncryptionPrograms) {
 
  576         if (flagEncryptionPrograms) {
 
  578             ImmutablePair<String, LogicalImagerRule> ruleMap = createEncryptionProgramsRule();
 
  582             int index = ((RulesTableModel) rulesTable.getModel()).findRow(EncryptionProgramsRule.getName());
 
  584                 getRuleSetFromCurrentConfig().getRules().remove(index);
 
  585                 updatePanel(configFilename, config);
 
  586                 if (rulesTable.getRowCount() > 0) {
 
  587                     rulesTable.setRowSelectionInterval(0, 0);
 
  588                     updateForSelectedRule();
 
  597     private ImmutablePair<String, LogicalImagerRule> createEncryptionProgramsRule() {
 
  598         LogicalImagerRule.Builder builder = 
new LogicalImagerRule.Builder();
 
  599         builder.getName(EncryptionProgramsRule.getName())
 
  600                 .getDescription(EncryptionProgramsRule.getDescription())
 
  601                 .getShouldAlert(
true)
 
  603                 .getFilenames(EncryptionProgramsRule.getFilenames());
 
  604         LogicalImagerRule rule = builder.build();
 
  605         return new ImmutablePair<>(EncryptionProgramsRule.getName(), rule);
 
  609     private javax.swing.JTextField configFileTextField;
 
  610     private javax.swing.JCheckBox createVHDCheckBox;
 
  611     private javax.swing.JLabel daysIncludedLabel;
 
  612     private javax.swing.JButton deleteRuleButton;
 
  613     private javax.swing.JTextField descriptionEditTextField;
 
  614     private javax.swing.JLabel descriptionLabel;
 
  615     private javax.swing.JButton editRuleButton;
 
  616     private javax.swing.JLabel extensionsLabel;
 
  617     private javax.swing.JTextField extensionsTextField;
 
  618     private javax.swing.JLabel fileSizeLabel;
 
  619     private javax.swing.JLabel filenamesLabel;
 
  620     private javax.swing.JScrollPane filenamesScrollPane;
 
  621     private javax.swing.JTable filenamesTable;
 
  622     private javax.swing.JCheckBox finalizeImageWriter;
 
  623     private javax.swing.JCheckBox flagEncryptionProgramsCheckBox;
 
  624     private javax.swing.JLabel folderNamesLabel;
 
  625     private javax.swing.JScrollPane folderNamesScrollPane;
 
  626     private javax.swing.JTable folderNamesTable;
 
  627     private javax.swing.JLabel fullPathsLabel;
 
  628     private javax.swing.JScrollPane fullPathsScrollPane;
 
  629     private javax.swing.JTable fullPathsTable;
 
  630     private javax.swing.JSeparator jSeparator1;
 
  631     private javax.swing.JLabel maxSizeLabel;
 
  632     private javax.swing.JFormattedTextField maxSizeTextField;
 
  633     private javax.swing.JLabel minSizeLabel;
 
  634     private javax.swing.JFormattedTextField minSizeTextField;
 
  635     private javax.swing.JLabel modifiedDateLabel;
 
  636     private javax.swing.JTextField modifiedWithinTextField;
 
  637     private javax.swing.JButton newRuleButton;
 
  638     private javax.swing.JCheckBox promptBeforeExit;
 
  639     private javax.swing.JTextField ruleNameEditTextField;
 
  640     private javax.swing.JLabel ruleNameLabel;
 
  641     private javax.swing.JLabel ruleSetFileLabel;
 
  642     private javax.swing.JScrollPane rulesScrollPane;
 
  643     private javax.swing.JTable rulesTable;
 
  644     private javax.swing.JCheckBox shouldAlertCheckBox;
 
  645     private javax.swing.JCheckBox shouldSaveCheckBox;
 
  648     private LogicalImagerRuleSet getRuleSetFromCurrentConfig() {
 
  649         if (config.getRuleSets().isEmpty()) {
 
  650             List<LogicalImagerRuleSet> ruleSets = 
new ArrayList<>();
 
  651             ruleSets.add(
new LogicalImagerRuleSet(
"no-set-name", 
new ArrayList<>())); 
 
  652             config.setRuleSet(ruleSets);
 
  654         return config.getRuleSets().get(0);
 
  664     private void updatePanel(String configFilePath, LogicalImagerConfig config, String rowSelectionkey) {
 
  665         configFileTextField.setText(configFilePath);
 
  666         finalizeImageWriter.setSelected(config.isFinalizeImageWriter());
 
  667         promptBeforeExit.setSelected(config.isPromptBeforeExit());
 
  668         createVHDCheckBox.setSelected(config.isCreateVHD());
 
  669         finalizeImageWriter.setEnabled(config.isCreateVHD());
 
  670         LogicalImagerRuleSet ruleSet = getRuleSetFromCurrentConfig();
 
  671         flagEncryptionProgramsCheckBox.setSelected(ruleSet.find(EncryptionProgramsRule.getName()) != null);
 
  672         RulesTableModel rulesTableModel = 
new RulesTableModel();
 
  674         int selectThisRow = 0;
 
  676         Collections.sort(ruleSet.getRules(), 
new SortRuleByName());
 
  678         for (LogicalImagerRule rule : ruleSet.getRules()) {
 
  679             rulesTableModel.setValueAt(rule.getName(), row, 0);
 
  680             if (rowSelectionkey != null && rowSelectionkey.equals(rule.getName())) {
 
  683             rulesTableModel.setValueAt(rule.getDescription(), row, 1);
 
  684             rulesTableModel.setValueAt(rule, row, 2);
 
  687         rulesTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
 
  688         rulesTable.setModel(rulesTableModel);
 
  690         if (rulesTableModel.getRowCount() > 0) {
 
  691             rulesTable.setRowSelectionInterval(selectThisRow, selectThisRow);
 
  692             updateForSelectedRule();
 
  695             updateRuleButtons(
false);
 
  705     private void updatePanel(String configFilePath, LogicalImagerConfig config) {
 
  706         updatePanel(configFilePath, config, null);
 
  712     private void updateForSelectedRule() {
 
  713         int index = rulesTable.getSelectedRow();
 
  715             String ruleName = (String) rulesTable.getModel().getValueAt(index, 0);
 
  716             String description = (String) rulesTable.getModel().getValueAt(index, 1);
 
  717             updateRuleDetails(ruleName, description);
 
  718             updateRuleButtons(!ruleName.equals(EncryptionProgramsRule.getName()));
 
  721             updateRuleButtons(
false);
 
  731     private void updateRuleDetails(String ruleName, String description) {
 
  733         LogicalImagerRule rule = getRuleSetFromCurrentConfig().find(ruleName);
 
  734         shouldAlertCheckBox.setSelected(rule.isShouldAlert());
 
  735         shouldSaveCheckBox.setSelected(rule.isShouldSave());
 
  736         ruleNameEditTextField.setText(ruleName);
 
  737         descriptionEditTextField.setText(description);
 
  738         updateExtensions(rule.getExtensions());
 
  739         updateList(filenamesTable, rule.getFilenames());
 
  740         updateList(folderNamesTable, rule.getPaths());
 
  741         updateList(fullPathsTable, rule.getFullPaths());
 
  742         if (rule.getMinFileSize() == null) {
 
  743             minSizeTextField.setText(
"");
 
  745             minSizeTextField.setText(rule.getMinFileSize().toString());
 
  747         if (rule.getMaxFileSize() == null) {
 
  748             maxSizeTextField.setText(
"");
 
  750             maxSizeTextField.setText(rule.getMaxFileSize().toString());
 
  752         if (rule.getMinDays() == null) {
 
  753             modifiedWithinTextField.setText(
"");
 
  755             modifiedWithinTextField.setText(Integer.toString(rule.getMinDays()));
 
  762     private void clearRuleDetails() {
 
  763         ruleNameEditTextField.setText(
"");
 
  764         descriptionEditTextField.setText(
"");
 
  765         extensionsTextField.setText(
"");
 
  766         updateExtensions(null);
 
  767         updateList(filenamesTable, null);
 
  768         updateList(folderNamesTable, null);
 
  769         updateList(fullPathsTable, null);
 
  770         minSizeTextField.setText(
"");
 
  771         maxSizeTextField.setText(
"");
 
  772         modifiedWithinTextField.setText(
"");
 
  773         shouldSaveCheckBox.setSelected(
true);
 
  774         shouldAlertCheckBox.setSelected(
false);
 
  783     private void updateExtensions(List<String> extensions) {
 
  784         extensionsTextField.setText(
"");
 
  785         if (extensions == null) {
 
  789         boolean first = 
true;
 
  790         for (String ext : extensions) {
 
  791             content += (first ? 
"" : 
",") + ext;
 
  794         extensionsTextField.setText(content);
 
  803     private void updateList(javax.swing.JTable jTable, List<String> list) {
 
  804         SingleColumnTableModel tableModel = 
new SingleColumnTableModel();
 
  805         jTable.setTableHeader(null);
 
  807             jTable.setModel(tableModel);
 
  811         for (String s : list) {
 
  812             tableModel.setValueAt(s, row, 0);
 
  815         jTable.setModel(tableModel);
 
  818     void setConfiguration(String configFilename, LogicalImagerConfig config) {
 
  819         this.configFilename = configFilename;
 
  820         this.config = config;
 
  821         updatePanel(configFilename, config);
 
  824     private void updateRow(
int index, ImmutablePair<String, LogicalImagerRule> ruleMap) {
 
  825         getRuleSetFromCurrentConfig().getRules().remove(index);
 
  826         getRuleSetFromCurrentConfig().getRules().add(ruleMap.getValue());
 
  827         updatePanel(configFilename, config, ruleMap.getKey());
 
  837     private boolean ruleExists(ImmutablePair<String, LogicalImagerRule> ruleMap) {
 
  838         for (LogicalImagerRule rule : getRuleSetFromCurrentConfig().getRules()) {
 
  839             if (rule.getName().equals(ruleMap.getKey())) {
 
  846     private void appendRow(ImmutablePair<String, LogicalImagerRule> ruleMap) {
 
  847         getRuleSetFromCurrentConfig().getRules().add(ruleMap.getValue());
 
  848         updatePanel(configFilename, config, ruleMap.getKey());
 
  857     private void updateRuleButtons(
boolean isRowSelected) {
 
  858         newRuleButton.setEnabled(
true);
 
  859         editRuleButton.setEnabled(isRowSelected);
 
  860         deleteRuleButton.setEnabled(isRowSelected);
 
  869         public int compare(LogicalImagerRule a, LogicalImagerRule b) {
 
  870             return a.getName().compareToIgnoreCase(b.getName());
 
  879         private static final long serialVersionUID = 1L;
 
  880         private final List<String> ruleName = 
new ArrayList<>();
 
  882         private final List<LogicalImagerRule> rule = 
new ArrayList<>();
 
  884         int findRow(String name) {
 
  885             return ruleName.indexOf(name);
 
  890             return ruleName.size();
 
  899             "ConfigVisualPanel2.rulesTable.columnModel.title0=Rule Name",
 
  900             "ConfigVisualPanel2.rulesTable.columnModel.title1=Description" 
  904             String colName = null;
 
  907                     colName = Bundle.ConfigVisualPanel2_rulesTable_columnModel_title0();
 
  910                     colName = Bundle.ConfigVisualPanel2_rulesTable_columnModel_title1();
 
  921             switch (columnIndex) {
 
  923                     ret = ruleName.get(rowIndex);
 
  926                     ret = ruleDescription.get(rowIndex);
 
  929                     ret = rule.get(rowIndex);
 
  932                     throw new UnsupportedOperationException(
"Invalid table column index: " + columnIndex); 
 
  943         public void setValueAt(Object aValue, 
int rowIndex, 
int columnIndex) {
 
  944             switch (columnIndex) {
 
  946                     ruleName.add((String) aValue);
 
  949                     ruleDescription.add((String) aValue);
 
  952                     rule.add((LogicalImagerRule) aValue);
 
  955                     throw new UnsupportedOperationException(
"Invalid table column index: " + columnIndex); 
 
  958             if (columnIndex < 2) {
 
  959                 super.setValueAt(aValue, rowIndex, columnIndex);
 
  969         private static final long serialVersionUID = 1L;
 
  971         private final List<String> list = 
new ArrayList<>();
 
  991             if (columnIndex == 0) {
 
  992                 ret = list.get(rowIndex);
 
  994                 throw new UnsupportedOperationException(
"Invalid table column index: " + columnIndex); 
 
 1005         public void setValueAt(Object aValue, 
int rowIndex, 
int columnIndex) {
 
 1006             if (columnIndex == 0) {
 
 1007                 list.add((String) aValue);
 
 1009                 throw new UnsupportedOperationException(
"Invalid table column index: " + columnIndex); 
 
void setValueAt(Object aValue, int rowIndex, int columnIndex)
String getColumnName(int column)
boolean isCellEditable(int rowIndex, int columnIndex)
String getColumnName(int column)
int compare(LogicalImagerRule a, LogicalImagerRule b)
final List< String > ruleDescription
Object getValueAt(int rowIndex, int columnIndex)
void setValueAt(Object aValue, int rowIndex, int columnIndex)
boolean isCellEditable(int rowIndex, int columnIndex)
Object getValueAt(int rowIndex, int columnIndex)