Autopsy  4.4.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-2016 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 javax.swing.text.BadLocationException;
32 import javax.swing.text.Utilities;
33 import org.openide.nodes.Node;
34 import org.openide.util.lookup.ServiceProvider;
37 import org.sleuthkit.datamodel.Content;
38 import org.sleuthkit.datamodel.TskException;
39 
43 @ServiceProvider(service = DataContentViewer.class, position = 1)
44 public class DataContentViewerHex extends javax.swing.JPanel implements DataContentViewer {
45 
46  private static final long pageLength = 16384;
47  private final byte[] data = new byte[(int) pageLength];
48  private static int currentPage = 1;
49  private int totalPages;
50  private Content dataSource;
51 
52  private static final Logger logger = Logger.getLogger(DataContentViewerHex.class.getName());
53 
58  initComponents();
59  customizeComponents();
60  this.resetComponent();
61  logger.log(Level.INFO, "Created HexView instance: " + this); //NON-NLS
62  }
63 
64  private void customizeComponents() {
65  outputViewPane.setComponentPopupMenu(rightClickMenu);
66  ActionListener actList = new ActionListener() {
67  @Override
68  public void actionPerformed(ActionEvent e) {
69  JMenuItem jmi = (JMenuItem) e.getSource();
70  if (jmi.equals(copyMenuItem)) {
71  outputViewPane.copy();
72  } else if (jmi.equals(selectAllMenuItem)) {
73  outputViewPane.selectAll();
74  }
75  }
76  };
77  copyMenuItem.addActionListener(actList);
78  selectAllMenuItem.addActionListener(actList);
79  }
80 
86  @SuppressWarnings("unchecked")
87  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
88  private void initComponents() {
89 
90  rightClickMenu = new javax.swing.JPopupMenu();
91  copyMenuItem = new javax.swing.JMenuItem();
92  selectAllMenuItem = new javax.swing.JMenuItem();
93  hexViewerPanel = new javax.swing.JPanel();
94  totalPageLabel = new javax.swing.JLabel();
95  ofLabel = new javax.swing.JLabel();
96  currentPageLabel = new javax.swing.JLabel();
97  pageLabel = new javax.swing.JLabel();
98  prevPageButton = new javax.swing.JButton();
99  nextPageButton = new javax.swing.JButton();
100  pageLabel2 = new javax.swing.JLabel();
101  goToPageTextField = new javax.swing.JTextField();
102  goToPageLabel = new javax.swing.JLabel();
103  goToOffsetLabel = new javax.swing.JLabel();
104  goToOffsetTextField = new javax.swing.JTextField();
105  jScrollPane1 = new javax.swing.JScrollPane();
106  outputViewPane = new JTextPane(){
107  public boolean getScrollableTracksViewportWidth() {
108  return (getSize().width < 400);
109  }};
110  this.outputViewPane.setBackground(new java.awt.Color(255, 255, 255)); // to make sure the background color is white
111  this.outputViewPane.requestFocusInWindow();
112  this.outputViewPane.setCursor(Cursor.getDefaultCursor());
113 
114  copyMenuItem.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.copyMenuItem.text")); // NOI18N
115  rightClickMenu.add(copyMenuItem);
116 
117  selectAllMenuItem.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.selectAllMenuItem.text")); // NOI18N
118  rightClickMenu.add(selectAllMenuItem);
119 
120  setPreferredSize(new java.awt.Dimension(610, 58));
121 
122  hexViewerPanel.setPreferredSize(new java.awt.Dimension(610, 23));
123 
124  totalPageLabel.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.totalPageLabel.text_1")); // NOI18N
125 
126  ofLabel.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.ofLabel.text_1")); // NOI18N
127 
128  currentPageLabel.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.currentPageLabel.text_1")); // NOI18N
129  currentPageLabel.setMaximumSize(new java.awt.Dimension(18, 14));
130  currentPageLabel.setMinimumSize(new java.awt.Dimension(18, 14));
131  currentPageLabel.setPreferredSize(new java.awt.Dimension(18, 14));
132 
133  pageLabel.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.pageLabel.text_1")); // NOI18N
134  pageLabel.setMaximumSize(new java.awt.Dimension(33, 14));
135  pageLabel.setMinimumSize(new java.awt.Dimension(33, 14));
136  pageLabel.setPreferredSize(new java.awt.Dimension(33, 14));
137 
138  prevPageButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back.png"))); // NOI18N
139  prevPageButton.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.prevPageButton.text")); // NOI18N
140  prevPageButton.setBorderPainted(false);
141  prevPageButton.setContentAreaFilled(false);
142  prevPageButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png"))); // NOI18N
143  prevPageButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
144  prevPageButton.setPreferredSize(new java.awt.Dimension(23, 23));
145  prevPageButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back_hover.png"))); // NOI18N
146  prevPageButton.addActionListener(new java.awt.event.ActionListener() {
147  public void actionPerformed(java.awt.event.ActionEvent evt) {
148  prevPageButtonActionPerformed(evt);
149  }
150  });
151 
152  nextPageButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png"))); // NOI18N
153  nextPageButton.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.nextPageButton.text")); // NOI18N
154  nextPageButton.setBorderPainted(false);
155  nextPageButton.setContentAreaFilled(false);
156  nextPageButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward_disabled.png"))); // NOI18N
157  nextPageButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
158  nextPageButton.setPreferredSize(new java.awt.Dimension(23, 23));
159  nextPageButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward_hover.png"))); // NOI18N
160  nextPageButton.addActionListener(new java.awt.event.ActionListener() {
161  public void actionPerformed(java.awt.event.ActionEvent evt) {
162  nextPageButtonActionPerformed(evt);
163  }
164  });
165 
166  pageLabel2.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.pageLabel2.text")); // NOI18N
167  pageLabel2.setMaximumSize(new java.awt.Dimension(29, 14));
168  pageLabel2.setMinimumSize(new java.awt.Dimension(29, 14));
169  pageLabel2.setPreferredSize(new java.awt.Dimension(29, 14));
170 
171  goToPageTextField.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.goToPageTextField.text")); // NOI18N
172  goToPageTextField.addActionListener(new java.awt.event.ActionListener() {
173  public void actionPerformed(java.awt.event.ActionEvent evt) {
174  goToPageTextFieldActionPerformed(evt);
175  }
176  });
177 
178  goToPageLabel.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.goToPageLabel.text")); // NOI18N
179 
180  goToOffsetLabel.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.goToOffsetLabel.text")); // NOI18N
181 
182  goToOffsetTextField.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.goToOffsetTextField.text")); // NOI18N
183  goToOffsetTextField.addActionListener(new java.awt.event.ActionListener() {
184  public void actionPerformed(java.awt.event.ActionEvent evt) {
185  goToOffsetTextFieldActionPerformed(evt);
186  }
187  });
188 
189  javax.swing.GroupLayout hexViewerPanelLayout = new javax.swing.GroupLayout(hexViewerPanel);
190  hexViewerPanel.setLayout(hexViewerPanelLayout);
191  hexViewerPanelLayout.setHorizontalGroup(
192  hexViewerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
193  .addGroup(hexViewerPanelLayout.createSequentialGroup()
194  .addContainerGap()
195  .addComponent(pageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
196  .addGap(18, 18, 18)
197  .addComponent(currentPageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
198  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
199  .addComponent(ofLabel)
200  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
201  .addComponent(totalPageLabel)
202  .addGap(50, 50, 50)
203  .addComponent(pageLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
204  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
205  .addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
206  .addGap(0, 0, 0)
207  .addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
208  .addGap(18, 18, 18)
209  .addComponent(goToPageLabel)
210  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
211  .addComponent(goToPageTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
212  .addGap(18, 18, 18)
213  .addComponent(goToOffsetLabel)
214  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
215  .addComponent(goToOffsetTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
216  .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
217  );
218  hexViewerPanelLayout.setVerticalGroup(
219  hexViewerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
220  .addGroup(hexViewerPanelLayout.createSequentialGroup()
221  .addGroup(hexViewerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
222  .addComponent(pageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
223  .addGroup(hexViewerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
224  .addComponent(currentPageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
225  .addComponent(ofLabel)
226  .addComponent(totalPageLabel))
227  .addComponent(pageLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
228  .addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
229  .addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
230  .addComponent(goToPageLabel)
231  .addComponent(goToPageTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
232  .addComponent(goToOffsetLabel)
233  .addComponent(goToOffsetTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
234  .addGap(0, 0, 0))
235  );
236 
237  jScrollPane1.setBackground(new java.awt.Color(255, 255, 255));
238  jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
239  jScrollPane1.setPreferredSize(new java.awt.Dimension(610, 402));
240 
241  outputViewPane.setEditable(false);
242  outputViewPane.setFont(new java.awt.Font("Courier New", 0, 11)); // NOI18N
243  outputViewPane.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
244  outputViewPane.setMinimumSize(new java.awt.Dimension(600, 20));
245  outputViewPane.setPreferredSize(new java.awt.Dimension(700, 400));
246  jScrollPane1.setViewportView(outputViewPane);
247 
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(hexViewerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
253  .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
254  );
255  layout.setVerticalGroup(
256  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
257  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
258  .addComponent(hexViewerPanel, 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, 29, Short.MAX_VALUE)
261  .addGap(0, 0, 0))
262  );
263  }// </editor-fold>//GEN-END:initComponents
264 
265  private void prevPageButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_prevPageButtonActionPerformed
266  setDataViewByPageNumber(currentPage - 1);
267  goToPageTextField.setText(Integer.toString(currentPage));
268  }//GEN-LAST:event_prevPageButtonActionPerformed
269 
270  private void nextPageButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nextPageButtonActionPerformed
271  setDataViewByPageNumber(currentPage + 1);
272  goToPageTextField.setText(Integer.toString(currentPage));
273  }//GEN-LAST:event_nextPageButtonActionPerformed
274 
275  private void goToPageTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_goToPageTextFieldActionPerformed
276  String pageNumberStr = goToPageTextField.getText();
277  int pageNumber = 0;
278 
279  try {
280  pageNumber = Integer.parseInt(pageNumberStr);
281  } catch (NumberFormatException ex) {
282  pageNumber = totalPages + 1;
283  }
284  if (pageNumber > totalPages || pageNumber < 1) {
285  JOptionPane.showMessageDialog(this,
286  NbBundle.getMessage(this.getClass(),
287  "DataContentViewerHex.goToPageTextField.msgDlg",
288  totalPages),
289  NbBundle.getMessage(this.getClass(),
290  "DataContentViewerHex.goToPageTextField.err"),
291  JOptionPane.WARNING_MESSAGE);
292  return;
293  }
294  setDataViewByPageNumber(pageNumber);
295  }//GEN-LAST:event_goToPageTextFieldActionPerformed
296 
307  private long getOffsetRelativeToCaretPosition(Long userInput) {
308  String userSelectedLine;
309  try {
310  // get the selected line. Extract the current hex offset location.
311  userSelectedLine = outputViewPane.getText().subSequence(
312  Utilities.getRowStart(outputViewPane, outputViewPane.getCaretPosition()),
313  Utilities.getRowEnd(outputViewPane, outputViewPane.getCaretPosition()))
314  .toString();
315  // NOTE: This needs to change if the outputFormat of outputViewPane changes.
316  String hexForUserSelectedLine = userSelectedLine.substring(0, userSelectedLine.indexOf(":"));
317 
318  return Long.decode(hexForUserSelectedLine) + userInput;
319  } catch (BadLocationException | StringIndexOutOfBoundsException | NumberFormatException ex) {
320  // thrown in case the caret location is out of the range of the outputViewPane.
321  return -1L;
322  }
323  }
324 
325  private void goToOffsetTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_goToOffsetTextFieldActionPerformed
326  long offset;
327  try {
328  if (goToOffsetTextField.getText().startsWith("+") || goToOffsetTextField.getText().startsWith("-")) {
329  offset = getOffsetRelativeToCaretPosition(Long.decode(goToOffsetTextField.getText()));
330  } else {
331  offset = Long.decode(goToOffsetTextField.getText());
332  }
333  } catch (NumberFormatException ex) {
334  // notify the user and return
335  JOptionPane.showMessageDialog(this, NbBundle.getMessage(this.getClass(), "DataContentViewerHex.goToOffsetTextField.msgDlg", goToOffsetTextField.getText()));
336  return;
337  }
338 
339  if (offset >= 0) {
340  setDataViewByOffset(offset);
341  } else {
342  outputViewPane.setText(NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.setDataView.invalidOffset.negativeOffsetValue"));
343  }
344  }//GEN-LAST:event_goToOffsetTextFieldActionPerformed
345 
346  // Variables declaration - do not modify//GEN-BEGIN:variables
347  private javax.swing.JMenuItem copyMenuItem;
348  private javax.swing.JLabel currentPageLabel;
349  private javax.swing.JLabel goToOffsetLabel;
350  private javax.swing.JTextField goToOffsetTextField;
351  private javax.swing.JLabel goToPageLabel;
352  private javax.swing.JTextField goToPageTextField;
353  private javax.swing.JPanel hexViewerPanel;
354  private javax.swing.JScrollPane jScrollPane1;
355  private javax.swing.JButton nextPageButton;
356  private javax.swing.JLabel ofLabel;
357  private javax.swing.JTextPane outputViewPane;
358  private javax.swing.JLabel pageLabel;
359  private javax.swing.JLabel pageLabel2;
360  private javax.swing.JButton prevPageButton;
361  private javax.swing.JPopupMenu rightClickMenu;
362  private javax.swing.JMenuItem selectAllMenuItem;
363  private javax.swing.JLabel totalPageLabel;
364  // End of variables declaration//GEN-END:variables
365 
371  private void setDataViewByPageNumber(int page) {
372  if (this.dataSource == null) {
373  return;
374  }
375  if (page == 0) {
376  return;
377  }
378  currentPage = page;
379  long offset = (currentPage - 1) * pageLength;
380  setDataView(offset);
381  goToOffsetTextField.setText(Long.toString(offset));
382  }
383 
389  private void setDataViewByOffset(long offset) {
390  if (this.dataSource == null) {
391  return;
392  }
393  currentPage = (int) (offset / pageLength) + 1;
394  setDataView(offset);
395  goToPageTextField.setText(Integer.toString(currentPage));
396  }
397 
398  private void setDataView(long offset) {
399  // change the cursor to "waiting cursor" for this operation
400  this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
401 
402  String errorText = null;
403 
404  int bytesRead = 0;
405  if (dataSource.getSize() > 0) {
406  try {
407  bytesRead = dataSource.read(data, offset, pageLength); // read the data
408  } catch (TskException ex) {
409  errorText = NbBundle.getMessage(this.getClass(), "DataContentViewerHex.setDataView.errorText", offset,
410  offset + pageLength);
411  logger.log(Level.WARNING, "Error while trying to show the hex content.", ex); //NON-NLS
412  }
413  }
414 
415  // set the data on the bottom and show it
416  if (bytesRead <= 0) {
417  errorText = NbBundle.getMessage(this.getClass(), "DataContentViewerHex.setDataView.errorText", offset,
418  offset + pageLength);
419  }
420 
421  // disable or enable the next button
422  if ((errorText == null) && (currentPage < totalPages)) {
423  nextPageButton.setEnabled(true);
424  } else {
425  nextPageButton.setEnabled(false);
426  }
427 
428  if ((errorText == null) && (currentPage > 1)) {
429  prevPageButton.setEnabled(true);
430  } else {
431  prevPageButton.setEnabled(false);
432  }
433 
434  currentPageLabel.setText(Integer.toString(currentPage));
435  setComponentsVisibility(true); // shows the components that not needed
436 
437  // set the output view
438  if (errorText == null) {
439  int showLength = bytesRead < pageLength ? bytesRead : (int) pageLength;
440  outputViewPane.setText(DataConversion.byteArrayToHex(data, showLength, offset));
441  } else {
442  outputViewPane.setText(errorText);
443  }
444 
445  outputViewPane.setCaretPosition(0);
446  this.setCursor(null);
447  }
448 
449  @Override
450  public void setNode(Node selectedNode) {
451  if ((selectedNode == null) || (!isSupported(selectedNode))) {
452  resetComponent();
453  return;
454  }
455 
456  Content content = (selectedNode).getLookup().lookup(Content.class);
457  if (content == null) {
458  resetComponent();
459  return;
460  }
461 
462  dataSource = content;
463  totalPages = 0;
464  if (dataSource.getSize() > 0) {
465  totalPages = Math.round((dataSource.getSize() - 1) / pageLength) + 1;
466  }
467  totalPageLabel.setText(Integer.toString(totalPages));
468 
469  this.setDataViewByPageNumber(1);
470  }
471 
472  @Override
473  public String getTitle() {
474  return NbBundle.getMessage(this.getClass(), "DataContentViewerHex.title");
475  }
476 
477  @Override
478  public String getToolTip() {
479  return NbBundle.getMessage(this.getClass(), "DataContentViewerHex.toolTip");
480  }
481 
482  @Override
483  public DataContentViewer createInstance() {
484  return new DataContentViewerHex();
485  }
486 
487  @Override
488  public void resetComponent() {
489  // clear / reset the fields
490  currentPage = 1;
491  this.dataSource = null;
492  currentPageLabel.setText("");
493  totalPageLabel.setText("");
494  outputViewPane.setText("");
495  setComponentsVisibility(false); // hides the components that not needed
496  }
497 
503  private void setComponentsVisibility(boolean isVisible) {
504  currentPageLabel.setVisible(isVisible);
505  totalPageLabel.setVisible(isVisible);
506  ofLabel.setVisible(isVisible);
507  prevPageButton.setVisible(isVisible);
508  nextPageButton.setVisible(isVisible);
509  pageLabel.setVisible(isVisible);
510  pageLabel2.setVisible(isVisible);
511  goToPageTextField.setVisible(isVisible);
512  goToPageLabel.setVisible(isVisible);
513  goToOffsetTextField.setVisible(isVisible);
514  goToOffsetLabel.setVisible(isVisible);
515  }
516 
517  @Override
518  public boolean isSupported(Node node) {
519  if (node == null) {
520  return false;
521  }
522  Content content = node.getLookup().lookup(Content.class);
523  if (content != null && content.getSize() > 0) {
524  return true;
525  }
526 
527  return false;
528  }
529 
530  @Override
531  public int isPreferred(Node node) {
532  return 1;
533  }
534 
535  @Override
536  public Component getComponent() {
537  return this;
538  }
539 
540  /*
541  * Show the right click menu only if evt is the correct mouse event
542  */
543  private void maybeShowPopup(java.awt.event.MouseEvent evt) {
544  if (evt.isPopupTrigger()) {
545  rightClickMenu.setLocation(evt.getLocationOnScreen());
546  rightClickMenu.setVisible(true);
547  copyMenuItem.setEnabled(outputViewPane.getSelectedText() != null);
548  } else {
549  rightClickMenu.setVisible(false);
550  }
551  }
552 }
void goToOffsetTextFieldActionPerformed(java.awt.event.ActionEvent evt)
void goToPageTextFieldActionPerformed(java.awt.event.ActionEvent evt)
static String byteArrayToHex(byte[] array, int length, long arrayOffset, Font font)
synchronized static Logger getLogger(String name)
Definition: Logger.java:161
void prevPageButtonActionPerformed(java.awt.event.ActionEvent evt)
void nextPageButtonActionPerformed(java.awt.event.ActionEvent evt)

Copyright © 2012-2016 Basis Technology. Generated on: Fri Sep 29 2017
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.