From 95c47bebeeadbeef6c9cd358721141fa27e33f0b Mon Sep 17 00:00:00 2001 From: adam-m Date: Wed, 27 Jun 2012 16:29:23 -0400 Subject: [PATCH] Add dialog to add image wizard showing non-critical errors --- .../casemodule/AddImageErrorsDialog.form | 97 ++++++++++++ .../casemodule/AddImageErrorsDialog.java | 145 ++++++++++++++++++ .../casemodule/AddImageVisualPanel2.form | 34 ++-- .../casemodule/AddImageVisualPanel2.java | 96 +++++++++--- .../casemodule/AddImageWizardPanel2.java | 53 ++++--- .../autopsy/casemodule/Bundle.properties | 6 +- 6 files changed, 373 insertions(+), 58 deletions(-) create mode 100644 Case/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.form create mode 100644 Case/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.java diff --git a/Case/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.form b/Case/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.form new file mode 100644 index 0000000000..5fd0e900b1 --- /dev/null +++ b/Case/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.form @@ -0,0 +1,97 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/Case/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.java b/Case/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.java new file mode 100644 index 0000000000..ae4c7d296f --- /dev/null +++ b/Case/src/org/sleuthkit/autopsy/casemodule/AddImageErrorsDialog.java @@ -0,0 +1,145 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package org.sleuthkit.autopsy.casemodule; + +/** + * Modal dialog to show add image error messages + */ +public class AddImageErrorsDialog extends javax.swing.JDialog { + + /** + * Creates new form AddImageErrorsDialog + */ + public AddImageErrorsDialog(java.awt.Frame parent, boolean modal) { + super(parent, modal); + initComponents(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + jScrollPane1 = new javax.swing.JScrollPane(); + errorsText = new javax.swing.JTextArea(); + copyButton = new javax.swing.JButton(); + closeButton = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setTitle(org.openide.util.NbBundle.getMessage(AddImageErrorsDialog.class, "AddImageErrorsDialog.title")); // NOI18N + setIconImage(null); + setIconImages(null); + + errorsText.setColumns(20); + errorsText.setEditable(false); + errorsText.setRows(5); + jScrollPane1.setViewportView(errorsText); + + org.openide.awt.Mnemonics.setLocalizedText(copyButton, org.openide.util.NbBundle.getMessage(AddImageErrorsDialog.class, "AddImageErrorsDialog.copyButton.text")); // NOI18N + copyButton.setToolTipText(org.openide.util.NbBundle.getMessage(AddImageErrorsDialog.class, "AddImageErrorsDialog.copyButton.toolTipText")); // NOI18N + copyButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + copyButtonActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(closeButton, org.openide.util.NbBundle.getMessage(AddImageErrorsDialog.class, "AddImageErrorsDialog.closeButton.text")); // NOI18N + closeButton.setToolTipText(org.openide.util.NbBundle.getMessage(AddImageErrorsDialog.class, "AddImageErrorsDialog.closeButton.toolTipText")); // NOI18N + closeButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + closeButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 485, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(copyButton) + .addGap(18, 18, 18) + .addComponent(closeButton)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 219, Short.MAX_VALUE) + .addGap(0, 0, 0) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(closeButton) + .addComponent(copyButton))) + ); + + pack(); + }// //GEN-END:initComponents + + private void copyButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_copyButtonActionPerformed + errorsText.selectAll(); + errorsText.copy(); + }//GEN-LAST:event_copyButtonActionPerformed + + private void closeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeButtonActionPerformed + setVisible(false); + }//GEN-LAST:event_closeButtonActionPerformed + + + void setErrors(String errors) { + errorsText.setText(errors); + } + + /** + * @param args the command line arguments + */ + public static void main(String args[]) { + /* Set the Nimbus look and feel */ + // + /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. + * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html + */ + try { + for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { + if ("Nimbus".equals(info.getName())) { + javax.swing.UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (ClassNotFoundException ex) { + java.util.logging.Logger.getLogger(AddImageErrorsDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (InstantiationException ex) { + java.util.logging.Logger.getLogger(AddImageErrorsDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (IllegalAccessException ex) { + java.util.logging.Logger.getLogger(AddImageErrorsDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (javax.swing.UnsupportedLookAndFeelException ex) { + java.util.logging.Logger.getLogger(AddImageErrorsDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + // + + /* Create and display the dialog */ + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + AddImageErrorsDialog dialog = new AddImageErrorsDialog(new javax.swing.JFrame(), true); + dialog.addWindowListener(new java.awt.event.WindowAdapter() { + @Override + public void windowClosing(java.awt.event.WindowEvent e) { + System.exit(0); + } + }); + dialog.setVisible(true); + } + }); + } + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton closeButton; + private javax.swing.JButton copyButton; + private javax.swing.JTextArea errorsText; + private javax.swing.JScrollPane jScrollPane1; + // End of variables declaration//GEN-END:variables +} diff --git a/Case/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel2.form b/Case/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel2.form index 22a106fde4..384535ef0b 100644 --- a/Case/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel2.form +++ b/Case/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel2.form @@ -1,4 +1,4 @@ - +
@@ -25,10 +25,10 @@ - + - - + + @@ -46,8 +46,8 @@ - - + + @@ -72,13 +72,6 @@ - - - - - - - @@ -86,5 +79,20 @@ + + + + + + + + + + + + + + + diff --git a/Case/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel2.java b/Case/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel2.java index df309133c4..192f67bbfc 100644 --- a/Case/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel2.java +++ b/Case/src/org/sleuthkit/autopsy/casemodule/AddImageVisualPanel2.java @@ -16,15 +16,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.sleuthkit.autopsy.casemodule; import java.awt.Color; -import javax.swing.JPanel; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.Box; +import javax.swing.BoxLayout; import javax.swing.JButton; -import javax.swing.JCheckBox; +import javax.swing.JFrame; +import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.JProgressBar; +import javax.swing.SwingUtilities; /** * The "Add Image" wizard panel 2. Provides checkbox to enable indexing, button @@ -32,16 +37,38 @@ import javax.swing.JProgressBar; */ final class AddImageVisualPanel2 extends JPanel { - /** Creates new form AddImageVisualPanel2 */ + private String nonCriticalErrors = null; + private JLabel progressLabel = null; + private JButton errorButton = null; + + /** + * Creates new form AddImageVisualPanel2 + */ AddImageVisualPanel2() { initComponents(); + customizeComponents(); + } + + private void customizeComponents() { + progressLabel = new JLabel(); + infoPanel.setLayout(new BoxLayout(infoPanel, BoxLayout.PAGE_AXIS)); + infoPanel.add(progressLabel); + infoPanel.add(Box.createRigidArea(new Dimension(10, 10))); //spacer + } + + void resetInfoPanel() { + if (errorButton != null) { + infoPanel.remove(errorButton); + errorButton = null; + } + progressLabel.setText(""); } /** * Returns the name of the this panel. This name will be shown on the left * panel of the "Add Image" wizard panel. * - * @return name the name of this panel + * @return name the name of this panel */ @Override public String getName() { @@ -59,9 +86,9 @@ final class AddImageVisualPanel2 extends JPanel { /** * Changes the progress bar text and color. * - * @param text the text to be shown - * @param value the current value of the progress bar - * @param color the color of the progress bar text + * @param text the text to be shown + * @param value the current value of the progress bar + * @param color the color of the progress bar text */ public void changeProgressBarTextAndColor(String text, int value, Color color) { progressLabel.setText(text); @@ -69,9 +96,28 @@ final class AddImageVisualPanel2 extends JPanel { crDbProgressBar.setValue(value); } - /** + + + void setNonCriticalErrors(final String errors) { + progressLabel.setText("*Image added (non-critical image errors encountered). Click below to view the Add Image Log."); + errorButton = new JButton(); + errorButton.setText("View Log"); + infoPanel.add(errorButton); + errorButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + //JOptionPane.showMessageDialog(null, errors, "Add image non-critical errors", JOptionPane.WARNING_MESSAGE); + AddImageErrorsDialog dialog = new AddImageErrorsDialog(null, true); + dialog.setErrors(errors); + dialog.setVisible(true); + } + }); + + } + + /** * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always + * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents @@ -80,18 +126,27 @@ final class AddImageVisualPanel2 extends JPanel { crDbProgressBar = new javax.swing.JProgressBar(); jLabel5 = new javax.swing.JLabel(); crDbLabel = new javax.swing.JLabel(); - progressLabel = new javax.swing.JLabel(); jLabel1 = new javax.swing.JLabel(); + infoPanel = new javax.swing.JPanel(); org.openide.awt.Mnemonics.setLocalizedText(jLabel5, org.openide.util.NbBundle.getMessage(AddImageVisualPanel2.class, "AddImageVisualPanel2.jLabel5.text")); // NOI18N - crDbLabel.setFont(new java.awt.Font("Tahoma", 1, 14)); + crDbLabel.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(crDbLabel, org.openide.util.NbBundle.getMessage(AddImageVisualPanel2.class, "AddImageVisualPanel2.crDbLabel.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(progressLabel, org.openide.util.NbBundle.getMessage(AddImageVisualPanel2.class, "AddImageVisualPanel2.progressLabel.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(AddImageVisualPanel2.class, "AddImageVisualPanel2.jLabel1.text")); // NOI18N + javax.swing.GroupLayout infoPanelLayout = new javax.swing.GroupLayout(infoPanel); + infoPanel.setLayout(infoPanelLayout); + infoPanelLayout.setHorizontalGroup( + infoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 588, Short.MAX_VALUE) + ); + infoPanelLayout.setVerticalGroup( + infoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 47, Short.MAX_VALUE) + ); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -104,9 +159,9 @@ final class AddImageVisualPanel2 extends JPanel { .addComponent(crDbLabel) .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 552, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel5)) - .addGap(0, 16, Short.MAX_VALUE)) - .addComponent(crDbProgressBar, javax.swing.GroupLayout.DEFAULT_SIZE, 568, Short.MAX_VALUE) - .addComponent(progressLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 568, Short.MAX_VALUE)) + .addGap(0, 36, Short.MAX_VALUE)) + .addComponent(crDbProgressBar, javax.swing.GroupLayout.DEFAULT_SIZE, 588, Short.MAX_VALUE) + .addComponent(infoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); layout.setVerticalGroup( @@ -121,16 +176,15 @@ final class AddImageVisualPanel2 extends JPanel { .addGap(18, 18, 18) .addComponent(crDbProgressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) - .addComponent(progressLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 12, Short.MAX_VALUE) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(infoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(24, 24, 24)) ); }// //GEN-END:initComponents - // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel crDbLabel; private javax.swing.JProgressBar crDbProgressBar; + private javax.swing.JPanel infoPanel; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel5; - private javax.swing.JLabel progressLabel; // End of variables declaration//GEN-END:variables } diff --git a/Case/src/org/sleuthkit/autopsy/casemodule/AddImageWizardPanel2.java b/Case/src/org/sleuthkit/autopsy/casemodule/AddImageWizardPanel2.java index 0457c02d64..916bb419f0 100644 --- a/Case/src/org/sleuthkit/autopsy/casemodule/AddImageWizardPanel2.java +++ b/Case/src/org/sleuthkit/autopsy/casemodule/AddImageWizardPanel2.java @@ -79,7 +79,7 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { * but never displayed, or not all panels are displayed, it is better to * create only those which really need to be visible. * - * @return component the UI component of this wizard panel + * @return component the UI component of this wizard panel */ @Override public AddImageVisualPanel2 getComponent() { @@ -93,7 +93,7 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { * Help for this panel. When the panel is active, this is used as the help * for the wizard dialog. * - * @return HelpCtx.DEFAULT_HELP the help for this panel + * @return HelpCtx.DEFAULT_HELP the help for this panel */ @Override public HelpCtx getHelp() { @@ -105,7 +105,7 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { * Tests whether the panel is finished and it is safe to proceed to the next * one. If the panel is valid, the "Next" button will be enabled. * - * @return boolean true if can proceed to the next one, false otherwise + * @return boolean true if can proceed to the next one, false otherwise */ @Override public boolean isValid() { @@ -130,10 +130,10 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { } /** - * Sets the isDbCreated variable in this class and also invoke + * Sets the isDbCreated variable in this class and also invoke * fireChangeEvent() method. * - * @param created whether the database already created or not + * @param created whether the database already created or not */ private void setDbCreated(Boolean created) { imgAdded = created; @@ -144,7 +144,7 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { /** * Adds a listener to changes of the panel's validity. * - * @param l the change listener to add + * @param l the change listener to add */ @Override public final void addChangeListener(ChangeListener l) { @@ -156,7 +156,7 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { /** * Removes a listener to changes of the panel's validity. * - * @param l the change listener to move + * @param l the change listener to move */ @Override public final void removeChangeListener(ChangeListener l) { @@ -166,8 +166,8 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { } /** - * This method is auto-generated. It seems that this method is used to listen - * to any change in this wizard panel. + * This method is auto-generated. It seems that this method is used to + * listen to any change in this wizard panel. */ protected final void fireChangeEvent() { Iterator it; @@ -184,7 +184,7 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { * Load the image locations from the WizardDescriptor settings object, and * the * - * @param settings the setting to be read from + * @param settings the setting to be read from */ @Override public void readSettings(WizardDescriptor settings) { @@ -194,14 +194,14 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { timeZone = settings.getProperty(AddImageAction.TIMEZONE_PROP).toString(); noFatOrphans = ((Boolean) settings.getProperty(AddImageAction.NOFATORPHANS_PROP)).booleanValue(); - component.changeProgressBarTextAndColor("", 0, Color.black); + getComponent().resetInfoPanel(); startAddImage(); } /** * - * @param settings the setting to be stored to + * @param settings the setting to be stored to */ @Override public void storeSettings(WizardDescriptor settings) { @@ -213,10 +213,12 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { // be cancelled if all goes well, and availble if we return to this // panel so the the previously added image can be reverted settings.putProperty(AddImageAction.IMAGECLEANUPTASK_PROP, cleanupImage); + + getComponent().resetInfoPanel(); } /** - * Thread that will make the JNI call to ingest the image. + * Thread that will make the JNI call to ingest the image. */ private class AddImgTask extends SwingWorker { @@ -233,20 +235,19 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { } /** - * Starts the addImage process, but does not commit the results. - * + * Starts the addImage process, but does not commit the results. + * * @return - * @throws Exception + * @throws Exception */ @Override protected Integer doInBackground() { this.setProgress(0); - + // Add a cleanup task to interupt the backgroud process if the // wizard exits while the background process is running. AddImageAction.CleanupTask cancelledWhileRunning = action.new CleanupTask() { - @Override void cleanup() throws Exception { logger.log(Level.INFO, "Add image process interrupted."); @@ -259,7 +260,6 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { //lock DB for writes in EWT thread //wait until lock acquired in EWT EventQueue.invokeAndWait(new Runnable() { - @Override public void run() { SleuthkitCase.dbWriteLock(); @@ -280,12 +280,12 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { try { process.run(new String[]{imgPath}); } catch (TskCoreException ex) { - logger.log(Level.WARNING, "Errors occurred while running add image. ", ex); + logger.log(Level.WARNING, "Core errors occurred while running add image. ", ex); //critical core/system error and process needs to be interrupted hasCritError = true; errorString = ex.getMessage(); } catch (TskDataException ex) { - logger.log(Level.WARNING, "Errors occurred while running add image. ", ex); + logger.log(Level.WARNING, "Data errors occurred while running add image. ", ex); errorString = ex.getMessage(); } finally { // process is over, doesn't need to be dealt with if cancel happens @@ -296,7 +296,7 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { } /** - * + * * (called by EventDispatch Thread after doInBackground finishes) */ @Override @@ -317,6 +317,7 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { logger.log(Level.INFO, "Handling errors or interruption that occured in add image process"); revert(); if (hasCritError) { + //core error StringBuilder errMsgB = new StringBuilder(); errMsgB.append("*Failed to add image"); if (errorString != null) { @@ -325,7 +326,12 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { errMsgB.append(""); getComponent().changeProgressBarTextAndColor(errMsgB.toString(), 0, Color.black); } + return; + } else if (errorString != null) { + //data error (non-critical) + logger.log(Level.INFO, "Handling non-critical errors that occured in add image process"); + getComponent().setNonCriticalErrors(errorString); } } @@ -344,7 +350,8 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel { }; cleanupImage.enable(); - getComponent().changeProgressBarTextAndColor("*Image added.", 100, Color.black); // complete progress bar + if (errorString == null) + getComponent().changeProgressBarTextAndColor("*Image added.", 100, Color.black); // complete progress bar // Get attention for the process finish java.awt.Toolkit.getDefaultToolkit().beep(); //BEEP! diff --git a/Case/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Case/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index 7950e0c13e..5760343319 100755 --- a/Case/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Case/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -90,7 +90,6 @@ OpenRecentCasePanel.jLabel1.text=Recent Cases AddImageVisualPanel1.imgInfoLabel.text=Enter Disk Image Information: AddImageVisualPanel2.crDbLabel.text=Adding Image AddImageVisualPanel2.jLabel5.text=Processing Image and Adding to Database : -AddImageVisualPanel2.progressLabel.text= AddImageVisualPanel2.jLabel1.text= We are now analyzing the disk image to extract volume and file system data and populate a local database. AddImageVisualPanel1.timeZoneLabel.text=Please select the image timezone: AddImageVisualPanel1.imgPathTextField.text= @@ -121,3 +120,8 @@ NewCaseVisualPanel2.optionalLabel.text=Optional: Set Case Number and Examiner AddImageVisualPanel1.noFatOrphansCheckbox.toolTipText= AddImageVisualPanel1.noFatOrphansCheckbox.text=Ignore orphan files in FAT file systems AddImageVisualPanel1.optionsLabel1.text=Options to produce results faster (although some data will not be searched): +AddImageErrorsDialog.title=Add Image Log +AddImageErrorsDialog.copyButton.toolTipText=Copy errors to clipboard +AddImageErrorsDialog.copyButton.text=Copy +AddImageErrorsDialog.closeButton.toolTipText=Close this window +AddImageErrorsDialog.closeButton.text=Close