diff --git a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataResultViewer.java b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataResultViewer.java index cf85bcaf25..b8e2ef44b2 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataResultViewer.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataResultViewer.java @@ -80,4 +80,11 @@ public interface DataResultViewer { * @return True if supported, else false */ public boolean isSupported(Node selectedNode); + + /** + * Set a custom content viewer to respond to selection events from this result viewer. + * If not set, the default content viewer is user + * @param contentViewer content viewer to respond to selection events from this viewer + */ + public void setContentViewer(DataContent contentViewer); } diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AbstractDataResultViewer.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AbstractDataResultViewer.java index 1d9d3c640b..da3f69e4e3 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/AbstractDataResultViewer.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AbstractDataResultViewer.java @@ -43,9 +43,19 @@ public abstract class AbstractDataResultViewer extends JPanel implements private static final Logger logger = Logger.getLogger(AbstractDataResultViewer.class.getName()); protected transient ExplorerManager em = new ExplorerManager(); private PropertyChangeListener nodeSelListener; + + /** + * Content viewer to respond to selection events + * Either the main one, or custom one if set + */ + protected DataContent contentViewer; public AbstractDataResultViewer() { + //DataContent is designed to return only the default viewer from lookup + //use the default one unless set otherwise + contentViewer = Lookup.getDefault().lookup(DataContent.class); + //property listener to send nodes to content viewer nodeSelListener = new PropertyChangeListener() { @@ -70,17 +80,16 @@ public abstract class AbstractDataResultViewer extends JPanel implements nodeSelected(selectedNode); - // DataContent is designed to return only the default viewer - DataContent dataContent = Lookup.getDefault().lookup(DataContent.class); + if (selectedNode != null) { // there's a new/changed node to display Node newSelectedNode = selectedNode; // get the selected Node on the table // push the node to default "DataContent" - dataContent.setNode(newSelectedNode); + contentViewer.setNode(newSelectedNode); } else { // clear the node viewer - dataContent.setNode(null); + contentViewer.setNode(null); } } finally { setCursor(null); @@ -155,4 +164,9 @@ public abstract class AbstractDataResultViewer extends JPanel implements logger.log(Level.WARNING, "Couldn't set selected nodes.", ex); } } + + @Override + public void setContentViewer(DataContent contentViewer) { + this.contentViewer = contentViewer; + } } diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultTopComponent.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultTopComponent.java index 08d8b38925..32da094913 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultTopComponent.java @@ -18,7 +18,6 @@ */ package org.sleuthkit.autopsy.corecomponents; -import java.awt.Component; import java.awt.Cursor; import java.beans.PropertyChangeListener; import org.sleuthkit.autopsy.corecomponentinterfaces.DataResult; @@ -33,6 +32,7 @@ import org.openide.windows.TopComponent; import org.openide.nodes.Node; import org.openide.util.Lookup; import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.corecomponentinterfaces.DataContent; import org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer; /** @@ -52,7 +52,15 @@ public final class DataResultTopComponent extends TopComponent implements DataRe public static String REMOVE_FILESEARCH = "RemoveFileSearchTopComponent"; // Different DataResultsViewers private List viewers = new ArrayList(); + + //custom content viewer to send selections to, or null if the main one + private DataContent customContentViewer; + /** + * Create a new data result top component + * @param isMain whether it is the main, application default result viewer, there can be only 1 main result viewer + * @param title title of the data result window + */ public DataResultTopComponent(boolean isMain, String title) { initComponents(); setToolTipText(NbBundle.getMessage(DataResultTopComponent.class, "HINT_NodeTableTopComponent")); @@ -65,6 +73,19 @@ public final class DataResultTopComponent extends TopComponent implements DataRe this.dataResultTabbedPanel.addChangeListener(this); } + + /** + * Create a new, custom data result top component, in addition to the application main one + * @param title title of the data result window + * @param customContentViewer custom content viewer to send selection events to + */ + public DataResultTopComponent(String title, DataContentTopComponent customContentViewer) { + this(false, title); + + //custom content viewer tc to setup for every result viewer + this.customContentViewer = customContentViewer; + } + private static class UpdateWrapper { @@ -102,6 +123,10 @@ public final class DataResultTopComponent extends TopComponent implements DataRe boolean isSupported(Node selectedNode) { return this.wrapped.isSupported(selectedNode); } + + void setContentViewer(DataContent contentViewer) { + this.wrapped.setContentViewer(contentViewer); + } } /** @@ -191,8 +216,14 @@ public final class DataResultTopComponent extends TopComponent implements DataRe // find all dataContentViewer and add them to the tabbed pane for (DataResultViewer factory : Lookup.getDefault().lookupAll(DataResultViewer.class)) { DataResultViewer drv = factory.getInstance(); - this.viewers.add(new UpdateWrapper(drv)); + UpdateWrapper resultViewer = new UpdateWrapper(drv); + if (customContentViewer != null) { + //set custom content viewer to respond to events from this result viewer + resultViewer.setContentViewer(customContentViewer); + } + this.viewers.add(resultViewer); this.dataResultTabbedPanel.addTab(drv.getTitle(), drv.getComponent()); + } }