20 package org.sleuthkit.autopsy.casemodule;
 
   22 import java.nio.file.Paths;
 
   24 import java.util.logging.Level;
 
   25 import javax.swing.JOptionPane;
 
   26 import javax.swing.JPanel;
 
   27 import org.openide.DialogDescriptor;
 
   28 import org.openide.DialogDisplayer;
 
   29 import org.openide.NotifyDescriptor;
 
   30 import org.openide.util.NbBundle;
 
   31 import org.openide.util.actions.CallableSystemAction;
 
   38 class CasePropertiesPanel 
extends javax.swing.JPanel {
 
   40     private static final long serialVersionUID = 1L;
 
   41     private Case current = null;
 
   42     private static JPanel caller;    
 
   44     CasePropertiesPanel(Case currentCase, String crDate, String caseDir, Map<Long, String> imgPaths) 
throws CaseMetadata.CaseMetadataException {
 
   46         caseNameTextField.setText(currentCase.getDisplayName());
 
   47         String caseNumber = currentCase.getNumber();
 
   48         if (!caseNumber.isEmpty()) {
 
   49             caseNumberField.setText(caseNumber);
 
   51             caseNumberField.setText(
"N/A");
 
   53         String examiner = currentCase.getExaminer();
 
   54         if (!examiner.isEmpty()) {
 
   55             examinerField.setText(examiner);
 
   57             examinerField.setText(
"N/A");
 
   59         crDateField.setText(crDate);
 
   60         caseDirField.setText(caseDir);
 
   61         current = currentCase;
 
   63         CaseMetadata caseMetadata = currentCase.getCaseMetadata();
 
   64         if (caseMetadata.getCaseType() == Case.CaseType.SINGLE_USER_CASE) {
 
   65             dbNameField.setText(Paths.get(caseMetadata.getCaseDirectory(), caseMetadata.getCaseDatabaseName()).toString());
 
   67             dbNameField.setText(caseMetadata.getCaseDatabaseName());
 
   69         Case.CaseType caseType = caseMetadata.getCaseType();
 
   70         caseTypeField.setText(caseType.getLocalizedDisplayName());
 
   71         if (caseType == Case.CaseType.SINGLE_USER_CASE) {
 
   72             deleteCaseButton.setEnabled(
true);
 
   74             deleteCaseButton.setEnabled(
false);
 
   92     @SuppressWarnings(
"unchecked")
 
   94     private 
void initComponents() {
 
   96         jScrollPane1 = 
new javax.swing.JScrollPane();
 
   97         jTextArea1 = 
new javax.swing.JTextArea();
 
   98         jPanel1 = 
new javax.swing.JPanel();
 
   99         caseNameLabel = 
new javax.swing.JLabel();
 
  100         crDateLabel = 
new javax.swing.JLabel();
 
  101         caseDirLabel = 
new javax.swing.JLabel();
 
  102         caseNameTextField = 
new javax.swing.JTextField();
 
  103         updateCaseNameButton = 
new javax.swing.JButton();
 
  104         deleteCaseButton = 
new javax.swing.JButton();
 
  105         caseNumberLabel = 
new javax.swing.JLabel();
 
  106         examinerLabel = 
new javax.swing.JLabel();
 
  107         lbDbType = 
new javax.swing.JLabel();
 
  108         lbDbName = 
new javax.swing.JLabel();
 
  109         caseNumberField = 
new javax.swing.JLabel();
 
  110         examinerField = 
new javax.swing.JLabel();
 
  111         crDateField = 
new javax.swing.JLabel();
 
  112         caseDirField = 
new javax.swing.JLabel();
 
  113         dbNameField = 
new javax.swing.JLabel();
 
  114         caseTypeField = 
new javax.swing.JLabel();
 
  116         jTextArea1.setColumns(20);
 
  117         jTextArea1.setRows(5);
 
  118         jScrollPane1.setViewportView(jTextArea1);
 
  120         caseNameLabel.setFont(caseNameLabel.getFont().deriveFont(caseNameLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  121         caseNameLabel.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, 
"CasePropertiesPanel.caseNameLabel.text")); 
 
  123         crDateLabel.setFont(crDateLabel.getFont().deriveFont(crDateLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  124         crDateLabel.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, 
"CasePropertiesPanel.crDateLabel.text")); 
 
  126         caseDirLabel.setFont(caseDirLabel.getFont().deriveFont(caseDirLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  127         caseDirLabel.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, 
"CasePropertiesPanel.caseDirLabel.text")); 
 
  129         caseNameTextField.setFont(caseNameTextField.getFont().deriveFont(caseNameTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  130         caseNameTextField.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, 
"CasePropertiesPanel.caseNameTextField.text")); 
 
  132         updateCaseNameButton.setFont(updateCaseNameButton.getFont().deriveFont(updateCaseNameButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  133         updateCaseNameButton.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, 
"CasePropertiesPanel.updateCaseNameButton.text")); 
 
  134         updateCaseNameButton.addActionListener(
new java.awt.event.ActionListener() {
 
  135             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  136                 updateCaseNameButtonActionPerformed(evt);
 
  140         deleteCaseButton.setFont(deleteCaseButton.getFont().deriveFont(deleteCaseButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  141         deleteCaseButton.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, 
"CasePropertiesPanel.deleteCaseButton.text")); 
 
  142         deleteCaseButton.addActionListener(
new java.awt.event.ActionListener() {
 
  143             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  144                 deleteCaseButtonActionPerformed(evt);
 
  148         caseNumberLabel.setFont(caseNumberLabel.getFont().deriveFont(caseNumberLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  149         caseNumberLabel.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, 
"CasePropertiesPanel.caseNumberLabel.text")); 
 
  151         examinerLabel.setFont(examinerLabel.getFont().deriveFont(examinerLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  152         examinerLabel.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, 
"CasePropertiesPanel.examinerLabel.text")); 
 
  154         lbDbType.setFont(lbDbType.getFont().deriveFont(lbDbType.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  155         lbDbType.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, 
"CasePropertiesPanel.lbDbType.text")); 
 
  157         lbDbName.setFont(lbDbName.getFont().deriveFont(lbDbName.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  158         lbDbName.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, 
"CasePropertiesPanel.lbDbName.text")); 
 
  160         caseDirField.setMinimumSize(
new java.awt.Dimension(25, 14));
 
  162         dbNameField.setMinimumSize(
new java.awt.Dimension(25, 14));
 
  164         caseTypeField.setMaximumSize(
new java.awt.Dimension(1, 0));
 
  166         javax.swing.GroupLayout jPanel1Layout = 
new javax.swing.GroupLayout(jPanel1);
 
  167         jPanel1.setLayout(jPanel1Layout);
 
  168         jPanel1Layout.setHorizontalGroup(
 
  169             jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  170             .addGroup(jPanel1Layout.createSequentialGroup()
 
  172                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  173                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  174                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  175                             .addComponent(lbDbName)
 
  176                             .addComponent(lbDbType)
 
  177                             .addComponent(caseDirLabel))
 
  178                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  179                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  180                             .addComponent(caseDirField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  181                             .addComponent(caseTypeField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  182                             .addComponent(dbNameField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
 
  183                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  184                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  185                             .addComponent(crDateLabel)
 
  186                             .addComponent(examinerLabel)
 
  187                             .addComponent(caseNumberLabel))
 
  189                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  190                             .addComponent(examinerField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  191                             .addComponent(caseNumberField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  192                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  193                                 .addComponent(caseNameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 243, Short.MAX_VALUE)
 
  194                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  195                                 .addComponent(updateCaseNameButton, javax.swing.GroupLayout.PREFERRED_SIZE, 104, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  196                             .addComponent(crDateField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
 
  197                     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
 
  198                         .addGap(0, 0, Short.MAX_VALUE)
 
  199                         .addComponent(deleteCaseButton, javax.swing.GroupLayout.PREFERRED_SIZE, 106, javax.swing.GroupLayout.PREFERRED_SIZE)))
 
  201             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  202                 .addGroup(jPanel1Layout.createSequentialGroup()
 
  204                     .addComponent(caseNameLabel)
 
  205                     .addContainerGap(392, Short.MAX_VALUE)))
 
  207         jPanel1Layout.setVerticalGroup(
 
  208             jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  209             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
 
  211                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  212                     .addComponent(caseNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  213                     .addComponent(updateCaseNameButton))
 
  214                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  215                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  216                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  217                         .addComponent(caseNumberField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  218                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  219                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
 
  220                             .addComponent(examinerField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  221                             .addComponent(examinerLabel))
 
  222                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  223                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  224                             .addComponent(crDateField, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  225                             .addComponent(crDateLabel, javax.swing.GroupLayout.Alignment.TRAILING))
 
  226                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  227                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, 
false)
 
  228                             .addComponent(caseDirLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  229                             .addComponent(caseDirField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
 
  230                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  231                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  232                             .addComponent(caseTypeField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  233                             .addComponent(lbDbType))
 
  234                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  235                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  236                             .addComponent(lbDbName)
 
  237                             .addComponent(dbNameField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)))
 
  238                     .addComponent(caseNumberLabel))
 
  240                 .addComponent(deleteCaseButton)
 
  242             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  243                 .addGroup(jPanel1Layout.createSequentialGroup()
 
  245                     .addComponent(caseNameLabel)
 
  246                     .addContainerGap(173, Short.MAX_VALUE)))
 
  249         javax.swing.GroupLayout layout = 
new javax.swing.GroupLayout(
this);
 
  250         this.setLayout(layout);
 
  251         layout.setHorizontalGroup(
 
  252             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  253             .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  255         layout.setVerticalGroup(
 
  256             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  257             .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  266     private void updateCaseNameButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  267         String oldCaseName = Case.getCurrentCase().getDisplayName();
 
  268         String newCaseName = caseNameTextField.getText();
 
  270         if (!oldCaseName.equals(newCaseName)) {
 
  273             if (newCaseName.trim().isEmpty()) {
 
  274                 JOptionPane.showMessageDialog(caller,
 
  275                         NbBundle.getMessage(
this.getClass(),
 
  276                                 "CasePropertiesForm.updateCaseName.msgDlg.empty.msg"),
 
  277                         NbBundle.getMessage(
this.getClass(),
 
  278                                 "CasePropertiesForm.updateCaseName.msgDlg.empty.title"),
 
  279                         JOptionPane.ERROR_MESSAGE);
 
  283                 if (newCaseName.contains(
"\\") || newCaseName.contains(
"/") || newCaseName.contains(
":")
 
  284                         || newCaseName.contains(
"*") || newCaseName.contains(
"?") || newCaseName.contains(
"\"")
 
  285                         || newCaseName.contains(
"<") || newCaseName.contains(
">") || newCaseName.contains(
"|")) {
 
  286                     String errorMsg = NbBundle
 
  287                             .getMessage(this.getClass(), 
"CasePropertiesForm.updateCaseName.msgDlg.invalidSymbols.msg");
 
  288                     JOptionPane.showMessageDialog(caller, errorMsg,
 
  289                             NbBundle.getMessage(
this.getClass(),
 
  290                                     "CasePropertiesForm.updateCaseName.msgDlg.invalidSymbols.title"),
 
  291                             JOptionPane.ERROR_MESSAGE);
 
  294                     String confMsg = NbBundle
 
  295                             .getMessage(this.getClass(), 
"CasePropertiesForm.updateCaseName.confMsg.msg", oldCaseName,
 
  297                     NotifyDescriptor d = 
new NotifyDescriptor.Confirmation(confMsg,
 
  298                             NbBundle.getMessage(
this.getClass(),
 
  299                                     "CasePropertiesForm.updateCaseName.confMsg.title"),
 
  300                             NotifyDescriptor.YES_NO_OPTION, NotifyDescriptor.WARNING_MESSAGE);
 
  301                     d.setValue(NotifyDescriptor.NO_OPTION);
 
  303                     Object res = DialogDisplayer.getDefault().notify(d);
 
  304                     if (res != null && res == DialogDescriptor.YES_OPTION) {
 
  306                         String oldPath = current.getCaseMetadata().getFilePath().toString();
 
  308                             current.updateCaseName(oldCaseName, oldPath, newCaseName, oldPath);
 
  309                         } 
catch (CaseActionException ex) {
 
  310                             Logger.getLogger(CasePropertiesPanel.class.getName()).log(Level.WARNING, 
"Error: problem updating case name.", ex); 
 
  318     private void deleteCaseButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  319         CallableSystemAction.get(CaseDeleteAction.class).actionPerformed(evt);
 
  324     private javax.swing.JLabel caseDirField;
 
  325     private javax.swing.JLabel caseDirLabel;
 
  326     private javax.swing.JLabel caseNameLabel;
 
  327     private javax.swing.JTextField caseNameTextField;
 
  328     private javax.swing.JLabel caseNumberField;
 
  329     private javax.swing.JLabel caseNumberLabel;
 
  330     private javax.swing.JLabel caseTypeField;
 
  331     private javax.swing.JLabel crDateField;
 
  332     private javax.swing.JLabel crDateLabel;
 
  333     private javax.swing.JLabel dbNameField;
 
  334     private javax.swing.JButton deleteCaseButton;
 
  335     private javax.swing.JLabel examinerField;
 
  336     private javax.swing.JLabel examinerLabel;
 
  337     private javax.swing.JPanel jPanel1;
 
  338     private javax.swing.JScrollPane jScrollPane1;
 
  339     private javax.swing.JTextArea jTextArea1;
 
  340     private javax.swing.JLabel lbDbName;
 
  341     private javax.swing.JLabel lbDbType;
 
  342     private javax.swing.JButton updateCaseNameButton;