19 package org.sleuthkit.autopsy.corecomponents;
 
   21 import java.awt.Component;
 
   22 import java.awt.Cursor;
 
   23 import java.awt.Toolkit;
 
   24 import java.awt.event.ActionEvent;
 
   25 import java.awt.event.ActionListener;
 
   26 import java.awt.datatransfer.StringSelection;
 
   27 import java.text.SimpleDateFormat;
 
   28 import java.util.ArrayList;
 
   29 import java.util.Collection;
 
   30 import java.util.Enumeration;
 
   31 import java.util.List;
 
   32 import java.util.concurrent.ExecutionException;
 
   33 import java.util.logging.Level;
 
   34 import javax.swing.JMenuItem;
 
   35 import javax.swing.JTextArea;
 
   36 import javax.swing.SwingWorker;
 
   37 import javax.swing.event.ChangeEvent;
 
   38 import javax.swing.event.ListSelectionEvent;
 
   39 import javax.swing.event.TableColumnModelEvent;
 
   40 import javax.swing.table.DefaultTableModel;
 
   41 import javax.swing.table.TableColumn;
 
   42 import javax.swing.event.TableColumnModelListener;
 
   43 import javax.swing.text.View;
 
   44 import org.apache.commons.lang.StringUtils;
 
   45 import org.openide.nodes.Node;
 
   46 import org.openide.util.Lookup;
 
   47 import org.openide.util.NbBundle;
 
   48 import org.openide.util.lookup.ServiceProvider;
 
   53 import org.
sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
 
   58 import org.netbeans.swing.etable.ETable;
 
   65 @ServiceProvider(service = DataContentViewer.class, position = 7)
 
   66 @SuppressWarnings(
"PMD.SingularField") 
 
   70         "DataContentViewerArtifact.attrsTableHeader.type=Type",
 
   71         "DataContentViewerArtifact.attrsTableHeader.value=Value",
 
   72         "DataContentViewerArtifact.attrsTableHeader.sources=Source(s)",
 
   73         "DataContentViewerArtifact.failedToGetSourcePath.message=Failed to get source file path from case database",
 
   74         "DataContentViewerArtifact.failedToGetAttributes.message=Failed to get some or all attributes from case database" 
   78     private final static String ERROR_TEXT = NbBundle.getMessage(
DataContentViewerArtifact.class, 
"DataContentViewerArtifact.errorText");
 
   80     private int currentPage = 1;
 
   81     private final Object lock = 
new Object();
 
   83     SwingWorker<ViewUpdate, Void> currentTask; 
 
   84     private static final String[] COLUMN_HEADERS = {
 
   85         Bundle.DataContentViewerArtifact_attrsTableHeader_type(),
 
   86         Bundle.DataContentViewerArtifact_attrsTableHeader_value(),
 
   87         Bundle.DataContentViewerArtifact_attrsTableHeader_sources()};
 
   88     private static final int[] COLUMN_WIDTHS = {100, 800, 100};
 
   89     private static final int CELL_BOTTOM_MARGIN = 5;
 
   90     private static final int CELL_RIGHT_MARGIN = 1;
 
   95         resultsTableScrollPane.setViewportView(resultsTable);
 
   96         customizeComponents();
 
  102         resultsTable = 
new ETable();
 
  103         resultsTable.setModel(
new javax.swing.table.DefaultTableModel() {
 
  104             private static final long serialVersionUID = 1L;
 
  106             public boolean isCellEditable(
int rowIndex, 
int columnIndex) {
 
  110         resultsTable.setCellSelectionEnabled(
true);
 
  111         resultsTable.getTableHeader().setReorderingAllowed(
false);
 
  112         resultsTable.setColumnHidingAllowed(
false);
 
  113         resultsTable.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_INTERVAL_SELECTION);
 
  114         resultsTable.getColumnModel().addColumnModelListener(
new TableColumnModelListener() {
 
  117             public void columnAdded(TableColumnModelEvent e) {
 
  121             public void columnRemoved(TableColumnModelEvent e) {
 
  125             public void columnMoved(TableColumnModelEvent e) {
 
  130             public void columnMarginChanged(ChangeEvent e) {
 
  135             public void columnSelectionChanged(ListSelectionEvent e) {
 
  138         resultsTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_NEXT_COLUMN);
 
  146         int valueColIndex = -1;
 
  147         for (
int col = 0; col < resultsTable.getColumnCount(); col++) {
 
  148             if (resultsTable.getColumnName(col).equals(COLUMN_HEADERS[1])) {
 
  152         if (valueColIndex != -1) {
 
  153             for (
int row = 0; row < resultsTable.getRowCount(); row++) {
 
  154                 Component comp = resultsTable.prepareRenderer(
 
  155                         resultsTable.getCellRenderer(row, valueColIndex), row, valueColIndex);
 
  157              if (comp instanceof JTextArea) {
 
  158                     final JTextArea tc = (JTextArea) comp;
 
  159                     final View rootView = tc.getUI().getRootView(tc);
 
  160                     java.awt.Insets i = tc.getInsets();
 
  161                     rootView.setSize(resultsTable.getColumnModel().getColumn(valueColIndex)
 
  162                             .getWidth() - (i.left + i.right +CELL_RIGHT_MARGIN), 
 
  164                     rowHeight = (int) rootView.getPreferredSpan(View.Y_AXIS);
 
  166                     rowHeight = comp.getPreferredSize().height;
 
  169                     resultsTable.setRowHeight(row, rowHeight + CELL_BOTTOM_MARGIN);
 
  179         Enumeration<TableColumn> columns = resultsTable.getColumnModel().getColumns();
 
  180         while (columns.hasMoreElements()) {
 
  181             TableColumn col = columns.nextElement();
 
  182             if (col.getHeaderValue().equals(COLUMN_HEADERS[0])) {
 
  183                 col.setPreferredWidth(COLUMN_WIDTHS[0]);
 
  184             } 
else if (col.getHeaderValue().equals(COLUMN_HEADERS[1])) {
 
  185                 col.setPreferredWidth(COLUMN_WIDTHS[1]);
 
  186             } 
else if (col.getHeaderValue().equals(COLUMN_HEADERS[2])) {
 
  187                 col.setPreferredWidth(COLUMN_WIDTHS[2]);
 
  197     @SuppressWarnings(
"unchecked")
 
  199     private 
void initComponents() {
 
  201         rightClickMenu = 
new javax.swing.JPopupMenu();
 
  202         copyMenuItem = 
new javax.swing.JMenuItem();
 
  203         selectAllMenuItem = 
new javax.swing.JMenuItem();
 
  204         jScrollPane1 = 
new javax.swing.JScrollPane();
 
  205         jPanel1 = 
new javax.swing.JPanel();
 
  206         totalPageLabel = 
new javax.swing.JLabel();
 
  207         ofLabel = 
new javax.swing.JLabel();
 
  208         currentPageLabel = 
new javax.swing.JLabel();
 
  209         pageLabel = 
new javax.swing.JLabel();
 
  210         nextPageButton = 
new javax.swing.JButton();
 
  211         pageLabel2 = 
new javax.swing.JLabel();
 
  212         prevPageButton = 
new javax.swing.JButton();
 
  213         artifactLabel = 
new javax.swing.JLabel();
 
  214         resultsTableScrollPane = 
new javax.swing.JScrollPane();
 
  216         copyMenuItem.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerArtifact.class, 
"DataContentViewerArtifact.copyMenuItem.text")); 
 
  217         rightClickMenu.add(copyMenuItem);
 
  219         selectAllMenuItem.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerArtifact.class, 
"DataContentViewerArtifact.selectAllMenuItem.text")); 
 
  220         rightClickMenu.add(selectAllMenuItem);
 
  222         setPreferredSize(
new java.awt.Dimension(100, 58));
 
  224         jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
 
  225         jScrollPane1.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
 
  227         jPanel1.setPreferredSize(
new java.awt.Dimension(620, 58));
 
  229         totalPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerArtifact.class, 
"DataContentViewerArtifact.totalPageLabel.text")); 
 
  233         currentPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerArtifact.class, 
"DataContentViewerArtifact.currentPageLabel.text")); 
 
  234         currentPageLabel.setMaximumSize(
new java.awt.Dimension(18, 14));
 
  235         currentPageLabel.setMinimumSize(
new java.awt.Dimension(18, 14));
 
  236         currentPageLabel.setPreferredSize(
new java.awt.Dimension(18, 14));
 
  240         nextPageButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png"))); 
 
  241         nextPageButton.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerArtifact.class, 
"DataContentViewerArtifact.nextPageButton.text")); 
 
  242         nextPageButton.setBorderPainted(
false);
 
  243         nextPageButton.setContentAreaFilled(
false);
 
  244         nextPageButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_forward_disabled.png"))); 
 
  245         nextPageButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
 
  246         nextPageButton.setPreferredSize(
new java.awt.Dimension(23, 23));
 
  247         nextPageButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_forward_hover.png"))); 
 
  248         nextPageButton.addActionListener(
new java.awt.event.ActionListener() {
 
  249             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  250                 nextPageButtonActionPerformed(evt);
 
  255         pageLabel2.setMaximumSize(
new java.awt.Dimension(29, 14));
 
  256         pageLabel2.setMinimumSize(
new java.awt.Dimension(29, 14));
 
  258         prevPageButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back.png"))); 
 
  259         prevPageButton.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerArtifact.class, 
"DataContentViewerArtifact.prevPageButton.text")); 
 
  260         prevPageButton.setBorderPainted(
false);
 
  261         prevPageButton.setContentAreaFilled(
false);
 
  262         prevPageButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png"))); 
 
  263         prevPageButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
 
  264         prevPageButton.setPreferredSize(
new java.awt.Dimension(23, 23));
 
  265         prevPageButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back_hover.png"))); 
 
  266         prevPageButton.addActionListener(
new java.awt.event.ActionListener() {
 
  267             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  268                 prevPageButtonActionPerformed(evt);
 
  272         javax.swing.GroupLayout jPanel1Layout = 
new javax.swing.GroupLayout(jPanel1);
 
  273         jPanel1.setLayout(jPanel1Layout);
 
  274         jPanel1Layout.setHorizontalGroup(
 
  275             jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  276             .addGroup(jPanel1Layout.createSequentialGroup()
 
  278                 .addComponent(pageLabel)
 
  279                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  280                 .addComponent(currentPageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  281                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  282                 .addComponent(ofLabel)
 
  283                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  284                 .addComponent(totalPageLabel)
 
  286                 .addComponent(pageLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  287                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  288                 .addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  290                 .addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  291                 .addContainerGap(383, Short.MAX_VALUE))
 
  292             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  293                 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
 
  294                     .addContainerGap(280, Short.MAX_VALUE)
 
  295                     .addComponent(artifactLabel)
 
  296                     .addContainerGap(84, Short.MAX_VALUE)))
 
  298         jPanel1Layout.setVerticalGroup(
 
  299             jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  300             .addGroup(jPanel1Layout.createSequentialGroup()
 
  301                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  302                     .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  303                         .addComponent(pageLabel)
 
  304                         .addComponent(currentPageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  305                         .addComponent(ofLabel)
 
  306                         .addComponent(totalPageLabel))
 
  307                     .addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  308                     .addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  309                     .addComponent(pageLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  310                 .addContainerGap(35, Short.MAX_VALUE))
 
  311             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  312                 .addGroup(jPanel1Layout.createSequentialGroup()
 
  313                     .addComponent(artifactLabel)
 
  314                     .addGap(0, 58, Short.MAX_VALUE)))
 
  317         jScrollPane1.setViewportView(jPanel1);
 
  319         resultsTableScrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
 
  320         resultsTableScrollPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
 
  321         resultsTableScrollPane.setPreferredSize(
new java.awt.Dimension(620, 34));
 
  323         javax.swing.GroupLayout layout = 
new javax.swing.GroupLayout(
this);
 
  324         this.setLayout(layout);
 
  325         layout.setHorizontalGroup(
 
  326             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  327             .addComponent(jScrollPane1)
 
  328             .addComponent(resultsTableScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  330         layout.setVerticalGroup(
 
  331             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  332             .addGroup(layout.createSequentialGroup()
 
  333                 .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  334                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  335                 .addComponent(resultsTableScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
 
  340         currentPage = currentPage + 1;
 
  341         currentPageLabel.setText(Integer.toString(currentPage));
 
  342         artifactLabel.setText(artifactTableContents.get(currentPage - 1).getArtifactDisplayName());
 
  347         currentPage = currentPage - 1;
 
  348         currentPageLabel.setText(Integer.toString(currentPage));
 
  349         artifactLabel.setText(artifactTableContents.get(currentPage - 1).getArtifactDisplayName());
 
  372         resultsTable.setComponentPopupMenu(rightClickMenu);
 
  373         ActionListener actList = 
new ActionListener() {
 
  375             public void actionPerformed(ActionEvent e) {
 
  376                 JMenuItem jmi = (JMenuItem) e.getSource();
 
  377                 if (jmi.equals(copyMenuItem)) {
 
  378                     StringBuilder selectedText = 
new StringBuilder(512);
 
  379                     for (
int row : resultsTable.getSelectedRows()) {
 
  380                         for (
int col : resultsTable.getSelectedColumns()) {
 
  381                             selectedText.append((String) resultsTable.getValueAt(row, col));
 
  382                             selectedText.append(
"\t");
 
  385                         if (row != resultsTable.getSelectedRows()[resultsTable.getSelectedRows().length - 1]) {
 
  386                             selectedText.append(System.lineSeparator());
 
  389                     Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
new StringSelection(selectedText.toString()), null);
 
  390                 } 
else if (jmi.equals(selectAllMenuItem)) {
 
  391                     resultsTable.selectAll();
 
  395         copyMenuItem.addActionListener(actList);
 
  397         selectAllMenuItem.addActionListener(actList);
 
  405         currentPageLabel.setText(
"");
 
  406         artifactLabel.setText(
"");
 
  407         totalPageLabel.setText(
"");
 
  408         ((DefaultTableModel) resultsTable.getModel()).setRowCount(0);
 
  409         prevPageButton.setEnabled(
false);
 
  410         nextPageButton.setEnabled(
false);
 
  416         if (currentNode == selectedNode) {
 
  419         currentNode = selectedNode;
 
  422         if (selectedNode == null) {
 
  427         Lookup lookup = selectedNode.getLookup();
 
  428         Content content = lookup.lookup(Content.class);
 
  429         if (content == null) {
 
  438         return NbBundle.getMessage(this.getClass(), 
"DataContentViewerArtifact.title");
 
  443         return NbBundle.getMessage(this.getClass(), 
"DataContentViewerArtifact.toolTip");
 
  467         for (Content content : node.getLookup().lookupAll(Content.class)) {
 
  468             if ( (content != null)  && (!(content instanceof BlackboardArtifact)) ){
 
  470                     return content.getAllArtifactsCount() > 0;
 
  471                 } 
catch (TskException ex) {
 
  472                     logger.log(Level.SEVERE, 
"Couldn't get count of BlackboardArtifacts for content", ex); 
 
  481         BlackboardArtifact artifact = node.getLookup().lookup(BlackboardArtifact.class);
 
  485         if ((artifact == null)
 
  486                 || (artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID())
 
  487                 || (artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID())
 
  488                 || (artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID())
 
  489                 || (artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_OBJECT_DETECTED.getTypeID())
 
  490                 || (artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_METADATA_EXIF.getTypeID())
 
  491                 || (artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_EXT_MISMATCH_DETECTED.getTypeID())) {
 
  504         private final SimpleDateFormat dateFormatter = 
new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
 
  505         private String[][] rowData = null;
 
  510             artifactDisplayName = artifact.getDisplayName();
 
  511             this.content = content;
 
  516             artifactDisplayName = errorMsg;
 
  517             rowData = 
new String[1][3];
 
  518             rowData[0] = 
new String[]{
"", errorMsg, 
""};
 
  526         private void addRows(BlackboardArtifact artifact) {
 
  527             List<String[]> rowsToAdd = 
new ArrayList<>();
 
  532                 for (BlackboardAttribute attr : artifact.getAttributes()) {
 
  537                     switch (attr.getAttributeType().getValueType()) {
 
  544                             value = attr.getDisplayString();
 
  548                             long epoch = attr.getValueLong();
 
  549                             value = 
"0000-00-00 00:00:00";
 
  550                             if (null != content && 0 != epoch) {
 
  552                                 value = dateFormatter.format(
new java.util.Date(epoch * 1000));
 
  559                     String sources = StringUtils.join(attr.getSources(), 
", ");
 
  560                     rowsToAdd.add(
new String[]{attr.getAttributeType().getDisplayName(), value, sources});
 
  567                     if (null != content) {
 
  568                         path = content.getUniquePath();
 
  570                 } 
catch (TskCoreException ex) {
 
  571                     logger.log(Level.SEVERE, String.format(
"Error getting source content path for artifact (artifact_id=%d, obj_id=%d)", artifact.getArtifactID(), artifact.getObjectID()), ex);
 
  572                     path = Bundle.DataContentViewerArtifact_failedToGetSourcePath_message();
 
  574                 rowsToAdd.add(
new String[]{
"Source File Path", path, 
""});
 
  578                 rowsToAdd.add(
new String[]{
"Artifact ID", Long.toString(artifact.getArtifactID()), 
""});
 
  579             } 
catch (TskCoreException ex) {
 
  580                 rowsToAdd.add(
new String[]{
"", Bundle.DataContentViewerArtifact_failedToGetAttributes_message(), 
""});
 
  582             rowData = rowsToAdd.toArray(
new String[0][0]);
 
  588         String getArtifactDisplayName() {
 
  589             return artifactDisplayName;
 
  604             this.currentPage = currentPage;
 
  605             this.numberOfPages = numberOfPages;
 
  606             this.tableContents = contents;
 
  609         ViewUpdate(
int numberOfPages, 
int currentPage, String errorMsg) {
 
  610             this.currentPage = currentPage;
 
  611             this.numberOfPages = numberOfPages;
 
  624         this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
 
  626         nextPageButton.setEnabled(viewUpdate.currentPage < viewUpdate.numberOfPages);
 
  627         prevPageButton.setEnabled(viewUpdate.currentPage > 1);
 
  628         currentPage = viewUpdate.currentPage;
 
  629         totalPageLabel.setText(Integer.toString(viewUpdate.numberOfPages));
 
  630         currentPageLabel.setText(Integer.toString(currentPage));
 
  631         artifactLabel.setText(viewUpdate.tableContents.getArtifactDisplayName());
 
  632         DefaultTableModel tModel = ((DefaultTableModel) resultsTable.getModel());
 
  633         tModel.setDataVector(viewUpdate.tableContents.
getRows(), COLUMN_HEADERS);
 
  636         resultsTable.clearSelection();
 
  638         this.setCursor(null);
 
  647     private synchronized void startNewTask(SwingWorker<ViewUpdate, Void> task) {
 
  648         String[][] waitRow = 
new String[1][3];
 
  649         waitRow[0] = 
new String[]{
"", WAIT_TEXT, 
""};
 
  650         DefaultTableModel tModel = ((DefaultTableModel) resultsTable.getModel());
 
  651         tModel.setDataVector(waitRow, COLUMN_HEADERS);
 
  654         resultsTable.clearSelection();
 
  656         if (currentTask != null) {
 
  659             currentTask.cancel(
false);
 
  664         currentTask.execute();
 
  674         synchronized (lock) {
 
  675             this.artifactTableContents = artifactList;
 
  685         synchronized (lock) {
 
  686             return artifactTableContents;
 
  700             this.selectedNode = selectedNode;
 
  707             Lookup lookup = selectedNode.getLookup();
 
  710             ArrayList<BlackboardArtifact> artifacts = 
new ArrayList<>();
 
  711             Collection<? extends Content> contents = lookup.lookupAll(Content.class);
 
  712             if (contents.isEmpty()) {
 
  713                 return new ViewUpdate(getArtifactContents().size(), currentPage, ERROR_TEXT);
 
  715             Content underlyingContent = null;
 
  716             for (Content content : contents) {
 
  717                 if ( (content != null)  && (!(content instanceof BlackboardArtifact)) ) {
 
  721                         artifacts = content.getAllArtifacts();
 
  722                         underlyingContent = content;
 
  724                     } 
catch (TskException ex) {
 
  725                         logger.log(Level.SEVERE, 
"Couldn't get artifacts", ex); 
 
  726                         return new ViewUpdate(getArtifactContents().size(), currentPage, ERROR_TEXT);
 
  736             ArrayList<ResultsTableArtifact> artifactContents = 
new ArrayList<>();
 
  737             for (BlackboardArtifact artifact : artifacts) {
 
  744             BlackboardArtifact artifact = lookup.lookup(BlackboardArtifact.class);
 
  745             if (artifact != null) {
 
  746                 index = artifacts.indexOf(artifact);
 
  752                         for (BlackboardAttribute attr : artifact.getAttributes()) {
 
  753                             if (attr.getAttributeType().getTypeID() == BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT.getTypeID()) {
 
  754                                 long assocArtifactId = attr.getValueLong();
 
  755                                 int assocArtifactIndex = -1;
 
  756                                 for (BlackboardArtifact art : artifacts) {
 
  757                                     if (assocArtifactId == art.getArtifactID()) {
 
  758                                         assocArtifactIndex = artifacts.indexOf(art);
 
  762                                 if (assocArtifactIndex >= 0) {
 
  763                                     index = assocArtifactIndex;
 
  768                     } 
catch (TskCoreException ex) {
 
  769                         logger.log(Level.WARNING, 
"Couldn't get associated artifact to display in Content Viewer.", ex); 
 
  780             ViewUpdate viewUpdate = 
new ViewUpdate(artifactContents.size(), index + 1, artifactContents.get(index));
 
  788             setArtifactContents(artifactContents);
 
  795             if (!isCancelled()) {
 
  798                     if (viewUpdate != null) {
 
  799                         updateView(viewUpdate);
 
  801                 } 
catch (InterruptedException | ExecutionException ex) {
 
  802                     logger.log(Level.WARNING, 
"Artifact display task unexpectedly interrupted or failed", ex);                 
 
  818             this.pageIndex = pageIndex;
 
  825             List<ResultsTableArtifact> artifactContents = getArtifactContents();
 
  833             return new ViewUpdate(artifactContents.size(), pageIndex, artifactContent);
 
  838             if (!isCancelled()) {
 
  841                     if (viewUpdate != null) {
 
  842                         updateView(viewUpdate);
 
  844                 } 
catch (InterruptedException | ExecutionException ex) {
 
  845                     logger.log(Level.WARNING, 
"Artifact display task unexpectedly interrupted or failed", ex);                 
 
  858             javax.swing.JTextArea jtex = 
new javax.swing.JTextArea();
 
  859             if (value instanceof String) {
 
  860                 jtex.setText((String) value);
 
  861                 jtex.setLineWrap(
true);
 
  862                 jtex.setWrapStyleWord(
false);
 
  866                 jtex.setBackground(javax.swing.UIManager.getColor(
"Table.selectionBackground"));
 
  868                 jtex.setBackground(javax.swing.UIManager.getColor(
"Table.background"));
 
javax.swing.JPopupMenu rightClickMenu
void prevPageButtonActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JScrollPane jScrollPane1
javax.swing.JLabel pageLabel
synchronized void startNewTask(SwingWorker< ViewUpdate, Void > task)
javax.swing.JPanel jPanel1
javax.swing.JLabel artifactLabel
javax.swing.JButton nextPageButton
void setArtifactContents(List< ResultsTableArtifact > artifactList)
void nextPageButtonActionPerformed(java.awt.event.ActionEvent evt)
DataContentViewerArtifact()
List< ResultsTableArtifact > artifactTableContents
javax.swing.JScrollPane resultsTableScrollPane
ViewUpdate doInBackground()
void updateView(ViewUpdate viewUpdate)
static TimeZone getTimeZone(Content content)
List< ResultsTableArtifact > getArtifactContents()
void setNode(Node selectedNode)
javax.swing.JMenuItem copyMenuItem
javax.swing.JLabel totalPageLabel
javax.swing.JButton prevPageButton
final String artifactDisplayName
javax.swing.JMenuItem selectAllMenuItem
Component getTableCellRendererComponent(javax.swing.JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
javax.swing.JLabel pageLabel2
javax.swing.JLabel ofLabel
DataContentViewer createInstance()
synchronized static Logger getLogger(String name)
ViewUpdate doInBackground()
boolean isSupported(Node node)
void addRows(BlackboardArtifact artifact)
int isPreferred(Node node)
void customizeComponents()
javax.swing.JLabel currentPageLabel