Add support for custom content viewer responding to sel. events from custom result viewer

This commit is contained in:
adam-m 2013-01-07 21:36:01 -05:00
parent b5714cf4b4
commit f29f48d34b
3 changed files with 58 additions and 6 deletions

View File

@ -80,4 +80,11 @@ public interface DataResultViewer {
* @return True if supported, else false * @return True if supported, else false
*/ */
public boolean isSupported(Node selectedNode); 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);
} }

View File

@ -43,9 +43,19 @@ public abstract class AbstractDataResultViewer extends JPanel implements
private static final Logger logger = Logger.getLogger(AbstractDataResultViewer.class.getName()); private static final Logger logger = Logger.getLogger(AbstractDataResultViewer.class.getName());
protected transient ExplorerManager em = new ExplorerManager(); protected transient ExplorerManager em = new ExplorerManager();
private PropertyChangeListener nodeSelListener; private PropertyChangeListener nodeSelListener;
/**
* Content viewer to respond to selection events
* Either the main one, or custom one if set
*/
protected DataContent contentViewer;
public AbstractDataResultViewer() { 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 //property listener to send nodes to content viewer
nodeSelListener = new PropertyChangeListener() { nodeSelListener = new PropertyChangeListener() {
@ -70,17 +80,16 @@ public abstract class AbstractDataResultViewer extends JPanel implements
nodeSelected(selectedNode); nodeSelected(selectedNode);
// DataContent is designed to return only the default viewer
DataContent dataContent = Lookup.getDefault().lookup(DataContent.class);
if (selectedNode != null) { if (selectedNode != null) {
// there's a new/changed node to display // there's a new/changed node to display
Node newSelectedNode = selectedNode; // get the selected Node on the table Node newSelectedNode = selectedNode; // get the selected Node on the table
// push the node to default "DataContent" // push the node to default "DataContent"
dataContent.setNode(newSelectedNode); contentViewer.setNode(newSelectedNode);
} else { } else {
// clear the node viewer // clear the node viewer
dataContent.setNode(null); contentViewer.setNode(null);
} }
} finally { } finally {
setCursor(null); setCursor(null);
@ -155,4 +164,9 @@ public abstract class AbstractDataResultViewer extends JPanel implements
logger.log(Level.WARNING, "Couldn't set selected nodes.", ex); logger.log(Level.WARNING, "Couldn't set selected nodes.", ex);
} }
} }
@Override
public void setContentViewer(DataContent contentViewer) {
this.contentViewer = contentViewer;
}
} }

View File

@ -18,7 +18,6 @@
*/ */
package org.sleuthkit.autopsy.corecomponents; package org.sleuthkit.autopsy.corecomponents;
import java.awt.Component;
import java.awt.Cursor; import java.awt.Cursor;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataResult; import org.sleuthkit.autopsy.corecomponentinterfaces.DataResult;
@ -33,6 +32,7 @@ import org.openide.windows.TopComponent;
import org.openide.nodes.Node; import org.openide.nodes.Node;
import org.openide.util.Lookup; import org.openide.util.Lookup;
import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataContent;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer; import org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer;
/** /**
@ -52,7 +52,15 @@ public final class DataResultTopComponent extends TopComponent implements DataRe
public static String REMOVE_FILESEARCH = "RemoveFileSearchTopComponent"; public static String REMOVE_FILESEARCH = "RemoveFileSearchTopComponent";
// Different DataResultsViewers // Different DataResultsViewers
private List<UpdateWrapper> viewers = new ArrayList<UpdateWrapper>(); private List<UpdateWrapper> viewers = new ArrayList<UpdateWrapper>();
//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) { public DataResultTopComponent(boolean isMain, String title) {
initComponents(); initComponents();
setToolTipText(NbBundle.getMessage(DataResultTopComponent.class, "HINT_NodeTableTopComponent")); setToolTipText(NbBundle.getMessage(DataResultTopComponent.class, "HINT_NodeTableTopComponent"));
@ -65,6 +73,19 @@ public final class DataResultTopComponent extends TopComponent implements DataRe
this.dataResultTabbedPanel.addChangeListener(this); 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 { private static class UpdateWrapper {
@ -102,6 +123,10 @@ public final class DataResultTopComponent extends TopComponent implements DataRe
boolean isSupported(Node selectedNode) { boolean isSupported(Node selectedNode) {
return this.wrapped.isSupported(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 // find all dataContentViewer and add them to the tabbed pane
for (DataResultViewer factory : Lookup.getDefault().lookupAll(DataResultViewer.class)) { for (DataResultViewer factory : Lookup.getDefault().lookupAll(DataResultViewer.class)) {
DataResultViewer drv = factory.getInstance(); 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()); this.dataResultTabbedPanel.addTab(drv.getTitle(), drv.getComponent());
} }
} }