19 package org.sleuthkit.autopsy.modules.filetypeid;
21 import java.awt.EventQueue;
22 import java.beans.PropertyChangeEvent;
23 import java.beans.PropertyChangeListener;
24 import java.util.Collections;
25 import java.util.List;
26 import java.util.logging.Level;
27 import javax.swing.DefaultComboBoxModel;
28 import javax.swing.DefaultListModel;
29 import javax.swing.JOptionPane;
30 import javax.swing.event.ListSelectionEvent;
31 import javax.swing.event.ListSelectionListener;
32 import org.netbeans.spi.options.OptionsPanelController;
33 import org.openide.util.NbBundle;
46 final class FileTypeIdGlobalSettingsPanel
extends IngestModuleGlobalSettingsPanel implements OptionsPanel {
47 private static final long serialVersionUID = 1L;
48 private static final Logger logger = Logger.getLogger(FileTypeIdGlobalSettingsPanel.class.getName());
50 private static final String RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.signatureComboBox.rawItem");
51 private static final String ASCII_SIGNATURE_TYPE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.signatureComboBox.asciiItem");
53 private static final String START_OFFSET_RELATIVE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.offsetComboBox.startItem");
54 private static final String END_OFFSET_RELATIVE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.offsetComboBox.endItem");
62 private DefaultListModel<FileType> typesListModel;
63 private java.util.List<FileType> fileTypes;
64 private DefaultListModel<Signature> signaturesListModel;
75 IngestJobEventPropertyChangeListener ingestJobEventsListener;
80 FileTypeIdGlobalSettingsPanel() {
82 customizeComponents();
83 addIngestJobEventsListener();
90 @NbBundle.Messages({
"FileTypeIdGlobalSettingsPanel.Title=Global File Type Identification Settings"})
91 private void customizeComponents() {
92 setName(Bundle.FileTypeIdGlobalSettingsPanel_Title());
93 setFileTypesListModel();
94 setSignaturesListModel();
95 setSignatureTypeComboBoxModel();
96 setOffsetRealtiveToComboBoxModel();
97 addTypeListSelectionListener();
98 populateTypeDetailsComponents();
104 private void setFileTypesListModel() {
105 typesListModel =
new DefaultListModel<>();
106 typesList.setModel(typesListModel);
109 private void setSignaturesListModel() {
110 this.signaturesListModel =
new DefaultListModel<>();
111 signatureList.setModel(signaturesListModel);
117 private void setSignatureTypeComboBoxModel() {
118 DefaultComboBoxModel<String> sigTypeComboBoxModel =
new DefaultComboBoxModel<>();
119 sigTypeComboBoxModel.addElement(FileTypeIdGlobalSettingsPanel.RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM);
120 sigTypeComboBoxModel.addElement(FileTypeIdGlobalSettingsPanel.ASCII_SIGNATURE_TYPE_COMBO_BOX_ITEM);
126 private void setOffsetRealtiveToComboBoxModel() {
127 DefaultComboBoxModel<String> offsetRelComboBoxModel =
new DefaultComboBoxModel<>();
128 offsetRelComboBoxModel.addElement(FileTypeIdGlobalSettingsPanel.START_OFFSET_RELATIVE_COMBO_BOX_ITEM);
129 offsetRelComboBoxModel.addElement(FileTypeIdGlobalSettingsPanel.END_OFFSET_RELATIVE_COMBO_BOX_ITEM);
137 private void addTypeListSelectionListener() {
138 typesList.addListSelectionListener(
new ListSelectionListener() {
140 public void valueChanged(ListSelectionEvent e) {
141 if (e.getValueIsAdjusting() ==
false) {
142 if (typesList.getSelectedIndex() == -1) {
143 clearTypeDetailsComponents();
145 populateTypeDetailsComponents();
161 private void addIngestJobEventsListener() {
162 ingestJobEventsListener =
new IngestJobEventPropertyChangeListener();
163 IngestManager.getInstance().addIngestJobEventListener(ingestJobEventsListener);
173 EventQueue.invokeLater(
new Runnable() {
186 private void enableButtons() {
188 newTypeButton.setEnabled(!ingestIsRunning);
190 boolean fileTypeIsSelected = typesList.getSelectedIndex() != -1;
191 deleteTypeButton.setEnabled(!ingestIsRunning && fileTypeIsSelected);
192 editTypeButton.setEnabled(!ingestIsRunning && fileTypeIsSelected);
194 ingestRunningWarningLabel.setVisible(ingestIsRunning);
203 fileTypes = CustomFileTypesManager.getInstance().getUserDefinedFileTypes();
204 updateFileTypesListModel();
205 if (!typesListModel.isEmpty()) {
206 typesList.setSelectedIndex(0);
208 }
catch (CustomFileTypesException ex) {
209 logger.log(Level.SEVERE,
"Failed to get custom file types", ex);
210 JOptionPane.showMessageDialog(null,
211 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.loadFileTypes.errorMessage"),
212 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.loadFailed.title"),
213 JOptionPane.ERROR_MESSAGE);
214 fileTypes = Collections.emptyList();
222 private void updateFileTypesListModel() {
223 typesListModel.clear();
224 for (FileType fileType : fileTypes) {
225 typesListModel.addElement(fileType);
234 private void populateTypeDetailsComponents() {
235 FileType fileType = typesList.getSelectedValue();
236 this.signatureList.setEnabled(
false);
237 if (null != fileType) {
238 List<Signature> signatures = fileType.getSignatures();
239 this.signaturesListModel.clear();
240 for (Signature sig : signatures) {
241 signaturesListModel.addElement(sig);
251 private void clearTypeDetailsComponents() {
252 typesList.clearSelection();
253 this.signaturesListModel.clear();
261 public void store() {
263 CustomFileTypesManager.getInstance().setUserDefinedFileTypes(fileTypes);
264 }
catch (CustomFileTypesManager.CustomFileTypesException ex) {
265 logger.log(Level.SEVERE,
"Failed to set custom file types", ex);
266 JOptionPane.showMessageDialog(null,
267 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.saveFileTypes.errorMessage"),
268 NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.JOptionPane.storeFailed.title"),
269 JOptionPane.ERROR_MESSAGE);
277 public void saveSettings() {
285 @SuppressWarnings(
"FinalizeDeclaration")
286 protected
void finalize() throws Throwable {
287 IngestManager.getInstance().removeIngestJobEventListener(ingestJobEventsListener);
296 @SuppressWarnings(
"unchecked")
298 private
void initComponents() {
300 jPanel3 =
new javax.swing.JPanel();
301 ingestRunningWarningLabel =
new javax.swing.JLabel();
302 jLabel3 =
new javax.swing.JLabel();
303 jScrollPane2 =
new javax.swing.JScrollPane();
304 jSplitPane1 =
new javax.swing.JSplitPane();
305 jPanel1 =
new javax.swing.JPanel();
306 jLabel2 =
new javax.swing.JLabel();
307 typesScrollPane =
new javax.swing.JScrollPane();
308 typesList =
new javax.swing.JList<>();
309 deleteTypeButton =
new javax.swing.JButton();
310 newTypeButton =
new javax.swing.JButton();
311 editTypeButton =
new javax.swing.JButton();
312 jPanel2 =
new javax.swing.JPanel();
313 jLabel1 =
new javax.swing.JLabel();
314 jScrollPane1 =
new javax.swing.JScrollPane();
315 signatureList =
new javax.swing.JList<>();
317 setMaximumSize(null);
318 setPreferredSize(
new java.awt.Dimension(752, 507));
320 jPanel3.setPreferredSize(
new java.awt.Dimension(781, 339));
322 ingestRunningWarningLabel.setFont(ingestRunningWarningLabel.getFont().deriveFont(ingestRunningWarningLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
323 ingestRunningWarningLabel.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/modules/filetypeid/warning16.png")));
324 org.openide.awt.Mnemonics.setLocalizedText(ingestRunningWarningLabel,
org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.ingestRunningWarningLabel.text"));
326 jLabel3.setFont(jLabel3.getFont().deriveFont(jLabel3.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
327 org.openide.awt.Mnemonics.setLocalizedText(jLabel3,
org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.jLabel3.text"));
329 jScrollPane2.setMinimumSize(
new java.awt.Dimension(300, 0));
330 jScrollPane2.setPreferredSize(
new java.awt.Dimension(550, 275));
332 jSplitPane1.setDividerSize(1);
333 jSplitPane1.setMinimumSize(
new java.awt.Dimension(0, 0));
335 jPanel1.setMinimumSize(
new java.awt.Dimension(362, 0));
336 jPanel1.setPreferredSize(
new java.awt.Dimension(362, 0));
338 jLabel2.setFont(jLabel2.getFont().deriveFont(jLabel2.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
339 org.openide.awt.Mnemonics.setLocalizedText(jLabel2,
org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.jLabel2.text"));
341 typesList.setFont(typesList.getFont().deriveFont(typesList.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
342 typesList.setMaximumSize(
new java.awt.Dimension(150, 0));
343 typesList.setMinimumSize(
new java.awt.Dimension(150, 0));
344 typesScrollPane.setViewportView(typesList);
346 deleteTypeButton.setFont(deleteTypeButton.getFont().deriveFont(deleteTypeButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
347 deleteTypeButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/delete16.png")));
348 org.openide.awt.Mnemonics.setLocalizedText(deleteTypeButton,
org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.deleteTypeButton.text"));
349 deleteTypeButton.addActionListener(
new java.awt.event.ActionListener() {
350 public void actionPerformed(java.awt.event.ActionEvent evt) {
351 deleteTypeButtonActionPerformed(evt);
355 newTypeButton.setFont(newTypeButton.getFont().deriveFont(newTypeButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
356 newTypeButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/add16.png")));
357 org.openide.awt.Mnemonics.setLocalizedText(newTypeButton,
org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.newTypeButton.text"));
358 newTypeButton.addActionListener(
new java.awt.event.ActionListener() {
359 public void actionPerformed(java.awt.event.ActionEvent evt) {
360 newTypeButtonActionPerformed(evt);
364 editTypeButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/edit16.png")));
365 org.openide.awt.Mnemonics.setLocalizedText(editTypeButton,
org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.editTypeButton.text"));
366 editTypeButton.addActionListener(
new java.awt.event.ActionListener() {
367 public void actionPerformed(java.awt.event.ActionEvent evt) {
368 editTypeButtonActionPerformed(evt);
372 javax.swing.GroupLayout jPanel1Layout =
new javax.swing.GroupLayout(jPanel1);
373 jPanel1.setLayout(jPanel1Layout);
374 jPanel1Layout.setHorizontalGroup(
375 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
376 .addGroup(jPanel1Layout.createSequentialGroup()
378 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
379 .addGroup(jPanel1Layout.createSequentialGroup()
380 .addComponent(newTypeButton, javax.swing.GroupLayout.PREFERRED_SIZE, 101, javax.swing.GroupLayout.PREFERRED_SIZE)
381 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
382 .addComponent(editTypeButton)
383 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
384 .addComponent(deleteTypeButton))
385 .addComponent(jLabel2)
386 .addComponent(typesScrollPane))
389 jPanel1Layout.setVerticalGroup(
390 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
391 .addGroup(jPanel1Layout.createSequentialGroup()
393 .addComponent(jLabel2)
394 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
395 .addComponent(typesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 203, Short.MAX_VALUE)
397 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
398 .addComponent(newTypeButton)
399 .addComponent(editTypeButton)
400 .addComponent(deleteTypeButton))
404 jPanel1Layout.linkSize(javax.swing.SwingConstants.VERTICAL,
new java.awt.Component[] {deleteTypeButton, newTypeButton});
406 jSplitPane1.setLeftComponent(jPanel1);
408 jPanel2.setMinimumSize(
new java.awt.Dimension(79, 0));
410 org.openide.awt.Mnemonics.setLocalizedText(jLabel1,
org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class,
"FileTypeIdGlobalSettingsPanel.jLabel1.text"));
412 signatureList.setModel(
new javax.swing.AbstractListModel<Signature>() {
413 Signature[] signatures = {};
414 public int getSize() {
return signatures.length; }
415 public Signature getElementAt(
int i) {
return signatures[i]; }
417 signatureList.setEnabled(
false);
418 signatureList.setMaximumSize(
new java.awt.Dimension(32767, 32767));
419 signatureList.setPreferredSize(null);
420 jScrollPane1.setViewportView(signatureList);
422 javax.swing.GroupLayout jPanel2Layout =
new javax.swing.GroupLayout(jPanel2);
423 jPanel2.setLayout(jPanel2Layout);
424 jPanel2Layout.setHorizontalGroup(
425 jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
426 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
428 .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
429 .addGroup(jPanel2Layout.createSequentialGroup()
430 .addComponent(jLabel1)
431 .addGap(100, 100, 100))
432 .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
435 jPanel2Layout.setVerticalGroup(
436 jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
437 .addGroup(jPanel2Layout.createSequentialGroup()
439 .addComponent(jLabel1)
440 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
441 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 235, Short.MAX_VALUE)
445 jSplitPane1.setRightComponent(jPanel2);
447 jScrollPane2.setViewportView(jSplitPane1);
449 javax.swing.GroupLayout jPanel3Layout =
new javax.swing.GroupLayout(jPanel3);
450 jPanel3.setLayout(jPanel3Layout);
451 jPanel3Layout.setHorizontalGroup(
452 jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
453 .addGroup(jPanel3Layout.createSequentialGroup()
455 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
456 .addComponent(ingestRunningWarningLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
457 .addComponent(jLabel3, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
458 .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 761, Short.MAX_VALUE))
461 jPanel3Layout.setVerticalGroup(
462 jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
463 .addGroup(jPanel3Layout.createSequentialGroup()
465 .addComponent(jLabel3)
466 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
467 .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 281, Short.MAX_VALUE)
468 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
469 .addComponent(ingestRunningWarningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
473 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
474 this.setLayout(layout);
475 layout.setHorizontalGroup(
476 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
477 .addGroup(layout.createSequentialGroup()
478 .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, 752, Short.MAX_VALUE)
481 layout.setVerticalGroup(
482 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
483 .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, 507, Short.MAX_VALUE)
487 private void newTypeButtonActionPerformed(java.awt.event.ActionEvent evt) {
488 AddFileTypeDialog dialog =
new AddFileTypeDialog();
489 AddFileTypeDialog.BUTTON_PRESSED result = dialog.getResult();
490 if (result == AddFileTypeDialog.BUTTON_PRESSED.OK) {
491 fileTypes.add(dialog.getFileType());
492 updateFileTypesListModel();
493 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
498 private void deleteTypeButtonActionPerformed(java.awt.event.ActionEvent evt) {
499 FileType fileType = typesList.getSelectedValue();
500 fileTypes.remove(fileType);
501 updateFileTypesListModel();
502 if (!typesListModel.isEmpty()) {
503 typesList.setSelectedIndex(0);
505 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
508 private void editTypeButtonActionPerformed(java.awt.event.ActionEvent evt) {
509 int selected = this.typesList.getSelectedIndex();
510 AddFileTypeDialog dialog =
new AddFileTypeDialog(this.typesListModel.get(
this.typesList.getSelectedIndex()));
511 AddFileTypeDialog.BUTTON_PRESSED result = dialog.getResult();
512 if (result == AddFileTypeDialog.BUTTON_PRESSED.OK) {
513 this.fileTypes.remove(selected);
514 this.fileTypes.add(selected, dialog.getFileType());
515 updateFileTypesListModel();
516 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
521 private javax.swing.JButton deleteTypeButton;
522 private javax.swing.JButton editTypeButton;
523 private javax.swing.JLabel ingestRunningWarningLabel;
524 private javax.swing.JLabel jLabel1;
525 private javax.swing.JLabel jLabel2;
526 private javax.swing.JLabel jLabel3;
527 private javax.swing.JPanel jPanel1;
528 private javax.swing.JPanel jPanel2;
529 private javax.swing.JPanel jPanel3;
530 private javax.swing.JScrollPane jScrollPane1;
531 private javax.swing.JScrollPane jScrollPane2;
532 private javax.swing.JSplitPane jSplitPane1;
533 private javax.swing.JButton newTypeButton;
534 private javax.swing.JList<Signature> signatureList;
535 private javax.swing.JList<FileType> typesList;
536 private javax.swing.JScrollPane typesScrollPane;
void propertyChange(PropertyChangeEvent evt)
static synchronized IngestManager getInstance()
boolean isIngestRunning()