19 package org.sleuthkit.autopsy.corecomponents;
21 import java.awt.Component;
22 import java.awt.Cursor;
23 import java.awt.event.ActionEvent;
24 import java.awt.event.ActionListener;
25 import java.util.List;
26 import java.util.logging.Level;
27 import org.openide.util.NbBundle;
29 import javax.swing.JMenuItem;
30 import javax.swing.JOptionPane;
31 import org.openide.nodes.Node;
32 import org.openide.util.lookup.ServiceProvider;
44 @ServiceProvider(service = DataContentViewer.class, position = 2)
45 @SuppressWarnings(
"PMD.SingularField")
48 private static long currentOffset = 0;
49 private static final long PAGE_LENGTH = 16384;
50 private final byte[] data =
new byte[(int) PAGE_LENGTH];
51 private static int currentPage = 1;
62 customizeComponents();
63 this.resetComponent();
64 logger.log(Level.INFO,
"Created StringView instance: {0}",
this);
68 outputViewPane.setComponentPopupMenu(rightClickMenu);
69 ActionListener actList =
new ActionListener() {
71 public void actionPerformed(ActionEvent e) {
72 JMenuItem jmi = (JMenuItem) e.getSource();
73 if (jmi.equals(copyMenuItem)) {
74 outputViewPane.copy();
75 }
else if (jmi.equals(selectAllMenuItem)) {
76 outputViewPane.selectAll();
80 copyMenuItem.addActionListener(actList);
81 selectAllMenuItem.addActionListener(actList);
84 for (
SCRIPT s : supportedScripts) {
85 languageCombo.addItem(s);
95 @SuppressWarnings(
"unchecked")
97 private
void initComponents() {
99 rightClickMenu =
new javax.swing.JPopupMenu();
100 copyMenuItem =
new javax.swing.JMenuItem();
101 selectAllMenuItem =
new javax.swing.JMenuItem();
102 jScrollPane1 =
new javax.swing.JScrollPane();
103 outputViewPane =
new javax.swing.JTextPane();
104 jScrollPane2 =
new javax.swing.JScrollPane();
105 jPanel2 =
new javax.swing.JPanel();
106 totalPageLabel =
new javax.swing.JLabel();
107 ofLabel =
new javax.swing.JLabel();
108 currentPageLabel =
new javax.swing.JLabel();
109 pageLabel =
new javax.swing.JLabel();
110 nextPageButton =
new javax.swing.JButton();
111 pageLabel2 =
new javax.swing.JLabel();
112 prevPageButton =
new javax.swing.JButton();
113 goToPageLabel =
new javax.swing.JLabel();
114 goToPageTextField =
new javax.swing.JTextField();
115 languageCombo =
new javax.swing.JComboBox<>();
116 languageLabel =
new javax.swing.JLabel();
118 copyMenuItem.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.copyMenuItem.text"));
119 rightClickMenu.add(copyMenuItem);
121 selectAllMenuItem.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.selectAllMenuItem.text"));
122 rightClickMenu.add(selectAllMenuItem);
124 setMinimumSize(
new java.awt.Dimension(5, 5));
125 setPreferredSize(
new java.awt.Dimension(100, 144));
127 jScrollPane1.setPreferredSize(
new java.awt.Dimension(640, 402));
129 outputViewPane.setEditable(
false);
130 outputViewPane.setFont(
new java.awt.Font(
"Courier New", 0, 11));
131 outputViewPane.setPreferredSize(
new java.awt.Dimension(638, 400));
132 jScrollPane1.setViewportView(outputViewPane);
134 jScrollPane2.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
135 jScrollPane2.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
137 totalPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.totalPageLabel.text_1"));
139 ofLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.ofLabel.text_1"));
141 currentPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.currentPageLabel.text_1"));
142 currentPageLabel.setMaximumSize(
new java.awt.Dimension(18, 14));
143 currentPageLabel.setPreferredSize(
new java.awt.Dimension(18, 14));
145 pageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.pageLabel.text_1"));
146 pageLabel.setMaximumSize(
new java.awt.Dimension(33, 14));
147 pageLabel.setMinimumSize(
new java.awt.Dimension(33, 14));
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(
DataContentViewerString.class,
"DataContentViewerString.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(55, 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(
DataContentViewerString.class,
"DataContentViewerString.pageLabel2.text"));
164 pageLabel2.setMaximumSize(
new java.awt.Dimension(29, 14));
165 pageLabel2.setMinimumSize(
new java.awt.Dimension(29, 14));
167 prevPageButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back.png")));
168 prevPageButton.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.prevPageButton.text"));
169 prevPageButton.setBorderPainted(
false);
170 prevPageButton.setContentAreaFilled(
false);
171 prevPageButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png")));
172 prevPageButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
173 prevPageButton.setPreferredSize(
new java.awt.Dimension(55, 23));
174 prevPageButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back_hover.png")));
175 prevPageButton.addActionListener(
new java.awt.event.ActionListener() {
176 public void actionPerformed(java.awt.event.ActionEvent evt) {
177 prevPageButtonActionPerformed(evt);
181 goToPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.goToPageLabel.text"));
183 goToPageTextField.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.goToPageTextField.text"));
184 goToPageTextField.addActionListener(
new java.awt.event.ActionListener() {
185 public void actionPerformed(java.awt.event.ActionEvent evt) {
186 goToPageTextFieldActionPerformed(evt);
190 languageCombo.setToolTipText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.languageCombo.toolTipText"));
191 languageCombo.addActionListener(
new java.awt.event.ActionListener() {
192 public void actionPerformed(java.awt.event.ActionEvent evt) {
193 languageComboActionPerformed(evt);
197 languageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.languageLabel.text"));
198 languageLabel.setToolTipText(
org.openide.util.NbBundle.getMessage(
DataContentViewerString.class,
"DataContentViewerString.languageLabel.toolTipText"));
200 javax.swing.GroupLayout jPanel2Layout =
new javax.swing.GroupLayout(jPanel2);
201 jPanel2.setLayout(jPanel2Layout);
202 jPanel2Layout.setHorizontalGroup(
203 jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
204 .addGroup(jPanel2Layout.createSequentialGroup()
206 .addComponent(pageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
208 .addComponent(currentPageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
209 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
210 .addComponent(ofLabel)
211 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
212 .addComponent(totalPageLabel)
214 .addComponent(pageLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
215 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
216 .addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
218 .addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
220 .addComponent(goToPageLabel)
221 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
222 .addComponent(goToPageTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
224 .addComponent(languageLabel)
225 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
226 .addComponent(languageCombo, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE)
227 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
229 jPanel2Layout.setVerticalGroup(
230 jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
231 .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
232 .addComponent(pageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
233 .addComponent(currentPageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
234 .addComponent(ofLabel)
235 .addComponent(totalPageLabel))
236 .addComponent(pageLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
237 .addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
238 .addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
239 .addComponent(goToPageLabel)
240 .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
241 .addComponent(goToPageTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
242 .addComponent(languageCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
243 .addComponent(languageLabel))
246 jScrollPane2.setViewportView(jPanel2);
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(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
253 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE)
255 layout.setVerticalGroup(
256 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
257 .addGroup(layout.createSequentialGroup()
258 .addComponent(jScrollPane2, 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, 25, Short.MAX_VALUE))
266 currentOffset -= PAGE_LENGTH;
268 currentPageLabel.setText(Integer.toString(currentPage));
269 setDataView(dataSource, currentOffset);
274 currentOffset += PAGE_LENGTH;
276 currentPageLabel.setText(Integer.toString(currentPage));
277 setDataView(dataSource, currentOffset);
281 String pageNumberStr = goToPageTextField.getText();
283 int maxPage = Math.round((dataSource.getSize() - 1) / PAGE_LENGTH) + 1;
285 pageNumber = Integer.parseInt(pageNumberStr);
286 }
catch (NumberFormatException ex) {
287 pageNumber = maxPage + 1;
289 if (pageNumber > maxPage || pageNumber < 1) {
290 JOptionPane.showMessageDialog(
this,
291 NbBundle.getMessage(
this.getClass(),
292 "DataContentViewerString.goToPageTextField.msgDlg",
294 NbBundle.getMessage(
this.getClass(),
295 "DataContentViewerString.goToPageTextField.err"),
296 JOptionPane.WARNING_MESSAGE);
299 currentOffset = (pageNumber - 1) * PAGE_LENGTH;
300 currentPage = pageNumber;
301 currentPageLabel.setText(Integer.toString(currentPage));
302 setDataView(dataSource, currentOffset);
307 if (dataSource != null) {
308 setDataView(dataSource, currentOffset);
340 if (dataSource == null) {
345 this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
347 this.dataSource = dataSource;
352 if (dataSource.getSize() > 0) {
354 bytesRead = dataSource.read(data, offset, PAGE_LENGTH);
355 }
catch (TskCoreException ex) {
356 logger.log(Level.WARNING,
"Error while trying to show the String content.", ex);
362 final SCRIPT selScript = (
SCRIPT) languageCombo.getSelectedItem();
366 if (text.trim().isEmpty()) {
367 text = NbBundle.getMessage(this.getClass(),
368 "DataContentViewerString.setDataView.errorNoText", currentOffset,
369 currentOffset + PAGE_LENGTH);
372 text = NbBundle.getMessage(this.getClass(),
"DataContentViewerString.setDataView.errorText", currentOffset,
373 currentOffset + PAGE_LENGTH);
377 if (offset + PAGE_LENGTH < dataSource.getSize()) {
378 nextPageButton.setEnabled(
true);
380 nextPageButton.setEnabled(
false);
384 prevPageButton.setEnabled(
false);
387 prevPageButton.setEnabled(
true);
390 int totalPage = Math.round((dataSource.getSize() - 1) / PAGE_LENGTH) + 1;
391 totalPageLabel.setText(Integer.toString(totalPage));
392 currentPageLabel.setText(Integer.toString(currentPage));
393 outputViewPane.setText(text);
394 setComponentsVisibility(
true);
395 outputViewPane.moveCaretPosition(0);
397 this.setCursor(null);
401 this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
403 this.dataSource = null;
408 nextPageButton.setEnabled(
false);
410 prevPageButton.setEnabled(
false);
414 totalPageLabel.setText(Integer.toString(totalPage));
415 currentPageLabel.setText(Integer.toString(currentPage));
416 outputViewPane.setText(text);
417 setComponentsVisibility(
true);
418 outputViewPane.moveCaretPosition(0);
420 this.setCursor(null);
430 currentPageLabel.setVisible(isVisible);
431 totalPageLabel.setVisible(isVisible);
432 ofLabel.setVisible(isVisible);
433 prevPageButton.setVisible(isVisible);
434 nextPageButton.setVisible(isVisible);
435 pageLabel.setVisible(isVisible);
436 pageLabel2.setVisible(isVisible);
437 goToPageTextField.setVisible(isVisible);
438 goToPageLabel.setVisible(isVisible);
439 languageCombo.setVisible(isVisible);
440 languageLabel.setVisible(isVisible);
445 if ((selectedNode == null) || (!isSupported(selectedNode))) {
451 if (content != null) {
452 this.setDataView(content, 0);
456 if (scontent != null) {
457 this.setDataView(scontent);
466 return NbBundle.getMessage(this.getClass(),
"DataContentViewerString.title");
471 return NbBundle.getMessage(this.getClass(),
"DataContentViewerString.toolTip");
484 this.dataSource = null;
485 currentPageLabel.setText(
"");
486 totalPageLabel.setText(
"");
487 prevPageButton.setEnabled(
false);
488 nextPageButton.setEnabled(
false);
489 outputViewPane.setText(
"");
490 setComponentsVisibility(
false);
499 return (content != null && content.getSize() > 0);
static Content getDefaultContent(Node node)
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()