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(640, 58));
196 jScrollPane1.setBackground(
new java.awt.Color(255, 255, 255));
197 jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
198 jScrollPane1.setPreferredSize(
new java.awt.Dimension(640, 29));
200 extractedTextPane.setEditable(
false);
201 extractedTextPane.setAutoscrolls(
false);
202 extractedTextPane.setInheritsPopupMenu(
true);
203 extractedTextPane.setMaximumSize(
new java.awt.Dimension(2000, 2000));
204 extractedTextPane.setPreferredSize(
new java.awt.Dimension(640, 29));
205 jScrollPane1.setViewportView(extractedTextPane);
208 sourceComboBox.setMinimumSize(
new java.awt.Dimension(90, 20));
209 sourceComboBox.setPreferredSize(
new java.awt.Dimension(90, 20));
211 hitLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitLabel.text"));
212 hitLabel.setToolTipText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitLabel.toolTipText"));
214 hitCountLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
215 hitCountLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitCountLabel.text"));
216 hitCountLabel.setMaximumSize(
new java.awt.Dimension(18, 14));
217 hitCountLabel.setMinimumSize(
new java.awt.Dimension(18, 14));
218 hitCountLabel.setPreferredSize(
new java.awt.Dimension(18, 14));
220 hitOfLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitOfLabel.text"));
222 hitTotalLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
223 hitTotalLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitTotalLabel.text"));
224 hitTotalLabel.setMaximumSize(
new java.awt.Dimension(18, 14));
225 hitTotalLabel.setMinimumSize(
new java.awt.Dimension(18, 14));
226 hitTotalLabel.setPreferredSize(
new java.awt.Dimension(18, 14));
228 hitButtonsLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitButtonsLabel.text"));
230 hitPreviousButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_back.png")));
231 hitPreviousButton.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitPreviousButton.text"));
232 hitPreviousButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
233 hitPreviousButton.setBorderPainted(
false);
234 hitPreviousButton.setContentAreaFilled(
false);
235 hitPreviousButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_back_disabled.png")));
236 hitPreviousButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
237 hitPreviousButton.setPreferredSize(
new java.awt.Dimension(23, 23));
238 hitPreviousButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_back_hover.png")));
240 hitNextButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_forward.png")));
241 hitNextButton.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitNextButton.text"));
242 hitNextButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
243 hitNextButton.setBorderPainted(
false);
244 hitNextButton.setContentAreaFilled(
false);
245 hitNextButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_forward_disabled.png")));
246 hitNextButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
247 hitNextButton.setPreferredSize(
new java.awt.Dimension(23, 23));
248 hitNextButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_forward_hover.png")));
250 pageButtonsLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageButtonsLabel.text"));
252 pagePreviousButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_back.png")));
253 pagePreviousButton.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pagePreviousButton.text"));
254 pagePreviousButton.setActionCommand(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pagePreviousButton.actionCommand"));
255 pagePreviousButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
256 pagePreviousButton.setBorderPainted(
false);
257 pagePreviousButton.setContentAreaFilled(
false);
258 pagePreviousButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_back_disabled.png")));
259 pagePreviousButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
261 pageNextButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_forward.png")));
262 pageNextButton.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageNextButton.text"));
263 pageNextButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
264 pageNextButton.setBorderPainted(
false);
265 pageNextButton.setContentAreaFilled(
false);
266 pageNextButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_forward_disabled.png")));
267 pageNextButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
268 pageNextButton.setPreferredSize(
new java.awt.Dimension(23, 23));
270 pagesLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pagesLabel.text"));
272 pageCurLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
273 pageCurLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageCurLabel.text"));
275 pageOfLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageOfLabel.text"));
277 pageTotalLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
278 pageTotalLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageTotalLabel.text"));
280 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
281 this.setLayout(layout);
282 layout.setHorizontalGroup(
283 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
284 .addGroup(layout.createSequentialGroup()
286 .addComponent(hitLabel)
287 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
288 .addComponent(hitCountLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
289 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
290 .addComponent(hitOfLabel)
291 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
292 .addComponent(hitTotalLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
293 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
294 .addComponent(hitButtonsLabel)
295 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
296 .addComponent(hitPreviousButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
298 .addComponent(hitNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
299 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
300 .addComponent(pagesLabel)
301 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
302 .addComponent(pageCurLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
303 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
304 .addComponent(pageOfLabel)
305 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
306 .addComponent(pageTotalLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
308 .addComponent(pageButtonsLabel)
309 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
310 .addComponent(pagePreviousButton)
312 .addComponent(pageNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
313 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
314 .addComponent(sourceComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
316 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
318 layout.setVerticalGroup(
319 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
320 .addGroup(layout.createSequentialGroup()
321 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
322 .addComponent(sourceComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
323 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
324 .addComponent(hitCountLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
325 .addComponent(hitOfLabel)
326 .addComponent(hitTotalLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
327 .addComponent(hitLabel)
328 .addComponent(hitButtonsLabel))
329 .addComponent(hitPreviousButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
330 .addComponent(hitNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
331 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
332 .addComponent(pageButtonsLabel)
333 .addComponent(pageTotalLabel)
334 .addComponent(pagesLabel)
335 .addComponent(pageCurLabel)
336 .addComponent(pageOfLabel))
337 .addComponent(pageNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
338 .addComponent(pagePreviousButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
339 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
340 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
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.JScrollPane jScrollPane1;
354 private javax.swing.JLabel pageButtonsLabel;
355 private javax.swing.JLabel pageCurLabel;
356 private javax.swing.JButton pageNextButton;
357 private javax.swing.JLabel pageOfLabel;
358 private javax.swing.JButton pagePreviousButton;
359 private javax.swing.JLabel pageTotalLabel;
360 private javax.swing.JLabel pagesLabel;
361 private javax.swing.JPopupMenu rightClickMenu;
362 private javax.swing.JMenuItem selectAllMenuItem;
366 void refreshCurrentMarkup() {
367 IndexedText ms = (IndexedText) sourceComboBox.getSelectedItem();
377 void setSources(List<IndexedText> sources) {
378 sourceComboBox.removeAllItems();
379 setPanelText(null,
false);
381 for (IndexedText ms : sources) {
382 sourceComboBox.addItem(ms);
385 if (!sources.isEmpty()) {
386 sourceComboBox.setSelectedIndex(0);
396 public List<IndexedText> getSources() {
397 ArrayList<IndexedText> sources =
new ArrayList<>();
398 for (
int i = 0; i < sourceComboBox.getItemCount(); ++i) {
399 sources.add(sourceComboBox.getItemAt(i));
409 public IndexedText getSelectedSource() {
410 return (IndexedText) sourceComboBox.getSelectedItem();
413 private void setPanelText(String text,
boolean detectDirection) {
418 if (detectDirection) {
421 final int len = text.length();
422 final int prefixLen =
"<pre>".length();
423 if (len > prefixLen) {
424 final int maxOrientChars = Math.min(len, 1024);
425 final String orientDetectText = EscapeUtil.unEscapeHtml(text.substring(prefixLen, maxOrientChars));
426 ComponentOrientation direction = TextUtil.getTextDirection(orientDetectText);
428 extractedTextPane.applyComponentOrientation(direction);
430 extractedTextPane.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
433 extractedTextPane.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
436 extractedTextPane.setText(text);
437 extractedTextPane.setCaretPosition(0);
440 private void initControls() {
441 hitPreviousButton.setEnabled(
false);
442 hitNextButton.setEnabled(
false);
445 void scrollToAnchor(String anchor) {
446 extractedTextPane.scrollToReference(anchor);
453 void updateCurrentMatchDisplay(
int current) {
455 hitCountLabel.setText(
"-");
457 hitCountLabel.setText(Integer.toString(current));
465 void updateTotaMatcheslDisplay(
int total) {
467 hitTotalLabel.setText(
"-");
469 hitTotalLabel.setText(Integer.toString(total));
477 void updateCurrentPageDisplay(
int current) {
478 pageCurLabel.setText(Integer.toString(current));
485 void updateTotalPageslDisplay(
int total) {
486 pageTotalLabel.setText(Integer.toString(total));
489 void resetDisplay() {
497 void resetHitDisplay() {
498 hitTotalLabel.setText(
"-");
499 hitCountLabel.setText(
"-");
505 void resetPagesDisplay() {
506 pageCurLabel.setText(
"-");
507 pageTotalLabel.setText(
"-");
515 void enablePrevMatchControl(
boolean enable) {
516 hitPreviousButton.setEnabled(enable);
524 void enableNextMatchControl(
boolean enable) {
525 hitNextButton.setEnabled(enable);
528 void addPrevMatchControlListener(ActionListener l) {
529 hitPreviousButton.addActionListener(l);
532 void addNextMatchControlListener(ActionListener l) {
533 hitNextButton.addActionListener(l);
541 void enablePrevPageControl(
boolean enable) {
542 pagePreviousButton.setEnabled(enable);
550 void enableNextPageControl(
boolean enable) {
551 pageNextButton.setEnabled(enable);
554 void addPrevPageControlListener(ActionListener l) {
555 pagePreviousButton.addActionListener(l);
558 void addNextPageControlListener(ActionListener l) {
559 pageNextButton.addActionListener(l);
562 void addSourceComboControlListener(ActionListener l) {
563 sourceComboBox.addActionListener(l);
571 void updateControls(IndexedText source) {
572 updatePageControls(source);
573 updateSearchControls(source);
581 void updatePageControls(IndexedText source) {
582 if (source == null) {
583 enableNextPageControl(
false);
584 enablePrevPageControl(
false);
585 updateCurrentPageDisplay(0);
586 updateTotalPageslDisplay(0);
590 updateCurrentPageDisplay(source.getCurrentPage());
591 int totalPages = source.getNumberPages();
592 updateTotalPageslDisplay(totalPages);
594 if (totalPages == 1) {
595 enableNextPageControl(
false);
596 enablePrevPageControl(
false);
598 enableNextPageControl(source.hasNextPage());
599 enablePrevPageControl(source.hasPreviousPage());
608 void updateSearchControls(IndexedText source) {
610 if (source != null && source.isSearchable()) {
611 updateCurrentMatchDisplay(source.currentItem());
612 updateTotaMatcheslDisplay(source.getNumberHits());
613 enableNextMatchControl(source.hasNextItem() || source.hasNextPage());
614 enablePrevMatchControl(source.hasPreviousItem() || source.hasPreviousPage());
616 enableNextMatchControl(
false);
617 enablePrevMatchControl(
false);
618 updateCurrentMatchDisplay(0);
619 updateTotaMatcheslDisplay(0);
628 private void scrollToCurrentHit(
final IndexedText source) {
629 if (source == null || !source.isSearchable()) {
634 EventQueue.invokeLater(() -> scrollToAnchor(source.getAnchorPrefix() + source.currentItem()));
643 private void setMarkup(IndexedText source) {
644 setPanelText(NbBundle.getMessage(
this.getClass(),
"ExtractedContentPanel.setMarkup.panelTxt"),
false);
645 new SetMarkupWorker(source).execute();
665 progress = ProgressHandle.createHandle(NbBundle.getMessage(
this.getClass(),
"ExtractedContentPanel.SetMarkup.progress.loading"));
666 progress.setDisplayName(NbBundle.getMessage(
this.getClass(),
"ExtractedContentPanel.SetMarkup.progress.displayName"));
668 progress.switchToIndeterminate();
670 return source.getText();
674 "ExtractedContentPanel.SetMarkup.error=There was an error getting the text for the selected source."})
682 String markup =
get();
683 if (markup != null) {
684 setPanelText(markup,
true);
686 setPanelText(
"",
false);
689 }
catch (InterruptedException | ExecutionException ex) {
690 logger.log(Level.SEVERE,
"Error getting marked up text", ex);
691 setPanelText(Bundle.ExtractedContentPanel_SetMarkup_error(),
true);
693 catch (java.util.concurrent.CancellationException ex) {
696 updateControls(source);
698 scrollToCurrentHit(source);