Autopsy  3.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
ExtractedContentPanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011 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.keywordsearch;
20 
21 import java.awt.ComponentOrientation;
22 import java.awt.EventQueue;
23 import java.awt.event.ActionEvent;
24 import java.awt.event.ActionListener;
25 import java.awt.event.ItemEvent;
26 import java.awt.event.ItemListener;
27 import java.util.ArrayList;
28 import java.util.List;
29 import java.util.concurrent.ExecutionException;
30 import java.util.logging.Level;
31 
32 import org.openide.util.NbBundle;
34 import javax.swing.JMenuItem;
35 import javax.swing.JTextPane;
36 import javax.swing.SizeRequirements;
37 import javax.swing.SwingWorker;
38 import javax.swing.text.Element;
39 import javax.swing.text.View;
40 import javax.swing.text.ViewFactory;
41 import javax.swing.text.html.InlineView;
42 import javax.swing.text.html.ParagraphView;
43 import javax.swing.text.html.HTMLEditorKit;
44 import javax.swing.text.html.HTMLEditorKit.HTMLFactory;
45 import javax.swing.text.html.StyleSheet;
46 import org.netbeans.api.progress.ProgressHandle;
47 import org.netbeans.api.progress.ProgressHandleFactory;
50 
55 class ExtractedContentPanel extends javax.swing.JPanel {
56 
57  private static Logger logger = Logger.getLogger(ExtractedContentPanel.class.getName());
58 
59  ExtractedContentPanel() {
60  initComponents();
61 
62  initControls();
63 
64  customizeComponents();
65 
66  }
67 
68  private void customizeComponents() {
69 
70  HTMLEditorKit editorKit = new HTMLEditorKit() {
71  @Override
72  public ViewFactory getViewFactory() {
73 
74  return new HTMLFactory() {
75  @Override
76  public View create(Element e) {
77  View v = super.create(e);
78  if (v instanceof InlineView) {
79  return new InlineView(e) {
80  @Override
81  public int getBreakWeight(int axis, float pos, float len) {
82  return GoodBreakWeight;
83  }
84 
85  @Override
86  public View breakView(int axis, int p0, float pos, float len) {
87  if (axis == View.X_AXIS) {
88  checkPainter();
89  int p1 = getGlyphPainter().getBoundedPosition(this, p0, pos, len);
90  if (p0 == getStartOffset() && p1 == getEndOffset()) {
91  return this;
92  }
93  return createFragment(p0, p1);
94  }
95  return this;
96  }
97  };
98  } else if (v instanceof ParagraphView) {
99  return new ParagraphView(e) {
100  @Override
101  protected SizeRequirements calculateMinorAxisRequirements(int axis, SizeRequirements r) {
102  if (r == null) {
103  r = new SizeRequirements();
104  }
105  float pref = layoutPool.getPreferredSpan(axis);
106  float min = layoutPool.getMinimumSpan(axis);
107  // Don't include insets, Box.getXXXSpan will include them.
108  r.minimum = (int) min;
109  r.preferred = Math.max(r.minimum, (int) pref);
110  r.maximum = Integer.MAX_VALUE;
111  r.alignment = 0.5f;
112  return r;
113  }
114  };
115  }
116  return v;
117  }
118  };
119  }
120  };
121 
122  // set font size manually in an effort to get fonts in this panel to look
123  // similar to what is in the 'String View' content viewer.
124  StyleSheet ss = editorKit.getStyleSheet();
125  ss.addRule("body {font-size: 8.5px;}"); //NON-NLS
126 
127  extractedTextPane.setEditorKit(editorKit);
128 
129  sourceComboBox.addItemListener(new ItemListener() {
130  @Override
131  public void itemStateChanged(ItemEvent e) {
132  if (e.getStateChange() == ItemEvent.SELECTED) {
133  TextMarkup source = (TextMarkup) e.getItem();
134  setMarkup(source);
135  }
136  }
137  });
138 
139 
140  setSources(new ArrayList<TextMarkup>());
141 
142  extractedTextPane.setComponentPopupMenu(rightClickMenu);
143  ActionListener actList = new ActionListener() {
144  @Override
145  public void actionPerformed(ActionEvent e) {
146  JMenuItem jmi = (JMenuItem) e.getSource();
147  if (jmi.equals(copyMenuItem)) {
148  extractedTextPane.copy();
149  } else if (jmi.equals(selectAllMenuItem)) {
150  extractedTextPane.selectAll();
151  }
152  }
153  };
154  copyMenuItem.addActionListener(actList);
155  selectAllMenuItem.addActionListener(actList);
156  }
157 
163  @SuppressWarnings("unchecked")
164  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
165  private void initComponents() {
166 
167  rightClickMenu = new javax.swing.JPopupMenu();
168  copyMenuItem = new javax.swing.JMenuItem();
169  selectAllMenuItem = new javax.swing.JMenuItem();
170  jScrollPane1 = new javax.swing.JScrollPane();
171  extractedTextPane = new JTextPane(){
172  public boolean getScrollableTracksViewportWidth() {
173  return (getSize().width < 400);
174  }};
175  sourceComboBox = new javax.swing.JComboBox<>();
176  hitLabel = new javax.swing.JLabel();
177  hitCountLabel = new javax.swing.JLabel();
178  hitOfLabel = new javax.swing.JLabel();
179  hitTotalLabel = new javax.swing.JLabel();
180  hitButtonsLabel = new javax.swing.JLabel();
181  hitPreviousButton = new javax.swing.JButton();
182  hitNextButton = new javax.swing.JButton();
183  pageButtonsLabel = new javax.swing.JLabel();
184  pagePreviousButton = new javax.swing.JButton();
185  pageNextButton = new javax.swing.JButton();
186  pagesLabel = new javax.swing.JLabel();
187  pageCurLabel = new javax.swing.JLabel();
188  pageOfLabel = new javax.swing.JLabel();
189  pageTotalLabel = new javax.swing.JLabel();
190 
191  copyMenuItem.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.copyMenuItem.text")); // NOI18N
192  rightClickMenu.add(copyMenuItem);
193 
194  selectAllMenuItem.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.selectAllMenuItem.text")); // NOI18N
195  rightClickMenu.add(selectAllMenuItem);
196 
197  setPreferredSize(new java.awt.Dimension(700, 400));
198 
199  jScrollPane1.setBackground(new java.awt.Color(255, 255, 255));
200  jScrollPane1.setPreferredSize(new java.awt.Dimension(700, 400));
201 
202  extractedTextPane.setEditable(false);
203  extractedTextPane.setAutoscrolls(false);
204  extractedTextPane.setMaximumSize(new java.awt.Dimension(2000, 2000));
205  extractedTextPane.setPreferredSize(new java.awt.Dimension(700, 400));
206  jScrollPane1.setViewportView(extractedTextPane);
207 
208  sourceComboBox.setModel(new javax.swing.DefaultComboBoxModel<TextMarkup>());
209 
210  hitLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitLabel.text")); // NOI18N
211  hitLabel.setToolTipText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitLabel.toolTipText")); // NOI18N
212 
213  hitCountLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
214  hitCountLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitCountLabel.text")); // NOI18N
215  hitCountLabel.setMaximumSize(new java.awt.Dimension(18, 14));
216  hitCountLabel.setMinimumSize(new java.awt.Dimension(18, 14));
217  hitCountLabel.setPreferredSize(new java.awt.Dimension(18, 14));
218 
219  hitOfLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitOfLabel.text")); // NOI18N
220 
221  hitTotalLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
222  hitTotalLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitTotalLabel.text")); // NOI18N
223  hitTotalLabel.setMaximumSize(new java.awt.Dimension(18, 14));
224  hitTotalLabel.setMinimumSize(new java.awt.Dimension(18, 14));
225  hitTotalLabel.setPreferredSize(new java.awt.Dimension(18, 14));
226 
227  hitButtonsLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitButtonsLabel.text")); // NOI18N
228 
229  hitPreviousButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_back.png"))); // NOI18N NON-NLS
230  hitPreviousButton.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitPreviousButton.text")); // NOI18N
231  hitPreviousButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
232  hitPreviousButton.setBorderPainted(false);
233  hitPreviousButton.setContentAreaFilled(false);
234  hitPreviousButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_back_disabled.png"))); // NOI18N NON-NLS
235  hitPreviousButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
236  hitPreviousButton.setPreferredSize(new java.awt.Dimension(23, 23));
237  hitPreviousButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_back_hover.png"))); // NOI18N NON-NLS
238 
239  hitNextButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_forward.png"))); // NOI18N NON-NLS
240  hitNextButton.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitNextButton.text")); // NOI18N
241  hitNextButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
242  hitNextButton.setBorderPainted(false);
243  hitNextButton.setContentAreaFilled(false);
244  hitNextButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_forward_disabled.png"))); // NOI18N NON-NLS
245  hitNextButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
246  hitNextButton.setPreferredSize(new java.awt.Dimension(23, 23));
247  hitNextButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_forward_hover.png"))); // NOI18N NON-NLS
248 
249  pageButtonsLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pageButtonsLabel.text")); // NOI18N
250 
251  pagePreviousButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_back.png"))); // NOI18N NON-NLS
252  pagePreviousButton.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pagePreviousButton.text")); // NOI18N
253  pagePreviousButton.setActionCommand(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pagePreviousButton.actionCommand")); // NOI18N
254  pagePreviousButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
255  pagePreviousButton.setBorderPainted(false);
256  pagePreviousButton.setContentAreaFilled(false);
257  pagePreviousButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_back_disabled.png"))); // NOI18N NON-NLS
258  pagePreviousButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
259 
260  pageNextButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_forward.png"))); // NOI18N NON-NLS
261  pageNextButton.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pageNextButton.text")); // NOI18N
262  pageNextButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
263  pageNextButton.setBorderPainted(false);
264  pageNextButton.setContentAreaFilled(false);
265  pageNextButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_forward_disabled.png"))); // NOI18N NON-NLS
266  pageNextButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
267  pageNextButton.setPreferredSize(new java.awt.Dimension(23, 23));
268 
269  pagesLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pagesLabel.text")); // NOI18N
270 
271  pageCurLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
272  pageCurLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pageCurLabel.text")); // NOI18N
273 
274  pageOfLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pageOfLabel.text")); // NOI18N
275 
276  pageTotalLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
277  pageTotalLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pageTotalLabel.text")); // NOI18N
278 
279  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
280  this.setLayout(layout);
281  layout.setHorizontalGroup(
282  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
283  .addGroup(layout.createSequentialGroup()
284  .addContainerGap()
285  .addComponent(hitLabel)
286  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
287  .addComponent(hitCountLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
288  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
289  .addComponent(hitOfLabel)
290  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
291  .addComponent(hitTotalLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
292  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
293  .addComponent(hitButtonsLabel)
294  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
295  .addComponent(hitPreviousButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
296  .addGap(0, 0, 0)
297  .addComponent(hitNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
298  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
299  .addComponent(pagesLabel)
300  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
301  .addComponent(pageCurLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
302  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
303  .addComponent(pageOfLabel)
304  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
305  .addComponent(pageTotalLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
306  .addGap(18, 18, 18)
307  .addComponent(pageButtonsLabel)
308  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
309  .addComponent(pagePreviousButton)
310  .addGap(0, 0, 0)
311  .addComponent(pageNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
312  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
313  .addComponent(sourceComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
314  .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
315  );
316  layout.setVerticalGroup(
317  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
318  .addGroup(layout.createSequentialGroup()
319  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
320  .addComponent(sourceComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
321  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
322  .addComponent(hitCountLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
323  .addComponent(hitOfLabel)
324  .addComponent(hitTotalLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
325  .addComponent(hitLabel)
326  .addComponent(hitButtonsLabel))
327  .addComponent(hitPreviousButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
328  .addComponent(hitNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
329  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
330  .addComponent(pageButtonsLabel)
331  .addComponent(pageTotalLabel)
332  .addComponent(pagesLabel)
333  .addComponent(pageCurLabel)
334  .addComponent(pageOfLabel))
335  .addComponent(pageNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
336  .addComponent(pagePreviousButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
337  .addGap(0, 0, 0)
338  .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 377, Short.MAX_VALUE))
339  );
340  }// </editor-fold>//GEN-END:initComponents
341  // Variables declaration - do not modify//GEN-BEGIN:variables
342  private javax.swing.JMenuItem copyMenuItem;
343  private javax.swing.JTextPane extractedTextPane;
344  private javax.swing.JLabel hitButtonsLabel;
345  private javax.swing.JLabel hitCountLabel;
346  private javax.swing.JLabel hitLabel;
347  private javax.swing.JButton hitNextButton;
348  private javax.swing.JLabel hitOfLabel;
349  private javax.swing.JButton hitPreviousButton;
350  private javax.swing.JLabel hitTotalLabel;
351  private javax.swing.JScrollPane jScrollPane1;
352  private javax.swing.JLabel pageButtonsLabel;
353  private javax.swing.JLabel pageCurLabel;
354  private javax.swing.JButton pageNextButton;
355  private javax.swing.JLabel pageOfLabel;
356  private javax.swing.JButton pagePreviousButton;
357  private javax.swing.JLabel pageTotalLabel;
358  private javax.swing.JLabel pagesLabel;
359  private javax.swing.JPopupMenu rightClickMenu;
360  private javax.swing.JMenuItem selectAllMenuItem;
361  private javax.swing.JComboBox<TextMarkup> sourceComboBox;
362  // End of variables declaration//GEN-END:variables
363 
364  void refreshCurrentMarkup() {
365  TextMarkup ms = (TextMarkup) sourceComboBox.getSelectedItem();
366  setMarkup(ms);
367  }
368 
375  void setSources(List<TextMarkup> sources) {
376  sourceComboBox.removeAllItems();
377  setPanelText(null, false);
378 
379  for (TextMarkup ms : sources) {
380  sourceComboBox.addItem(ms);
381  }
382 
383  if (!sources.isEmpty()) {
384  sourceComboBox.setSelectedIndex(0);
385  }
386  }
387 
394  public List<TextMarkup> getSources() {
395  ArrayList<TextMarkup> sources = new ArrayList<>();
396  for (int i = 0; i < sourceComboBox.getItemCount(); ++i) {
397  sources.add(sourceComboBox.getItemAt(i));
398  }
399  return sources;
400  }
401 
406  public TextMarkup getSelectedSource() {
407  return (TextMarkup) sourceComboBox.getSelectedItem();
408  }
409 
410  private void setPanelText(String text, boolean detectDirection) {
411  if (text == null) {
412  text = "";
413  }
414 
415  if (detectDirection) {
416  //detect text direction using first 1024 chars and set it
417  //get first up to 1024 chars, strip <pre> tag and unescape html to get the string on which to detect
418  final int len = text.length();
419  final int prefixLen = "<pre>".length(); //NON-NLS
420  if (len > prefixLen) {
421  final int maxOrientChars = Math.min(len, 1024);
422  final String orientDetectText = EscapeUtil.unEscapeHtml(text.substring(prefixLen, maxOrientChars));
423  ComponentOrientation direction = TextUtil.getTextDirection(orientDetectText);
424  //logger.log(Level.INFO, "ORIENTATION LEFT TO RIGHT: " + direction.isLeftToRight());
425  extractedTextPane.applyComponentOrientation(direction);
426  } else {
427  extractedTextPane.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
428  }
429  } else {
430  extractedTextPane.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
431  }
432 
433  extractedTextPane.setText(text);
434  extractedTextPane.setCaretPosition(0);
435  }
436 
437  private void initControls() {
438  hitPreviousButton.setEnabled(false);
439  hitNextButton.setEnabled(false);
440  }
441 
442  void scrollToAnchor(String anchor) {
443  extractedTextPane.scrollToReference(anchor);
444  }
445 
450  void updateCurrentMatchDisplay(int current) {
451  if (current == 0) {
452  hitCountLabel.setText("-");
453  } else {
454  hitCountLabel.setText(Integer.toString(current));
455  }
456  }
457 
462  void updateTotaMatcheslDisplay(int total) {
463  if (total == 0) {
464  hitTotalLabel.setText("-");
465  } else {
466  hitTotalLabel.setText(Integer.toString(total));
467  }
468  }
469 
474  void updateCurrentPageDisplay(int current) {
475  pageCurLabel.setText(Integer.toString(current));
476  }
477 
482  void updateTotalPageslDisplay(int total) {
483  pageTotalLabel.setText(Integer.toString(total));
484  }
485 
486  void resetDisplay() {
487  resetHitDisplay();
488  resetPagesDisplay();
489  }
490 
494  void resetHitDisplay() {
495  hitTotalLabel.setText("-");
496  hitCountLabel.setText("-");
497  }
498 
502  void resetPagesDisplay() {
503  pageCurLabel.setText("-");
504  pageTotalLabel.setText("-");
505  }
506 
512  void enablePrevMatchControl(boolean enable) {
513  hitPreviousButton.setEnabled(enable);
514  }
515 
521  void enableNextMatchControl(boolean enable) {
522  hitNextButton.setEnabled(enable);
523  }
524 
525  void addPrevMatchControlListener(ActionListener l) {
526  hitPreviousButton.addActionListener(l);
527  }
528 
529  void addNextMatchControlListener(ActionListener l) {
530  hitNextButton.addActionListener(l);
531  }
532 
538  void enablePrevPageControl(boolean enable) {
539  pagePreviousButton.setEnabled(enable);
540  }
541 
547  void enableNextPageControl(boolean enable) {
548  pageNextButton.setEnabled(enable);
549  }
550 
551  void addPrevPageControlListener(ActionListener l) {
552  pagePreviousButton.addActionListener(l);
553  }
554 
555  void addNextPageControlListener(ActionListener l) {
556  pageNextButton.addActionListener(l);
557  }
558 
559  void addSourceComboControlListener(ActionListener l) {
560  sourceComboBox.addActionListener(l);
561  }
562 
568  void updateControls(TextMarkup source) {
569  updatePageControls(source);
570  updateSearchControls(source);
571  }
572 
578  void updatePageControls(TextMarkup source) {
579  if (source == null) {
580  enableNextPageControl(false);
581  enablePrevPageControl(false);
582  updateCurrentPageDisplay(0);
583  updateTotalPageslDisplay(0);
584  return;
585  }
586 
587  updateCurrentPageDisplay(source.getCurrentPage());
588  int totalPages = source.getNumberPages();
589  updateTotalPageslDisplay(totalPages);
590 
591 
592  if (totalPages == 1) {
593  enableNextPageControl(false);
594  enablePrevPageControl(false);
595  } else {
596  if (source.hasNextPage()) {
597  enableNextPageControl(true);
598  } else {
599  enableNextPageControl(false);
600  }
601 
602  if (source.hasPreviousPage()) {
603  enablePrevPageControl(true);
604  } else {
605  enablePrevPageControl(false);
606  }
607  }
608 
609 
610  }
611 
617  void updateSearchControls(TextMarkup source) {
618  //setup search controls
619  if (source != null && source.isSearchable()) {
620 
621  updateCurrentMatchDisplay(source.currentItem());
622  updateTotaMatcheslDisplay(source.getNumberHits());
623 
624  if (source.hasNextItem() || source.hasNextPage()) {
625  enableNextMatchControl(true);
626  } else {
627  enableNextMatchControl(false);
628  }
629 
630  if (source.hasPreviousItem() || source.hasPreviousPage()) {
631  enablePrevMatchControl(true);
632  } else {
633  enablePrevMatchControl(false);
634  }
635 
636  } else {
637  enableNextMatchControl(false);
638  enablePrevMatchControl(false);
639  updateCurrentMatchDisplay(0);
640  updateTotaMatcheslDisplay(0);
641  }
642  }
643 
649  private void scrollToCurrentHit(final TextMarkup source) {
650  if (source == null || !source.isSearchable()) {
651  return;
652  }
653 
654  //scrolling required invokeLater to enqueue in EDT
655  EventQueue.invokeLater(new Runnable() {
656  @Override
657  public void run() {
658  scrollToAnchor(source.getAnchorPrefix() + Integer.toString(source.currentItem()));
659  }
660  });
661 
662  }
663 
669  private void setMarkup(TextMarkup source) {
670  setPanelText(NbBundle.getMessage(this.getClass(), "ExtractedContentPanel.setMarkup.panelTxt"), false);
671  new SetMarkupWorker(source).execute();
672  }
673 
679  private final class SetMarkupWorker extends SwingWorker<Object, Void> {
680 
681  private TextMarkup source;
682  private String markup;
683  private ProgressHandle progress;
684 
685  SetMarkupWorker(TextMarkup source) {
686  this.source = source;
687  }
688 
689  @Override
690  protected Object doInBackground() throws Exception {
691  progress = ProgressHandleFactory.createHandle(
692  NbBundle.getMessage(this.getClass(), "ExtractedContentPanel.SetMarkup.progress.loading"));
693  progress.setDisplayName(
694  NbBundle.getMessage(this.getClass(), "ExtractedContentPanel.SetMarkup.progress.displayName"));
695  progress.start();
696  progress.switchToIndeterminate();
697 
698  markup = source.getMarkup();
699  return null;
700  }
701 
702  @Override
703  protected void done() {
704  //super.done();
705  progress.finish();
706 
707  // see if there are any errors
708  // @@@ BC: Display the errors to the user somehow
709  try {
710  get();
711  } catch (InterruptedException | ExecutionException ex) {
712  logger.log(Level.SEVERE, "Error getting marked up text" ); //NON-NLS
713  }
714  // catch and ignore if we were cancelled
715  catch (java.util.concurrent.CancellationException ex ) { }
716 
717 
718  if (markup != null) {
719  setPanelText(markup, true);
720  } else {
721  setPanelText("", false);
722  }
723  updateControls(source);
724 
725  scrollToCurrentHit(source);
726  }
727  }
728 }

Copyright © 2012-2015 Basis Technology. Generated on: Mon Oct 19 2015
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.