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.pleasewaitNodeDisplayName");
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);
281 }
catch (IllegalStateException ex) {
287 if (evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) {
288 setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
292 if (contentViewer == null) {
293 contentViewer = Lookup.getDefault().lookup(
DataContent.class);
297 if (contentViewer != null) {
298 Node[] selectedNodes = explorerManager.getSelectedNodes();
300 drv.setSelectedNodes(selectedNodes);
306 if (selectedNodes.length == 1) {
307 contentViewer.
setNode(selectedNodes[0]);
309 contentViewer.setNode(null);
321 if (null != this.customContentViewer) {
322 viewerWrapper.setContentViewer(this.customContentViewer);
324 this.viewers.add(viewerWrapper);
335 if (null != explorerManager && null != emNodeSelectionListener) {
336 explorerManager.removePropertyChangeListener(emNodeSelectionListener);
337 explorerManager = null;
341 for (UpdateWrapper drv : this.viewers) {
346 for (UpdateWrapper drv : this.viewers) {
347 drv.clearComponent();
355 this.setLayout(null);
357 this.setVisible(
false);
368 if (this.rootNode != null) {
369 this.rootNode.removeNodeListener(rootNodeListener);
373 if (listeningToTabbedPane ==
false) {
375 listeningToTabbedPane =
true;
378 this.rootNode = selectedNode;
379 if (this.rootNode != null) {
380 rootNodeListener.
reset();
381 this.rootNode.addNodeListener(rootNodeListener);
387 if (selectedNode != null) {
388 int childrenCount = selectedNode.getChildren().getNodesCount();
399 if (drv.isSupported(selectedNode)) {
408 boolean hasViewerEnabled =
true;
411 hasViewerEnabled =
false;
414 currentActiveTab = i;
415 hasViewerEnabled =
true;
420 if (hasViewerEnabled) {
425 if (hasViewerEnabled) {
426 viewers.get(currentActiveTab).setNode(selectedNode);
448 List<DataResultViewer> ret =
new ArrayList<>();
450 ret.add(w.getViewer());
467 JTabbedPane pane = (JTabbedPane) e.getSource();
470 int currentTab = pane.getSelectedIndex();
471 if (currentTab != -1) {
478 this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
480 drv.setNode(rootNode);
482 this.setCursor(null);
501 drv.resetComponent();
507 drv.setSelectedNodes(selected);
520 @SuppressWarnings(
"unchecked")
529 setMinimumSize(
new java.awt.Dimension(0, 5));
530 setPreferredSize(
new java.awt.Dimension(5, 5));
537 org.openide.awt.Mnemonics.setLocalizedText(
matchLabel,
org.openide.util.NbBundle.getMessage(
DataResultPanel.class,
"DataResultPanel.matchLabel.text"));
541 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
542 this.setLayout(layout);
543 layout.setHorizontalGroup(
544 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
545 .addGroup(layout.createSequentialGroup()
546 .addComponent(
directoryTablePath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
547 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
549 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
551 .addComponent(
dataResultTabbedPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
553 layout.setVerticalGroup(
554 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
555 .addGroup(layout.createSequentialGroup()
556 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
557 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
560 .addComponent(
directoryTablePath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
562 .addComponent(
dataResultTabbedPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
579 this.outdated =
true;
586 void setNode(Node selectedNode) {
587 this.wrapped.
setNode(selectedNode);
588 this.outdated =
false;
591 void resetComponent() {
593 this.outdated =
true;
596 void clearComponent() {
598 this.outdated =
true;
601 boolean isOutdated() {
605 void setSelectedNodes(Node[] selected) {
609 boolean isSupported(Node selectedNode) {
613 void setContentViewer(DataContent contentViewer) {
634 waitingForData =
true;
639 Node[] delta = nme.getDelta();
649 waitingForData =
false;
650 if (SwingUtilities.isEventDispatchThread()) {
653 SwingUtilities.invokeLater(
new Runnable() {
664 for (Node n : delta) {
665 if (!n.getDisplayName().equals(PLEASEWAIT_NODE_DISPLAY_NAME)) {
677 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()
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()
static final String PLEASEWAIT_NODE_DISPLAY_NAME