Autopsy  4.4.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-17 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.ActionListener;
24 import java.awt.event.ItemEvent;
25 import java.util.ArrayList;
26 import java.util.List;
27 import java.util.concurrent.ExecutionException;
28 import java.util.logging.Level;
29 import javax.swing.JTextPane;
30 import javax.swing.SizeRequirements;
31 import javax.swing.SwingWorker;
32 import javax.swing.text.Element;
33 import javax.swing.text.View;
34 import javax.swing.text.ViewFactory;
35 import javax.swing.text.html.HTMLEditorKit;
36 import javax.swing.text.html.HTMLEditorKit.HTMLFactory;
37 import javax.swing.text.html.InlineView;
38 import javax.swing.text.html.ParagraphView;
39 import org.apache.commons.lang3.StringUtils;
40 import org.netbeans.api.progress.ProgressHandle;
41 import org.openide.util.NbBundle;
45 
50 class ExtractedContentPanel extends javax.swing.JPanel {
51 
52  private static final Logger logger = Logger.getLogger(ExtractedContentPanel.class.getName());
53  private String contentName;
54 
55  ExtractedContentPanel() {
56  initComponents();
57  setSources("", new ArrayList<>());
58  hitPreviousButton.setEnabled(false);
59  hitNextButton.setEnabled(false);
60 
61  /*
62  * This appears to be an attempt to modify the wrapping behavior of the
63  * extractedTextPane taken form this website:
64  * http://java-sl.com/tip_html_letter_wrap.html.
65  */
66  HTMLEditorKit editorKit = new HTMLEditorKit() {
67  @Override
68  public ViewFactory getViewFactory() {
69 
70  return new HTMLFactory() {
71  @Override
72  public View create(Element e) {
73  View v = super.create(e);
74  if (v instanceof InlineView) {
75  return new InlineView(e) {
76  @Override
77  public int getBreakWeight(int axis, float pos, float len) {
78  return GoodBreakWeight;
79  }
80 
81  @Override
82  public View breakView(int axis, int p0, float pos, float len) {
83  if (axis == View.X_AXIS) {
84  checkPainter();
85  int p1 = getGlyphPainter().getBoundedPosition(this, p0, pos, len);
86  if (p0 == getStartOffset() && p1 == getEndOffset()) {
87  return this;
88  }
89  return createFragment(p0, p1);
90  }
91  return this;
92  }
93  };
94  } else if (v instanceof ParagraphView) {
95  return new ParagraphView(e) {
96  @Override
97  protected SizeRequirements calculateMinorAxisRequirements(int axis, SizeRequirements r) {
98  if (r == null) {
99  r = new SizeRequirements();
100  }
101  float pref = layoutPool.getPreferredSpan(axis);
102  float min = layoutPool.getMinimumSpan(axis);
103  // Don't include insets, Box.getXXXSpan will include them.
104  r.minimum = (int) min;
105  r.preferred = Math.max(r.minimum, (int) pref);
106  r.maximum = Integer.MAX_VALUE;
107  r.alignment = 0.5f;
108  return r;
109  }
110  };
111  }
112  return v;
113  }
114  };
115  }
116  };
117  /*
118  * set font size manually in an effort to get fonts in this panel to
119  * look similar to what is in the 'String View' content viewer.
120  */
121  editorKit.getStyleSheet().addRule("body {font-size: 8.5px;}"); //NON-NLS
122  extractedTextPane.setEditorKit(editorKit);
123 
124  sourceComboBox.addItemListener(itemEvent -> {
125  if (itemEvent.getStateChange() == ItemEvent.SELECTED) {
126  refreshCurrentMarkup();
127  }
128  });
129  extractedTextPane.setComponentPopupMenu(rightClickMenu);
130  copyMenuItem.addActionListener(actionEvent -> extractedTextPane.copy());
131  selectAllMenuItem.addActionListener(actionEvent -> extractedTextPane.selectAll());
132  }
133 
139  @SuppressWarnings("unchecked")
140  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
141  private void initComponents() {
142 
143  rightClickMenu = new javax.swing.JPopupMenu();
144  copyMenuItem = new javax.swing.JMenuItem();
145  selectAllMenuItem = new javax.swing.JMenuItem();
146  jScrollPane1 = new javax.swing.JScrollPane();
147  extractedTextPane = new JTextPane(){
148  public boolean getScrollableTracksViewportWidth() {
149  return (getSize().width < 400);
150  }};
151  sourceComboBox = new javax.swing.JComboBox<>();
152  jLabel1 = new javax.swing.JLabel();
153  pageOfLabel = new javax.swing.JLabel();
154  pageButtonsLabel = new javax.swing.JLabel();
155  pageTotalLabel = new javax.swing.JLabel();
156  pagesLabel = new javax.swing.JLabel();
157  pageNextButton = new javax.swing.JButton();
158  pagePreviousButton = new javax.swing.JButton();
159  pageCurLabel = new javax.swing.JLabel();
160  jSeparator1 = new javax.swing.JSeparator();
161  hitLabel = new javax.swing.JLabel();
162  hitButtonsLabel = new javax.swing.JLabel();
163  hitNextButton = new javax.swing.JButton();
164  hitOfLabel = new javax.swing.JLabel();
165  hitTotalLabel = new javax.swing.JLabel();
166  hitPreviousButton = new javax.swing.JButton();
167  hitCountLabel = new javax.swing.JLabel();
168  jSeparator2 = new javax.swing.JSeparator();
169 
170  copyMenuItem.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.copyMenuItem.text")); // NOI18N
171  rightClickMenu.add(copyMenuItem);
172 
173  selectAllMenuItem.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.selectAllMenuItem.text")); // NOI18N
174  rightClickMenu.add(selectAllMenuItem);
175 
176  setPreferredSize(new java.awt.Dimension(717, 58));
177 
178  jScrollPane1.setBackground(new java.awt.Color(255, 255, 255));
179  jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
180  jScrollPane1.setPreferredSize(new java.awt.Dimension(640, 29));
181 
182  extractedTextPane.setEditable(false);
183  extractedTextPane.setAutoscrolls(false);
184  extractedTextPane.setInheritsPopupMenu(true);
185  extractedTextPane.setMaximumSize(new java.awt.Dimension(2000, 2000));
186  extractedTextPane.setPreferredSize(new java.awt.Dimension(640, 29));
187  jScrollPane1.setViewportView(extractedTextPane);
188 
189  sourceComboBox.setModel(new javax.swing.DefaultComboBoxModel<org.sleuthkit.autopsy.keywordsearch.IndexedText>());
190  sourceComboBox.setMaximumSize(new java.awt.Dimension(150, 32767));
191  sourceComboBox.setMinimumSize(new java.awt.Dimension(150, 20));
192  sourceComboBox.setPreferredSize(new java.awt.Dimension(150, 20));
193 
194  jLabel1.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.jLabel1.text")); // NOI18N
195 
196  pageOfLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pageOfLabel.text")); // NOI18N
197 
198  pageButtonsLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pageButtonsLabel.text")); // NOI18N
199 
200  pageTotalLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
201  pageTotalLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pageTotalLabel.text")); // NOI18N
202 
203  pagesLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pagesLabel.text")); // NOI18N
204 
205  pageNextButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_forward.png"))); // NOI18N
206  pageNextButton.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pageNextButton.text")); // NOI18N
207  pageNextButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
208  pageNextButton.setBorderPainted(false);
209  pageNextButton.setContentAreaFilled(false);
210  pageNextButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_forward_disabled.png"))); // NOI18N
211  pageNextButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
212  pageNextButton.setPreferredSize(new java.awt.Dimension(23, 23));
213 
214  pagePreviousButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_back.png"))); // NOI18N
215  pagePreviousButton.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pagePreviousButton.text")); // NOI18N
216  pagePreviousButton.setActionCommand(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pagePreviousButton.actionCommand")); // NOI18N
217  pagePreviousButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
218  pagePreviousButton.setBorderPainted(false);
219  pagePreviousButton.setContentAreaFilled(false);
220  pagePreviousButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_back_disabled.png"))); // NOI18N
221  pagePreviousButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
222 
223  pageCurLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
224  pageCurLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pageCurLabel.text")); // NOI18N
225 
226  jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);
227 
228  hitLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitLabel.text")); // NOI18N
229  hitLabel.setToolTipText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitLabel.toolTipText")); // NOI18N
230 
231  hitButtonsLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitButtonsLabel.text")); // NOI18N
232 
233  hitNextButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_forward.png"))); // NOI18N
234  hitNextButton.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitNextButton.text")); // NOI18N
235  hitNextButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
236  hitNextButton.setBorderPainted(false);
237  hitNextButton.setContentAreaFilled(false);
238  hitNextButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_forward_disabled.png"))); // NOI18N
239  hitNextButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
240  hitNextButton.setPreferredSize(new java.awt.Dimension(23, 23));
241  hitNextButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_forward_hover.png"))); // NOI18N
242 
243  hitOfLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitOfLabel.text")); // NOI18N
244 
245  hitTotalLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
246  hitTotalLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitTotalLabel.text")); // NOI18N
247  hitTotalLabel.setMaximumSize(new java.awt.Dimension(18, 14));
248  hitTotalLabel.setMinimumSize(new java.awt.Dimension(18, 14));
249  hitTotalLabel.setPreferredSize(new java.awt.Dimension(18, 14));
250 
251  hitPreviousButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_back.png"))); // NOI18N
252  hitPreviousButton.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitPreviousButton.text")); // NOI18N
253  hitPreviousButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
254  hitPreviousButton.setBorderPainted(false);
255  hitPreviousButton.setContentAreaFilled(false);
256  hitPreviousButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_back_disabled.png"))); // NOI18N
257  hitPreviousButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
258  hitPreviousButton.setPreferredSize(new java.awt.Dimension(23, 23));
259  hitPreviousButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_back_hover.png"))); // NOI18N
260 
261  hitCountLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
262  hitCountLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitCountLabel.text")); // NOI18N
263  hitCountLabel.setMaximumSize(new java.awt.Dimension(18, 14));
264  hitCountLabel.setMinimumSize(new java.awt.Dimension(18, 14));
265  hitCountLabel.setPreferredSize(new java.awt.Dimension(18, 14));
266 
267  jSeparator2.setOrientation(javax.swing.SwingConstants.VERTICAL);
268 
269  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
270  this.setLayout(layout);
271  layout.setHorizontalGroup(
272  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
273  .addGroup(layout.createSequentialGroup()
274  .addContainerGap()
275  .addComponent(hitLabel)
276  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
277  .addComponent(hitCountLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
278  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
279  .addComponent(hitOfLabel)
280  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
281  .addComponent(hitTotalLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
282  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
283  .addComponent(hitButtonsLabel)
284  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
285  .addComponent(hitPreviousButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
286  .addGap(0, 0, 0)
287  .addComponent(hitNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
288  .addGap(18, 18, 18)
289  .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
290  .addGap(18, 18, 18)
291  .addComponent(pagesLabel)
292  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
293  .addComponent(pageCurLabel)
294  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
295  .addComponent(pageOfLabel)
296  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
297  .addComponent(pageTotalLabel)
298  .addGap(18, 18, 18)
299  .addComponent(pageButtonsLabel)
300  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
301  .addComponent(pagePreviousButton)
302  .addGap(0, 0, 0)
303  .addComponent(pageNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
304  .addGap(18, 18, 18)
305  .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
306  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
307  .addComponent(jLabel1)
308  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
309  .addComponent(sourceComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
310  .addContainerGap())
311  .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
312  );
313  layout.setVerticalGroup(
314  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
315  .addGroup(layout.createSequentialGroup()
316  .addContainerGap()
317  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
318  .addComponent(hitPreviousButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
319  .addComponent(jLabel1)
320  .addComponent(hitNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
321  .addComponent(pageButtonsLabel)
322  .addComponent(pagePreviousButton)
323  .addComponent(pageNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
324  .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
325  .addComponent(sourceComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
326  .addComponent(pagesLabel)
327  .addComponent(hitLabel)
328  .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
329  .addComponent(pageCurLabel)
330  .addComponent(pageOfLabel)
331  .addComponent(hitCountLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
332  .addComponent(pageTotalLabel)
333  .addComponent(hitOfLabel)
334  .addComponent(hitTotalLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
335  .addComponent(hitButtonsLabel))
336  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
337  .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 126, Short.MAX_VALUE))
338  );
339 
340  layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {hitButtonsLabel, hitCountLabel, hitLabel, hitNextButton, hitOfLabel, hitPreviousButton, hitTotalLabel, jLabel1, jSeparator1, jSeparator2, pageButtonsLabel, pageCurLabel, pageNextButton, pageOfLabel, pagePreviousButton, pageTotalLabel, pagesLabel, sourceComboBox});
341 
342  }// </editor-fold>//GEN-END:initComponents
343  // Variables declaration - do not modify//GEN-BEGIN:variables
344  private javax.swing.JMenuItem copyMenuItem;
345  private javax.swing.JTextPane extractedTextPane;
346  private javax.swing.JLabel hitButtonsLabel;
347  private javax.swing.JLabel hitCountLabel;
348  private javax.swing.JLabel hitLabel;
349  private javax.swing.JButton hitNextButton;
350  private javax.swing.JLabel hitOfLabel;
351  private javax.swing.JButton hitPreviousButton;
352  private javax.swing.JLabel hitTotalLabel;
353  private javax.swing.JLabel jLabel1;
354  private javax.swing.JScrollPane jScrollPane1;
355  private javax.swing.JSeparator jSeparator1;
356  private javax.swing.JSeparator jSeparator2;
357  private javax.swing.JLabel pageButtonsLabel;
358  private javax.swing.JLabel pageCurLabel;
359  private javax.swing.JButton pageNextButton;
360  private javax.swing.JLabel pageOfLabel;
361  private javax.swing.JButton pagePreviousButton;
362  private javax.swing.JLabel pageTotalLabel;
363  private javax.swing.JLabel pagesLabel;
364  private javax.swing.JPopupMenu rightClickMenu;
365  private javax.swing.JMenuItem selectAllMenuItem;
366  private javax.swing.JComboBox<org.sleuthkit.autopsy.keywordsearch.IndexedText> sourceComboBox;
367  // End of variables declaration//GEN-END:variables
368 
369  void refreshCurrentMarkup() {
370  setMarkup(getSelectedSource());
371  }
372 
381  void setSources(String contentName, List<IndexedText> sources) {
382  this.contentName = contentName;
383  setPanelText(null, false);
384 
385  sourceComboBox.removeAllItems();
386  sources.forEach(sourceComboBox::addItem);
387  if (false == sources.isEmpty()) {
388  sourceComboBox.setSelectedIndex(0);
389  }
390  }
391 
397  public IndexedText getSelectedSource() {
398  return (IndexedText) sourceComboBox.getSelectedItem();
399  }
400 
401  private void setPanelText(String text, boolean detectDirection) {
402  text = StringUtils.defaultString(text);
403 
404  if (detectDirection) {
405  //detect text direction using first 1024 chars and set it
406  //get first up to 1024 chars, strip <pre> tag and unescape html to get the string on which to detect
407  final int len = text.length();
408  final int prefixLen = "<pre>".length(); //NON-NLS
409  if (len > prefixLen) {
410  final int maxOrientChars = Math.min(len, 1024);
411  final String orientDetectText = EscapeUtil.unEscapeHtml(text.substring(prefixLen, maxOrientChars));
412  ComponentOrientation direction = TextUtil.getTextDirection(orientDetectText);
413  //logger.log(Level.INFO, "ORIENTATION LEFT TO RIGHT: " + direction.isLeftToRight());
414  extractedTextPane.applyComponentOrientation(direction);
415  } else {
416  extractedTextPane.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
417  }
418  } else {
419  extractedTextPane.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
420  }
421 
422  extractedTextPane.setText(text);
423  extractedTextPane.setCaretPosition(0);
424  }
425 
426  void scrollToAnchor(String anchor) {
427  extractedTextPane.scrollToReference(anchor);
428  }
429 
434  void updateCurrentMatchDisplay(int current) {
435  if (current == 0) {
436  hitCountLabel.setText("-");
437  } else {
438  hitCountLabel.setText(Integer.toString(current));
439  }
440  }
441 
446  void updateTotaMatcheslDisplay(int total) {
447  if (total == 0) {
448  hitTotalLabel.setText("-");
449  } else {
450  hitTotalLabel.setText(Integer.toString(total));
451  }
452  }
453 
458  void updateCurrentPageDisplay(int current) {
459  pageCurLabel.setText(Integer.toString(current));
460  }
461 
466  void updateTotalPageslDisplay(int total) {
467  pageTotalLabel.setText(Integer.toString(total));
468  }
469 
474  void resetDisplay() {
475  setSources("", new ArrayList<>());
476  hitTotalLabel.setText("-");
477  hitCountLabel.setText("-");
478  pageCurLabel.setText("-");
479  pageTotalLabel.setText("-");
480  }
481 
487  void enablePrevMatchControl(boolean enable) {
488  hitPreviousButton.setEnabled(enable);
489  }
490 
496  void enableNextMatchControl(boolean enable) {
497  hitNextButton.setEnabled(enable);
498  }
499 
500  void addPrevMatchControlListener(ActionListener l) {
501  hitPreviousButton.addActionListener(l);
502  }
503 
504  void addNextMatchControlListener(ActionListener l) {
505  hitNextButton.addActionListener(l);
506  }
507 
513  void enablePrevPageControl(boolean enable) {
514  pagePreviousButton.setEnabled(enable);
515  }
516 
522  void enableNextPageControl(boolean enable) {
523  pageNextButton.setEnabled(enable);
524  }
525 
526  void addPrevPageControlListener(ActionListener l) {
527  pagePreviousButton.addActionListener(l);
528  }
529 
530  void addNextPageControlListener(ActionListener l) {
531  pageNextButton.addActionListener(l);
532  }
533 
534  void addSourceComboControlListener(ActionListener l) {
535  sourceComboBox.addActionListener(l);
536  }
537 
543  void updateControls(IndexedText source) {
544  updatePageControls(source);
545  updateSearchControls(source);
546  }
547 
553  void updatePageControls(IndexedText source) {
554  if (source == null) {
555  enableNextPageControl(false);
556  enablePrevPageControl(false);
557  updateCurrentPageDisplay(0);
558  updateTotalPageslDisplay(0);
559  return;
560  }
561 
562  updateCurrentPageDisplay(source.getCurrentPage());
563  int totalPages = source.getNumberPages();
564  updateTotalPageslDisplay(totalPages);
565 
566  if (totalPages == 1) {
567  enableNextPageControl(false);
568  enablePrevPageControl(false);
569  } else {
570  enableNextPageControl(source.hasNextPage());
571  enablePrevPageControl(source.hasPreviousPage());
572  }
573  }
574 
580  void updateSearchControls(IndexedText source) {
581  //setup search controls
582  if (source != null && source.isSearchable()) {
583  updateCurrentMatchDisplay(source.currentItem());
584  updateTotaMatcheslDisplay(source.getNumberHits());
585  enableNextMatchControl(source.hasNextItem() || source.hasNextPage());
586  enablePrevMatchControl(source.hasPreviousItem() || source.hasPreviousPage());
587  } else {
588  enableNextMatchControl(false);
589  enablePrevMatchControl(false);
590  updateCurrentMatchDisplay(0);
591  updateTotaMatcheslDisplay(0);
592  }
593  }
594 
600  private void scrollToCurrentHit(final IndexedText source) {
601  if (source == null || !source.isSearchable()) {
602  return;
603  }
604 
605  //scrolling required invokeLater to enqueue in EDT
606  EventQueue.invokeLater(() -> scrollToAnchor(source.getAnchorPrefix() + source.currentItem()));
607 
608  }
609 
615  @NbBundle.Messages("ExtractedContentPanel.setMarkup.panelTxt=<span style='font-style:italic'>Loading text... Please wait</span>")
616  private void setMarkup(IndexedText source) {
617  setPanelText(Bundle.ExtractedContentPanel_setMarkup_panelTxt(), false);
618  new SetMarkupWorker(contentName, source).execute();
619  }
620 
626  private final class SetMarkupWorker extends SwingWorker<String, Void> {
627 
628  private final String contentName;
629 
630  private final IndexedText source;
631 
632  private ProgressHandle progress;
633 
634  SetMarkupWorker(String contentName, IndexedText source) {
635  this.contentName = contentName;
636  this.source = source;
637  }
638 
639  @Override
640  @NbBundle.Messages({"# {0} - Content name",
641  "ExtractedContentPanel.SetMarkup.progress.loading=Loading text for {0}"})
642  protected String doInBackground() throws Exception {
643  progress = ProgressHandle.createHandle(Bundle.ExtractedContentPanel_SetMarkup_progress_loading(contentName));
644  progress.start();
645  progress.switchToIndeterminate();
646 
647  return source.getText();
648  }
649 
650  @NbBundle.Messages({
651  "ExtractedContentPanel.SetMarkup.error=There was an error getting the text for the selected source."})
652  @Override
653  protected void done() {
654  super.done();
655  progress.finish();
656 
657  // see if there are any errors
658  try {
659  String markup = get();
660  if (markup != null) {
661  setPanelText(markup, true);
662  } else {
663  setPanelText("", false);
664  }
665 
666  } catch (InterruptedException | ExecutionException ex) {
667  logger.log(Level.SEVERE, "Error getting marked up text", ex); //NON-NLS
668  setPanelText(Bundle.ExtractedContentPanel_SetMarkup_error(), true);
669  } // catch and ignore if we were cancelled
670  catch (java.util.concurrent.CancellationException ex) {
671  }
672 
673  updateControls(source);
674 
675  scrollToCurrentHit(source);
676  }
677  }
678 }

Copyright © 2012-2016 Basis Technology. Generated on: Fri Sep 29 2017
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.