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;