19package org.sleuthkit.autopsy.corecomponents;
21import java.awt.Cursor;
22import java.beans.PropertyChangeEvent;
23import java.beans.PropertyChangeListener;
24import java.util.ArrayList;
25import java.util.Collection;
26import java.util.Collections;
28import javax.swing.JTabbedPane;
29import javax.swing.SwingUtilities;
30import javax.swing.event.ChangeEvent;
31import javax.swing.event.ChangeListener;
32import org.openide.explorer.ExplorerManager;
33import org.openide.nodes.Node;
34import org.openide.nodes.NodeEvent;
35import org.openide.nodes.NodeListener;
36import org.openide.nodes.NodeMemberEvent;
37import org.openide.nodes.NodeReorderEvent;
38import org.openide.util.Lookup;
39import org.openide.util.NbBundle;
40import org.sleuthkit.autopsy.casemodule.Case;
41import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
42import org.sleuthkit.autopsy.corecomponentinterfaces.DataContent;
43import org.sleuthkit.autopsy.corecomponentinterfaces.DataResult;
44import org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer;
45import org.sleuthkit.autopsy.datamodel.NodeSelectionInfo;
75@SuppressWarnings(
"PMD.SingularField")
76public class DataResultPanel extends javax.swing.JPanel implements
DataResult, ChangeListener, ExplorerManager.Provider {
134 public static DataResultPanel
createInstance(String title, String description, Node
currentRootNode,
int childNodeCount, Collection<DataResultViewer> viewers) {
164 DataResultPanel resultPanel =
new DataResultPanel(title,
false, Collections.emptyList(), customContentView);
190 DataResultPanel resultPanel =
new DataResultPanel(title,
false, Collections.emptyList(), customContentView);
208 resultViewPanel.setName(title);
211 resultViewPanel.
setPath(description);
232 this.setTitle(title);
233 this.isMain = isMain;
234 this.contentView = contentView;
235 this.resultViewers =
new ArrayList<>(viewers);
236 this.explorerManagerListener =
new ExplorerManagerListener();
237 this.rootNodeListener =
new RootNodeListener();
301 this.contentView = customContentView;
318 if (this.explorerManager ==
null) {
319 this.explorerManager = ExplorerManager.find(
this);
320 this.explorerManager.addPropertyChangeListener(this.explorerManagerListener);
330 if (this.resultViewers.isEmpty()) {
333 this.resultViewers.add(resultViewer);
335 this.resultViewers.add(resultViewer.createInstance());
339 this.resultViewers.forEach((resultViewer) ->
resultViewerTabs.addTab(resultViewer.getTitle(), resultViewer.getComponent()));
342 this.setVisible(
true);
357 if (this.currentRootNode !=
null) {
371 this.currentRootNode = rootNode;
372 if (this.currentRootNode !=
null) {
384 this.resultViewers.forEach((viewer) -> {
385 viewer.resetComponent();
389 if (this.currentRootNode !=
null) {
390 int childrenCount = this.currentRootNode.getChildren().getNodesCount();
424 this.resultViewers.forEach((viewer) -> viewer.setSelectedNodes(selectedNodes));
455 if (
null != selectedChildInfo) {
492 JTabbedPane pane = (JTabbedPane) event.getSource();
493 int currentTab = pane.getSelectedIndex();
494 if (currentTab != DataResultPanel.NO_TAB_SELECTED) {
496 this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
500 this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
522 return (!this.isMain) || openCase.
hasData() ==
false;
530 if (explorerManager !=
null && explorerManagerListener !=
null) {
531 explorerManager.removePropertyChangeListener(explorerManagerListener);
532 explorerManager =
null;
535 this.resultViewers.forEach((viewer) -> viewer.setNode(
null));
539 this.descriptionLabel.removeAll();
540 this.numberOfChildNodesLabel.removeAll();
541 this.matchLabel.removeAll();
542 this.setLayout(
null);
544 this.setVisible(
false);
568 if (evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES) &&
contentView !=
null) {
578 if (selectedNodes.length == 1) {
604 Node[] delta = nme.getDelta();
617 if (SwingUtilities.isEventDispatchThread()) {
620 SwingUtilities.invokeLater(() -> {
628 for (Node n : delta) {
669 @SuppressWarnings(
"unchecked")
678 setMinimumSize(
new java.awt.Dimension(0, 5));
679 setPreferredSize(
new java.awt.Dimension(5, 5));
681 org.openide.awt.Mnemonics.setLocalizedText(
descriptionLabel, org.openide.util.NbBundle.getMessage(DataResultPanel.class,
"DataResultPanel.descriptionLabel.text"));
684 org.openide.awt.Mnemonics.setLocalizedText(
numberOfChildNodesLabel, org.openide.util.NbBundle.getMessage(DataResultPanel.class,
"DataResultPanel.numberOfChildNodesLabel.text"));
686 org.openide.awt.Mnemonics.setLocalizedText(
matchLabel, org.openide.util.NbBundle.getMessage(DataResultPanel.class,
"DataResultPanel.matchLabel.text"));
690 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
691 this.setLayout(layout);
692 layout.setHorizontalGroup(
693 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
694 .addGroup(layout.createSequentialGroup()
695 .addComponent(
descriptionLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
696 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
698 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
700 .addComponent(
resultViewerTabs, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
702 layout.setVerticalGroup(
703 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
704 .addGroup(layout.createSequentialGroup()
705 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
706 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
709 .addComponent(
descriptionLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
711 .addComponent(
resultViewerTabs, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
static Case getCurrentCaseThrows()
static synchronized DataContentTopComponent findInstance()
void propertyChange(PropertyChangeEvent evt)
void propertyChange(PropertyChangeEvent evt)
void nodeDestroyed(NodeEvent ne)
void childrenAdded(final NodeMemberEvent nme)
boolean containsReal(Node[] delta)
void childrenReordered(NodeReorderEvent nre)
volatile boolean waitingForData
void childrenRemoved(NodeMemberEvent nme)
static final String PLEASE_WAIT_NODE_DISPLAY_NAME
void setPath(String description)
void addResultViewer(DataResultViewer resultViewer)
final List< DataResultViewer > resultViewers
ExplorerManager explorerManager
List< DataResultViewer > getViewers()
void setTitle(String title)
static DataResultPanel createInstance(String title, String description, Node currentRootNode, int childNodeCount, Collection< DataResultViewer > viewers)
javax.swing.JLabel matchLabel
ExplorerManager getExplorerManager()
javax.swing.JTabbedPane resultViewerTabs
javax.swing.JLabel descriptionLabel
static final long serialVersionUID
final ExplorerManagerListener explorerManagerListener
javax.swing.JLabel numberOfChildNodesLabel
void setNumMatches(Integer numberOfChildNodes)
boolean listeningToTabbedPane
static void createInstanceCommon(String title, String description, Node currentRootNode, int childNodeCount, DataResultPanel resultViewPanel)
static DataResultPanel createInstance(String title, String description, Node currentRootNode, int childNodeCount)
void setContentViewer(DataContent customContentView)
void stateChanged(ChangeEvent event)
void setSelectedNodes(Node[] selectedNodes)
final RootNodeListener rootNodeListener
static DataResultPanel createInstanceUninitialized(String title, String description, Node currentRootNode, int childNodeCount, DataContent customContentView)
static final int NO_TAB_SELECTED
void setNumberOfChildNodes(Integer numberOfChildNodes)
void setupTabs(Node selectedNode)
void setNode(Node rootNode)
static DataResultPanel createInstance(String title, String description, Node currentRootNode, int childNodeCount, DataContent customContentView)
void resetTabs(Node unusedSelectedNode)
default void clearComponent()