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;