19package org.sleuthkit.autopsy.corecomponents;
21import java.awt.Cursor;
22import java.beans.PropertyChangeEvent;
23import java.util.ArrayList;
24import java.util.Collection;
26import java.util.concurrent.ExecutionException;
27import java.util.logging.Level;
28import javax.swing.JTabbedPane;
29import javax.swing.SwingWorker;
30import javax.swing.event.ChangeEvent;
31import javax.swing.event.ChangeListener;
32import org.openide.nodes.Node;
33import org.openide.util.Lookup;
34import org.openide.util.NbBundle;
35import org.sleuthkit.autopsy.core.UserPreferences;
36import org.sleuthkit.autopsy.corecomponentinterfaces.DataContent;
37import org.sleuthkit.autopsy.corecomponentinterfaces.DataContentViewer;
38import org.sleuthkit.autopsy.coreutils.Logger;
39import org.sleuthkit.datamodel.Content;
40import org.sleuthkit.datamodel.TskCoreException;
45@SuppressWarnings(
"PMD.SingularField")
46public class DataContentPanel extends javax.swing.JPanel implements
DataContent, ChangeListener {
49 private final List<UpdateWrapper>
viewers =
new ArrayList<>();
65 DataContentPanel(
boolean isMain) {
70 Collection<? extends DataContentViewer> dcvs = Lookup.getDefault().lookupAll(
DataContentViewer.class);
80 javax.swing.JScrollPane scrollTab =
new javax.swing.JScrollPane(dcv.
getComponent());
81 scrollTab.setVerticalScrollBarPolicy(javax.swing.JScrollPane.VERTICAL_SCROLLBAR_NEVER);
88 for (
int tab = 0; tab < numTabs; ++tab) {
100 return new DataContentPanel(
false);
112 @SuppressWarnings(
"unchecked")
118 setMinimumSize(
new java.awt.Dimension(5, 5));
120 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
121 this.setLayout(layout);
122 layout.setHorizontalGroup(
123 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
126 layout.setVerticalGroup(
127 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
146 for (
int index = 0; index <
jTabbedPane1.getTabCount(); index++) {
148 String tabTitle =
viewers.get(index).getTitle(selectedNode);
149 tabTitle = tabTitle ==
null ?
"" : tabTitle;
154 viewers.get(index).resetComponent();
157 if (selectedNode !=
null) {
171 private void updateTabs(Node selectedNode, List<Integer> supportedIndices,
int preferredIndex) {
179 for (Integer index : supportedIndices) {
189 dcv.resetComponent();
191 dcv.setNode(selectedNode);
205 JTabbedPane pane = (JTabbedPane) evt.getSource();
208 int currentTab = pane.getSelectedIndex();
209 if (currentTab != -1) {
213 this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
217 this.setCursor(
null);
223 private static class UpdateWrapper {
230 this.outdated =
true;
233 void setNode(Node selectedNode) {
234 this.wrapped.
setNode(selectedNode);
235 this.outdated =
false;
238 void resetComponent() {
240 this.outdated =
true;
243 boolean isOutdated() {
244 return this.outdated;
247 boolean isSupported(Node node) {
251 int isPreferred(Node node) {
255 String getTitle(Node node) {
259 DataContentViewer getViewer() {
268 private class DataContentPanelWorker
extends SwingWorker<WorkerResults, Void> {
277 DataContentPanelWorker(Node
node) {
284 List<Integer> supportedViewers =
new ArrayList<>();
285 int preferredViewerIndex = 0;
286 int maxPreferred = 0;
288 for (
int index = 0; index <
viewers.size(); index++) {
290 if (dcv.isSupported(
node)) {
291 supportedViewers.add(index);
293 int currentPreferred = dcv.isPreferred(
node);
294 if (currentPreferred > maxPreferred) {
295 preferredViewerIndex = index;
296 maxPreferred = currentPreferred;
300 if (this.isCancelled()) {
319 if (results !=
null) {
320 updateTabs(results.getNode(), results.getSupportedIndices(), results.getPreferredViewerIndex());
323 }
catch (InterruptedException | ExecutionException ex) {
324 logger.log(Level.SEVERE,
"Failed to updated data content panel for node " +
node.getName(), ex);
326 setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
334 private class WorkerResults {
360 List<Integer> getSupportedIndices() {
361 return supportedViewerIndices;
369 int getPreferredViewerIndex() {
370 return preferredViewerIndex;
static boolean keepPreferredContentViewer()
WorkerResults doInBackground()
final DataContentViewer wrapped
final int preferredViewerIndex
final List< Integer > supportedViewerIndices
void propertyChange(PropertyChangeEvent evt)
DataContentPanelWorker workerThread
void updateTabs(Node selectedNode, List< Integer > supportedIndices, int preferredIndex)
void setNode(Node selectedNode)
JTabbedPane getTabPanels()
static DataContentPanel createInstance()
boolean listeningToTabbedPane
final List< UpdateWrapper > viewers
javax.swing.JTabbedPane jTabbedPane1
void stateChanged(ChangeEvent evt)
synchronized static Logger getLogger(String name)
boolean isSupported(Node node)
DataContentViewer createInstance()
void setNode(Node selectedNode)
int isPreferred(Node node)