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
*/
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());
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;
}
}

View File

@ -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<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) {
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());
}
}