25 package org.sleuthkit.autopsy.casemodule;
 
   29 import java.util.logging.Level;
 
   30 import javax.swing.JOptionPane;
 
   31 import javax.swing.JPanel;
 
   32 import org.openide.DialogDescriptor;
 
   33 import org.openide.DialogDisplayer;
 
   34 import org.openide.NotifyDescriptor;
 
   35 import org.openide.util.NbBundle;
 
   36 import org.openide.util.actions.CallableSystemAction;
 
   43 class CasePropertiesForm 
extends javax.swing.JPanel {
 
   45     private static final long serialVersionUID = 1L;
 
   47     private Case current = null;
 
   48     private static JPanel caller;    
 
   52     private String shrinkPath(String path, 
int targetLength) {
 
   53         if (path.length() > targetLength) {
 
   56             int partsLength = targetLength - fill.length();
 
   58             String front = path.substring(0, partsLength / 4);
 
   59             int frontSep = front.lastIndexOf(File.separatorChar);
 
   61                 front = front.substring(0, frontSep + 1);
 
   64             String back = path.substring(partsLength * 3 / 4);
 
   65             int backSep = back.indexOf(File.separatorChar);
 
   67                 back = back.substring(backSep);
 
   69             return back + fill + front;
 
   78     CasePropertiesForm(Case currentCase, String crDate, String caseDir, Map<Long, String> imgPaths) 
throws CaseMetadata.CaseMetadataException {
 
   80         caseNameTextField.setText(currentCase.getName());
 
   81         String caseNumber = currentCase.getNumber();
 
   82         if (!caseNumber.equals(
"")) {
 
   83             caseNumberField.setText(caseNumber);
 
   85             caseNumberField.setText(
"N/A");
 
   87         String examiner = currentCase.getExaminer();
 
   88         if (!examiner.equals(
"")) {
 
   89             examinerField.setText(examiner);
 
   91             examinerField.setText(
"N/A");
 
   93         crDateField.setText(crDate);
 
   94         caseDirField.setText(caseDir);
 
   95         current = currentCase;
 
   97         CaseMetadata caseMetadata = currentCase.getCaseMetadata();
 
   98         if (caseMetadata.getCaseType() == Case.CaseType.SINGLE_USER_CASE) {
 
   99             dbNameField.setText(caseMetadata.getCaseDatabasePath());
 
  101             dbNameField.setText(caseMetadata.getCaseDatabaseName());
 
  103         Case.CaseType caseType = caseMetadata.getCaseType();
 
  104         caseTypeField.setText(caseType.getLocalizedDisplayName());
 
  105         if (caseType == Case.CaseType.SINGLE_USER_CASE) {
 
  106             deleteCaseButton.setEnabled(
true);
 
  108             deleteCaseButton.setEnabled(
false);
 
  126     @SuppressWarnings(
"unchecked")
 
  128     private 
void initComponents() {
 
  130         jScrollPane1 = 
new javax.swing.JScrollPane();
 
  131         jTextArea1 = 
new javax.swing.JTextArea();
 
  132         jPanel1 = 
new javax.swing.JPanel();
 
  133         caseNameLabel = 
new javax.swing.JLabel();
 
  134         crDateLabel = 
new javax.swing.JLabel();
 
  135         caseDirLabel = 
new javax.swing.JLabel();
 
  136         caseNameTextField = 
new javax.swing.JTextField();
 
  137         updateCaseNameButton = 
new javax.swing.JButton();
 
  138         deleteCaseButton = 
new javax.swing.JButton();
 
  139         caseNumberLabel = 
new javax.swing.JLabel();
 
  140         examinerLabel = 
new javax.swing.JLabel();
 
  141         lbDbType = 
new javax.swing.JLabel();
 
  142         lbDbName = 
new javax.swing.JLabel();
 
  143         caseNumberField = 
new javax.swing.JLabel();
 
  144         examinerField = 
new javax.swing.JLabel();
 
  145         crDateField = 
new javax.swing.JLabel();
 
  146         caseDirField = 
new javax.swing.JLabel();
 
  147         dbNameField = 
new javax.swing.JLabel();
 
  148         caseTypeField = 
new javax.swing.JLabel();
 
  150         jTextArea1.setColumns(20);
 
  151         jTextArea1.setRows(5);
 
  152         jScrollPane1.setViewportView(jTextArea1);
 
  154         caseNameLabel.setFont(caseNameLabel.getFont().deriveFont(caseNameLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  155         caseNameLabel.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, 
"CasePropertiesForm.caseNameLabel.text")); 
 
  157         crDateLabel.setFont(crDateLabel.getFont().deriveFont(crDateLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  158         crDateLabel.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, 
"CasePropertiesForm.crDateLabel.text")); 
 
  160         caseDirLabel.setFont(caseDirLabel.getFont().deriveFont(caseDirLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  161         caseDirLabel.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, 
"CasePropertiesForm.caseDirLabel.text")); 
 
  163         caseNameTextField.setFont(caseNameTextField.getFont().deriveFont(caseNameTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  164         caseNameTextField.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, 
"CasePropertiesForm.caseNameTextField.text")); 
 
  165         caseNameTextField.addActionListener(
new java.awt.event.ActionListener() {
 
  166             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  167                 caseNameTextFieldActionPerformed(evt);
 
  171         updateCaseNameButton.setFont(updateCaseNameButton.getFont().deriveFont(updateCaseNameButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  172         updateCaseNameButton.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, 
"CasePropertiesForm.updateCaseNameButton.text")); 
 
  173         updateCaseNameButton.addActionListener(
new java.awt.event.ActionListener() {
 
  174             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  175                 updateCaseNameButtonActionPerformed(evt);
 
  179         deleteCaseButton.setFont(deleteCaseButton.getFont().deriveFont(deleteCaseButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  180         deleteCaseButton.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, 
"CasePropertiesForm.deleteCaseButton.text")); 
 
  181         deleteCaseButton.addActionListener(
new java.awt.event.ActionListener() {
 
  182             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  183                 deleteCaseButtonActionPerformed(evt);
 
  187         caseNumberLabel.setFont(caseNumberLabel.getFont().deriveFont(caseNumberLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  188         caseNumberLabel.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, 
"CasePropertiesForm.caseNumberLabel.text")); 
 
  190         examinerLabel.setFont(examinerLabel.getFont().deriveFont(examinerLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  191         examinerLabel.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, 
"CasePropertiesForm.examinerLabel.text")); 
 
  193         lbDbType.setFont(lbDbType.getFont().deriveFont(lbDbType.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  194         lbDbType.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, 
"CasePropertiesForm.lbDbType.text")); 
 
  196         lbDbName.setFont(lbDbName.getFont().deriveFont(lbDbName.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  197         lbDbName.setText(
org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, 
"CasePropertiesForm.lbDbName.text")); 
 
  199         caseDirField.setMinimumSize(
new java.awt.Dimension(25, 14));
 
  201         dbNameField.setMinimumSize(
new java.awt.Dimension(25, 14));
 
  203         caseTypeField.setMaximumSize(
new java.awt.Dimension(1, 0));
 
  205         javax.swing.GroupLayout jPanel1Layout = 
new javax.swing.GroupLayout(jPanel1);
 
  206         jPanel1.setLayout(jPanel1Layout);
 
  207         jPanel1Layout.setHorizontalGroup(
 
  208             jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  209             .addGroup(jPanel1Layout.createSequentialGroup()
 
  211                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  212                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  213                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  214                             .addComponent(lbDbName)
 
  215                             .addComponent(lbDbType)
 
  216                             .addComponent(caseDirLabel))
 
  217                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  218                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  219                             .addComponent(caseDirField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  220                             .addComponent(caseTypeField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  221                             .addComponent(dbNameField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
 
  222                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  223                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  224                             .addComponent(crDateLabel)
 
  225                             .addComponent(examinerLabel)
 
  226                             .addComponent(caseNumberLabel))
 
  228                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  229                             .addComponent(examinerField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  230                             .addComponent(caseNumberField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  231                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  232                                 .addComponent(caseNameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 243, Short.MAX_VALUE)
 
  233                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  234                                 .addComponent(updateCaseNameButton, javax.swing.GroupLayout.PREFERRED_SIZE, 104, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  235                             .addComponent(crDateField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
 
  236                     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
 
  237                         .addGap(0, 0, Short.MAX_VALUE)
 
  238                         .addComponent(deleteCaseButton, javax.swing.GroupLayout.PREFERRED_SIZE, 106, javax.swing.GroupLayout.PREFERRED_SIZE)))
 
  240             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  241                 .addGroup(jPanel1Layout.createSequentialGroup()
 
  243                     .addComponent(caseNameLabel)
 
  244                     .addContainerGap(392, Short.MAX_VALUE)))
 
  246         jPanel1Layout.setVerticalGroup(
 
  247             jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  248             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
 
  250                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  251                     .addComponent(caseNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  252                     .addComponent(updateCaseNameButton))
 
  253                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  254                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  255                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  256                         .addComponent(caseNumberField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  257                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  258                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
 
  259                             .addComponent(examinerField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  260                             .addComponent(examinerLabel))
 
  261                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  262                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  263                             .addComponent(crDateField, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  264                             .addComponent(crDateLabel, javax.swing.GroupLayout.Alignment.TRAILING))
 
  265                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  266                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, 
false)
 
  267                             .addComponent(caseDirLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  268                             .addComponent(caseDirField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
 
  269                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  270                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  271                             .addComponent(caseTypeField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  272                             .addComponent(lbDbType))
 
  273                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  274                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  275                             .addComponent(lbDbName)
 
  276                             .addComponent(dbNameField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)))
 
  277                     .addComponent(caseNumberLabel))
 
  279                 .addComponent(deleteCaseButton)
 
  281             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  282                 .addGroup(jPanel1Layout.createSequentialGroup()
 
  284                     .addComponent(caseNameLabel)
 
  285                     .addContainerGap(173, Short.MAX_VALUE)))
 
  288         javax.swing.GroupLayout layout = 
new javax.swing.GroupLayout(
this);
 
  289         this.setLayout(layout);
 
  290         layout.setHorizontalGroup(
 
  291             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  292             .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  294         layout.setVerticalGroup(
 
  295             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  296             .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  305     private void updateCaseNameButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  306         String oldCaseName = Case.getCurrentCase().getName();
 
  307         String newCaseName = caseNameTextField.getText();
 
  309         if (!oldCaseName.equals(newCaseName)) {
 
  312             if (newCaseName.trim().equals(
"")) {
 
  313                 JOptionPane.showMessageDialog(caller,
 
  314                         NbBundle.getMessage(
this.getClass(),
 
  315                                 "CasePropertiesForm.updateCaseName.msgDlg.empty.msg"),
 
  316                         NbBundle.getMessage(
this.getClass(),
 
  317                                 "CasePropertiesForm.updateCaseName.msgDlg.empty.title"),
 
  318                         JOptionPane.ERROR_MESSAGE);
 
  321             if (newCaseName.contains(
"\\") || newCaseName.contains(
"/") || newCaseName.contains(
":")
 
  322                     || newCaseName.contains(
"*") || newCaseName.contains(
"?") || newCaseName.contains(
"\"")
 
  323                     || newCaseName.contains(
"<") || newCaseName.contains(
">") || newCaseName.contains(
"|")) {
 
  324                 String errorMsg = NbBundle
 
  325                         .getMessage(this.getClass(), 
"CasePropertiesForm.updateCaseName.msgDlg.invalidSymbols.msg");
 
  326                 JOptionPane.showMessageDialog(caller, errorMsg,
 
  327                         NbBundle.getMessage(
this.getClass(),
 
  328                                 "CasePropertiesForm.updateCaseName.msgDlg.invalidSymbols.title"),
 
  329                         JOptionPane.ERROR_MESSAGE);
 
  332                 String confMsg = NbBundle
 
  333                         .getMessage(this.getClass(), 
"CasePropertiesForm.updateCaseName.confMsg.msg", oldCaseName,
 
  335                 NotifyDescriptor d = 
new NotifyDescriptor.Confirmation(confMsg,
 
  336                         NbBundle.getMessage(
this.getClass(),
 
  337                                 "CasePropertiesForm.updateCaseName.confMsg.title"),
 
  338                         NotifyDescriptor.YES_NO_OPTION, NotifyDescriptor.WARNING_MESSAGE);
 
  339                 d.setValue(NotifyDescriptor.NO_OPTION);
 
  341                 Object res = DialogDisplayer.getDefault().notify(d);
 
  342                 if (res != null && res == DialogDescriptor.YES_OPTION) {
 
  344                     String oldPath = current.getCaseMetadata().getFilePath().toString();
 
  346                         current.updateCaseName(oldCaseName, oldPath, newCaseName, oldPath);
 
  347                     } 
catch (Exception ex) {
 
  348                         Logger.getLogger(CasePropertiesForm.class.getName()).log(Level.WARNING, 
"Error: problem updating case name.", ex); 
 
  355     private void deleteCaseButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  356         CallableSystemAction.get(CaseDeleteAction.class).actionPerformed(evt);
 
  359     private void caseNameTextFieldActionPerformed(java.awt.event.ActionEvent evt) {
 
  365     private javax.swing.JLabel caseDirField;
 
  366     private javax.swing.JLabel caseDirLabel;
 
  367     private javax.swing.JLabel caseNameLabel;
 
  368     private javax.swing.JTextField caseNameTextField;
 
  369     private javax.swing.JLabel caseNumberField;
 
  370     private javax.swing.JLabel caseNumberLabel;
 
  371     private javax.swing.JLabel caseTypeField;
 
  372     private javax.swing.JLabel crDateField;
 
  373     private javax.swing.JLabel crDateLabel;
 
  374     private javax.swing.JLabel dbNameField;
 
  375     private javax.swing.JButton deleteCaseButton;
 
  376     private javax.swing.JLabel examinerField;
 
  377     private javax.swing.JLabel examinerLabel;
 
  378     private javax.swing.JPanel jPanel1;
 
  379     private javax.swing.JScrollPane jScrollPane1;
 
  380     private javax.swing.JTextArea jTextArea1;
 
  381     private javax.swing.JLabel lbDbName;
 
  382     private javax.swing.JLabel lbDbType;
 
  383     private javax.swing.JButton updateCaseNameButton;