19 package org.sleuthkit.autopsy.keywordsearch;
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 import javax.swing.JMenuItem;
32 import javax.swing.JTextPane;
33 import javax.swing.SizeRequirements;
34 import javax.swing.SwingWorker;
35 import javax.swing.text.Element;
36 import javax.swing.text.View;
37 import javax.swing.text.ViewFactory;
38 import javax.swing.text.html.HTMLEditorKit;
39 import javax.swing.text.html.HTMLEditorKit.HTMLFactory;
40 import javax.swing.text.html.InlineView;
41 import javax.swing.text.html.ParagraphView;
42 import javax.swing.text.html.StyleSheet;
43 import org.netbeans.api.progress.ProgressHandle;
44 import org.openide.util.NbBundle;
53 class ExtractedContentPanel
extends javax.swing.JPanel {
55 private static Logger logger = Logger.getLogger(ExtractedContentPanel.class.getName());
57 ExtractedContentPanel() {
62 customizeComponents();
66 private void customizeComponents() {
68 HTMLEditorKit editorKit =
new HTMLEditorKit() {
70 public ViewFactory getViewFactory() {
72 return new HTMLFactory() {
74 public View create(Element e) {
75 View v = super.create(e);
76 if (v instanceof InlineView) {
77 return new InlineView(e) {
79 public int getBreakWeight(
int axis,
float pos,
float len) {
80 return GoodBreakWeight;
84 public View breakView(
int axis,
int p0,
float pos,
float len) {
85 if (axis == View.X_AXIS) {
87 int p1 = getGlyphPainter().getBoundedPosition(
this, p0, pos, len);
88 if (p0 == getStartOffset() && p1 == getEndOffset()) {
91 return createFragment(p0, p1);
96 }
else if (v instanceof ParagraphView) {
97 return new ParagraphView(e) {
99 protected SizeRequirements calculateMinorAxisRequirements(
int axis, SizeRequirements r) {
101 r =
new SizeRequirements();
103 float pref = layoutPool.getPreferredSpan(axis);
104 float min = layoutPool.getMinimumSpan(axis);
106 r.minimum = (int) min;
107 r.preferred = Math.max(r.minimum, (
int) pref);
108 r.maximum = Integer.MAX_VALUE;
122 StyleSheet ss = editorKit.getStyleSheet();
123 ss.addRule(
"body {font-size: 8.5px;}");
125 extractedTextPane.setEditorKit(editorKit);
127 sourceComboBox.addItemListener(
new ItemListener() {
129 public void itemStateChanged(ItemEvent e) {
130 if (e.getStateChange() == ItemEvent.SELECTED) {
131 IndexedText source = (IndexedText) e.getItem();
137 setSources(
new ArrayList<IndexedText>());
139 extractedTextPane.setComponentPopupMenu(rightClickMenu);
140 ActionListener actList =
new ActionListener() {
142 public void actionPerformed(ActionEvent e) {
143 JMenuItem jmi = (JMenuItem) e.getSource();
144 if (jmi.equals(copyMenuItem)) {
145 extractedTextPane.copy();
146 }
else if (jmi.equals(selectAllMenuItem)) {
147 extractedTextPane.selectAll();
151 copyMenuItem.addActionListener(actList);
152 selectAllMenuItem.addActionListener(actList);
160 @SuppressWarnings(
"unchecked")
162 private
void initComponents() {
164 rightClickMenu =
new javax.swing.JPopupMenu();
165 copyMenuItem =
new javax.swing.JMenuItem();
166 selectAllMenuItem =
new javax.swing.JMenuItem();
167 jScrollPane1 =
new javax.swing.JScrollPane();
168 extractedTextPane =
new JTextPane(){
169 public boolean getScrollableTracksViewportWidth() {
170 return (getSize().width < 400);
172 sourceComboBox =
new javax.swing.JComboBox<>();
173 hitLabel =
new javax.swing.JLabel();
174 hitCountLabel =
new javax.swing.JLabel();
175 hitOfLabel =
new javax.swing.JLabel();
176 hitTotalLabel =
new javax.swing.JLabel();
177 hitButtonsLabel =
new javax.swing.JLabel();
178 hitPreviousButton =
new javax.swing.JButton();
179 hitNextButton =
new javax.swing.JButton();
180 pageButtonsLabel =
new javax.swing.JLabel();
181 pagePreviousButton =
new javax.swing.JButton();
182 pageNextButton =
new javax.swing.JButton();
183 pagesLabel =
new javax.swing.JLabel();
184 pageCurLabel =
new javax.swing.JLabel();
185 pageOfLabel =
new javax.swing.JLabel();
186 pageTotalLabel =
new javax.swing.JLabel();
188 copyMenuItem.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.copyMenuItem.text"));
189 rightClickMenu.add(copyMenuItem);
191 selectAllMenuItem.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.selectAllMenuItem.text"));
192 rightClickMenu.add(selectAllMenuItem);
194 setPreferredSize(
new java.awt.Dimension(700, 400));
196 jScrollPane1.setBackground(
new java.awt.Color(255, 255, 255));
197 jScrollPane1.setPreferredSize(
new java.awt.Dimension(700, 400));
199 extractedTextPane.setEditable(
false);
200 extractedTextPane.setAutoscrolls(
false);
201 extractedTextPane.setMaximumSize(
new java.awt.Dimension(2000, 2000));
202 extractedTextPane.setPreferredSize(
new java.awt.Dimension(700, 400));
203 jScrollPane1.setViewportView(extractedTextPane);
205 sourceComboBox.setModel(
new javax.swing.DefaultComboBoxModel<IndexedText>());
207 hitLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitLabel.text"));
208 hitLabel.setToolTipText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitLabel.toolTipText"));
210 hitCountLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
211 hitCountLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitCountLabel.text"));
212 hitCountLabel.setMaximumSize(
new java.awt.Dimension(18, 14));
213 hitCountLabel.setMinimumSize(
new java.awt.Dimension(18, 14));
214 hitCountLabel.setPreferredSize(
new java.awt.Dimension(18, 14));
216 hitOfLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitOfLabel.text"));
218 hitTotalLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
219 hitTotalLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitTotalLabel.text"));
220 hitTotalLabel.setMaximumSize(
new java.awt.Dimension(18, 14));
221 hitTotalLabel.setMinimumSize(
new java.awt.Dimension(18, 14));
222 hitTotalLabel.setPreferredSize(
new java.awt.Dimension(18, 14));
224 hitButtonsLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitButtonsLabel.text"));
226 hitPreviousButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_back.png")));
227 hitPreviousButton.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitPreviousButton.text"));
228 hitPreviousButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
229 hitPreviousButton.setBorderPainted(
false);
230 hitPreviousButton.setContentAreaFilled(
false);
231 hitPreviousButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_back_disabled.png")));
232 hitPreviousButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
233 hitPreviousButton.setPreferredSize(
new java.awt.Dimension(23, 23));
234 hitPreviousButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_back_hover.png")));
236 hitNextButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_forward.png")));
237 hitNextButton.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitNextButton.text"));
238 hitNextButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
239 hitNextButton.setBorderPainted(
false);
240 hitNextButton.setContentAreaFilled(
false);
241 hitNextButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_forward_disabled.png")));
242 hitNextButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
243 hitNextButton.setPreferredSize(
new java.awt.Dimension(23, 23));
244 hitNextButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_forward_hover.png")));
246 pageButtonsLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageButtonsLabel.text"));
248 pagePreviousButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_back.png")));
249 pagePreviousButton.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pagePreviousButton.text"));
250 pagePreviousButton.setActionCommand(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pagePreviousButton.actionCommand"));
251 pagePreviousButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
252 pagePreviousButton.setBorderPainted(
false);
253 pagePreviousButton.setContentAreaFilled(
false);
254 pagePreviousButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_back_disabled.png")));
255 pagePreviousButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
257 pageNextButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_forward.png")));
258 pageNextButton.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageNextButton.text"));
259 pageNextButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
260 pageNextButton.setBorderPainted(
false);
261 pageNextButton.setContentAreaFilled(
false);
262 pageNextButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_forward_disabled.png")));
263 pageNextButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
264 pageNextButton.setPreferredSize(
new java.awt.Dimension(23, 23));
266 pagesLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pagesLabel.text"));
268 pageCurLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
269 pageCurLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageCurLabel.text"));
271 pageOfLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageOfLabel.text"));
273 pageTotalLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
274 pageTotalLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageTotalLabel.text"));
276 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
277 this.setLayout(layout);
278 layout.setHorizontalGroup(
279 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
280 .addGroup(layout.createSequentialGroup()
282 .addComponent(hitLabel)
283 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
284 .addComponent(hitCountLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
285 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
286 .addComponent(hitOfLabel)
287 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
288 .addComponent(hitTotalLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
289 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
290 .addComponent(hitButtonsLabel)
291 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
292 .addComponent(hitPreviousButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
294 .addComponent(hitNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
295 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
296 .addComponent(pagesLabel)
297 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
298 .addComponent(pageCurLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
299 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
300 .addComponent(pageOfLabel)
301 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
302 .addComponent(pageTotalLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
304 .addComponent(pageButtonsLabel)
305 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
306 .addComponent(pagePreviousButton)
308 .addComponent(pageNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
309 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
310 .addComponent(sourceComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
311 .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
313 layout.setVerticalGroup(
314 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
315 .addGroup(layout.createSequentialGroup()
316 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
317 .addComponent(sourceComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
318 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
319 .addComponent(hitCountLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
320 .addComponent(hitOfLabel)
321 .addComponent(hitTotalLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
322 .addComponent(hitLabel)
323 .addComponent(hitButtonsLabel))
324 .addComponent(hitPreviousButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
325 .addComponent(hitNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
326 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
327 .addComponent(pageButtonsLabel)
328 .addComponent(pageTotalLabel)
329 .addComponent(pagesLabel)
330 .addComponent(pageCurLabel)
331 .addComponent(pageOfLabel))
332 .addComponent(pageNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
333 .addComponent(pagePreviousButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
335 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 377, Short.MAX_VALUE))
339 private javax.swing.JMenuItem copyMenuItem;
340 private javax.swing.JTextPane extractedTextPane;
341 private javax.swing.JLabel hitButtonsLabel;
342 private javax.swing.JLabel hitCountLabel;
343 private javax.swing.JLabel hitLabel;
344 private javax.swing.JButton hitNextButton;
345 private javax.swing.JLabel hitOfLabel;
346 private javax.swing.JButton hitPreviousButton;
347 private javax.swing.JLabel hitTotalLabel;
348 private javax.swing.JScrollPane jScrollPane1;
349 private javax.swing.JLabel pageButtonsLabel;
350 private javax.swing.JLabel pageCurLabel;
351 private javax.swing.JButton pageNextButton;
352 private javax.swing.JLabel pageOfLabel;
353 private javax.swing.JButton pagePreviousButton;
354 private javax.swing.JLabel pageTotalLabel;
355 private javax.swing.JLabel pagesLabel;
356 private javax.swing.JPopupMenu rightClickMenu;
357 private javax.swing.JMenuItem selectAllMenuItem;
358 private javax.swing.JComboBox<IndexedText> sourceComboBox;
361 void refreshCurrentMarkup() {
362 IndexedText ms = (IndexedText) sourceComboBox.getSelectedItem();
372 void setSources(List<IndexedText> sources) {
373 sourceComboBox.removeAllItems();
374 setPanelText(null,
false);
376 for (IndexedText ms : sources) {
377 sourceComboBox.addItem(ms);
380 if (!sources.isEmpty()) {
381 sourceComboBox.setSelectedIndex(0);
391 public List<IndexedText> getSources() {
392 ArrayList<IndexedText> sources =
new ArrayList<>();
393 for (
int i = 0; i < sourceComboBox.getItemCount(); ++i) {
394 sources.add(sourceComboBox.getItemAt(i));
404 public IndexedText getSelectedSource() {
405 return (IndexedText) sourceComboBox.getSelectedItem();
408 private void setPanelText(String text,
boolean detectDirection) {
413 if (detectDirection) {
416 final int len = text.length();
417 final int prefixLen =
"<pre>".length();
418 if (len > prefixLen) {
419 final int maxOrientChars = Math.min(len, 1024);
420 final String orientDetectText = EscapeUtil.unEscapeHtml(text.substring(prefixLen, maxOrientChars));
421 ComponentOrientation direction = TextUtil.getTextDirection(orientDetectText);
423 extractedTextPane.applyComponentOrientation(direction);
425 extractedTextPane.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
428 extractedTextPane.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
431 extractedTextPane.setText(text);
432 extractedTextPane.setCaretPosition(0);
435 private void initControls() {
436 hitPreviousButton.setEnabled(
false);
437 hitNextButton.setEnabled(
false);
440 void scrollToAnchor(String anchor) {
441 extractedTextPane.scrollToReference(anchor);
448 void updateCurrentMatchDisplay(
int current) {
450 hitCountLabel.setText(
"-");
452 hitCountLabel.setText(Integer.toString(current));
460 void updateTotaMatcheslDisplay(
int total) {
462 hitTotalLabel.setText(
"-");
464 hitTotalLabel.setText(Integer.toString(total));
472 void updateCurrentPageDisplay(
int current) {
473 pageCurLabel.setText(Integer.toString(current));
480 void updateTotalPageslDisplay(
int total) {
481 pageTotalLabel.setText(Integer.toString(total));
484 void resetDisplay() {
492 void resetHitDisplay() {
493 hitTotalLabel.setText(
"-");
494 hitCountLabel.setText(
"-");
500 void resetPagesDisplay() {
501 pageCurLabel.setText(
"-");
502 pageTotalLabel.setText(
"-");
510 void enablePrevMatchControl(
boolean enable) {
511 hitPreviousButton.setEnabled(enable);
519 void enableNextMatchControl(
boolean enable) {
520 hitNextButton.setEnabled(enable);
523 void addPrevMatchControlListener(ActionListener l) {
524 hitPreviousButton.addActionListener(l);
527 void addNextMatchControlListener(ActionListener l) {
528 hitNextButton.addActionListener(l);
536 void enablePrevPageControl(
boolean enable) {
537 pagePreviousButton.setEnabled(enable);
545 void enableNextPageControl(
boolean enable) {
546 pageNextButton.setEnabled(enable);
549 void addPrevPageControlListener(ActionListener l) {
550 pagePreviousButton.addActionListener(l);
553 void addNextPageControlListener(ActionListener l) {
554 pageNextButton.addActionListener(l);
557 void addSourceComboControlListener(ActionListener l) {
558 sourceComboBox.addActionListener(l);
566 void updateControls(IndexedText source) {
567 updatePageControls(source);
568 updateSearchControls(source);
576 void updatePageControls(IndexedText source) {
577 if (source == null) {
578 enableNextPageControl(
false);
579 enablePrevPageControl(
false);
580 updateCurrentPageDisplay(0);
581 updateTotalPageslDisplay(0);
585 updateCurrentPageDisplay(source.getCurrentPage());
586 int totalPages = source.getNumberPages();
587 updateTotalPageslDisplay(totalPages);
589 if (totalPages == 1) {
590 enableNextPageControl(
false);
591 enablePrevPageControl(
false);
593 enableNextPageControl(source.hasNextPage());
594 enablePrevPageControl(source.hasPreviousPage());
603 void updateSearchControls(IndexedText source) {
605 if (source != null && source.isSearchable()) {
606 updateCurrentMatchDisplay(source.currentItem());
607 updateTotaMatcheslDisplay(source.getNumberHits());
608 enableNextMatchControl(source.hasNextItem() || source.hasNextPage());
609 enablePrevMatchControl(source.hasPreviousItem() || source.hasPreviousPage());
611 enableNextMatchControl(
false);
612 enablePrevMatchControl(
false);
613 updateCurrentMatchDisplay(0);
614 updateTotaMatcheslDisplay(0);
623 private void scrollToCurrentHit(
final IndexedText source) {
624 if (source == null || !source.isSearchable()) {
629 EventQueue.invokeLater(() -> scrollToAnchor(source.getAnchorPrefix() + source.currentItem()));
638 private void setMarkup(IndexedText source) {
639 setPanelText(NbBundle.getMessage(
this.getClass(),
"ExtractedContentPanel.setMarkup.panelTxt"),
false);
640 new SetMarkupWorker(source).execute();
660 progress = ProgressHandle.createHandle(NbBundle.getMessage(
this.getClass(),
"ExtractedContentPanel.SetMarkup.progress.loading"));
661 progress.setDisplayName(NbBundle.getMessage(
this.getClass(),
"ExtractedContentPanel.SetMarkup.progress.displayName"));
663 progress.switchToIndeterminate();
665 return source.getText();
669 "ExtractedContentPanel.SetMarkup.error=There was an error getting the text for the selected source."})
677 String markup =
get();
678 if (markup != null) {
679 setPanelText(markup,
true);
681 setPanelText(
"",
false);
684 }
catch (InterruptedException | ExecutionException ex) {
685 logger.log(Level.SEVERE,
"Error getting marked up text", ex);
686 setPanelText(Bundle.ExtractedContentPanel_SetMarkup_error(),
true);
688 catch (java.util.concurrent.CancellationException ex) {
691 updateControls(source);
693 scrollToCurrentHit(source);