19 package org.sleuthkit.autopsy.corecomponents;
21 import java.awt.Cursor;
22 import java.beans.PropertyChangeEvent;
23 import java.beans.PropertyChangeListener;
24 import java.util.ArrayList;
25 import java.util.List;
26 import javax.swing.JTabbedPane;
27 import javax.swing.SwingUtilities;
28 import javax.swing.event.ChangeEvent;
29 import javax.swing.event.ChangeListener;
30 import org.openide.explorer.ExplorerManager;
31 import org.openide.nodes.Node;
32 import org.openide.nodes.NodeEvent;
33 import org.openide.nodes.NodeListener;
34 import org.openide.nodes.NodeMemberEvent;
35 import org.openide.nodes.NodeReorderEvent;
36 import org.openide.util.Lookup;
37 import org.openide.util.NbBundle;
62 private final List<UpdateWrapper>
viewers =
new ArrayList<>();
72 "DataResultPanel.dummyNodeDisplayName");
138 newDataResult.
open();
139 return newDataResult;
160 newDataResult.
open();
161 return newDataResult;
183 return newDataResult;
198 newDataResult.
setNode(givenNode);
199 newDataResult.
setPath(pathText);
218 if (null == explorerManager) {
227 explorerManager = ExplorerManager.find(
this);
234 explorerManager.addPropertyChangeListener(emNodeSelectionListener);
240 if (totalTabs == 0) {
267 if (rootNode == null) {
272 this.setVisible(
true);
285 if (evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) {
286 setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
290 if (contentViewer == null) {
291 contentViewer = Lookup.getDefault().lookup(
DataContent.class);
295 if (contentViewer != null) {
296 Node[] selectedNodes = explorerManager.getSelectedNodes();
298 drv.setSelectedNodes(selectedNodes);
304 if (selectedNodes.length == 1) {
305 contentViewer.
setNode(selectedNodes[0]);
307 contentViewer.setNode(null);
319 if (null != this.customContentViewer) {
320 viewerWrapper.setContentViewer(this.customContentViewer);
322 this.viewers.add(viewerWrapper);
333 if (null != explorerManager && null != emNodeSelectionListener) {
334 explorerManager.removePropertyChangeListener(emNodeSelectionListener);
335 explorerManager = null;
339 for (UpdateWrapper drv : this.viewers) {
344 for (UpdateWrapper drv : this.viewers) {
345 drv.clearComponent();
353 this.setLayout(null);
355 this.setVisible(
false);
366 if (this.rootNode != null) {
367 this.rootNode.removeNodeListener(rootNodeListener);
371 if (listeningToTabbedPane ==
false) {
373 listeningToTabbedPane =
true;
376 this.rootNode = selectedNode;
377 if (this.rootNode != null) {
378 rootNodeListener.
reset();
379 this.rootNode.addNodeListener(rootNodeListener);
385 if (selectedNode != null) {
386 int childrenCount = selectedNode.getChildren().getNodesCount();
397 if (drv.isSupported(selectedNode)) {
406 boolean hasViewerEnabled =
true;
409 hasViewerEnabled =
false;
412 currentActiveTab = i;
413 hasViewerEnabled =
true;
418 if (hasViewerEnabled) {
423 if (hasViewerEnabled) {
424 viewers.get(currentActiveTab).setNode(selectedNode);
446 List<DataResultViewer> ret =
new ArrayList<DataResultViewer>();
448 ret.add(w.getViewer());
460 JTabbedPane pane = (JTabbedPane) e.getSource();
463 int currentTab = pane.getSelectedIndex();
464 if (currentTab != -1) {
471 this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
473 drv.setNode(rootNode);
475 this.setCursor(null);
494 drv.resetComponent();
500 drv.setSelectedNodes(selected);
513 @SuppressWarnings(
"unchecked")
522 setMinimumSize(
new java.awt.Dimension(0, 5));
523 setPreferredSize(
new java.awt.Dimension(5, 5));
530 org.openide.awt.Mnemonics.setLocalizedText(
matchLabel,
org.openide.util.NbBundle.getMessage(
DataResultPanel.class,
"DataResultPanel.matchLabel.text"));
534 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
535 this.setLayout(layout);
536 layout.setHorizontalGroup(
537 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
538 .addGroup(layout.createSequentialGroup()
539 .addComponent(
directoryTablePath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
540 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
542 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
544 .addComponent(
dataResultTabbedPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
546 layout.setVerticalGroup(
547 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
548 .addGroup(layout.createSequentialGroup()
549 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
550 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
553 .addComponent(
directoryTablePath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
555 .addComponent(
dataResultTabbedPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
572 this.outdated =
true;
579 void setNode(Node selectedNode) {
580 this.wrapped.
setNode(selectedNode);
581 this.outdated =
false;
584 void resetComponent() {
586 this.outdated =
true;
589 void clearComponent() {
591 this.outdated =
true;
594 boolean isOutdated() {
598 void setSelectedNodes(Node[] selected) {
602 boolean isSupported(Node selectedNode) {
606 void setContentViewer(DataContent contentViewer) {
627 waitingForData =
true;
632 Node[] delta = nme.getDelta();
642 waitingForData =
false;
643 if (SwingUtilities.isEventDispatchThread()) {
646 SwingUtilities.invokeLater(
new Runnable() {
657 for (Node n : delta) {
658 if (!n.getDisplayName().equals(DUMMY_NODE_DISPLAY_NAME)) {
670 if (rootNode != null && rootNode.getChildren() != null) {
void setupTabs(Node selectedNode)
static void createInstanceCommon(String pathText, Node givenNode, int totalMatches, DataResultPanel newDataResult)
boolean isSupported(Node selectedNode)
void propertyChange(PropertyChangeEvent evt)
ExplorerManager explorerManager
static final Logger logger
DataContent customContentViewer
volatile boolean waitingForData
void setSelectedNodes(Node[] selected)
void childrenReordered(NodeReorderEvent nre)
javax.swing.JLabel numberMatchLabel
final List< UpdateWrapper > viewers
static DataResultPanel createInstanceUninitialized(String title, String pathText, Node givenNode, int totalMatches, DataContent dataContent)
static DataResultPanel createInstance(String title, String pathText, Node givenNode, int totalMatches, DataContent dataContent)
void setSelectedNodes(Node[] selected)
void setNode(Node selectedNode)
List< DataResultViewer > getViewers()
static final String DUMMY_NODE_DISPLAY_NAME
void childrenRemoved(NodeMemberEvent nme)
void setContentViewer(DataContent customContentViewer)
javax.swing.JTabbedPane dataResultTabbedPanel
void setNode(Node selectedNode)
DataResultViewer createInstance()
ExplorerManagerNodeSelectionListener emNodeSelectionListener
void nodeDestroyed(NodeEvent ne)
void setNode(Node selectedNode)
void addDataResultViewer(DataResultViewer dataResultViewer)
void childrenAdded(final NodeMemberEvent nme)
javax.swing.JLabel directoryTablePath
void resetTabs(Node selectedNode)
void setNumMatches(Integer numMatches)
boolean listeningToTabbedPane
static DataResultPanel createInstance(String title, String pathText, Node givenNode, int totalMatches)
void stateChanged(ChangeEvent e)
void setPath(String pathText)
boolean containsReal(Node[] delta)
static Case getCurrentCase()
synchronized static Logger getLogger(String name)
javax.swing.JLabel matchLabel
void setContentViewer(DataContent contentViewer)
final RootNodeListener rootNodeListener
void setTitle(String title)
void propertyChange(PropertyChangeEvent evt)
static boolean isCaseOpen()