19 package org.sleuthkit.autopsy.communications.relationships;
 
   21 import java.awt.Component;
 
   22 import java.awt.KeyboardFocusManager;
 
   23 import java.beans.PropertyChangeEvent;
 
   24 import java.beans.PropertyChangeListener;
 
   25 import java.util.HashSet;
 
   27 import java.util.logging.Level;
 
   28 import javax.swing.JPanel;
 
   29 import static javax.swing.SwingUtilities.isDescendingFrom;
 
   30 import org.openide.explorer.ExplorerManager;
 
   31 import static org.openide.explorer.ExplorerUtils.createLookup;
 
   32 import org.openide.nodes.AbstractNode;
 
   33 import org.openide.nodes.Node;
 
   34 import org.openide.util.Lookup;
 
   35 import org.openide.util.NbBundle.Messages;
 
   49 final class MediaViewer 
extends JPanel implements RelationshipsViewer, ExplorerManager.Provider, Lookup.Provider {
 
   51     private static final Logger logger = Logger.getLogger(MediaViewer.class.getName());
 
   52     private static final long serialVersionUID = 1L;
 
   54     private final ExplorerManager tableEM = 
new ExplorerManager();
 
   55     private PropertyChangeListener focusPropertyListener;
 
   57     private final ModifiableProxyLookup proxyLookup;
 
   59     private final MessageDataContent contentViewer;
 
   62         "MediaViewer_Name=Media Attachments" 
   70         splitPane.setResizeWeight(0.5);
 
   71         splitPane.setDividerLocation(0.5);
 
   73         contentViewer = 
new MessageDataContent();
 
   74         contentViewer.setPreferredSize(
new java.awt.Dimension(450, 400));
 
   75         splitPane.setRightComponent(contentViewer);
 
   77         proxyLookup = 
new ModifiableProxyLookup(createLookup(tableEM, getActionMap()));
 
   79         tableEM.addPropertyChangeListener((PropertyChangeEvent evt) -> {
 
   80             if (evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) {
 
   81                 handleNodeSelectionChange();
 
   85         thumbnailViewer.resetComponent();
 
   89     public String getDisplayName() {
 
   90         return Bundle.MediaViewer_Name();
 
   94     public JPanel getPanel() {
 
   99     public void setSelectionInfo(SelectionInfo info) {
 
  100         Set<Content> relationshipSources;
 
  101         Set<BlackboardArtifact> artifactList = 
new HashSet<>();
 
  102         contentViewer.setNode(null);
 
  105                 relationshipSources = info.getRelationshipSources();
 
  107                 relationshipSources.stream().filter((content) -> (content instanceof BlackboardArtifact)).forEachOrdered((content) -> {
 
  108                     artifactList.add((BlackboardArtifact) content);
 
  111             } 
catch (TskCoreException ex) {
 
  112                 logger.log(Level.WARNING, 
"Unable to update selection.", ex);
 
  115         thumbnailViewer.resetComponent();
 
  117         thumbnailViewer.setNode(
new TableFilterNode(
new DataResultFilterNode(
new AbstractNode(
new AttachmentThumbnailsChildren(artifactList)), tableEM), 
true, this.getClass().getName()));
 
  121     public ExplorerManager getExplorerManager() {
 
  126     public Lookup getLookup() {
 
  131     public void addNotify() {
 
  134         if (focusPropertyListener == null) {
 
  137             focusPropertyListener = (
final PropertyChangeEvent focusEvent) -> {
 
  138                 if (focusEvent.getPropertyName().equalsIgnoreCase(
"focusOwner")) {
 
  139                     handleFocusChange((Component) focusEvent.getNewValue());
 
  145         KeyboardFocusManager.getCurrentKeyboardFocusManager()
 
  146                 .addPropertyChangeListener(
"focusOwner", focusPropertyListener);
 
  154     private void handleFocusChange(Component newFocusOwner) {
 
  155         if (newFocusOwner == null) {
 
  158         if (isDescendingFrom(newFocusOwner, contentViewer)) {
 
  160             proxyLookup.setNewLookups(createLookup(contentViewer.getExplorerManager(), getActionMap()));
 
  161         } 
else if (isDescendingFrom(newFocusOwner, 
this)) {
 
  163             proxyLookup.setNewLookups(createLookup(tableEM, getActionMap()));
 
  169     public void removeNotify() {
 
  170         super.removeNotify();
 
  172         if (focusPropertyListener != null) {
 
  173             KeyboardFocusManager.getCurrentKeyboardFocusManager()
 
  174                     .removePropertyChangeListener(
"focusOwner", focusPropertyListener);
 
  181     private void handleNodeSelectionChange() {
 
  182         final Node[] nodes = tableEM.getSelectedNodes();
 
  184         if (nodes != null && nodes.length == 1) {
 
  185             AbstractContent thumbnail = nodes[0].getLookup().lookup(AbstractContent.class);
 
  186             if (thumbnail != null) {
 
  188                     Content parentContent = thumbnail.getParent();
 
  189                     if (parentContent != null && parentContent instanceof BlackboardArtifact) {
 
  190                         contentViewer.setNode(
new BlackboardArtifactNode((BlackboardArtifact) parentContent));
 
  192                 } 
catch (TskCoreException ex) {
 
  193                     logger.log(Level.WARNING, 
"Unable to get parent Content from AbstraceContent instance.", ex); 
 
  197             contentViewer.setNode(null);
 
  206     @SuppressWarnings(
"unchecked")
 
  208     private 
void initComponents() {
 
  209         java.awt.GridBagConstraints gridBagConstraints;
 
  211         splitPane = 
new javax.swing.JSplitPane();
 
  214         setLayout(
new java.awt.GridBagLayout());
 
  216         splitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
 
  218         thumbnailViewer.setMinimumSize(
new java.awt.Dimension(350, 102));
 
  219         thumbnailViewer.setPreferredSize(
new java.awt.Dimension(450, 400));
 
  220         splitPane.setLeftComponent(thumbnailViewer);
 
  222         gridBagConstraints = 
new java.awt.GridBagConstraints();
 
  223         gridBagConstraints.gridx = 0;
 
  224         gridBagConstraints.gridy = 0;
 
  225         gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
 
  226         gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
 
  227         gridBagConstraints.weightx = 1.0;
 
  228         gridBagConstraints.weighty = 1.0;
 
  229         add(splitPane, gridBagConstraints);
 
  234     private javax.swing.JSplitPane splitPane;