Autopsy  3.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
DataContentViewerHex.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011-2013 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.corecomponents;
20 
21 import java.awt.*;
22 import java.awt.event.ActionEvent;
23 import java.awt.event.ActionListener;
24 import java.util.logging.Level;
25 
26 import org.openide.util.NbBundle;
28 import javax.swing.JMenuItem;
29 import javax.swing.JOptionPane;
30 import javax.swing.JTextPane;
31 import org.openide.nodes.Node;
32 import org.openide.util.lookup.ServiceProvider;
37 
41 @ServiceProvider(service = DataContentViewer.class, position = 1)
42 public class DataContentViewerHex extends javax.swing.JPanel implements DataContentViewer {
43  private static final long pageLength = 16384;
44  private final byte[] data = new byte[(int) pageLength];
45  private static int currentPage = 1;
46  private int totalPages;
48 
49  private static final Logger logger = Logger.getLogger(DataContentViewerHex.class.getName());
50 
55  initComponents();
56  customizeComponents();
57  this.resetComponent();
58  logger.log(Level.INFO, "Created HexView instance: " + this); //NON-NLS
59  }
60 
61  private void customizeComponents() {
62  outputViewPane.setComponentPopupMenu(rightClickMenu);
63  ActionListener actList = new ActionListener() {
64  @Override
65  public void actionPerformed(ActionEvent e) {
66  JMenuItem jmi = (JMenuItem) e.getSource();
67  if (jmi.equals(copyMenuItem)) {
68  outputViewPane.copy();
69  } else if (jmi.equals(selectAllMenuItem)) {
70  outputViewPane.selectAll();
71  }
72  }
73  };
74  copyMenuItem.addActionListener(actList);
75  selectAllMenuItem.addActionListener(actList);
76  }
77 
83  @SuppressWarnings("unchecked")
84  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
85  private void initComponents() {
86 
87  rightClickMenu = new javax.swing.JPopupMenu();
88  copyMenuItem = new javax.swing.JMenuItem();
89  selectAllMenuItem = new javax.swing.JMenuItem();
90  hexViewerPanel = new javax.swing.JPanel();
91  jScrollPane1 = new javax.swing.JScrollPane();
92  outputViewPane = new JTextPane(){
93  public boolean getScrollableTracksViewportWidth() {
94  return (getSize().width < 400);
95  }};
96  this.outputViewPane.setBackground(new java.awt.Color(255, 255, 255)); // to make sure the background color is white
97  totalPageLabel = new javax.swing.JLabel();
98  ofLabel = new javax.swing.JLabel();
99  currentPageLabel = new javax.swing.JLabel();
100  pageLabel = new javax.swing.JLabel();
101  prevPageButton = new javax.swing.JButton();
102  nextPageButton = new javax.swing.JButton();
103  pageLabel2 = new javax.swing.JLabel();
104  goToPageTextField = new javax.swing.JTextField();
105  goToPageLabel = new javax.swing.JLabel();
106 
107  copyMenuItem.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.copyMenuItem.text")); // NOI18N
108  rightClickMenu.add(copyMenuItem);
109 
110  selectAllMenuItem.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.selectAllMenuItem.text")); // NOI18N
111  rightClickMenu.add(selectAllMenuItem);
112 
113  jScrollPane1.setBackground(new java.awt.Color(255, 255, 255));
114 
115  outputViewPane.setEditable(false);
116  outputViewPane.setFont(new Font("Courier New", Font.PLAIN, 11)); // NOI18N NON-NLS
117  outputViewPane.setMinimumSize(new java.awt.Dimension(700, 20));
118  outputViewPane.setPreferredSize(new java.awt.Dimension(700, 400));
119  jScrollPane1.setViewportView(outputViewPane);
120 
121  totalPageLabel.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.totalPageLabel.text_1")); // NOI18N
122 
123  ofLabel.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.ofLabel.text_1")); // NOI18N
124 
125  currentPageLabel.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.currentPageLabel.text_1")); // NOI18N
126  currentPageLabel.setMaximumSize(new java.awt.Dimension(18, 14));
127  currentPageLabel.setMinimumSize(new java.awt.Dimension(18, 14));
128  currentPageLabel.setPreferredSize(new java.awt.Dimension(18, 14));
129 
130  pageLabel.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.pageLabel.text_1")); // NOI18N
131  pageLabel.setMaximumSize(new java.awt.Dimension(33, 14));
132  pageLabel.setMinimumSize(new java.awt.Dimension(33, 14));
133  pageLabel.setPreferredSize(new java.awt.Dimension(33, 14));
134 
135  prevPageButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back.png"))); // NOI18N NON-NLS
136  prevPageButton.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.prevPageButton.text")); // NOI18N
137  prevPageButton.setBorderPainted(false);
138  prevPageButton.setContentAreaFilled(false);
139  prevPageButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png"))); // NOI18N NON-NLS
140  prevPageButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
141  prevPageButton.setPreferredSize(new java.awt.Dimension(23, 23));
142  prevPageButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back_hover.png"))); // NOI18N NON-NLS
143  prevPageButton.addActionListener(new java.awt.event.ActionListener() {
144  public void actionPerformed(java.awt.event.ActionEvent evt) {
145  prevPageButtonActionPerformed(evt);
146  }
147  });
148 
149  nextPageButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png"))); // NOI18N NON-NLS
150  nextPageButton.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.nextPageButton.text")); // NOI18N
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"))); // NOI18N NON-NLS
154  nextPageButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
155  nextPageButton.setPreferredSize(new java.awt.Dimension(23, 23));
156  nextPageButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward_hover.png"))); // NOI18N NON-NLS
157  nextPageButton.addActionListener(new java.awt.event.ActionListener() {
158  public void actionPerformed(java.awt.event.ActionEvent evt) {
159  nextPageButtonActionPerformed(evt);
160  }
161  });
162 
163  pageLabel2.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.pageLabel2.text")); // NOI18N
164  pageLabel2.setMaximumSize(new java.awt.Dimension(29, 14));
165  pageLabel2.setMinimumSize(new java.awt.Dimension(29, 14));
166  pageLabel2.setPreferredSize(new java.awt.Dimension(29, 14));
167 
168  goToPageTextField.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.goToPageTextField.text")); // NOI18N
169  goToPageTextField.addActionListener(new java.awt.event.ActionListener() {
170  public void actionPerformed(java.awt.event.ActionEvent evt) {
171  goToPageTextFieldActionPerformed(evt);
172  }
173  });
174 
175  goToPageLabel.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.goToPageLabel.text")); // NOI18N
176 
177  javax.swing.GroupLayout hexViewerPanelLayout = new javax.swing.GroupLayout(hexViewerPanel);
178  hexViewerPanel.setLayout(hexViewerPanelLayout);
179  hexViewerPanelLayout.setHorizontalGroup(
180  hexViewerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
181  .addGroup(hexViewerPanelLayout.createSequentialGroup()
182  .addContainerGap()
183  .addComponent(pageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
184  .addGap(18, 18, 18)
185  .addComponent(currentPageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
186  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
187  .addComponent(ofLabel)
188  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
189  .addComponent(totalPageLabel)
190  .addGap(50, 50, 50)
191  .addComponent(pageLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
192  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
193  .addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
194  .addGap(0, 0, 0)
195  .addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
196  .addGap(18, 18, 18)
197  .addComponent(goToPageLabel)
198  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
199  .addComponent(goToPageTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
200  .addContainerGap(205, Short.MAX_VALUE))
201  .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 622, Short.MAX_VALUE)
202  );
203  hexViewerPanelLayout.setVerticalGroup(
204  hexViewerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
205  .addGroup(hexViewerPanelLayout.createSequentialGroup()
206  .addGroup(hexViewerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
207  .addComponent(pageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
208  .addGroup(hexViewerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
209  .addComponent(currentPageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
210  .addComponent(ofLabel)
211  .addComponent(totalPageLabel))
212  .addComponent(pageLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
213  .addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
214  .addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
215  .addComponent(goToPageLabel)
216  .addComponent(goToPageTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
217  .addGap(0, 0, 0)
218  .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 388, Short.MAX_VALUE))
219  );
220 
221  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
222  this.setLayout(layout);
223  layout.setHorizontalGroup(
224  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
225  .addGap(0, 622, Short.MAX_VALUE)
226  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
227  .addGroup(layout.createSequentialGroup()
228  .addGap(0, 0, 0)
229  .addComponent(hexViewerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
230  .addGap(0, 0, 0)))
231  );
232  layout.setVerticalGroup(
233  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
234  .addGap(0, 411, Short.MAX_VALUE)
235  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
236  .addGroup(layout.createSequentialGroup()
237  .addGap(0, 0, 0)
238  .addComponent(hexViewerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
239  .addGap(0, 0, 0)))
240  );
241  }// </editor-fold>//GEN-END:initComponents
242 
243  private void prevPageButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_prevPageButtonActionPerformed
244  setDataView(currentPage - 1);
245  }//GEN-LAST:event_prevPageButtonActionPerformed
246 
247  private void nextPageButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nextPageButtonActionPerformed
248  setDataView(currentPage + 1);
249  }//GEN-LAST:event_nextPageButtonActionPerformed
250 
251  private void goToPageTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_goToPageTextFieldActionPerformed
252  String pageNumberStr = goToPageTextField.getText();
253  int pageNumber = 0;
254 
255  try {
256  pageNumber = Integer.parseInt(pageNumberStr);
257  } catch (NumberFormatException ex) {
258  pageNumber = totalPages + 1;
259  }
260  if (pageNumber > totalPages || pageNumber < 1) {
261  JOptionPane.showMessageDialog(this,
262  NbBundle.getMessage(this.getClass(),
263  "DataContentViewerHex.goToPageTextField.msgDlg",
264  totalPages),
265  NbBundle.getMessage(this.getClass(),
266  "DataContentViewerHex.goToPageTextField.err"),
267  JOptionPane.WARNING_MESSAGE);
268  return;
269  }
270  setDataView(pageNumber);
271  }//GEN-LAST:event_goToPageTextFieldActionPerformed
272  // Variables declaration - do not modify//GEN-BEGIN:variables
273  private javax.swing.JMenuItem copyMenuItem;
274  private javax.swing.JLabel currentPageLabel;
275  private javax.swing.JLabel goToPageLabel;
276  private javax.swing.JTextField goToPageTextField;
277  private javax.swing.JPanel hexViewerPanel;
278  private javax.swing.JScrollPane jScrollPane1;
279  private javax.swing.JButton nextPageButton;
280  private javax.swing.JLabel ofLabel;
281  private javax.swing.JTextPane outputViewPane;
282  private javax.swing.JLabel pageLabel;
283  private javax.swing.JLabel pageLabel2;
284  private javax.swing.JButton prevPageButton;
285  private javax.swing.JPopupMenu rightClickMenu;
286  private javax.swing.JMenuItem selectAllMenuItem;
287  private javax.swing.JLabel totalPageLabel;
288  // End of variables declaration//GEN-END:variables
289 
290 
296  private void setDataView(int page) {
297  if (this.dataSource == null) {
298  return;
299  }
300 
301  if (page == 0) {
302  return;
303  }
304 
305  currentPage = page;
306  long offset = (currentPage - 1) * pageLength;
307 
308  // change the cursor to "waiting cursor" for this operation
309  this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
310 
311  String errorText = null;
312 
313  int bytesRead = 0;
314  if (dataSource.getSize() > 0) {
315  try {
316  bytesRead = dataSource.read(data, offset, pageLength); // read the data
317  } catch (TskException ex) {
318  errorText = NbBundle.getMessage(this.getClass(), "DataContentViewerHex.setDataView.errorText", offset,
319  offset + pageLength);
320  logger.log(Level.WARNING, "Error while trying to show the hex content.", ex); //NON-NLS
321  }
322  }
323 
324  // set the data on the bottom and show it
325  if (bytesRead <= 0) {
326  errorText = NbBundle.getMessage(this.getClass(), "DataContentViewerHex.setDataView.errorText", offset,
327  offset + pageLength);
328  }
329 
330 
331  // disable or enable the next button
332  if ((errorText == null) && (currentPage < totalPages)) {
333  nextPageButton.setEnabled(true);
334  }
335  else {
336  nextPageButton.setEnabled(false);
337  }
338 
339  if ((errorText == null) && (currentPage > 1)) {
340  prevPageButton.setEnabled(true);
341  }
342  else {
343  prevPageButton.setEnabled(false);
344  }
345 
346  currentPageLabel.setText(Integer.toString(currentPage));
347  setComponentsVisibility(true); // shows the components that not needed
348 
349  // set the output view
350  if (errorText == null) {
351  int showLength = bytesRead < pageLength ? bytesRead : (int) pageLength;
352  outputViewPane.setText(DataConversion.byteArrayToHex(data, showLength, offset));
353  }
354  else {
355  outputViewPane.setText(errorText);
356  }
357 
358  outputViewPane.setCaretPosition(0);
359  this.setCursor(null);
360  }
361 
362  @Override
363  public void setNode(Node selectedNode) {
364  if ((selectedNode == null) || (!isSupported(selectedNode))) {
365  resetComponent();
366  return;
367  }
368 
369  Content content = (selectedNode).getLookup().lookup(Content.class);
370  if (content == null) {
371  resetComponent();
372  return;
373  }
374 
375  dataSource = content;
376  totalPages = 0;
377  if (dataSource.getSize() > 0) {
378  totalPages = Math.round((dataSource.getSize() - 1) / pageLength) + 1;
379  }
380  totalPageLabel.setText(Integer.toString(totalPages));
381 
382  this.setDataView(1);
383  }
384 
385  @Override
386  public String getTitle() {
387  return NbBundle.getMessage(this.getClass(), "DataContentViewerHex.title");
388  }
389 
390  @Override
391  public String getToolTip() {
392  return NbBundle.getMessage(this.getClass(), "DataContentViewerHex.toolTip");
393  }
394 
395  @Override
396  public DataContentViewer createInstance() {
397  return new DataContentViewerHex();
398  }
399 
400  @Override
401  public void resetComponent() {
402  // clear / reset the fields
403  currentPage = 1;
404  this.dataSource = null;
405  currentPageLabel.setText("");
406  totalPageLabel.setText("");
407  outputViewPane.setText("");
408  setComponentsVisibility(false); // hides the components that not needed
409  }
410 
416  private void setComponentsVisibility(boolean isVisible) {
417  currentPageLabel.setVisible(isVisible);
418  totalPageLabel.setVisible(isVisible);
419  ofLabel.setVisible(isVisible);
420  prevPageButton.setVisible(isVisible);
421  nextPageButton.setVisible(isVisible);
422  pageLabel.setVisible(isVisible);
423  pageLabel2.setVisible(isVisible);
424  goToPageTextField.setVisible(isVisible);
425  goToPageLabel.setVisible(isVisible);
426  }
427 
428  @Override
429  public boolean isSupported(Node node) {
430  if (node == null) {
431  return false;
432  }
433  Content content = node.getLookup().lookup(Content.class);
434  if (content != null && content.getSize() > 0) {
435  return true;
436  }
437 
438  return false;
439  }
440 
441  @Override
442  public int isPreferred(Node node) {
443  return 1;
444  }
445 
446  @Override
447  public Component getComponent() {
448  return this;
449  }
450 
451  /* Show the right click menu only if evt is the correct mouse event */
452  private void maybeShowPopup(java.awt.event.MouseEvent evt) {
453  if (evt.isPopupTrigger()) {
454  rightClickMenu.setLocation(evt.getLocationOnScreen());
455  rightClickMenu.setVisible(true);
456  copyMenuItem.setEnabled(outputViewPane.getSelectedText() != null);
457  } else {
458  rightClickMenu.setVisible(false);
459  }
460  }
461 }
int read(byte[] buf, long offset, long len)
void goToPageTextFieldActionPerformed(java.awt.event.ActionEvent evt)
static String byteArrayToHex(byte[] array, int length, long arrayOffset, Font font)
void prevPageButtonActionPerformed(java.awt.event.ActionEvent evt)
void nextPageButtonActionPerformed(java.awt.event.ActionEvent evt)
static Logger getLogger(String name)
Definition: Logger.java:131

Copyright © 2012-2015 Basis Technology. Generated on: Mon Oct 19 2015
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.