diff --git a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java
index 2be9a9b447..bf4d5dc3c1 100644
--- a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java
+++ b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java
@@ -18,6 +18,7 @@
*/
package org.sleuthkit.autopsy.core;
+import java.nio.file.Paths;
import org.sleuthkit.autopsy.coreutils.TextConverter;
import java.util.prefs.BackingStoreException;
import org.sleuthkit.autopsy.events.MessageServiceConnectionInfo;
@@ -75,6 +76,7 @@ public final class UserPreferences {
public static final String SHOW_ONLY_CURRENT_USER_TAGS = "ShowOnlyCurrentUserTags";
public static final String HIDE_CENTRAL_REPO_COMMENTS_AND_OCCURRENCES = "HideCentralRepoCommentsAndOccurrences";
public static final String DISPLAY_TRANSLATED_NAMES = "DisplayTranslatedNames";
+ public static final String HDX_EDITOR_PATH = "HdXEditorPath";
// Prevent instantiation.
private UserPreferences() {
@@ -471,4 +473,20 @@ public final class UserPreferences {
public static void setLogFileCount(int count) {
preferences.putInt(MAX_NUM_OF_LOG_FILE, count);
}
+
+ /**
+ *
+ * @param executablePath
+ */
+ public static void setHdXEditorPath(String executablePath) {
+ preferences.put(HDX_EDITOR_PATH, executablePath);
+ }
+
+ /**
+ *
+ * @return
+ */
+ public static String getHdXEditorPath() {
+ return preferences.get(HDX_EDITOR_PATH, Paths.get("C:", "Program Files", "HxD", "HxD.exe").toString());
+ }
}
diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties
index 38f8388cc4..d91a751a1a 100644
--- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties
+++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties
@@ -194,3 +194,33 @@ ViewPreferencesPanel.useBestViewerRadioButton.toolTipText=For example, change fr
ViewPreferencesPanel.useBestViewerRadioButton.text=Change to the most specific file viewer
ViewPreferencesPanel.fileNameTranslationColumnCheckbox.text=Add column in result viewer for file name translation
DataContentViewerHex.launchHxDButton.text=Launch in HxD
+ExternalViewerGlobalSettingsPanel.jButton2.text=jButton2
+ExternalViewerGlobalSettingsPanel.newRuleButton1.text=New Rule
+ExternalViewerGlobalSettingsPanel.newRuleButton.text=New Rule
+ExternalViewerGlobalSettingsPanel.browseHxDDirectory.text=Browse
+ExternalViewerGlobalSettingsPanel.jLabel2.text=Set launchable content viewer extensions
+ExternalViewerGlobalSettingsPanel.jLabel1.text=HxD Editor Path:
+ExternalViewerGlobalSettingsPanel.editRuleButton.text=Edit Rule
+ExternalViewerGlobalSettingsPanel.deleteRuleButton.text=Delete Rule
+ExternalViewerGlobalSettingsPanel.externalViewerTitleLabel.text=Set aplication viewer to use for files with specific mime types/extensions:
+ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title1=Application
+ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title0=Mime type/Extension
+AddExternalViewerRulePanel.nameLabel.text=MIME type or extension
+AddExternalViewerRulePanel.browseButton.text=Browse
+AddExternalViewerRulePanel.exePathTextField.text=
+AddExternalViewerRulePanel.exePathLabel.text=Path of the program to use for files with this type or extension
+AddExternalViewerRulePanel.extRadioButton.text=Extension
+AddExternalViewerRulePanel.mimeRadioButton.text=MIME type
+AddExternalViewerRulePanel.nameTextField.text=
+ExternalViewerGlobalSettingsPanel.jButton2.text_1=jButton2
+ExternalViewerGlobalSettingsPanel.newRuleButton1.text_1=New Rule
+ExternalViewerGlobalSettingsPanel.newRuleButton.text_1=New Rule
+ExternalViewerGlobalSettingsPanel.browseHxDDirectory.text_1=Browse
+ExternalViewerGlobalSettingsPanel.jLabel2.text_1=Set launchable content viewer extensions
+ExternalViewerGlobalSettingsPanel.jLabel1.text_1=HxD Editor Path:
+ExternalViewerGlobalSettingsPanel.HxDPath.text=C:/Program Files/HxD/HxD.exe
+ExternalViewerGlobalSettingsPanel.editRuleButton.text_1=Edit Rule
+ExternalViewerGlobalSettingsPanel.deleteRuleButton.text_1=Delete Rule
+ExternalViewerGlobalSettingsPanel.externalViewerTitleLabel.text_1=Set aplication viewer to use for files with specific mime types/extensions:
+ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title1_1=Application
+ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title0_1=Mime type/Extension
diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerHex.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerHex.java
index 8d855b7aa0..ddc6c8f43b 100644
--- a/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerHex.java
+++ b/Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerHex.java
@@ -32,13 +32,12 @@ import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Utilities;
-import org.openide.modules.InstalledFileLocator;
import org.openide.nodes.Node;
import org.openide.util.lookup.ServiceProvider;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
+import org.sleuthkit.autopsy.core.UserPreferences;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataContentViewer;
-import org.sleuthkit.autopsy.coreutils.ExecUtil;
import org.sleuthkit.autopsy.datamodel.ContentUtils;
import org.sleuthkit.autopsy.datamodel.DataConversion;
import org.sleuthkit.datamodel.Content;
@@ -356,22 +355,33 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
private void launchHxDButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_launchHxDButtonActionPerformed
try {
+ File HdXExecutable = new File(UserPreferences.getHdXEditorPath());
+ if(!HdXExecutable.exists() || !HdXExecutable.canExecute()) {
+ JOptionPane.showMessageDialog(null, "Unable to launch HxD Editor. "
+ + "Please set-up the HdX install location in Tools -> "
+ + "Options -> External Viewer");
+ return;
+ }
+
String tempDirectory = Case.getCurrentCaseThrows().getTempDirectory();
File dataSourceInTempDirectory = Paths.get(tempDirectory, dataSource.getId() + dataSource.getName()).toFile();
ContentUtils.writeToFile(dataSource, dataSourceInTempDirectory);
- String HdXExecutableToFind = Paths.get("HxD", "HxD64.exe").toString();
- File HdXExecutable = InstalledFileLocator.getDefault().locate(HdXExecutableToFind, DataContentViewerHex.class.getPackage().getName(), false);
- if (null == HdXExecutable) {
- throw new IOException(String.format("Could not find HdXExecutable at %s", HdXExecutableToFind));
+ try {
+ ProcessBuilder launchHdXExecutable = new ProcessBuilder();
+ launchHdXExecutable.command(String.format("\"%s\" \"%s\"",
+ HdXExecutable.getAbsolutePath(),
+ dataSourceInTempDirectory.getAbsolutePath()));
+ launchHdXExecutable.start();
+ } catch (IOException ex) {
+ JOptionPane.showMessageDialog(null, "Unable to launch HxD Editor. "
+ + "Please set-up the HdX install location in Tools -> "
+ + "Options -> External Viewer");
+ dataSourceInTempDirectory.delete();
}
-
- ProcessBuilder launchHdXExecutable = new ProcessBuilder();
- launchHdXExecutable.command(String.format("%s \"%s\"", HdXExecutable.getAbsolutePath(), dataSourceInTempDirectory.getAbsolutePath()));
- ExecUtil.execute(launchHdXExecutable);
} catch (NoCurrentCaseException | IOException ex) {
- logger.log(Level.SEVERE, "Unable to launch HxD Editor", ex);
- //TODO - Make pop-up appear saying there were problems attempting to launch editor
+ logger.log(Level.SEVERE, "Unable to copy file into temp directory", ex);
+ //Should we add a pop-up for this?
}
}//GEN-LAST:event_launchHxDButtonActionPerformed
@@ -546,6 +556,7 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
goToPageLabel.setVisible(isVisible);
goToOffsetTextField.setVisible(isVisible);
goToOffsetLabel.setVisible(isVisible);
+ launchHxDButton.setVisible(isVisible);
}
@Override
diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties
index 5857deb2b9..22ad15405a 100644
--- a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties
+++ b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties
@@ -124,12 +124,9 @@ ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title2_1=Title 3
ExternalViewerGlobalSettingsPanel.newRuleButton1.text=New Rule
ExternalViewerGlobalSettingsPanel.editRuleButton.text=Edit Rule
ExternalViewerGlobalSettingsPanel.deleteRuleButton.text=Delete Rule
-ExternalViewerGlobalSettingsPanel.externalViewerTitleLabel.text=Set aplication viewer to use for files with specific mime types/extensions:
+ExternalViewerGlobalSettingsPanel.externalViewerTitleLabel.text=Add your custom rules for external viewers:
ExternalViewerGlobalSettingsPanel.newRuleButton.text=New Rule
-ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title1=Application
-ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title0=Mime type/Extension
-ExternalViewerGlobalSettingsPanel.jLabel1.text=HxD Editor Path:
ExternalViewerGlobalSettingsPanel.jButton2.text=jButton2
-ExternalViewerGlobalSettingsPanel.jLabel2.text=Set launchable content viewer extensions
+ExternalViewerGlobalSettingsPanel.jLabel1.text=HxD Editor Path:
ExternalViewerGlobalSettingsPanel.browseHxDDirectory.text=Browse
-ExternalViewerGlobalSettingsPanel.HxDPath.text=C:/Program Files/HxD/HxD.exe
+ExternalViewerGlobalSettingsPanel.jLabel2.text=Add content viewer extensions:
diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerGlobalSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerGlobalSettingsPanel.form
index b3d33e0b2b..5ca99ba3bf 100644
--- a/Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerGlobalSettingsPanel.form
+++ b/Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerGlobalSettingsPanel.form
@@ -282,9 +282,6 @@
-
-
-
diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerGlobalSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerGlobalSettingsPanel.java
index 1903729ec5..4df9b933fd 100644
--- a/Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerGlobalSettingsPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/directorytree/ExternalViewerGlobalSettingsPanel.java
@@ -18,6 +18,7 @@
*/
package org.sleuthkit.autopsy.directorytree;
+import java.awt.Color;
import java.io.File;
import java.util.ArrayList;
import javax.swing.JFileChooser;
@@ -27,7 +28,7 @@ import javax.swing.table.AbstractTableModel;
import org.openide.util.NbBundle;
import org.netbeans.spi.options.OptionsPanelController;
import org.sleuthkit.autopsy.casemodule.GeneralFilter;
-import org.sleuthkit.autopsy.coreutils.ModuleSettings;
+import org.sleuthkit.autopsy.core.UserPreferences;
/**
* An options panel for the user to create, edit, and delete associations for
@@ -39,8 +40,6 @@ final class ExternalViewerGlobalSettingsPanel extends javax.swing.JPanel impleme
private RulesTableModel rulesTableModel;
private java.util.List rules;
- private static final String MODULE_NAME = ExternalViewerGlobalSettingsPanel.class.getName();
- private static final String HXD_PATH_NAME = "HxDExecutablePath";
/**
* Creates new form ExternalViewerGlobalSettingsPanel
@@ -171,7 +170,6 @@ final class ExternalViewerGlobalSettingsPanel extends javax.swing.JPanel impleme
);
HxDPath.setEditable(false);
- HxDPath.setText(org.openide.util.NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class, "ExternalViewerGlobalSettingsPanel.HxDPath.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(ExternalViewerGlobalSettingsPanel.class, "ExternalViewerGlobalSettingsPanel.jLabel1.text")); // NOI18N
@@ -245,25 +243,6 @@ final class ExternalViewerGlobalSettingsPanel extends javax.swing.JPanel impleme
);
}// //GEN-END:initComponents
- private void browseHxDDirectoryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseHxDDirectoryActionPerformed
- JFileChooser fileWindow = new JFileChooser();
- fileWindow.setFileSelectionMode(JFileChooser.FILES_ONLY);
- GeneralFilter exeFilter = new GeneralFilter(GeneralFilter.EXECUTABLE_EXTS, GeneralFilter.EXECUTABLE_DESC);
- File HxDPathFile = new File(HxDPath.getText());
- if(HxDPathFile.exists() && HxDPathFile.canExecute()) {
- fileWindow.setCurrentDirectory(new File(HxDPath.getText()));
- }
- fileWindow.setDragEnabled(false);
- fileWindow.setFileFilter(exeFilter);
- fileWindow.setMultiSelectionEnabled(false);
- int returnVal = fileWindow.showSaveDialog(this);
- if(returnVal == JFileChooser.APPROVE_OPTION) {
- File HxDExecutable = fileWindow.getSelectedFile();
- HxDPath.setText(HxDExecutable.getAbsolutePath());
- firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
- }
- }//GEN-LAST:event_browseHxDDirectoryActionPerformed
-
private void newRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newRuleButtonActionPerformed
AddExternalViewerRuleDialog dialog = new AddExternalViewerRuleDialog();
AddExternalViewerRuleDialog.BUTTON_PRESSED result = dialog.getResult();
@@ -321,18 +300,43 @@ final class ExternalViewerGlobalSettingsPanel extends javax.swing.JPanel impleme
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
}//GEN-LAST:event_deleteRuleButtonActionPerformed
+ private void browseHxDDirectoryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseHxDDirectoryActionPerformed
+ JFileChooser fileWindow = new JFileChooser();
+ fileWindow.setFileSelectionMode(JFileChooser.FILES_ONLY);
+ GeneralFilter exeFilter = new GeneralFilter(GeneralFilter.EXECUTABLE_EXTS, GeneralFilter.EXECUTABLE_DESC);
+ File HxDPathFile = new File(HxDPath.getText());
+ if(HxDPathFile.exists() && HxDPathFile.canExecute()) {
+ fileWindow.setCurrentDirectory(new File(HxDPath.getText()));
+ }
+ fileWindow.setDragEnabled(false);
+ fileWindow.setFileFilter(exeFilter);
+ fileWindow.setMultiSelectionEnabled(false);
+ int returnVal = fileWindow.showSaveDialog(this);
+ if(returnVal == JFileChooser.APPROVE_OPTION) {
+ File HxDExecutable = fileWindow.getSelectedFile();
+ HxDPath.setForeground(Color.BLACK);
+ HxDPath.setText(HxDExecutable.getAbsolutePath());
+ firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
+ }
+ }//GEN-LAST:event_browseHxDDirectoryActionPerformed
+
@Override
public void store() {
ExternalViewerRulesManager.getInstance().setUserRules(rules);
- ModuleSettings.setConfigSetting(MODULE_NAME, HXD_PATH_NAME, HxDPath.getText());
+ UserPreferences.setHdXEditorPath(HxDPath.getText());
}
@Override
public void load() {
rules = ExternalViewerRulesManager.getInstance().getUserRules();
- if(ModuleSettings.settingExists(MODULE_NAME, HXD_PATH_NAME)) {
- HxDPath.setText(ModuleSettings.getConfigSetting(MODULE_NAME, HXD_PATH_NAME));
- }
+ String editorPath = UserPreferences.getHdXEditorPath();
+ File HdXExecutable = new File(editorPath);
+ if(HdXExecutable.exists() || HdXExecutable.canExecute()) {
+ HxDPath.setText(editorPath);
+ } else {
+ HxDPath.setForeground(Color.RED);
+ HxDPath.setText(editorPath);
+ }
rulesTableModel.fireTableDataChanged();
checkButtons();
}