diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java
index 227bfd0650..5ad9a606a6 100644
--- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java
@@ -26,6 +26,8 @@ import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback.DataSourceProcessorResult;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorProgressMonitor;
import org.sleuthkit.autopsy.coreutils.Logger;
+import org.sleuthkit.autopsy.imagewriter.ImageWriterService;
+import org.sleuthkit.autopsy.ingest.IngestManager;
import org.sleuthkit.datamodel.Content;
import org.sleuthkit.datamodel.Image;
import org.sleuthkit.datamodel.SleuthkitJNI;
@@ -41,6 +43,7 @@ class AddImageTask implements Runnable {
private final String deviceId;
private final String imagePath;
private final String timeZone;
+ private final String imageWriterPath;
private final boolean ignoreFatOrphanFiles;
private final DataSourceProcessorProgressMonitor progressMonitor;
private final DataSourceProcessorCallback callback;
@@ -74,15 +77,19 @@ class AddImageTask implements Runnable {
* java.util.TimeZone.getID.
* @param ignoreFatOrphanFiles Whether to parse orphans if the image has a
* FAT filesystem.
+ * @param imageWriterPath Path that a copy of the image should be written to.
+ * Use empty string to disable image writing
* @param progressMonitor Progress monitor to report progress during
* processing.
* @param callback Callback to call when processing is done.
*/
- AddImageTask(String deviceId, String imagePath, String timeZone, boolean ignoreFatOrphanFiles, DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) {
+ AddImageTask(String deviceId, String imagePath, String timeZone, boolean ignoreFatOrphanFiles, String imageWriterPath,
+ DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) {
this.deviceId = deviceId;
this.imagePath = imagePath;
this.timeZone = timeZone;
this.ignoreFatOrphanFiles = ignoreFatOrphanFiles;
+ this.imageWriterPath = imageWriterPath;
this.callback = callback;
this.progressMonitor = progressMonitor;
tskAddImageProcessLock = new Object();
@@ -101,7 +108,7 @@ class AddImageTask implements Runnable {
try {
currentCase.getSleuthkitCase().acquireExclusiveLock();
synchronized (tskAddImageProcessLock) {
- tskAddImageProcess = currentCase.getSleuthkitCase().makeAddImageProcess(timeZone, true, ignoreFatOrphanFiles);
+ tskAddImageProcess = currentCase.getSleuthkitCase().makeAddImageProcess(timeZone, true, ignoreFatOrphanFiles, imageWriterPath);
}
Thread progressUpdateThread = new Thread(new ProgressUpdater(progressMonitor, tskAddImageProcess));
progressUpdateThread.start();
@@ -201,6 +208,9 @@ class AddImageTask implements Runnable {
if (!verificationError.isEmpty()) {
errorMessages.add(verificationError);
}
+ if(! imageWriterPath.isEmpty()){
+ ImageWriterService.createImageWriter(imageId);
+ }
newDataSources.add(newImage);
} else {
String errorMessage = String.format("Error commiting adding image %s to the case database, no object id returned", imagePath); //NON-NLS
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.form b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.form
deleted file mode 100644
index 928cb45a95..0000000000
--- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.form
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.java
deleted file mode 100644
index adf61a8f32..0000000000
--- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourceVisual.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * Autopsy Forensic Browser
- *
- * Copyright 2011-2014 Basis Technology Corp.
- * Contact: carrier sleuthkit org
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.sleuthkit.autopsy.casemodule;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-import javax.swing.JList;
-import javax.swing.JPanel;
-import javax.swing.JSeparator;
-import javax.swing.ListCellRenderer;
-import javax.swing.event.DocumentEvent;
-import org.openide.util.Lookup;
-import org.openide.util.NbBundle;
-import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessor;
-import org.sleuthkit.autopsy.coreutils.Logger;
-import org.sleuthkit.autopsy.datasourceprocessors.RawDSProcessor;
-
-/**
- * visual component for the first panel of add image wizard. Allows the user to
- * choose the data source type and then select the data source
- *
- */
-final class AddImageWizardChooseDataSourceVisual extends JPanel {
-
- static final Logger logger = Logger.getLogger(AddImageWizardChooseDataSourceVisual.class.getName());
-
- private AddImageWizardChooseDataSourcePanel wizPanel;
-
- private JPanel currentPanel;
-
- private Map datasourceProcessorsMap = new HashMap<>();
-
- List coreDSPTypes = new ArrayList<>();
-
- /**
- * Creates new form AddImageVisualPanel1
- *
- * @param wizPanel corresponding WizardPanel to handle logic of wizard step
- */
- AddImageWizardChooseDataSourceVisual(AddImageWizardChooseDataSourcePanel wizPanel) {
- initComponents();
- this.wizPanel = wizPanel;
-
- customInit();
- }
-
- @SuppressWarnings({"rawtypes", "unchecked"})
- private void customInit() {
-
- typePanel.setLayout(new BorderLayout());
-
- discoverDataSourceProcessors();
-
- // set up the DSP type combobox
- typeComboBox.removeAllItems();
-
- Set dspTypes = datasourceProcessorsMap.keySet();
-
- // make a list of core DSPs
- // ensure that the core DSPs are at the top and in a fixed order
- coreDSPTypes.add(ImageDSProcessor.getType());
- // Local disk processing is not allowed for multi-user cases
- if (Case.getCurrentCase().getCaseType() != Case.CaseType.MULTI_USER_CASE) {
- coreDSPTypes.add(LocalDiskDSProcessor.getType());
- } else {
- // remove LocalDiskDSProcessor from list of DSPs
- datasourceProcessorsMap.remove(LocalDiskDSProcessor.getType());
- }
- coreDSPTypes.add(LocalFilesDSProcessor.getType());
- coreDSPTypes.add(RawDSProcessor.getType());
-
- for (String dspType : coreDSPTypes) {
- typeComboBox.addItem(dspType);
- }
-
- // now add any addtional DSPs that haven't already been added
- for (String dspType : dspTypes) {
- if (!coreDSPTypes.contains(dspType)) {
- typeComboBox.addItem(dspType);
- }
- }
-
- typeComboBox.setRenderer(new ComboboxSeparatorRenderer(typeComboBox.getRenderer()) {
-
- @Override
- protected boolean addSeparatorAfter(JList list, Object value, int index) {
- return (index == coreDSPTypes.size() - 1);
- }
- });
-
- //add actionlistner to listen for change
- ActionListener cbActionListener = new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- dspSelectionChanged();
- }
- };
- typeComboBox.addActionListener(cbActionListener);
- typeComboBox.setSelectedIndex(0);
- }
-
- private void discoverDataSourceProcessors() {
-
- for (DataSourceProcessor dsProcessor : Lookup.getDefault().lookupAll(DataSourceProcessor.class)) {
-
- if (!datasourceProcessorsMap.containsKey(dsProcessor.getDataSourceType())) {
- datasourceProcessorsMap.put(dsProcessor.getDataSourceType(), dsProcessor);
- } else {
- logger.log(Level.SEVERE, "discoverDataSourceProcessors(): A DataSourceProcessor already exists for type = {0}", dsProcessor.getDataSourceType()); //NON-NLS
- }
- }
- }
-
- private void dspSelectionChanged() {
- // update the current panel to selection
- currentPanel = getCurrentDSProcessor().getPanel();
- updateCurrentPanel(currentPanel);
- }
-
- /**
- * Changes the current panel to the given panel.
- *
- * @param panel instance of ImageTypePanel to change to
- */
- @SuppressWarnings("deprecation")
- private void updateCurrentPanel(JPanel panel) {
- currentPanel = panel;
- typePanel.removeAll();
- typePanel.add(currentPanel, BorderLayout.CENTER);
- typePanel.validate();
- typePanel.repaint();
- currentPanel.addPropertyChangeListener(new PropertyChangeListener() {
- @Override
- public void propertyChange(PropertyChangeEvent evt) {
- if (evt.getPropertyName().equals(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString())) {
- updateUI(null);
- }
- if (evt.getPropertyName().equals(DataSourceProcessor.DSP_PANEL_EVENT.FOCUS_NEXT.toString())) {
- wizPanel.moveFocusToNext();
- }
- }
- });
-
- updateUI(null);
- }
-
- /**
- * Returns the currently selected DS Processor
- *
- * @return DataSourceProcessor the DataSourceProcessor corresponding to the
- * data source type selected in the combobox
- */
- protected DataSourceProcessor getCurrentDSProcessor() {
- // get the type of the currently selected panel and then look up
- // the correspodning DS Handler in the map
- String dsType = (String) typeComboBox.getSelectedItem();
- DataSourceProcessor dsProcessor = datasourceProcessorsMap.get(dsType);
-
- return dsProcessor;
-
- }
-
- /**
- * 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
- */
- @Override
- public String getName() {
- return NbBundle.getMessage(this.getClass(), "AddImageWizardChooseDataSourceVisual.getName.text");
- }
-
- /**
- * 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.
- */
- // //GEN-BEGIN:initComponents
- private void initComponents() {
-
- buttonGroup1 = new javax.swing.ButtonGroup();
- jLabel2 = new javax.swing.JLabel();
- inputPanel = new javax.swing.JPanel();
- typeTabel = new javax.swing.JLabel();
- typePanel = new javax.swing.JPanel();
- typeComboBox = new javax.swing.JComboBox();
-
- org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(AddImageWizardChooseDataSourceVisual.class, "AddImageWizardChooseDataSourceVisual.jLabel2.text")); // NOI18N
-
- setPreferredSize(new java.awt.Dimension(588, 328));
-
- org.openide.awt.Mnemonics.setLocalizedText(typeTabel, org.openide.util.NbBundle.getMessage(AddImageWizardChooseDataSourceVisual.class, "AddImageWizardChooseDataSourceVisual.typeTabel.text")); // NOI18N
-
- typePanel.setMinimumSize(new java.awt.Dimension(0, 65));
- typePanel.setPreferredSize(new java.awt.Dimension(521, 65));
-
- javax.swing.GroupLayout typePanelLayout = new javax.swing.GroupLayout(typePanel);
- typePanel.setLayout(typePanelLayout);
- typePanelLayout.setHorizontalGroup(
- typePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 548, Short.MAX_VALUE)
- );
- typePanelLayout.setVerticalGroup(
- typePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 225, Short.MAX_VALUE)
- );
-
- javax.swing.GroupLayout inputPanelLayout = new javax.swing.GroupLayout(inputPanel);
- inputPanel.setLayout(inputPanelLayout);
- inputPanelLayout.setHorizontalGroup(
- inputPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(inputPanelLayout.createSequentialGroup()
- .addContainerGap()
- .addGroup(inputPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(inputPanelLayout.createSequentialGroup()
- .addComponent(typeTabel)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addComponent(typeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 292, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addGap(0, 119, Short.MAX_VALUE))
- .addComponent(typePanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 548, Short.MAX_VALUE))
- .addContainerGap())
- );
- inputPanelLayout.setVerticalGroup(
- inputPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(inputPanelLayout.createSequentialGroup()
- .addContainerGap()
- .addGroup(inputPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
- .addComponent(typeTabel)
- .addComponent(typeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addComponent(typePanel, javax.swing.GroupLayout.PREFERRED_SIZE, 225, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
- );
-
- javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
- this.setLayout(layout);
- layout.setHorizontalGroup(
- layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(layout.createSequentialGroup()
- .addContainerGap()
- .addComponent(inputPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addContainerGap())
- );
- layout.setVerticalGroup(
- layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(layout.createSequentialGroup()
- .addGap(6, 6, 6)
- .addComponent(inputPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addContainerGap(44, Short.MAX_VALUE))
- );
- }// //GEN-END:initComponents
- // Variables declaration - do not modify//GEN-BEGIN:variables
- private javax.swing.ButtonGroup buttonGroup1;
- private javax.swing.JPanel inputPanel;
- private javax.swing.JLabel jLabel2;
- private javax.swing.JComboBox typeComboBox;
- private javax.swing.JPanel typePanel;
- private javax.swing.JLabel typeTabel;
- // End of variables declaration//GEN-END:variables
-
- /**
- * The "listener" that updates the UI of this panel based on the changes of
- * fields on this panel. This is also the method to check whether all the
- * fields on this panel are correctly filled and decides whether to enable
- * the "Next" button or not.
- *
- * @param e the document event
- */
- public void updateUI(DocumentEvent e) {
- // Enable the Next button if the current DSP panel is valid
- this.wizPanel.enableNextButton(getCurrentDSProcessor().isPanelValid());
- }
-
- @SuppressWarnings("rawtypes")
- public abstract class ComboboxSeparatorRenderer implements ListCellRenderer {
-
- private ListCellRenderer delegate;
-
- private JPanel separatorPanel = new JPanel(new BorderLayout());
-
- private JSeparator separator = new JSeparator();
-
- public ComboboxSeparatorRenderer(ListCellRenderer delegate) {
- this.delegate = delegate;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
- Component comp = delegate.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
- if (index != -1 && addSeparatorAfter(list, value, index)) {
- separatorPanel.removeAll();
- separatorPanel.add(comp, BorderLayout.CENTER);
- separatorPanel.add(separator, BorderLayout.SOUTH);
- return separatorPanel;
- } else {
- return comp;
- }
- }
-
- protected abstract boolean addSeparatorAfter(JList list, Object value, int index);
- }
-}
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourcePanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardDataSourceSettingsPanel.java
similarity index 81%
rename from Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourcePanel.java
rename to Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardDataSourceSettingsPanel.java
index 3d58017ecb..1643769be0 100644
--- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardChooseDataSourcePanel.java
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardDataSourceSettingsPanel.java
@@ -39,23 +39,17 @@ import org.sleuthkit.autopsy.ingest.runIngestModuleWizard.ShortcutWizardDescript
* The "Add Image" wizard panel1 handling the logic of selecting image file(s)
* to add to Case, and pick the time zone.
*/
-class AddImageWizardChooseDataSourcePanel extends ShortcutWizardDescriptorPanel implements PropertyChangeListener {
+class AddImageWizardDataSourceSettingsPanel extends ShortcutWizardDescriptorPanel implements PropertyChangeListener {
/**
* The visual component that displays this panel. If you need to access the
* component from this class, just use getComponent().
*/
- private final AddImageWizardAddingProgressPanel progressPanel;
- private AddImageWizardChooseDataSourceVisual component;
+ private AddImageWizardDataSourceSettingsVisual component;
private boolean isNextEnable = false;
- private static final String PROP_LASTDATASOURCE_PATH = "LBL_LastDataSource_PATH"; //NON-NLS
- private static final String PROP_LASTDATASOURCE_TYPE = "LBL_LastDataSource_TYPE"; //NON-NLS
// paths to any set hash lookup databases (can be null)
- private String NSRLPath, knownBadPath;
- AddImageWizardChooseDataSourcePanel(AddImageWizardAddingProgressPanel proPanel) {
-
- this.progressPanel = proPanel;
+ AddImageWizardDataSourceSettingsPanel() {
}
@@ -68,10 +62,10 @@ class AddImageWizardChooseDataSourcePanel extends ShortcutWizardDescriptorPanel
* @return component the UI component of this wizard panel
*/
@Override
- public AddImageWizardChooseDataSourceVisual getComponent() {
+ public AddImageWizardDataSourceSettingsVisual getComponent() {
if (component == null) {
WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
- component = new AddImageWizardChooseDataSourceVisual(this);
+ component = new AddImageWizardDataSourceSettingsVisual(this);
}
component.addPropertyChangeListener(this);
return component;
@@ -87,8 +81,7 @@ class AddImageWizardChooseDataSourcePanel extends ShortcutWizardDescriptorPanel
public HelpCtx getHelp() {
// Show no Help button for this panel:
return HelpCtx.DEFAULT_HELP;
- // If you have context help:
- // return new HelpCtx(SampleWizardPanel1.class);
+
}
/**
@@ -164,10 +157,6 @@ class AddImageWizardChooseDataSourcePanel extends ShortcutWizardDescriptorPanel
}
}
- // You can use a settings object to keep track of state. Normally the
- // settings object will be the WizardDescriptor, so you can use
- // WizardDescriptor.getProperty & putProperty to store information entered
- // by the user.
/**
* Provides the wizard panel with the current data--either the default data
* or already-modified settings, if the user used the previous and/or next
@@ -178,26 +167,16 @@ class AddImageWizardChooseDataSourcePanel extends ShortcutWizardDescriptorPanel
*/
@Override
public void readSettings(WizardDescriptor settings) {
-
- //reset settings if supports it
- //getComponent().reset();
// Prepopulate the image directory from the properties file
try {
-
- // Load hash database settings, enable or disable the checkbox
- this.NSRLPath = null;
- this.knownBadPath = null;
- //JCheckBox lookupFilesCheckbox = component.getLookupFilesCheckbox();
- //lookupFilesCheckbox.setSelected(false);
- //lookupFilesCheckbox.setEnabled(this.NSRLPath != null || this.knownBadPath != null);
-
+
// If there is a process object in the settings, revert it and remove it from the settings
AddImageAction.CleanupTask cleanupTask = (AddImageAction.CleanupTask) settings.getProperty(AddImageAction.IMAGECLEANUPTASK_PROP);
if (cleanupTask != null) {
try {
cleanupTask.cleanup();
} catch (Exception ex) {
- Logger logger = Logger.getLogger(AddImageWizardChooseDataSourcePanel.class.getName());
+ Logger logger = Logger.getLogger(AddImageWizardDataSourceSettingsPanel.class.getName());
logger.log(Level.WARNING, "Error cleaning up image task", ex); //NON-NLS
} finally {
cleanupTask.disable();
@@ -205,7 +184,7 @@ class AddImageWizardChooseDataSourcePanel extends ShortcutWizardDescriptorPanel
}
} catch (Exception e) {
}
-
+ component.setDspSelection((String)settings.getProperty("SelectedDsp")); //NON-NLS magic string used SelectDataSourceProcessorPanel
}
/**
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardDataSourceSettingsVisual.form b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardDataSourceSettingsVisual.form
new file mode 100644
index 0000000000..d8ab744f34
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardDataSourceSettingsVisual.form
@@ -0,0 +1,58 @@
+
+
+
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardDataSourceSettingsVisual.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardDataSourceSettingsVisual.java
new file mode 100644
index 0000000000..a5671ce0ee
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardDataSourceSettingsVisual.java
@@ -0,0 +1,215 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2011-2017 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.autopsy.casemodule;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JSeparator;
+import javax.swing.ListCellRenderer;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessor;
+import org.sleuthkit.autopsy.coreutils.Logger;
+
+/**
+ * visual component for the first panel of add image wizard. Allows the user to
+ * choose the data source type and then select the data source
+ *
+ */
+final class AddImageWizardDataSourceSettingsVisual extends JPanel {
+
+ private static final Logger logger = Logger.getLogger(AddImageWizardDataSourceSettingsVisual.class.getName());
+
+ private final AddImageWizardDataSourceSettingsPanel wizPanel;
+
+ private JPanel currentPanel;
+
+ private final Map datasourceProcessorsMap = new HashMap<>();
+
+ private String currentDsp;
+
+ /**
+ * Creates new form AddImageVisualPanel1
+ *
+ * @param wizPanel corresponding WizardPanel to handle logic of wizard step
+ */
+ AddImageWizardDataSourceSettingsVisual(AddImageWizardDataSourceSettingsPanel wizPanel) {
+ initComponents();
+ this.wizPanel = wizPanel;
+ typePanel.setLayout(new BorderLayout());
+ discoverDataSourceProcessors();
+ currentDsp = ImageDSProcessor.getType(); //default value to the ImageDSProcessor
+ }
+
+ /**
+ * Populate the map of DataSourceProcessors which so they can be retrieved
+ * by name.
+ */
+ private void discoverDataSourceProcessors() {
+ for (DataSourceProcessor dsProcessor : Lookup.getDefault().lookupAll(DataSourceProcessor.class)) {
+ if (!datasourceProcessorsMap.containsKey(dsProcessor.getDataSourceType())) {
+ datasourceProcessorsMap.put(dsProcessor.getDataSourceType(), dsProcessor);
+ } else {
+ logger.log(Level.SEVERE, "discoverDataSourceProcessors(): A DataSourceProcessor already exists for type = {0}", dsProcessor.getDataSourceType()); //NON-NLS
+ }
+ }
+ }
+
+ /**
+ * Set the current DataSourceProcessor and update the panel to reflect that
+ * selection.
+ *
+ * @param dsType - the name of the DataSourceProcessor you wish to have this
+ * panel display settings for.
+ */
+ void setDspSelection(String dsType) {
+ currentDsp = dsType;
+ currentPanel = datasourceProcessorsMap.get(dsType).getPanel();
+ updateCurrentPanel(currentPanel);
+ }
+
+ /**
+ * Changes the current panel to the given panel.
+ *
+ * @param panel instance of ImageTypePanel to change to
+ */
+ @SuppressWarnings("deprecation")
+ private void updateCurrentPanel(JPanel panel) {
+ currentPanel = panel;
+ typePanel.removeAll();
+ typePanel.add(currentPanel, BorderLayout.CENTER);
+ typePanel.validate();
+ typePanel.repaint();
+ currentPanel.addPropertyChangeListener(new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (evt.getPropertyName().equals(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString())) {
+ wizPanel.enableNextButton(getCurrentDSProcessor().isPanelValid());
+ }
+ if (evt.getPropertyName().equals(DataSourceProcessor.DSP_PANEL_EVENT.FOCUS_NEXT.toString())) {
+ wizPanel.moveFocusToNext();
+ }
+ }
+ });
+ this.wizPanel.enableNextButton(getCurrentDSProcessor().isPanelValid());
+ }
+
+ /**
+ * Returns the currently selected DS Processor
+ *
+ * @return DataSourceProcessor the DataSourceProcessor corresponding to the
+ * data source type selected in the combobox
+ */
+ protected DataSourceProcessor getCurrentDSProcessor() {
+ // get the type of the currently selected panel and then look up
+ // the correspodning DS Handler in the map
+ DataSourceProcessor dsProcessor = datasourceProcessorsMap.get(currentDsp);
+ return dsProcessor;
+
+ }
+
+ /**
+ * 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
+ */
+ @Override
+ public String getName() {
+ return NbBundle.getMessage(this.getClass(), "AddImageWizardChooseDataSourceVisual.getName.text");
+ }
+
+ /**
+ * 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.
+ */
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ typePanel = new javax.swing.JPanel();
+
+ setPreferredSize(new java.awt.Dimension(588, 328));
+
+ typePanel.setMinimumSize(new java.awt.Dimension(0, 65));
+ typePanel.setPreferredSize(new java.awt.Dimension(521, 65));
+
+ javax.swing.GroupLayout typePanelLayout = new javax.swing.GroupLayout(typePanel);
+ typePanel.setLayout(typePanelLayout);
+ typePanelLayout.setHorizontalGroup(
+ typePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 588, Short.MAX_VALUE)
+ );
+ typePanelLayout.setVerticalGroup(
+ typePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 328, Short.MAX_VALUE)
+ );
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+ this.setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(typePanel, javax.swing.GroupLayout.DEFAULT_SIZE, 588, Short.MAX_VALUE)
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(typePanel, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE)
+ );
+ }// //GEN-END:initComponents
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel typePanel;
+ // End of variables declaration//GEN-END:variables
+
+ @SuppressWarnings("rawtypes")
+ public abstract class ComboboxSeparatorRenderer implements ListCellRenderer {
+
+ private final ListCellRenderer delegate;
+
+ private final JPanel separatorPanel = new JPanel(new BorderLayout());
+
+ private final JSeparator separator = new JSeparator();
+
+ public ComboboxSeparatorRenderer(ListCellRenderer delegate) {
+ this.delegate = delegate;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
+ Component comp = delegate.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+ if (index != -1 && addSeparatorAfter(list, value, index)) {
+ separatorPanel.removeAll();
+ separatorPanel.add(comp, BorderLayout.CENTER);
+ separatorPanel.add(separator, BorderLayout.SOUTH);
+ return separatorPanel;
+ } else {
+ return comp;
+ }
+ }
+
+ protected abstract boolean addSeparatorAfter(JList list, Object value, int index);
+ }
+}
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigPanel.java
index ce4aa13c89..1d7bbb8a13 100644
--- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigPanel.java
@@ -69,12 +69,12 @@ class AddImageWizardIngestConfigPanel extends ShortcutWizardDescriptorPanel {
private final AddImageAction addImageAction;
private final AddImageWizardAddingProgressPanel progressPanel;
- private final AddImageWizardChooseDataSourcePanel dataSourcePanel;
+ private final AddImageWizardDataSourceSettingsPanel dataSourcePanel;
private DataSourceProcessor dsProcessor;
private boolean cancelled;
- AddImageWizardIngestConfigPanel(AddImageWizardChooseDataSourcePanel dsPanel, AddImageAction action, AddImageWizardAddingProgressPanel proPanel) {
+ AddImageWizardIngestConfigPanel(AddImageWizardDataSourceSettingsPanel dsPanel, AddImageAction action, AddImageWizardAddingProgressPanel proPanel) {
this.addImageAction = action;
this.progressPanel = proPanel;
this.dataSourcePanel = dsPanel;
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIterator.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIterator.java
index 3dafa75479..3558ffe83b 100644
--- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIterator.java
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIterator.java
@@ -40,6 +40,7 @@ class AddImageWizardIterator implements WizardDescriptor.Iterator panels;
private final AddImageAction action;
private int progressPanelIndex;
+ private int dsPanelIndex;
private final static String PROP_LASTPROFILE_NAME = "AIW_LASTPROFILE_NAME"; //NON-NLS
AddImageWizardIterator(AddImageAction action) {
@@ -53,10 +54,11 @@ class AddImageWizardIterator implements WizardDescriptor.Iterator getPanels() {
if (panels == null) {
panels = new ArrayList<>();
-
+ AddImageWizardSelectDspPanel dspSelection = new AddImageWizardSelectDspPanel();
+ panels.add(dspSelection);
AddImageWizardAddingProgressPanel progressPanel = new AddImageWizardAddingProgressPanel();
- AddImageWizardChooseDataSourcePanel dsPanel = new AddImageWizardChooseDataSourcePanel(progressPanel);
+ AddImageWizardDataSourceSettingsPanel dsPanel = new AddImageWizardDataSourceSettingsPanel();
AddImageWizardIngestConfigPanel ingestConfigPanel = new AddImageWizardIngestConfigPanel(dsPanel, action, progressPanel);
panels.add(dsPanel);
List profiles = IngestProfiles.getIngestProfiles();
@@ -66,6 +68,7 @@ class AddImageWizardIterator implements WizardDescriptor.Iterator sleuthkit org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.autopsy.casemodule;
+
+import java.awt.Component;
+import java.awt.Cursor;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.logging.Level;
+import javax.swing.event.ChangeListener;
+import org.openide.WizardDescriptor;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.windows.WindowManager;
+import org.sleuthkit.autopsy.coreutils.Logger;
+import org.sleuthkit.autopsy.coreutils.ModuleSettings;
+import org.sleuthkit.autopsy.ingest.runIngestModuleWizard.ShortcutWizardDescriptorPanel;
+
+/**
+ * Create a wizard panel which contains a panel allowing the selection of the
+ * DataSourceProcessor
+ */
+final class AddImageWizardSelectDspPanel extends ShortcutWizardDescriptorPanel implements PropertyChangeListener {
+
+ @NbBundle.Messages("SelectDataSourceProcessorPanel.name.text=Select Type of Data")
+ private AddImageWizardSelectDspVisual component;
+ private static final String LAST_DSP_PROPERTIES_FILE = "LastDspUsed"; //NON-NLS
+ private static final String LAST_DSP_USED_KEY = "Last_Dsp_Used"; //NON-NLS
+ private static final Logger logger = Logger.getLogger(AddImageWizardSelectDspVisual.class.getName());
+
+ @Override
+ public Component getComponent() {
+ if (component == null) {
+ String lastDspUsed;
+ if (!(ModuleSettings.getConfigSetting(LAST_DSP_PROPERTIES_FILE, LAST_DSP_USED_KEY) == null)
+ && !ModuleSettings.getConfigSetting(LAST_DSP_PROPERTIES_FILE, LAST_DSP_USED_KEY).isEmpty()) {
+ lastDspUsed = ModuleSettings.getConfigSetting(LAST_DSP_PROPERTIES_FILE, LAST_DSP_USED_KEY);
+ } else {
+ lastDspUsed = ImageDSProcessor.getType();
+ logger.log(Level.WARNING, "There was no properties file containing the last DataSourceProcessor used, Disk Image or VM will be selected as default selection"); //NON-NLS
+ }
+ WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+ component = new AddImageWizardSelectDspVisual(lastDspUsed);
+ component.setName(Bundle.SelectDataSourceProcessorPanel_name_text());
+ }
+ component.addPropertyChangeListener(this);
+ return component;
+ }
+
+ @Override
+ public HelpCtx getHelp() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ public void readSettings(WizardDescriptor data) {
+ }
+
+ @Override
+ public void storeSettings(WizardDescriptor data) {
+ String lastDspUsed = component.getSelectedDsp();
+ ModuleSettings.setConfigSetting(LAST_DSP_PROPERTIES_FILE, LAST_DSP_USED_KEY, lastDspUsed);
+ data.putProperty("SelectedDsp", lastDspUsed); //NON-NLS magic string necesary to AddImageWizardChooseDataSourcePanel
+ }
+
+ @Override
+ public boolean isValid() {
+ return true;
+ }
+
+ @Override
+ public void addChangeListener(ChangeListener cl) {
+ }
+
+ @Override
+ public void removeChangeListener(ChangeListener cl) {
+ }
+
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ }
+}
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardSelectDspVisual.form b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardSelectDspVisual.form
new file mode 100644
index 0000000000..106c4925c5
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardSelectDspVisual.form
@@ -0,0 +1,73 @@
+
+
+
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardSelectDspVisual.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardSelectDspVisual.java
new file mode 100644
index 0000000000..7a86e5dfb9
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardSelectDspVisual.java
@@ -0,0 +1,241 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2011-2017 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.autopsy.casemodule;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import javax.swing.AbstractButton;
+import javax.swing.Box.Filler;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.JToggleButton;
+import org.openide.util.Lookup;
+import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessor;
+import org.sleuthkit.autopsy.datasourceprocessors.RawDSProcessor;
+import org.sleuthkit.autopsy.coreutils.Logger;
+
+/**
+ * Panel which displays the available DataSourceProcessors and allows selection of one
+ */
+final class AddImageWizardSelectDspVisual extends JPanel {
+
+ private static final Logger logger = Logger.getLogger(AddImageWizardSelectDspVisual.class.getName());
+ private String selectedDsp;
+
+ /**
+ * Creates new form SelectDataSourceProcessorPanel
+ */
+ AddImageWizardSelectDspVisual(String lastDspUsed) {
+ initComponents();
+ selectedDsp = lastDspUsed;
+ createDataSourceProcessorButtons();
+
+ //add actionlistner to listen for change
+ }
+
+ /**
+ * Find the DSP which is currently selected and save it as the selected
+ * DataSourceProcessor.
+ *
+ */
+ private void updateSelectedDsp() {
+ Enumeration buttonGroup = buttonGroup1.getElements();
+ while (buttonGroup.hasMoreElements()) {
+ AbstractButton dspButton = buttonGroup.nextElement();
+ if (dspButton.isSelected()) {
+ selectedDsp = dspButton.getName();
+ break;
+ }
+ }
+ }
+
+ /**
+ * Get the DataSourceProcessor which is currently selected in this panel
+ *
+ * @return selectedDsp the DataSourceProcessor which is selected in this panel
+ */
+ String getSelectedDsp() {
+ return selectedDsp;
+ }
+
+ /**
+ * Create the a button for each DataSourceProcessor that should exist as an option.
+ */
+ private void createDataSourceProcessorButtons() {
+ //Listener for button selection
+ ActionListener cbActionListener = new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ updateSelectedDsp();
+ }
+ };
+ List dspList = getListOfDsps();
+ //Set up the constraints for the panel layout
+ GridBagLayout gridBagLayout = new GridBagLayout();
+ GridBagConstraints constraints = new GridBagConstraints();
+ constraints.fill = GridBagConstraints.HORIZONTAL;
+ constraints.gridx = 0;
+ constraints.gridy = 0;
+ constraints.weighty = 0;
+ constraints.anchor = GridBagConstraints.LINE_START;
+ Dimension spacerBlockDimension = new Dimension(6, 4); // Space between left edge and button, Space between rows
+ for (String dspType : dspList) {
+ constraints.weightx = 1;
+ //Add a spacer
+ Filler spacer = new Filler(spacerBlockDimension, spacerBlockDimension, spacerBlockDimension);
+ gridBagLayout.setConstraints(spacer, constraints);
+ jPanel1.add(spacer);
+ constraints.gridx++;
+ constraints.gridy++;
+ //Add the button
+ JToggleButton dspButton = createDspButton(dspType);
+ dspButton.addActionListener(cbActionListener);
+ jPanel1.add(dspButton);
+ buttonGroup1.add(dspButton);
+ gridBagLayout.setConstraints(dspButton, constraints);
+ constraints.gridx++;
+ //Add the text area serving as a label to the right of the button
+ JTextArea myLabel = new JTextArea(dspType);
+ myLabel.setBackground(new Color(240, 240, 240));//matches background of panel
+ myLabel.setEditable(false);
+ myLabel.setWrapStyleWord(true);
+ myLabel.setLineWrap(true);
+ jPanel1.add(myLabel);
+ gridBagLayout.setConstraints(myLabel, constraints);
+ constraints.weightx = 0;
+ constraints.gridy++;
+ constraints.gridx = 0;
+ }
+ Component vertGlue = javax.swing.Box.createVerticalGlue();
+ jPanel1.add(vertGlue);
+ constraints.gridy++;
+ constraints.gridx = 0;
+ constraints.weighty = 1;
+ gridBagLayout.setConstraints(vertGlue, constraints);
+ jPanel1.setLayout(gridBagLayout);
+ }
+
+ /**
+ * Create a list of the DataSourceProcessors which should exist as options on this panel.
+ * The default Autopsy DataSourceProcessors will appear
+ * at the beggining of the list in the same order.
+ *
+ * @return dspList a list of DataSourceProcessors which can be chose in this panel
+ */
+ private List getListOfDsps() {
+ List dspList = new ArrayList<>();
+ final Map datasourceProcessorsMap = new HashMap<>();
+ for (DataSourceProcessor dsProcessor : Lookup.getDefault().lookupAll(DataSourceProcessor.class)) {
+ if (!datasourceProcessorsMap.containsKey(dsProcessor.getDataSourceType())) {
+ datasourceProcessorsMap.put(dsProcessor.getDataSourceType(), dsProcessor);
+ } else {
+ logger.log(Level.SEVERE, "discoverDataSourceProcessors(): A DataSourceProcessor already exists for type = {0}", dsProcessor.getDataSourceType()); //NON-NLS
+ }
+ }
+ dspList.add(ImageDSProcessor.getType());
+ if (Case.getCurrentCase().getCaseType() != Case.CaseType.MULTI_USER_CASE) {
+ dspList.add(LocalDiskDSProcessor.getType());
+ } else {
+ // remove LocalDiskDSProcessor from list of DSPs
+ datasourceProcessorsMap.remove(LocalDiskDSProcessor.getType());
+ }
+ dspList.add(LocalFilesDSProcessor.getType());
+ dspList.add(RawDSProcessor.getType());
+ // now add any addtional DSPs that haven't already been added
+ for (String dspType : datasourceProcessorsMap.keySet()) {
+ if (!dspList.contains(dspType)) {
+ dspList.add(dspType);
+ }
+ }
+ return dspList;
+ }
+
+ /**
+ * Create a single button for a DataSourceProcessor
+ *
+ * @param dspType - the name of the DataSourceProcessor
+ *
+ * @return dspButton a JToggleButton for the specified dspType
+ */
+ private JToggleButton createDspButton(String dspType) {
+ JToggleButton dspButton = new JToggleButton();
+ dspButton.setMaximumSize(new java.awt.Dimension(48, 48));
+ dspButton.setMinimumSize(new java.awt.Dimension(48, 48));
+ dspButton.setPreferredSize(new java.awt.Dimension(48, 48));
+ dspButton.setName(dspType);
+ dspButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/modules/fileextmismatch/options-icon.png")));
+ dspButton.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/checkbox32.png")));
+ dspButton.setFocusable(false);
+ if (dspType.equals(selectedDsp)) {
+ dspButton.setSelected(true);
+ } else {
+ dspButton.setSelected(false);
+ }
+ return dspButton;
+ }
+
+ @SuppressWarnings("unchecked")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ buttonGroup1 = new javax.swing.ButtonGroup();
+ jScrollPane1 = new javax.swing.JScrollPane();
+ jPanel1 = new javax.swing.JPanel();
+ filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(6, 8), new java.awt.Dimension(6, 8), new java.awt.Dimension(6, 8));
+
+ jPanel1.setLayout(new java.awt.GridBagLayout());
+ jPanel1.add(filler1, new java.awt.GridBagConstraints());
+
+ jScrollPane1.setViewportView(jPanel1);
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+ this.setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 588, Short.MAX_VALUE)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 588, Short.MAX_VALUE))
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 328, Short.MAX_VALUE)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE))
+ );
+ }// //GEN-END:initComponents
+
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.ButtonGroup buttonGroup1;
+ private javax.swing.Box.Filler filler1;
+ private javax.swing.JPanel jPanel1;
+ private javax.swing.JScrollPane jScrollPane1;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties
index c4a51ac904..f22ada5664 100644
--- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties
@@ -55,8 +55,6 @@ LocalFilesPanel.localFileChooser.approveButtonText=Select
LocalFilesPanel.localFileChooser.approveButtonToolTipText=
LocalFilesPanel.selectButton.actionCommand=Add
AddImageWizardAddingProgressVisual.statusLabel.text=Data source has been added to the local database. Files are being analyzed.
-AddImageWizardChooseDataSourceVisual.typeTabel.text=Select data source type:
-AddImageWizardChooseDataSourceVisual.jLabel2.text=jLabel2
AddImageWizardAddingProgressVisual.progressLabel.text=