19 package org.sleuthkit.autopsy.corecomponents;
 
   21 import java.awt.Component;
 
   22 import java.awt.Cursor;
 
   23 import java.awt.event.ActionEvent;
 
   24 import java.awt.event.ActionListener;
 
   25 import java.util.List;
 
   26 import java.util.logging.Level;
 
   27 import org.openide.util.NbBundle;
 
   29 import javax.swing.JMenuItem;
 
   30 import javax.swing.JOptionPane;
 
   31 import org.openide.nodes.Node;
 
   32 import org.openide.util.lookup.ServiceProvider;
 
   44 @ServiceProvider(service = DataContentViewer.class, position = 2)
 
   45 @SuppressWarnings(
"PMD.SingularField") 
 
   48     private static long currentOffset = 0;
 
   49     private static final long PAGE_LENGTH = 16384;
 
   50     private final byte[] data = 
new byte[(int) PAGE_LENGTH];
 
   51     private static int currentPage = 1;
 
   62         customizeComponents();
 
   63         this.resetComponent();
 
   64         logger.log(Level.INFO, 
"Created StringView instance: {0}", 
this); 
 
   68         outputViewPane.setComponentPopupMenu(rightClickMenu);
 
   69         ActionListener actList = 
new ActionListener() {
 
   71             public void actionPerformed(ActionEvent e) {
 
   72                 JMenuItem jmi = (JMenuItem) e.getSource();
 
   73                 if (jmi.equals(copyMenuItem)) {
 
   74                     outputViewPane.copy();
 
   75                 } 
else if (jmi.equals(selectAllMenuItem)) {
 
   76                     outputViewPane.selectAll();
 
   80         copyMenuItem.addActionListener(actList);
 
   81         selectAllMenuItem.addActionListener(actList);
 
   84         for (
SCRIPT s : supportedScripts) {
 
   85             languageCombo.addItem(s);
 
   95     @SuppressWarnings(
"unchecked")
 
   97     private 
void initComponents() {
 
   99         rightClickMenu = 
new javax.swing.JPopupMenu();
 
  100         copyMenuItem = 
new javax.swing.JMenuItem();
 
  101         selectAllMenuItem = 
new javax.swing.JMenuItem();
 
  102         jScrollPane1 = 
new javax.swing.JScrollPane();
 
  103         outputViewPane = 
new javax.swing.JTextPane();
 
  104         jScrollPane2 = 
new javax.swing.JScrollPane();
 
  105         jPanel2 = 
new javax.swing.JPanel();
 
  106         totalPageLabel = 
new javax.swing.JLabel();
 
  107         ofLabel = 
new javax.swing.JLabel();
 
  108         currentPageLabel = 
new javax.swing.JLabel();
 
  109         pageLabel = 
new javax.swing.JLabel();
 
  110         nextPageButton = 
new javax.swing.JButton();
 
  111         pageLabel2 = 
new javax.swing.JLabel();
 
  112         prevPageButton = 
new javax.swing.JButton();
 
  113         goToPageLabel = 
new javax.swing.JLabel();
 
  114         goToPageTextField = 
new javax.swing.JTextField();
 
  115         languageCombo = 
new javax.swing.JComboBox<>();
 
  116         languageLabel = 
new javax.swing.JLabel();
 
  118         copyMenuItem.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class, 
"DataContentViewerString.copyMenuItem.text")); 
 
  119         rightClickMenu.add(copyMenuItem);
 
  121         selectAllMenuItem.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class, 
"DataContentViewerString.selectAllMenuItem.text")); 
 
  122         rightClickMenu.add(selectAllMenuItem);
 
  124         setMinimumSize(
new java.awt.Dimension(5, 5));
 
  125         setPreferredSize(
new java.awt.Dimension(100, 144));
 
  127         jScrollPane1.setPreferredSize(
new java.awt.Dimension(640, 402));
 
  129         outputViewPane.setEditable(
false);
 
  130         outputViewPane.setFont(
new java.awt.Font(
"Courier New", 0, 11)); 
 
  131         outputViewPane.setPreferredSize(
new java.awt.Dimension(638, 400));
 
  132         jScrollPane1.setViewportView(outputViewPane);
 
  134         jScrollPane2.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
 
  135         jScrollPane2.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
 
  137         totalPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class, 
"DataContentViewerString.totalPageLabel.text_1")); 
 
  139         ofLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class, 
"DataContentViewerString.ofLabel.text_1")); 
 
  141         currentPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class, 
"DataContentViewerString.currentPageLabel.text_1")); 
 
  142         currentPageLabel.setMaximumSize(
new java.awt.Dimension(18, 14));
 
  143         currentPageLabel.setPreferredSize(
new java.awt.Dimension(18, 14));
 
  145         pageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class, 
"DataContentViewerString.pageLabel.text_1")); 
 
  146         pageLabel.setMaximumSize(
new java.awt.Dimension(33, 14));
 
  147         pageLabel.setMinimumSize(
new java.awt.Dimension(33, 14));
 
  149         nextPageButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png"))); 
 
  150         nextPageButton.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class, 
"DataContentViewerString.nextPageButton.text")); 
 
  151         nextPageButton.setBorderPainted(
false);
 
  152         nextPageButton.setContentAreaFilled(
false);
 
  153         nextPageButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_forward_disabled.png"))); 
 
  154         nextPageButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
 
  155         nextPageButton.setPreferredSize(
new java.awt.Dimension(55, 23));
 
  156         nextPageButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_forward_hover.png"))); 
 
  157         nextPageButton.addActionListener(
new java.awt.event.ActionListener() {
 
  158             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  159                 nextPageButtonActionPerformed(evt);
 
  163         pageLabel2.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class, 
"DataContentViewerString.pageLabel2.text")); 
 
  164         pageLabel2.setMaximumSize(
new java.awt.Dimension(29, 14));
 
  165         pageLabel2.setMinimumSize(
new java.awt.Dimension(29, 14));
 
  167         prevPageButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back.png"))); 
 
  168         prevPageButton.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class, 
"DataContentViewerString.prevPageButton.text")); 
 
  169         prevPageButton.setBorderPainted(
false);
 
  170         prevPageButton.setContentAreaFilled(
false);
 
  171         prevPageButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png"))); 
 
  172         prevPageButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
 
  173         prevPageButton.setPreferredSize(
new java.awt.Dimension(55, 23));
 
  174         prevPageButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back_hover.png"))); 
 
  175         prevPageButton.addActionListener(
new java.awt.event.ActionListener() {
 
  176             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  177                 prevPageButtonActionPerformed(evt);
 
  181         goToPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class, 
"DataContentViewerString.goToPageLabel.text")); 
 
  183         goToPageTextField.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class, 
"DataContentViewerString.goToPageTextField.text")); 
 
  184         goToPageTextField.addActionListener(
new java.awt.event.ActionListener() {
 
  185             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  186                 goToPageTextFieldActionPerformed(evt);
 
  190         languageCombo.setToolTipText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class, 
"DataContentViewerString.languageCombo.toolTipText")); 
 
  191         languageCombo.addActionListener(
new java.awt.event.ActionListener() {
 
  192             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  193                 languageComboActionPerformed(evt);
 
  197         languageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class, 
"DataContentViewerString.languageLabel.text")); 
 
  198         languageLabel.setToolTipText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class, 
"DataContentViewerString.languageLabel.toolTipText")); 
 
  200         javax.swing.GroupLayout jPanel2Layout = 
new javax.swing.GroupLayout(jPanel2);
 
  201         jPanel2.setLayout(jPanel2Layout);
 
  202         jPanel2Layout.setHorizontalGroup(
 
  203             jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  204             .addGroup(jPanel2Layout.createSequentialGroup()
 
  206                 .addComponent(pageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  208                 .addComponent(currentPageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  209                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  210                 .addComponent(ofLabel)
 
  211                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  212                 .addComponent(totalPageLabel)
 
  214                 .addComponent(pageLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  215                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  216                 .addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  218                 .addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  220                 .addComponent(goToPageLabel)
 
  221                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  222                 .addComponent(goToPageTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  224                 .addComponent(languageLabel)
 
  225                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  226                 .addComponent(languageCombo, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  227                 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
 
  229         jPanel2Layout.setVerticalGroup(
 
  230             jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  231             .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  232                 .addComponent(pageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  233                 .addComponent(currentPageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  234                 .addComponent(ofLabel)
 
  235                 .addComponent(totalPageLabel))
 
  236             .addComponent(pageLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  237             .addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  238             .addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  239             .addComponent(goToPageLabel)
 
  240             .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  241                 .addComponent(goToPageTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  242                 .addComponent(languageCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  243                 .addComponent(languageLabel))
 
  246         jScrollPane2.setViewportView(jPanel2);
 
  248         javax.swing.GroupLayout layout = 
new javax.swing.GroupLayout(
this);
 
  249         this.setLayout(layout);
 
  250         layout.setHorizontalGroup(
 
  251             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  252             .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
 
  253             .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE)
 
  255         layout.setVerticalGroup(
 
  256             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  257             .addGroup(layout.createSequentialGroup()
 
  258                 .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  259                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  260                 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 25, Short.MAX_VALUE))
 
  266         currentOffset -= PAGE_LENGTH;
 
  268         currentPageLabel.setText(Integer.toString(currentPage));
 
  269         setDataView(dataSource, currentOffset);
 
  274         currentOffset += PAGE_LENGTH;
 
  276         currentPageLabel.setText(Integer.toString(currentPage));
 
  277         setDataView(dataSource, currentOffset);
 
  281         String pageNumberStr = goToPageTextField.getText();
 
  283         int maxPage = Math.round((dataSource.getSize() - 1) / PAGE_LENGTH) + 1;
 
  285             pageNumber = Integer.parseInt(pageNumberStr);
 
  286         } 
catch (NumberFormatException ex) {
 
  287             pageNumber = maxPage + 1;
 
  289         if (pageNumber > maxPage || pageNumber < 1) {
 
  290             JOptionPane.showMessageDialog(
this,
 
  291                     NbBundle.getMessage(
this.getClass(),
 
  292                             "DataContentViewerString.goToPageTextField.msgDlg",
 
  294                     NbBundle.getMessage(
this.getClass(),
 
  295                             "DataContentViewerString.goToPageTextField.err"),
 
  296                     JOptionPane.WARNING_MESSAGE);
 
  299         currentOffset = (pageNumber - 1) * PAGE_LENGTH;
 
  300         currentPage = pageNumber;
 
  301         currentPageLabel.setText(Integer.toString(currentPage));
 
  302         setDataView(dataSource, currentOffset);
 
  307         if (dataSource != null) {
 
  308             setDataView(dataSource, currentOffset);
 
  340         if (dataSource == null) {
 
  345         this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
 
  347         this.dataSource = dataSource;
 
  352         if (dataSource.getSize() > 0) {
 
  354                 bytesRead = dataSource.read(data, offset, PAGE_LENGTH); 
 
  355             } 
catch (TskCoreException ex) {
 
  356                 logger.log(Level.WARNING, 
"Error while trying to show the String content.", ex); 
 
  362             final SCRIPT selScript = (
SCRIPT) languageCombo.getSelectedItem();
 
  366             if (text.trim().isEmpty()) {
 
  367                 text = NbBundle.getMessage(this.getClass(),
 
  368                         "DataContentViewerString.setDataView.errorNoText", currentOffset,
 
  369                         currentOffset + PAGE_LENGTH);
 
  372             text = NbBundle.getMessage(this.getClass(), 
"DataContentViewerString.setDataView.errorText", currentOffset,
 
  373                     currentOffset + PAGE_LENGTH);
 
  377         if (offset + PAGE_LENGTH < dataSource.getSize()) {
 
  378             nextPageButton.setEnabled(
true);
 
  380             nextPageButton.setEnabled(
false);
 
  384             prevPageButton.setEnabled(
false);
 
  387             prevPageButton.setEnabled(
true);
 
  390         int totalPage = Math.round((dataSource.getSize() - 1) / PAGE_LENGTH) + 1;
 
  391         totalPageLabel.setText(Integer.toString(totalPage));
 
  392         currentPageLabel.setText(Integer.toString(currentPage));
 
  393         outputViewPane.setText(text); 
 
  394         setComponentsVisibility(
true); 
 
  395         outputViewPane.moveCaretPosition(0);
 
  397         this.setCursor(null);
 
  401         this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
 
  403             this.dataSource = null;
 
  408             nextPageButton.setEnabled(
false);
 
  410             prevPageButton.setEnabled(
false);
 
  414             totalPageLabel.setText(Integer.toString(totalPage));
 
  415             currentPageLabel.setText(Integer.toString(currentPage));
 
  416             outputViewPane.setText(text); 
 
  417             setComponentsVisibility(
true); 
 
  418             outputViewPane.moveCaretPosition(0);
 
  420             this.setCursor(null);
 
  430         currentPageLabel.setVisible(isVisible);
 
  431         totalPageLabel.setVisible(isVisible);
 
  432         ofLabel.setVisible(isVisible);
 
  433         prevPageButton.setVisible(isVisible);
 
  434         nextPageButton.setVisible(isVisible);
 
  435         pageLabel.setVisible(isVisible);
 
  436         pageLabel2.setVisible(isVisible);
 
  437         goToPageTextField.setVisible(isVisible);
 
  438         goToPageLabel.setVisible(isVisible);
 
  439         languageCombo.setVisible(isVisible);
 
  440         languageLabel.setVisible(isVisible);
 
  445         if ((selectedNode == null) || (!isSupported(selectedNode))) {
 
  451         if (content != null) {
 
  452             this.setDataView(content, 0);
 
  456             if (scontent != null) {
 
  457                 this.setDataView(scontent);
 
  466         return NbBundle.getMessage(this.getClass(), 
"DataContentViewerString.title");
 
  471         return NbBundle.getMessage(this.getClass(), 
"DataContentViewerString.toolTip");
 
  484         this.dataSource = null;
 
  485         currentPageLabel.setText(
"");
 
  486         totalPageLabel.setText(
"");
 
  487         prevPageButton.setEnabled(
false);
 
  488         nextPageButton.setEnabled(
false);
 
  489         outputViewPane.setText(
""); 
 
  490         setComponentsVisibility(
false); 
 
  499         return (content != null && content.getSize() > 0);
 
static Content getDefaultContent(Node node)
javax.swing.JLabel pageLabel2
javax.swing.JComboBox< SCRIPT > languageCombo
javax.swing.JLabel totalPageLabel
void nextPageButtonActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JMenuItem copyMenuItem
javax.swing.JLabel pageLabel
void setNode(Node selectedNode)
DataContentViewerString()
DataContentViewer createInstance()
javax.swing.JLabel languageLabel
void goToPageTextFieldActionPerformed(java.awt.event.ActionEvent evt)
void prevPageButtonActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JLabel ofLabel
void setDataView(Content dataSource, long offset)
javax.swing.JButton prevPageButton
javax.swing.JButton nextPageButton
javax.swing.JMenuItem selectAllMenuItem
javax.swing.JScrollPane jScrollPane1
void setDataView(StringContent dataSource)
javax.swing.JScrollPane jScrollPane2
javax.swing.JTextField goToPageTextField
synchronized static Logger getLogger(String name)
int isPreferred(Node node)
void setComponentsVisibility(boolean isVisible)
javax.swing.JLabel goToPageLabel
void languageComboActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JTextPane outputViewPane
javax.swing.JLabel currentPageLabel
boolean isSupported(Node node)
javax.swing.JPanel jPanel2
javax.swing.JPopupMenu rightClickMenu
void customizeComponents()