19 package org.sleuthkit.autopsy.corecomponents;
22 import java.awt.event.ActionEvent;
23 import java.awt.event.ActionListener;
24 import java.util.List;
25 import java.util.logging.Level;
27 import org.openide.util.NbBundle;
29 import javax.swing.JMenuItem;
30 import javax.swing.JOptionPane;
31 import javax.swing.JTextPane;
32 import org.openide.nodes.Node;
33 import org.openide.util.Lookup;
34 import org.openide.util.lookup.ServiceProvider;
46 @ServiceProvider(service = DataContentViewer.class, position = 2)
49 private static long currentOffset = 0;
50 private static final long pageLength = 16384;
51 private final byte[] data =
new byte[(int) pageLength];
52 private static int currentPage = 1;
63 customizeComponents();
64 this.resetComponent();
65 logger.log(Level.INFO,
"Created StringView instance: " +
this);
69 outputViewPane.setComponentPopupMenu(rightClickMenu);
70 ActionListener actList =
new ActionListener() {
72 public void actionPerformed(ActionEvent e) {
73 JMenuItem jmi = (JMenuItem) e.getSource();
74 if (jmi.equals(copyMenuItem)) {
75 outputViewPane.copy();
76 }
else if (jmi.equals(selectAllMenuItem)) {
77 outputViewPane.selectAll();
81 copyMenuItem.addActionListener(actList);
82 selectAllMenuItem.addActionListener(actList);
85 for (
SCRIPT s : supportedScripts) {
86 languageCombo.addItem(s);
96 @SuppressWarnings(
"unchecked")
98 private
void initComponents() {
100 rightClickMenu =
new javax.swing.JPopupMenu();
101 copyMenuItem =
new javax.swing.JMenuItem();
102 selectAllMenuItem =
new javax.swing.JMenuItem();
103 jScrollPane1 =
new javax.swing.JScrollPane();
104 outputViewPane =
new javax.swing.JTextPane();
105 jScrollPane2 =
new javax.swing.JScrollPane();
106 jPanel2 =
new javax.swing.JPanel();
107 totalPageLabel =
new javax.swing.JLabel();
108 ofLabel =
new javax.swing.JLabel();
109 currentPageLabel =
new javax.swing.JLabel();
110 pageLabel =
new javax.swing.JLabel();
111 nextPageButton =
new javax.swing.JButton();
112 pageLabel2 =
new javax.swing.JLabel();
113 prevPageButton =
new javax.swing.JButton();
114 goToPageLabel =
new javax.swing.JLabel();
115 goToPageTextField =
new javax.swing.JTextField();
116 languageCombo =
new javax.swing.JComboBox<>();
117 languageLabel =
new javax.swing.JLabel();
119 copyMenuItem.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.copyMenuItem.text"));
120 rightClickMenu.add(copyMenuItem);
122 selectAllMenuItem.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.selectAllMenuItem.text"));
123 rightClickMenu.add(selectAllMenuItem);
125 setMinimumSize(
new java.awt.Dimension(5, 5));
126 setPreferredSize(
new java.awt.Dimension(100, 144));
128 jScrollPane1.setPreferredSize(
new java.awt.Dimension(640, 402));
130 outputViewPane.setEditable(
false);
131 outputViewPane.setFont(
new java.awt.Font(
"Courier New", 0, 11));
132 outputViewPane.setPreferredSize(
new java.awt.Dimension(638, 400));
133 jScrollPane1.setViewportView(outputViewPane);
135 jScrollPane2.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
136 jScrollPane2.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
138 totalPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.totalPageLabel.text_1"));
140 ofLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.ofLabel.text_1"));
142 currentPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.currentPageLabel.text_1"));
143 currentPageLabel.setMaximumSize(
new java.awt.Dimension(18, 14));
144 currentPageLabel.setPreferredSize(
new java.awt.Dimension(18, 14));
146 pageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.pageLabel.text_1"));
147 pageLabel.setMaximumSize(
new java.awt.Dimension(33, 14));
148 pageLabel.setMinimumSize(
new java.awt.Dimension(33, 14));
150 nextPageButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png")));
151 nextPageButton.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.nextPageButton.text"));
152 nextPageButton.setBorderPainted(
false);
153 nextPageButton.setContentAreaFilled(
false);
154 nextPageButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_forward_disabled.png")));
155 nextPageButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
156 nextPageButton.setPreferredSize(
new java.awt.Dimension(55, 23));
157 nextPageButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_forward_hover.png")));
158 nextPageButton.addActionListener(
new java.awt.event.ActionListener() {
159 public void actionPerformed(java.awt.event.ActionEvent evt) {
160 nextPageButtonActionPerformed(evt);
164 pageLabel2.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.pageLabel2.text"));
165 pageLabel2.setMaximumSize(
new java.awt.Dimension(29, 14));
166 pageLabel2.setMinimumSize(
new java.awt.Dimension(29, 14));
168 prevPageButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back.png")));
169 prevPageButton.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.prevPageButton.text"));
170 prevPageButton.setBorderPainted(
false);
171 prevPageButton.setContentAreaFilled(
false);
172 prevPageButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png")));
173 prevPageButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
174 prevPageButton.setPreferredSize(
new java.awt.Dimension(55, 23));
175 prevPageButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back_hover.png")));
176 prevPageButton.addActionListener(
new java.awt.event.ActionListener() {
177 public void actionPerformed(java.awt.event.ActionEvent evt) {
178 prevPageButtonActionPerformed(evt);
182 goToPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.goToPageLabel.text"));
184 goToPageTextField.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.goToPageTextField.text"));
185 goToPageTextField.addActionListener(
new java.awt.event.ActionListener() {
186 public void actionPerformed(java.awt.event.ActionEvent evt) {
187 goToPageTextFieldActionPerformed(evt);
191 languageCombo.setToolTipText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.languageCombo.toolTipText"));
192 languageCombo.addActionListener(
new java.awt.event.ActionListener() {
193 public void actionPerformed(java.awt.event.ActionEvent evt) {
194 languageComboActionPerformed(evt);
198 languageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.languageLabel.text"));
199 languageLabel.setToolTipText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.languageLabel.toolTipText"));
201 javax.swing.GroupLayout jPanel2Layout =
new javax.swing.GroupLayout(jPanel2);
202 jPanel2.setLayout(jPanel2Layout);
203 jPanel2Layout.setHorizontalGroup(
204 jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
205 .addGroup(jPanel2Layout.createSequentialGroup()
207 .addComponent(pageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
209 .addComponent(currentPageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
210 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
211 .addComponent(ofLabel)
212 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
213 .addComponent(totalPageLabel)
215 .addComponent(pageLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
216 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
217 .addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
219 .addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
221 .addComponent(goToPageLabel)
222 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
223 .addComponent(goToPageTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
225 .addComponent(languageLabel)
226 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
227 .addComponent(languageCombo, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE)
228 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
230 jPanel2Layout.setVerticalGroup(
231 jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
232 .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
233 .addComponent(pageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
234 .addComponent(currentPageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
235 .addComponent(ofLabel)
236 .addComponent(totalPageLabel))
237 .addComponent(pageLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
238 .addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
239 .addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
240 .addComponent(goToPageLabel)
241 .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
242 .addComponent(goToPageTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
243 .addComponent(languageCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
244 .addComponent(languageLabel))
247 jScrollPane2.setViewportView(jPanel2);
249 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
250 this.setLayout(layout);
251 layout.setHorizontalGroup(
252 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
253 .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
254 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE)
256 layout.setVerticalGroup(
257 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
258 .addGroup(layout.createSequentialGroup()
259 .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
260 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
261 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 25, Short.MAX_VALUE))
267 currentOffset -= pageLength;
268 currentPage = currentPage - 1;
269 currentPageLabel.setText(Integer.toString(currentPage));
270 setDataView(dataSource, currentOffset);
275 currentOffset += pageLength;
276 currentPage = currentPage + 1;
277 currentPageLabel.setText(Integer.toString(currentPage));
278 setDataView(dataSource, currentOffset);
282 String pageNumberStr = goToPageTextField.getText();
284 int maxPage = Math.round((dataSource.getSize() - 1) / pageLength) + 1;
286 pageNumber = Integer.parseInt(pageNumberStr);
287 }
catch (NumberFormatException ex) {
288 pageNumber = maxPage + 1;
290 if (pageNumber > maxPage || pageNumber < 1) {
291 JOptionPane.showMessageDialog(
this,
292 NbBundle.getMessage(
this.getClass(),
293 "DataContentViewerString.goToPageTextField.msgDlg",
295 NbBundle.getMessage(
this.getClass(),
296 "DataContentViewerString.goToPageTextField.err"),
297 JOptionPane.WARNING_MESSAGE);
300 currentOffset = (pageNumber - 1) * pageLength;
301 currentPage = pageNumber;
302 currentPageLabel.setText(Integer.toString(currentPage));
303 setDataView(dataSource, currentOffset);
308 if (dataSource != null) {
309 setDataView(dataSource, currentOffset);
341 if (dataSource == null) {
346 this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
348 this.dataSource = dataSource;
353 if (dataSource.getSize() > 0) {
355 bytesRead = dataSource.read(data, offset, pageLength);
356 }
catch (TskException ex) {
357 text = NbBundle.getMessage(this.getClass(),
358 "DataContentViewerString.setDataView.errorText", currentOffset,
359 currentOffset + pageLength);
360 logger.log(Level.WARNING,
"Error while trying to show the String content.", ex);
366 final SCRIPT selScript = (
SCRIPT) languageCombo.getSelectedItem();
370 if (text.trim().isEmpty()) {
371 text = NbBundle.getMessage(this.getClass(),
372 "DataContentViewerString.setDataView.errorNoText", currentOffset,
373 currentOffset + pageLength);
376 text = NbBundle.getMessage(this.getClass(),
"DataContentViewerString.setDataView.errorText", currentOffset,
377 currentOffset + pageLength);
381 if (offset + pageLength < dataSource.getSize()) {
382 nextPageButton.setEnabled(
true);
384 nextPageButton.setEnabled(
false);
388 prevPageButton.setEnabled(
false);
391 prevPageButton.setEnabled(
true);
394 int totalPage = Math.round((dataSource.getSize() - 1) / pageLength) + 1;
395 totalPageLabel.setText(Integer.toString(totalPage));
396 currentPageLabel.setText(Integer.toString(currentPage));
397 outputViewPane.setText(text);
398 setComponentsVisibility(
true);
399 outputViewPane.moveCaretPosition(0);
401 this.setCursor(null);
405 this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
407 this.dataSource = null;
412 nextPageButton.setEnabled(
false);
414 prevPageButton.setEnabled(
false);
418 totalPageLabel.setText(Integer.toString(totalPage));
419 currentPageLabel.setText(Integer.toString(currentPage));
420 outputViewPane.setText(text);
421 setComponentsVisibility(
true);
422 outputViewPane.moveCaretPosition(0);
424 this.setCursor(null);
434 currentPageLabel.setVisible(isVisible);
435 totalPageLabel.setVisible(isVisible);
436 ofLabel.setVisible(isVisible);
437 prevPageButton.setVisible(isVisible);
438 nextPageButton.setVisible(isVisible);
439 pageLabel.setVisible(isVisible);
440 pageLabel2.setVisible(isVisible);
441 goToPageTextField.setVisible(isVisible);
442 goToPageLabel.setVisible(isVisible);
443 languageCombo.setVisible(isVisible);
444 languageLabel.setVisible(isVisible);
449 if ((selectedNode == null) || (!isSupported(selectedNode))) {
454 Content content = DataContentViewerUtility.getDefaultContent(selectedNode);
455 if (content != null) {
456 this.setDataView(content, 0);
460 if (scontent != null) {
461 this.setDataView(scontent);
470 return NbBundle.getMessage(this.getClass(),
"DataContentViewerString.title");
475 return NbBundle.getMessage(this.getClass(),
"DataContentViewerString.toolTip");
488 this.dataSource = null;
489 currentPageLabel.setText(
"");
490 totalPageLabel.setText(
"");
491 prevPageButton.setEnabled(
false);
492 nextPageButton.setEnabled(
false);
493 outputViewPane.setText(
"");
494 setComponentsVisibility(
false);
502 Content content = node.getLookup().lookup(Content.class);
503 if (content != null && content.getSize() > 0) {
525 if (evt.isPopupTrigger()) {
526 rightClickMenu.setLocation(evt.getLocationOnScreen());
527 rightClickMenu.setVisible(
true);
528 copyMenuItem.setEnabled(outputViewPane.getSelectedText() != null);
530 rightClickMenu.setVisible(
false);
void maybeShowPopup(java.awt.event.MouseEvent evt)
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()