19 package org.sleuthkit.autopsy.directorytree;
 
   21 import java.util.ArrayList;
 
   22 import java.util.Collections;
 
   23 import javax.swing.DefaultListModel;
 
   24 import javax.swing.JOptionPane;
 
   25 import javax.swing.event.ListSelectionEvent;
 
   26 import javax.swing.event.ListSelectionListener;
 
   27 import org.netbeans.spi.options.OptionsPanelController;
 
   28 import org.openide.util.NbBundle;
 
   37 final class ExternalViewerGlobalSettingsPanel 
extends javax.swing.JPanel implements OptionsPanel {
 
   39     private static final Logger LOGGER = Logger.
getLogger(ExternalViewerGlobalSettingsPanel.class.getName());
 
   40     private DefaultListModel<ExternalViewerRule> rulesListModel;
 
   41     private java.util.List<ExternalViewerRule> rules;
 
   46     public ExternalViewerGlobalSettingsPanel() {
 
   48         customizeComponents();
 
   54     private void customizeComponents() {
 
   55         rulesListModel = 
new DefaultListModel<>();
 
   56         rules = 
new ArrayList<>();
 
   57         rulesList.setModel(rulesListModel);
 
   58         rulesList.addListSelectionListener(
new ListSelectionListener() {
 
   60             public void valueChanged(ListSelectionEvent e) {
 
   61                 if (e.getValueIsAdjusting() == 
false) {
 
   62                     if (rulesList.getSelectedIndex() == -1) {
 
   77     @SuppressWarnings(
"unchecked")
 
   79     private 
void initComponents() {
 
   81         jPanel1 = 
new javax.swing.JPanel();
 
   82         externalViewerTitleLabel = 
new javax.swing.JLabel();
 
   83         jScrollPane1 = 
new javax.swing.JScrollPane();
 
   84         jSplitPane1 = 
new javax.swing.JSplitPane();
 
   85         exePanel = 
new javax.swing.JPanel();
 
   86         exePathLabel = 
new javax.swing.JLabel();
 
   87         exePathNameLabel = 
new javax.swing.JLabel();
 
   88         rulesPanel = 
new javax.swing.JPanel();
 
   89         ruleListLabel = 
new javax.swing.JLabel();
 
   90         rulesScrollPane = 
new javax.swing.JScrollPane();
 
   91         rulesList = 
new javax.swing.JList<>();
 
   92         newRuleButton = 
new javax.swing.JButton();
 
   93         editRuleButton = 
new javax.swing.JButton();
 
   94         deleteRuleButton = 
new javax.swing.JButton();
 
   96         setPreferredSize(
new java.awt.Dimension(750, 500));
 
   98         org.openide.awt.Mnemonics.setLocalizedText(externalViewerTitleLabel, 
org.openide.util.NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class, 
"ExternalViewerGlobalSettingsPanel.externalViewerTitleLabel.text")); 
 
  100         jSplitPane1.setDividerLocation(350);
 
  101         jSplitPane1.setDividerSize(1);
 
  103         org.openide.awt.Mnemonics.setLocalizedText(exePathLabel, 
org.openide.util.NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class, 
"ExternalViewerGlobalSettingsPanel.exePathLabel.text")); 
 
  105         org.openide.awt.Mnemonics.setLocalizedText(exePathNameLabel, 
org.openide.util.NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class, 
"ExternalViewerGlobalSettingsPanel.exePathNameLabel.text")); 
 
  107         javax.swing.GroupLayout exePanelLayout = 
new javax.swing.GroupLayout(exePanel);
 
  108         exePanel.setLayout(exePanelLayout);
 
  109         exePanelLayout.setHorizontalGroup(
 
  110             exePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  111             .addGroup(exePanelLayout.createSequentialGroup()
 
  113                 .addGroup(exePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  114                     .addComponent(exePathLabel)
 
  115                     .addComponent(exePathNameLabel))
 
  116                 .addContainerGap(159, Short.MAX_VALUE))
 
  118         exePanelLayout.setVerticalGroup(
 
  119             exePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  120             .addGroup(exePanelLayout.createSequentialGroup()
 
  122                 .addComponent(exePathLabel)
 
  123                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  124                 .addComponent(exePathNameLabel)
 
  125                 .addContainerGap(408, Short.MAX_VALUE))
 
  128         jSplitPane1.setRightComponent(exePanel);
 
  130         org.openide.awt.Mnemonics.setLocalizedText(ruleListLabel, 
org.openide.util.NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class, 
"ExternalViewerGlobalSettingsPanel.ruleListLabel.text")); 
 
  132         rulesScrollPane.setViewportView(rulesList);
 
  134         newRuleButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/add16.png"))); 
 
  135         org.openide.awt.Mnemonics.setLocalizedText(newRuleButton, 
org.openide.util.NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class, 
"ExternalViewerGlobalSettingsPanel.newRuleButton.text")); 
 
  136         newRuleButton.addActionListener(
new java.awt.event.ActionListener() {
 
  137             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  138                 newRuleButtonActionPerformed(evt);
 
  142         editRuleButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/edit16.png"))); 
 
  143         org.openide.awt.Mnemonics.setLocalizedText(editRuleButton, 
org.openide.util.NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class, 
"ExternalViewerGlobalSettingsPanel.editRuleButton.text")); 
 
  144         editRuleButton.addActionListener(
new java.awt.event.ActionListener() {
 
  145             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  146                 editRuleButtonActionPerformed(evt);
 
  150         deleteRuleButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/delete16.png"))); 
 
  151         org.openide.awt.Mnemonics.setLocalizedText(deleteRuleButton, 
org.openide.util.NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class, 
"ExternalViewerGlobalSettingsPanel.deleteRuleButton.text")); 
 
  152         deleteRuleButton.addActionListener(
new java.awt.event.ActionListener() {
 
  153             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  154                 deleteRuleButtonActionPerformed(evt);
 
  158         javax.swing.GroupLayout rulesPanelLayout = 
new javax.swing.GroupLayout(rulesPanel);
 
  159         rulesPanel.setLayout(rulesPanelLayout);
 
  160         rulesPanelLayout.setHorizontalGroup(
 
  161             rulesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  162             .addGroup(rulesPanelLayout.createSequentialGroup()
 
  164                 .addGroup(rulesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  165                     .addGroup(rulesPanelLayout.createSequentialGroup()
 
  166                         .addGroup(rulesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  167                             .addComponent(ruleListLabel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  168                             .addGroup(rulesPanelLayout.createSequentialGroup()
 
  169                                 .addComponent(rulesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 311, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  170                                 .addGap(0, 0, Short.MAX_VALUE)))
 
  172                     .addGroup(rulesPanelLayout.createSequentialGroup()
 
  173                         .addComponent(newRuleButton)
 
  174                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  175                         .addComponent(editRuleButton)
 
  176                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  177                         .addComponent(deleteRuleButton)
 
  178                         .addGap(0, 0, Short.MAX_VALUE))))
 
  180         rulesPanelLayout.setVerticalGroup(
 
  181             rulesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  182             .addGroup(rulesPanelLayout.createSequentialGroup()
 
  184                 .addComponent(ruleListLabel)
 
  185                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  186                 .addComponent(rulesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
 
  187                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  188                 .addGroup(rulesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  189                     .addComponent(newRuleButton)
 
  190                     .addComponent(editRuleButton)
 
  191                     .addComponent(deleteRuleButton))
 
  195         jSplitPane1.setLeftComponent(rulesPanel);
 
  197         jScrollPane1.setViewportView(jSplitPane1);
 
  199         javax.swing.GroupLayout jPanel1Layout = 
new javax.swing.GroupLayout(jPanel1);
 
  200         jPanel1.setLayout(jPanel1Layout);
 
  201         jPanel1Layout.setHorizontalGroup(
 
  202             jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  203             .addGroup(jPanel1Layout.createSequentialGroup()
 
  205                 .addComponent(externalViewerTitleLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 777, Short.MAX_VALUE)
 
  207             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  208                 .addGroup(jPanel1Layout.createSequentialGroup()
 
  210                     .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 777, Short.MAX_VALUE)
 
  213         jPanel1Layout.setVerticalGroup(
 
  214             jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  215             .addGroup(jPanel1Layout.createSequentialGroup()
 
  217                 .addComponent(externalViewerTitleLabel)
 
  218                 .addContainerGap(475, Short.MAX_VALUE))
 
  219             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  220                 .addGroup(jPanel1Layout.createSequentialGroup()
 
  222                     .addComponent(jScrollPane1)
 
  226         javax.swing.GroupLayout layout = 
new javax.swing.GroupLayout(
this);
 
  227         this.setLayout(layout);
 
  228         layout.setHorizontalGroup(
 
  229             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  230             .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  232         layout.setVerticalGroup(
 
  233             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  234             .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  238     private void newRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  239         AddExternalViewerRuleDialog dialog = 
new AddExternalViewerRuleDialog();
 
  240         AddExternalViewerRuleDialog.BUTTON_PRESSED result = dialog.getResult();
 
  241         if (result == AddExternalViewerRuleDialog.BUTTON_PRESSED.OK) {
 
  242             ExternalViewerRule newRule = dialog.getRule();
 
  244             if (rules.contains(newRule)) {
 
  245                 JOptionPane.showMessageDialog(null,
 
  246                         NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class, 
"ExternalViewerGlobalSettingsPanel.JOptionPane.ruleAlreadyExists.message"),
 
  247                         NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class, 
"ExternalViewerGlobalSettingsPanel.JOptionPane.ruleAlreadyExists.title"),
 
  248                         JOptionPane.ERROR_MESSAGE);
 
  251                 updateRulesListModel();
 
  252                 int index = rules.indexOf(newRule);
 
  253                 rulesList.setSelectedIndex(index);
 
  255                 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  260     private void editRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  261         int selected = rulesList.getSelectedIndex();
 
  262         AddExternalViewerRuleDialog dialog = 
new AddExternalViewerRuleDialog(rulesListModel.get(rulesList.getSelectedIndex()));
 
  263         AddExternalViewerRuleDialog.BUTTON_PRESSED result = dialog.getResult();
 
  264         if (result == AddExternalViewerRuleDialog.BUTTON_PRESSED.OK) {
 
  265             rules.remove(selected);
 
  266             ExternalViewerRule newRule = dialog.getRule();
 
  268             if (rules.contains(newRule)) {
 
  269                 JOptionPane.showMessageDialog(null,
 
  270                         NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class, 
"ExternalViewerGlobalSettingsPanel.JOptionPane.ruleAlreadyExists.message"),
 
  271                         NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class, 
"ExternalViewerGlobalSettingsPanel.JOptionPane.ruleAlreadyExists.title"),
 
  272                         JOptionPane.ERROR_MESSAGE);
 
  274                 rules.add(selected, dialog.getRule());
 
  275                 updateRulesListModel();
 
  276                 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  279         rulesList.setSelectedIndex(selected);
 
  283     private void deleteRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  284         ExternalViewerRule rule = rulesList.getSelectedValue();
 
  286         updateRulesListModel();
 
  287         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  291     public void store() {
 
  292         ExternalViewerRulesManager.getInstance().setUserRules(rules);
 
  297         rules = ExternalViewerRulesManager.getInstance().getUserRules();
 
  298         updateRulesListModel();
 
  305     private void enableButtons() {
 
  306         boolean ruleIsSelected = rulesList.getSelectedIndex() != -1;
 
  307         editRuleButton.setEnabled(ruleIsSelected);
 
  308         deleteRuleButton.setEnabled(ruleIsSelected);
 
  315     private void updateRulesListModel() {
 
  316         rulesListModel.clear();
 
  317         Collections.sort(rules);
 
  318         for (ExternalViewerRule rule : rules) {
 
  319             rulesListModel.addElement(rule);
 
  326     private void populateExePath() {
 
  327         ExternalViewerRule rule = rulesList.getSelectedValue();
 
  329             if (rule.getRuleType() == ExternalViewerRule.RuleType.MIME) {
 
  330                 exePathLabel.setText(NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class,
 
  331                         "ExternalViewerGlobalSettingsPanel.exePathLabel.MIME.text"));
 
  333                 exePathLabel.setText(NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class,
 
  334                         "ExternalViewerGlobalSettingsPanel.exePathLabel.EXT.text"));
 
  336             exePathNameLabel.setText(rule.getExePath());
 
  344     private void clearExePath() {
 
  345         rulesList.clearSelection();
 
  346         exePathLabel.setText(NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class,
 
  347                 "ExternalViewerGlobalSettingsPanel.exePathLabel.text"));
 
  348         exePathNameLabel.setText(NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class,
 
  349                 "ExternalViewerGlobalSettingsPanel.exePathLabel.empty.text"));
 
  354     private javax.swing.JButton deleteRuleButton;
 
  355     private javax.swing.JButton editRuleButton;
 
  356     private javax.swing.JPanel exePanel;
 
  357     private javax.swing.JLabel exePathLabel;
 
  358     private javax.swing.JLabel exePathNameLabel;
 
  359     private javax.swing.JLabel externalViewerTitleLabel;
 
  360     private javax.swing.JPanel jPanel1;
 
  361     private javax.swing.JScrollPane jScrollPane1;
 
  362     private javax.swing.JSplitPane jSplitPane1;
 
  363     private javax.swing.JButton newRuleButton;
 
  364     private javax.swing.JLabel ruleListLabel;
 
  365     private javax.swing.JList<ExternalViewerRule> rulesList;
 
  366     private javax.swing.JPanel rulesPanel;
 
  367     private javax.swing.JScrollPane rulesScrollPane;
 
synchronized static Logger getLogger(String name)