19 package org.sleuthkit.autopsy.corecomponents;
22 import java.awt.event.ActionEvent;
23 import java.awt.event.ActionListener;
24 import java.util.logging.Level;
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;
41 @ServiceProvider(service = DataContentViewer.class, position = 1)
43 private static final long pageLength = 16384;
44 private final byte[] data =
new byte[(int) pageLength];
45 private static int currentPage = 1;
56 customizeComponents();
57 this.resetComponent();
58 logger.log(Level.INFO,
"Created HexView instance: " +
this);
62 outputViewPane.setComponentPopupMenu(rightClickMenu);
63 ActionListener actList =
new ActionListener() {
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();
74 copyMenuItem.addActionListener(actList);
75 selectAllMenuItem.addActionListener(actList);
83 @SuppressWarnings(
"unchecked")
85 private
void initComponents() {
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);
96 this.outputViewPane.setBackground(
new java.awt.Color(255, 255, 255));
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();
107 copyMenuItem.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerHex.class,
"DataContentViewerHex.copyMenuItem.text"));
108 rightClickMenu.add(copyMenuItem);
110 selectAllMenuItem.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerHex.class,
"DataContentViewerHex.selectAllMenuItem.text"));
111 rightClickMenu.add(selectAllMenuItem);
113 jScrollPane1.setBackground(
new java.awt.Color(255, 255, 255));
115 outputViewPane.setEditable(
false);
116 outputViewPane.setFont(
new Font(
"Courier New", Font.PLAIN, 11));
117 outputViewPane.setMinimumSize(
new java.awt.Dimension(700, 20));
118 outputViewPane.setPreferredSize(
new java.awt.Dimension(700, 400));
119 jScrollPane1.setViewportView(outputViewPane);
121 totalPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerHex.class,
"DataContentViewerHex.totalPageLabel.text_1"));
123 ofLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerHex.class,
"DataContentViewerHex.ofLabel.text_1"));
125 currentPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerHex.class,
"DataContentViewerHex.currentPageLabel.text_1"));
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));
130 pageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerHex.class,
"DataContentViewerHex.pageLabel.text_1"));
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));
135 prevPageButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back.png")));
136 prevPageButton.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerHex.class,
"DataContentViewerHex.prevPageButton.text"));
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")));
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")));
143 prevPageButton.addActionListener(
new java.awt.event.ActionListener() {
144 public void actionPerformed(java.awt.event.ActionEvent evt) {
145 prevPageButtonActionPerformed(evt);
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(
DataContentViewerHex.class,
"DataContentViewerHex.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(23, 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(
DataContentViewerHex.class,
"DataContentViewerHex.pageLabel2.text"));
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));
168 goToPageTextField.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerHex.class,
"DataContentViewerHex.goToPageTextField.text"));
169 goToPageTextField.addActionListener(
new java.awt.event.ActionListener() {
170 public void actionPerformed(java.awt.event.ActionEvent evt) {
171 goToPageTextFieldActionPerformed(evt);
175 goToPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerHex.class,
"DataContentViewerHex.goToPageLabel.text"));
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()
183 .addComponent(pageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
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)
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)
195 .addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
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)
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))
218 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 388, Short.MAX_VALUE))
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()
229 .addComponent(hexViewerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
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()
238 .addComponent(hexViewerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
244 setDataView(currentPage - 1);
248 setDataView(currentPage + 1);
252 String pageNumberStr = goToPageTextField.getText();
256 pageNumber = Integer.parseInt(pageNumberStr);
257 }
catch (NumberFormatException ex) {
258 pageNumber = totalPages + 1;
260 if (pageNumber > totalPages || pageNumber < 1) {
261 JOptionPane.showMessageDialog(
this,
262 NbBundle.getMessage(
this.getClass(),
263 "DataContentViewerHex.goToPageTextField.msgDlg",
265 NbBundle.getMessage(
this.getClass(),
266 "DataContentViewerHex.goToPageTextField.err"),
267 JOptionPane.WARNING_MESSAGE);
270 setDataView(pageNumber);
297 if (this.dataSource == null) {
306 long offset = (currentPage - 1) * pageLength;
309 this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
311 String errorText = null;
314 if (dataSource.
getSize() > 0) {
316 bytesRead = dataSource.
read(data, offset, pageLength);
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);
325 if (bytesRead <= 0) {
326 errorText = NbBundle.getMessage(this.getClass(),
"DataContentViewerHex.setDataView.errorText", offset,
327 offset + pageLength);
332 if ((errorText == null) && (currentPage < totalPages)) {
333 nextPageButton.setEnabled(
true);
336 nextPageButton.setEnabled(
false);
339 if ((errorText == null) && (currentPage > 1)) {
340 prevPageButton.setEnabled(
true);
343 prevPageButton.setEnabled(
false);
346 currentPageLabel.setText(Integer.toString(currentPage));
347 setComponentsVisibility(
true);
350 if (errorText == null) {
351 int showLength = bytesRead < pageLength ? bytesRead : (int) pageLength;
355 outputViewPane.setText(errorText);
358 outputViewPane.setCaretPosition(0);
359 this.setCursor(null);
364 if ((selectedNode == null) || (!isSupported(selectedNode))) {
369 Content content = (selectedNode).getLookup().lookup(
Content.class);
370 if (content == null) {
375 dataSource = content;
377 if (dataSource.
getSize() > 0) {
378 totalPages = Math.round((dataSource.
getSize() - 1) / pageLength) + 1;
380 totalPageLabel.setText(Integer.toString(totalPages));
387 return NbBundle.getMessage(this.getClass(),
"DataContentViewerHex.title");
392 return NbBundle.getMessage(this.getClass(),
"DataContentViewerHex.toolTip");
404 this.dataSource = null;
405 currentPageLabel.setText(
"");
406 totalPageLabel.setText(
"");
407 outputViewPane.setText(
"");
408 setComponentsVisibility(
false);
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);
434 if (content != null && content.
getSize() > 0) {
453 if (evt.isPopupTrigger()) {
454 rightClickMenu.setLocation(evt.getLocationOnScreen());
455 rightClickMenu.setVisible(
true);
456 copyMenuItem.setEnabled(outputViewPane.getSelectedText() != null);
458 rightClickMenu.setVisible(
false);
void setNode(Node selectedNode)
javax.swing.JLabel currentPageLabel
javax.swing.JPopupMenu rightClickMenu
void setComponentsVisibility(boolean isVisible)
javax.swing.JButton prevPageButton
int isPreferred(Node node)
javax.swing.JScrollPane jScrollPane1
javax.swing.JLabel goToPageLabel
void maybeShowPopup(java.awt.event.MouseEvent evt)
javax.swing.JTextField goToPageTextField
boolean isSupported(Node node)
int read(byte[] buf, long offset, long len)
javax.swing.JMenuItem copyMenuItem
void setDataView(int page)
void goToPageTextFieldActionPerformed(java.awt.event.ActionEvent evt)
static String byteArrayToHex(byte[] array, int length, long arrayOffset, Font font)
javax.swing.JPanel hexViewerPanel
javax.swing.JButton nextPageButton
javax.swing.JMenuItem selectAllMenuItem
javax.swing.JTextPane outputViewPane
javax.swing.JLabel ofLabel
void prevPageButtonActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JLabel totalPageLabel
javax.swing.JLabel pageLabel2
javax.swing.JLabel pageLabel
void nextPageButtonActionPerformed(java.awt.event.ActionEvent evt)
DataContentViewer createInstance()
static Logger getLogger(String name)
void customizeComponents()