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 jPanel1 =
new javax.swing.JPanel();
104 jScrollPane1 =
new javax.swing.JScrollPane();
105 outputViewPane =
new JTextPane(){
106 public boolean getScrollableTracksViewportWidth() {
107 return (getSize().width < 400);
109 totalPageLabel =
new javax.swing.JLabel();
110 ofLabel =
new javax.swing.JLabel();
111 currentPageLabel =
new javax.swing.JLabel();
112 pageLabel =
new javax.swing.JLabel();
113 nextPageButton =
new javax.swing.JButton();
114 pageLabel2 =
new javax.swing.JLabel();
115 prevPageButton =
new javax.swing.JButton();
116 goToPageLabel =
new javax.swing.JLabel();
117 goToPageTextField =
new javax.swing.JTextField();
118 languageCombo =
new javax.swing.JComboBox<>();
119 languageLabel =
new javax.swing.JLabel();
121 copyMenuItem.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.copyMenuItem.text"));
122 rightClickMenu.add(copyMenuItem);
124 selectAllMenuItem.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.selectAllMenuItem.text"));
125 rightClickMenu.add(selectAllMenuItem);
127 setMinimumSize(
new java.awt.Dimension(5, 5));
129 jPanel1.setPreferredSize(
new java.awt.Dimension(640, 424));
131 jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
132 jScrollPane1.setPreferredSize(
new java.awt.Dimension(640, 402));
134 outputViewPane.setEditable(
false);
135 outputViewPane.setFont(
new java.awt.Font(
"Courier New", 0, 11));
136 outputViewPane.setPreferredSize(
new java.awt.Dimension(638, 400));
137 jScrollPane1.setViewportView(outputViewPane);
139 totalPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.totalPageLabel.text_1"));
141 ofLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.ofLabel.text_1"));
143 currentPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.currentPageLabel.text_1"));
144 currentPageLabel.setMaximumSize(
new java.awt.Dimension(18, 14));
145 currentPageLabel.setMinimumSize(
new java.awt.Dimension(18, 14));
146 currentPageLabel.setPreferredSize(
new java.awt.Dimension(18, 14));
148 pageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.pageLabel.text_1"));
149 pageLabel.setMaximumSize(
new java.awt.Dimension(33, 14));
150 pageLabel.setMinimumSize(
new java.awt.Dimension(33, 14));
151 pageLabel.setPreferredSize(
new java.awt.Dimension(33, 14));
153 nextPageButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png")));
154 nextPageButton.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.nextPageButton.text"));
155 nextPageButton.setBorderPainted(
false);
156 nextPageButton.setContentAreaFilled(
false);
157 nextPageButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_forward_disabled.png")));
158 nextPageButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
159 nextPageButton.setPreferredSize(
new java.awt.Dimension(55, 23));
160 nextPageButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_forward_hover.png")));
161 nextPageButton.addActionListener(
new java.awt.event.ActionListener() {
162 public void actionPerformed(java.awt.event.ActionEvent evt) {
163 nextPageButtonActionPerformed(evt);
167 pageLabel2.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.pageLabel2.text"));
168 pageLabel2.setMaximumSize(
new java.awt.Dimension(29, 14));
169 pageLabel2.setMinimumSize(
new java.awt.Dimension(29, 14));
170 pageLabel2.setPreferredSize(
new java.awt.Dimension(29, 14));
172 prevPageButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back.png")));
173 prevPageButton.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.prevPageButton.text"));
174 prevPageButton.setBorderPainted(
false);
175 prevPageButton.setContentAreaFilled(
false);
176 prevPageButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png")));
177 prevPageButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
178 prevPageButton.setPreferredSize(
new java.awt.Dimension(55, 23));
179 prevPageButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back_hover.png")));
180 prevPageButton.addActionListener(
new java.awt.event.ActionListener() {
181 public void actionPerformed(java.awt.event.ActionEvent evt) {
182 prevPageButtonActionPerformed(evt);
186 goToPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.goToPageLabel.text"));
188 goToPageTextField.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.goToPageTextField.text"));
189 goToPageTextField.addActionListener(
new java.awt.event.ActionListener() {
190 public void actionPerformed(java.awt.event.ActionEvent evt) {
191 goToPageTextFieldActionPerformed(evt);
195 languageCombo.setToolTipText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.languageCombo.toolTipText"));
196 languageCombo.addActionListener(
new java.awt.event.ActionListener() {
197 public void actionPerformed(java.awt.event.ActionEvent evt) {
198 languageComboActionPerformed(evt);
202 languageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.languageLabel.text"));
203 languageLabel.setToolTipText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.languageLabel.toolTipText"));
205 javax.swing.GroupLayout jPanel1Layout =
new javax.swing.GroupLayout(jPanel1);
206 jPanel1.setLayout(jPanel1Layout);
207 jPanel1Layout.setHorizontalGroup(
208 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
209 .addGroup(jPanel1Layout.createSequentialGroup()
211 .addComponent(pageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
213 .addComponent(currentPageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
214 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
215 .addComponent(ofLabel)
216 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
217 .addComponent(totalPageLabel)
219 .addComponent(pageLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
220 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
221 .addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
223 .addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
225 .addComponent(goToPageLabel)
226 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
227 .addComponent(goToPageTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
229 .addComponent(languageLabel)
230 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
231 .addComponent(languageCombo, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE))
232 .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
234 jPanel1Layout.setVerticalGroup(
235 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
236 .addGroup(jPanel1Layout.createSequentialGroup()
237 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
238 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
239 .addComponent(pageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
240 .addComponent(currentPageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
241 .addComponent(ofLabel)
242 .addComponent(totalPageLabel))
243 .addComponent(pageLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
244 .addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
245 .addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
246 .addComponent(goToPageLabel)
247 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
248 .addComponent(goToPageTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
249 .addComponent(languageCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
250 .addComponent(languageLabel)))
251 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
252 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 29, Short.MAX_VALUE))
255 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
256 this.setLayout(layout);
257 layout.setHorizontalGroup(
258 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
259 .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
261 layout.setVerticalGroup(
262 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
263 .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 58, Short.MAX_VALUE)
269 currentOffset -= pageLength;
270 currentPage = currentPage - 1;
271 currentPageLabel.setText(Integer.toString(currentPage));
272 setDataView(dataSource, currentOffset);
277 currentOffset += pageLength;
278 currentPage = currentPage + 1;
279 currentPageLabel.setText(Integer.toString(currentPage));
280 setDataView(dataSource, currentOffset);
284 String pageNumberStr = goToPageTextField.getText();
286 int maxPage = Math.round((dataSource.getSize() - 1) / pageLength) + 1;
288 pageNumber = Integer.parseInt(pageNumberStr);
289 }
catch (NumberFormatException ex) {
290 pageNumber = maxPage + 1;
292 if (pageNumber > maxPage || pageNumber < 1) {
293 JOptionPane.showMessageDialog(
this,
294 NbBundle.getMessage(
this.getClass(),
295 "DataContentViewerString.goToPageTextField.msgDlg",
297 NbBundle.getMessage(
this.getClass(),
298 "DataContentViewerString.goToPageTextField.err"),
299 JOptionPane.WARNING_MESSAGE);
302 currentOffset = (pageNumber - 1) * pageLength;
303 currentPage = pageNumber;
304 currentPageLabel.setText(Integer.toString(currentPage));
305 setDataView(dataSource, currentOffset);
310 if (dataSource != null) {
311 setDataView(dataSource, currentOffset);
342 if (dataSource == null) {
347 this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
349 this.dataSource = dataSource;
354 if (dataSource.getSize() > 0) {
356 bytesRead = dataSource.read(data, offset, pageLength);
357 }
catch (TskException ex) {
358 text = NbBundle.getMessage(this.getClass(),
359 "DataContentViewerString.setDataView.errorText", currentOffset,
360 currentOffset + pageLength);
361 logger.log(Level.WARNING,
"Error while trying to show the String content.", ex);
367 final SCRIPT selScript = (
SCRIPT) languageCombo.getSelectedItem();
371 if (text.trim().isEmpty()) {
372 text = NbBundle.getMessage(this.getClass(),
373 "DataContentViewerString.setDataView.errorNoText", currentOffset,
374 currentOffset + pageLength);
377 text = NbBundle.getMessage(this.getClass(),
"DataContentViewerString.setDataView.errorText", currentOffset,
378 currentOffset + pageLength);
382 if (offset + pageLength < dataSource.getSize()) {
383 nextPageButton.setEnabled(
true);
385 nextPageButton.setEnabled(
false);
389 prevPageButton.setEnabled(
false);
392 prevPageButton.setEnabled(
true);
395 int totalPage = Math.round((dataSource.getSize() - 1) / pageLength) + 1;
396 totalPageLabel.setText(Integer.toString(totalPage));
397 currentPageLabel.setText(Integer.toString(currentPage));
398 outputViewPane.setText(text);
399 setComponentsVisibility(
true);
400 outputViewPane.moveCaretPosition(0);
402 this.setCursor(null);
406 this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
408 this.dataSource = null;
413 nextPageButton.setEnabled(
false);
415 prevPageButton.setEnabled(
false);
419 totalPageLabel.setText(Integer.toString(totalPage));
420 currentPageLabel.setText(Integer.toString(currentPage));
421 outputViewPane.setText(text);
422 setComponentsVisibility(
true);
423 outputViewPane.moveCaretPosition(0);
425 this.setCursor(null);
435 currentPageLabel.setVisible(isVisible);
436 totalPageLabel.setVisible(isVisible);
437 ofLabel.setVisible(isVisible);
438 prevPageButton.setVisible(isVisible);
439 nextPageButton.setVisible(isVisible);
440 pageLabel.setVisible(isVisible);
441 pageLabel2.setVisible(isVisible);
442 goToPageTextField.setVisible(isVisible);
443 goToPageLabel.setVisible(isVisible);
444 languageCombo.setVisible(isVisible);
445 languageLabel.setVisible(isVisible);
450 if ((selectedNode == null) || (!isSupported(selectedNode))) {
455 Content content = DataContentViewerUtility.getDefaultContent(selectedNode);
456 if (content != null) {
457 this.setDataView(content, 0);
461 if (scontent != null) {
462 this.setDataView(scontent);
471 return NbBundle.getMessage(this.getClass(),
"DataContentViewerString.title");
476 return NbBundle.getMessage(this.getClass(),
"DataContentViewerString.toolTip");
489 this.dataSource = null;
490 currentPageLabel.setText(
"");
491 totalPageLabel.setText(
"");
492 prevPageButton.setEnabled(
false);
493 nextPageButton.setEnabled(
false);
494 outputViewPane.setText(
"");
495 setComponentsVisibility(
false);
503 Content content = node.getLookup().lookup(Content.class);
504 if (content != null && content.getSize() > 0) {
526 if (evt.isPopupTrigger()) {
527 rightClickMenu.setLocation(evt.getLocationOnScreen());
528 rightClickMenu.setVisible(
true);
529 copyMenuItem.setEnabled(outputViewPane.getSelectedText() != null);
531 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.JPanel jPanel1
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.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.JPopupMenu rightClickMenu
void customizeComponents()