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

Copyright © 2012-2016 Basis Technology. Generated on: Tue Feb 20 2018
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.