19 package org.sleuthkit.autopsy.casemodule;
 
   22 import java.awt.event.WindowAdapter;
 
   23 import java.awt.event.WindowEvent;
 
   24 import java.util.Arrays;
 
   25 import java.util.List;
 
   26 import java.util.ArrayList;
 
   27 import java.util.logging.Level;
 
   29 import javax.swing.JFileChooser;
 
   30 import javax.swing.JFrame;
 
   31 import javax.swing.JOptionPane;
 
   32 import org.openide.util.NbBundle;
 
   33 import org.openide.windows.WindowManager;
 
   39 class MissingImageDialog 
extends javax.swing.JDialog {
 
   41     private static final Logger logger = Logger.getLogger(MissingImageDialog.class.getName());
 
   44     static final GeneralFilter rawFilter = 
new GeneralFilter(GeneralFilter.RAW_IMAGE_EXTS, GeneralFilter.RAW_IMAGE_DESC);
 
   45     static final GeneralFilter encaseFilter = 
new GeneralFilter(GeneralFilter.ENCASE_IMAGE_EXTS, GeneralFilter.ENCASE_IMAGE_DESC);
 
   46     static final List<String> allExt = 
new ArrayList<String>();
 
   49         allExt.addAll(GeneralFilter.RAW_IMAGE_EXTS);
 
   50         allExt.addAll(GeneralFilter.ENCASE_IMAGE_EXTS);
 
   52     static final String allDesc = NbBundle.getMessage(MissingImageDialog.class, 
"MissingImageDialog.allDesc.text");
 
   53     static final GeneralFilter allFilter = 
new GeneralFilter(allExt, allDesc);
 
   54     private JFileChooser fc = 
new JFileChooser();
 
   56     private MissingImageDialog(
long obj_id, SleuthkitCase db) {
 
   57         super((JFrame) WindowManager.getDefault().getMainWindow(), 
true);
 
   62         fc.setDragEnabled(
false);
 
   63         fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
 
   64         fc.setMultiSelectionEnabled(
false);
 
   66         fc.addChoosableFileFilter(rawFilter);
 
   67         fc.addChoosableFileFilter(encaseFilter);
 
   68         fc.setFileFilter(allFilter);
 
   79     static void makeDialog(
long obj_id, SleuthkitCase db) {
 
   80         final MissingImageDialog dialog = 
new MissingImageDialog(obj_id, db);
 
   81         dialog.addWindowListener(
new WindowAdapter() {
 
   83             public void windowClosing(WindowEvent e) {
 
   90     private void customInit() {
 
   92         selectButton.setEnabled(
false);
 
   95     private void display() {
 
   96         this.setTitle(NbBundle.getMessage(
this.getClass(), 
"MissingImageDialog.display.title"));
 
   97         Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
 
   99         int w = this.getSize().width;
 
  100         int h = this.getSize().height;
 
  102         setLocation((screenDimension.width - w) / 2, (screenDimension.height - h) / 2);
 
  104         this.setVisible(
true);
 
  110     private void moveFocusToSelect() {
 
  111         this.selectButton.requestFocusInWindow();
 
  117     private void updateSelectButton() {
 
  120         if (!pathNameTextField.getText().isEmpty()) {
 
  121             String filePath = pathNameTextField.getText();
 
  122             boolean isExist = 
new File(filePath).isFile() || DriveUtils.driveExists(filePath);
 
  123             selectButton.setEnabled(isExist);
 
  132     @SuppressWarnings(
"unchecked")
 
  134     private 
void initComponents() {
 
  136         buttonPanel = 
new javax.swing.JPanel();
 
  137         selectButton = 
new javax.swing.JButton();
 
  138         cancelButton = 
new javax.swing.JButton();
 
  139         containerPanel = 
new javax.swing.JPanel();
 
  140         pathNameTextField = 
new javax.swing.JTextField();
 
  141         browseButton = 
new javax.swing.JButton();
 
  142         lbWarning = 
new javax.swing.JLabel();
 
  143         titleLabel = 
new javax.swing.JLabel();
 
  144         titleSeparator = 
new javax.swing.JSeparator();
 
  146         setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
 
  148         selectButton.setFont(selectButton.getFont().deriveFont(selectButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  149         org.openide.awt.Mnemonics.setLocalizedText(selectButton, 
org.openide.util.NbBundle.getMessage(MissingImageDialog.class, 
"MissingImageDialog.selectButton.text")); 
 
  150         selectButton.addActionListener(
new java.awt.event.ActionListener() {
 
  151             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  152                 selectButtonActionPerformed(evt);
 
  156         cancelButton.setFont(cancelButton.getFont().deriveFont(cancelButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  157         org.openide.awt.Mnemonics.setLocalizedText(cancelButton, 
org.openide.util.NbBundle.getMessage(MissingImageDialog.class, 
"MissingImageDialog.cancelButton.text")); 
 
  158         cancelButton.addActionListener(
new java.awt.event.ActionListener() {
 
  159             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  160                 cancelButtonActionPerformed(evt);
 
  164         javax.swing.GroupLayout buttonPanelLayout = 
new javax.swing.GroupLayout(buttonPanel);
 
  165         buttonPanel.setLayout(buttonPanelLayout);
 
  166         buttonPanelLayout.setHorizontalGroup(
 
  167             buttonPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  168             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, buttonPanelLayout.createSequentialGroup()
 
  169                 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  170                 .addComponent(selectButton)
 
  171                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  172                 .addComponent(cancelButton)
 
  175         buttonPanelLayout.setVerticalGroup(
 
  176             buttonPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  177             .addGroup(buttonPanelLayout.createSequentialGroup()
 
  179                 .addGroup(buttonPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  180                     .addComponent(selectButton)
 
  181                     .addComponent(cancelButton))
 
  182                 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
 
  185         pathNameTextField.setFont(pathNameTextField.getFont().deriveFont(pathNameTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  186         pathNameTextField.setText(
org.openide.util.NbBundle.getMessage(MissingImageDialog.class, 
"MissingImageDialog.pathNameTextField.text")); 
 
  187         pathNameTextField.addActionListener(
new java.awt.event.ActionListener() {
 
  188             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  189                 pathNameTextFieldActionPerformed(evt);
 
  193         browseButton.setFont(browseButton.getFont().deriveFont(browseButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  194         org.openide.awt.Mnemonics.setLocalizedText(browseButton, 
org.openide.util.NbBundle.getMessage(MissingImageDialog.class, 
"MissingImageDialog.browseButton.text")); 
 
  195         browseButton.addActionListener(
new java.awt.event.ActionListener() {
 
  196             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  197                 browseButtonActionPerformed(evt);
 
  201         lbWarning.setFont(lbWarning.getFont().deriveFont(lbWarning.getFont().getStyle() | java.awt.Font.BOLD, 12));
 
  202         lbWarning.setForeground(
new java.awt.Color(244, 0, 0));
 
  203         org.openide.awt.Mnemonics.setLocalizedText(lbWarning, 
org.openide.util.NbBundle.getMessage(MissingImageDialog.class, 
"MissingImageDialog.lbWarning.text")); 
 
  204         lbWarning.setToolTipText(
org.openide.util.NbBundle.getMessage(MissingImageDialog.class, 
"MissingImageDialog.lbWarning.toolTipText")); 
 
  206         javax.swing.GroupLayout containerPanelLayout = 
new javax.swing.GroupLayout(containerPanel);
 
  207         containerPanel.setLayout(containerPanelLayout);
 
  208         containerPanelLayout.setHorizontalGroup(
 
  209             containerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  210             .addGroup(containerPanelLayout.createSequentialGroup()
 
  212                 .addGroup(containerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  213                     .addComponent(lbWarning, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  214                     .addGroup(containerPanelLayout.createSequentialGroup()
 
  215                         .addComponent(pathNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 285, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  216                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  217                         .addComponent(browseButton)
 
  218                         .addContainerGap(83, Short.MAX_VALUE))))
 
  220         containerPanelLayout.setVerticalGroup(
 
  221             containerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  222             .addGroup(containerPanelLayout.createSequentialGroup()
 
  224                 .addGroup(containerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  225                     .addComponent(pathNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  226                     .addComponent(browseButton))
 
  227                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  228                 .addComponent(lbWarning, javax.swing.GroupLayout.DEFAULT_SIZE, 19, Short.MAX_VALUE)
 
  232         titleLabel.setFont(titleLabel.getFont().deriveFont(titleLabel.getFont().getStyle() | java.awt.Font.BOLD, 12));
 
  233         org.openide.awt.Mnemonics.setLocalizedText(titleLabel, 
org.openide.util.NbBundle.getMessage(MissingImageDialog.class, 
"MissingImageDialog.titleLabel.text")); 
 
  235         titleSeparator.setForeground(
new java.awt.Color(102, 102, 102));
 
  237         javax.swing.GroupLayout layout = 
new javax.swing.GroupLayout(getContentPane());
 
  238         getContentPane().setLayout(layout);
 
  239         layout.setHorizontalGroup(
 
  240             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  241             .addComponent(buttonPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  242             .addGroup(layout.createSequentialGroup()
 
  244                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  245                     .addComponent(containerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  246                     .addGroup(layout.createSequentialGroup()
 
  247                         .addComponent(titleLabel)
 
  248                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  249                         .addComponent(titleSeparator)))
 
  252         layout.setVerticalGroup(
 
  253             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  254             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
 
  256                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
 
  257                     .addComponent(titleLabel)
 
  258                     .addComponent(titleSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 7, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  259                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  260                 .addComponent(containerPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  261                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  262                 .addComponent(buttonPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  268     private void selectButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  270             String newPath = pathNameTextField.getText();
 
  272             db.setImagePaths(obj_id, Arrays.asList(
new String[]{newPath}));
 
  274         } 
catch (TskCoreException ex) {
 
  275             lbWarning.setText(NbBundle.getMessage(
this.getClass(), 
"MissingImageDialog.ErrorSettingImage"));
 
  276             logger.log(Level.WARNING, 
"Error setting image paths", ex); 
 
  280     private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  284     private void pathNameTextFieldActionPerformed(java.awt.event.ActionEvent evt) {
 
  287         updateSelectButton();
 
  290     private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  292         String oldText = pathNameTextField.getText();
 
  293         lbWarning.setText(
"");
 
  295         File currentDir = 
new File(oldText);
 
  296         if (currentDir.exists()) {
 
  297             fc.setCurrentDirectory(currentDir);
 
  300         int retval = fc.showOpenDialog(
this);
 
  301         if (retval == JFileChooser.APPROVE_OPTION) {
 
  302             String path = fc.getSelectedFile().getPath();
 
  303             pathNameTextField.setText(path);
 
  307         updateSelectButton();
 
  310     private javax.swing.JButton browseButton;
 
  311     private javax.swing.JPanel buttonPanel;
 
  312     private javax.swing.JButton cancelButton;
 
  313     private javax.swing.JPanel containerPanel;
 
  314     private javax.swing.JLabel lbWarning;
 
  315     private javax.swing.JTextField pathNameTextField;
 
  316     private javax.swing.JButton selectButton;
 
  317     private javax.swing.JLabel titleLabel;
 
  318     private javax.swing.JSeparator titleSeparator;
 
  325         int ret = JOptionPane.showConfirmDialog(null,
 
  326                 NbBundle.getMessage(
this.getClass(),
 
  327                         "MissingImageDialog.confDlg.noFileSel.msg"),
 
  328                 NbBundle.getMessage(
this.getClass(),
 
  329                         "MissingImageDialog.confDlg.noFileSel.title"),
 
  330                 JOptionPane.YES_NO_OPTION);
 
  331         if (ret == JOptionPane.YES_OPTION) {