diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties
index e0a5e749d2..29697568fe 100755
--- a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties
+++ b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties
@@ -31,3 +31,5 @@ MessageContentViewer.subjectLabel.text=Subject:
MessageContentViewer.subjectText.text=subject goes here
MessageContentViewer.directionText.text=direction
MessageContentViewer.ccLabel.text=CC:
+MessageContentViewer.attachmentsPanel.TabConstraints.tabTitle=Attachments
+MessageContentViewer.viewInNewWindowButton.text=View in new Window
diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.form b/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.form
index 856adf99a8..9fdcddfe02 100644
--- a/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.form
+++ b/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.form
@@ -336,6 +336,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java b/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java
index 0d43bd6849..2836b69b50 100644
--- a/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java
+++ b/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java
@@ -29,6 +29,7 @@ import java.util.stream.Collectors;
import javax.swing.text.JTextComponent;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
+import org.openide.explorer.ExplorerManager;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children;
import org.openide.nodes.Node;
@@ -41,6 +42,7 @@ import org.sleuthkit.autopsy.corecomponents.TableFilterNode;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.datamodel.FileNode;
import org.sleuthkit.autopsy.directorytree.DataResultFilterNode;
+import org.sleuthkit.autopsy.directorytree.NewWindowViewAction;
import org.sleuthkit.datamodel.AbstractFile;
import org.sleuthkit.datamodel.BlackboardArtifact;
import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG;
@@ -75,6 +77,7 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
private static final int TEXT_TAB_INDEX = 1;
private static final int HTML_TAB_INDEX = 2;
private static final int RTF_TAB_INDEX = 3;
+ private static final int ATTM_TAB_INDEX = 4;
private final List textAreas;
/**
@@ -82,13 +85,13 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
*/
private BlackboardArtifact artifact;
private DataResultPanel drp;
+ private final ExplorerManager drpExplorerManager;
/**
* Creates new MessageContentViewer
*/
public MessageContentViewer() {
initComponents();
-
drp = DataResultPanel.createInstanceUninitialized("Attachments", "", Node.EMPTY, 0, new DataContent() {
@Override
public void setNode(Node selectedNode) {
@@ -101,7 +104,8 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
}
}
);
- msgbodyTabbedPane.addTab("Attachments", drp);
+
+ attachmentsScrollPane.setViewportView(drp);
msgbodyTabbedPane.setEnabledAt(4, true);
textAreas = Arrays.asList(headersTextArea, textbodyTextArea, htmlbodyTextPane, rtfbodyTextPane);
@@ -111,6 +115,10 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
resetComponent();
drp.open();
+ drpExplorerManager = drp.getExplorerManager();
+ drpExplorerManager.addPropertyChangeListener(evt
+ -> viewInNewWindowButton.setEnabled(drpExplorerManager.getSelectedNodes().length == 1));
+
}
/**
@@ -144,6 +152,9 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
showImagesToggleButton = new javax.swing.JToggleButton();
rtfbodyScrollPane = new javax.swing.JScrollPane();
rtfbodyTextPane = new javax.swing.JTextPane();
+ attachmentsPanel = new javax.swing.JPanel();
+ viewInNewWindowButton = new javax.swing.JButton();
+ attachmentsScrollPane = new javax.swing.JScrollPane();
envelopePanel.setBackground(new java.awt.Color(204, 204, 204));
@@ -287,6 +298,39 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
msgbodyTabbedPane.addTab(org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.rtfbodyScrollPane.TabConstraints.tabTitle"), rtfbodyScrollPane); // NOI18N
+ org.openide.awt.Mnemonics.setLocalizedText(viewInNewWindowButton, org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.viewInNewWindowButton.text")); // NOI18N
+ viewInNewWindowButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ viewInNewWindowButtonActionPerformed(evt);
+ }
+ });
+
+ javax.swing.GroupLayout attachmentsPanelLayout = new javax.swing.GroupLayout(attachmentsPanel);
+ attachmentsPanel.setLayout(attachmentsPanelLayout);
+ attachmentsPanelLayout.setHorizontalGroup(
+ attachmentsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(attachmentsPanelLayout.createSequentialGroup()
+ .addGap(0, 0, 0)
+ .addGroup(attachmentsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, attachmentsPanelLayout.createSequentialGroup()
+ .addComponent(viewInNewWindowButton)
+ .addGap(3, 3, 3))
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, attachmentsPanelLayout.createSequentialGroup()
+ .addComponent(attachmentsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 647, Short.MAX_VALUE)
+ .addGap(0, 0, 0))))
+ );
+ attachmentsPanelLayout.setVerticalGroup(
+ attachmentsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(attachmentsPanelLayout.createSequentialGroup()
+ .addGap(0, 0, 0)
+ .addComponent(viewInNewWindowButton)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(attachmentsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 327, Short.MAX_VALUE)
+ .addGap(0, 0, 0))
+ );
+
+ msgbodyTabbedPane.addTab(org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.attachmentsPanel.TabConstraints.tabTitle"), attachmentsPanel); // NOI18N
+
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
@@ -329,8 +373,15 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
}
}//GEN-LAST:event_showImagesToggleButtonActionPerformed
+ private void viewInNewWindowButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_viewInNewWindowButtonActionPerformed
+
+ new NewWindowViewAction("View in new window", drpExplorerManager.getSelectedNodes()[0]).actionPerformed(evt);
+ }//GEN-LAST:event_viewInNewWindowButtonActionPerformed
+
// Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel attachmentsPanel;
+ private javax.swing.JScrollPane attachmentsScrollPane;
private javax.swing.JLabel ccLabel;
private javax.swing.JLabel ccText;
private javax.swing.JLabel datetimeText;
@@ -353,6 +404,7 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
private javax.swing.JTextArea textbodyTextArea;
private javax.swing.JLabel toLabel;
private javax.swing.JLabel toText;
+ private javax.swing.JButton viewInNewWindowButton;
// End of variables declaration//GEN-END:variables
@Override
@@ -480,12 +532,16 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
configureTextArea(TSK_EMAIL_CONTENT_PLAIN, TEXT_TAB_INDEX);
configureTextArea(TSK_EMAIL_CONTENT_HTML, HTML_TAB_INDEX);
configureTextArea(TSK_EMAIL_CONTENT_RTF, RTF_TAB_INDEX);
-
+
+ //TODO: Replace this with code to get the actual attachements!
final Set attachments = artifact.getDataSource().getChildren().stream()
.filter(AbstractFile.class::isInstance)
.map(AbstractFile.class::cast)
.collect(Collectors.toSet());
+ final int numberOfAttachments = attachments.size();
+ msgbodyTabbedPane.setEnabledAt(4, numberOfAttachments > 0);
+ msgbodyTabbedPane.setTitleAt(4, "Attachments (" + numberOfAttachments + ")");
drp.setNode(new TableFilterNode(new DataResultFilterNode(new AbstractNode(
new AttachmentsChildren(attachments)), null), true));
@@ -519,7 +575,10 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
msgbodyTabbedPane.setEnabledAt(HTML_TAB_INDEX, false);
msgbodyTabbedPane.setEnabledAt(RTF_TAB_INDEX, false);
msgbodyTabbedPane.setEnabledAt(HDR_TAB_INDEX, false);
+ msgbodyTabbedPane.setEnabledAt(HDR_TAB_INDEX, false);
configureTextArea(TSK_TEXT, TEXT_TAB_INDEX);
+ msgbodyTabbedPane.setEnabledAt(ATTM_TAB_INDEX, false);
+ msgbodyTabbedPane.setTitleAt(ATTM_TAB_INDEX, "Attachments");
} catch (TskCoreException ex) {
LOGGER.log(Level.WARNING, "Failed to get attributes for message.", ex); //NON-NLS
}
diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultPanel.java
index 879f67351a..12e78e2d68 100755
--- a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultPanel.java
@@ -65,7 +65,7 @@ import org.sleuthkit.autopsy.datamodel.NodeSelectionInfo;
* normally docked into the lower right hand side of the main window, underneath
* the results view. A custom content view may be specified instead.
*/
-public class DataResultPanel extends javax.swing.JPanel implements DataResult, ChangeListener {
+public class DataResultPanel extends javax.swing.JPanel implements DataResult, ChangeListener, ExplorerManager.Provider {
private static final long serialVersionUID = 1L;
private static final int NO_TAB_SELECTED = -1;
@@ -521,6 +521,11 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
}
}
+ @Override
+ public ExplorerManager getExplorerManager() {
+ return explorerManager;
+ }
+
/**
* Responds to node selection change events from the explorer manager.
*/