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;