19 package org.sleuthkit.autopsy.keywordsearch;
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;
50 class ExtractedContentPanel
extends javax.swing.JPanel {
52 private static final Logger logger = Logger.getLogger(ExtractedContentPanel.class.getName());
53 private String contentName;
55 ExtractedContentPanel() {
57 setSources(
"",
new ArrayList<>());
58 hitPreviousButton.setEnabled(
false);
59 hitNextButton.setEnabled(
false);
66 HTMLEditorKit editorKit =
new HTMLEditorKit() {
68 public ViewFactory getViewFactory() {
70 return new HTMLFactory() {
72 public View create(Element e) {
73 View v = super.create(e);
74 if (v instanceof InlineView) {
75 return new InlineView(e) {
77 public int getBreakWeight(
int axis,
float pos,
float len) {
78 return GoodBreakWeight;
82 public View breakView(
int axis,
int p0,
float pos,
float len) {
83 if (axis == View.X_AXIS) {
85 int p1 = getGlyphPainter().getBoundedPosition(
this, p0, pos, len);
86 if (p0 == getStartOffset() && p1 == getEndOffset()) {
89 return createFragment(p0, p1);
94 }
else if (v instanceof ParagraphView) {
95 return new ParagraphView(e) {
97 protected SizeRequirements calculateMinorAxisRequirements(
int axis, SizeRequirements r) {
99 r =
new SizeRequirements();
101 float pref = layoutPool.getPreferredSpan(axis);
102 float min = layoutPool.getMinimumSpan(axis);
104 r.minimum = (int) min;
105 r.preferred = Math.max(r.minimum, (
int) pref);
106 r.maximum = Integer.MAX_VALUE;
121 editorKit.getStyleSheet().addRule(
"body {font-size: 8.5px;}");
122 extractedTextPane.setEditorKit(editorKit);
124 sourceComboBox.addItemListener(itemEvent -> {
125 if (itemEvent.getStateChange() == ItemEvent.SELECTED) {
126 refreshCurrentMarkup();
129 extractedTextPane.setComponentPopupMenu(rightClickMenu);
130 copyMenuItem.addActionListener(actionEvent -> extractedTextPane.copy());
131 selectAllMenuItem.addActionListener(actionEvent -> extractedTextPane.selectAll());
139 @SuppressWarnings(
"unchecked")
141 private
void initComponents() {
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);
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();
170 copyMenuItem.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.copyMenuItem.text"));
171 rightClickMenu.add(copyMenuItem);
173 selectAllMenuItem.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.selectAllMenuItem.text"));
174 rightClickMenu.add(selectAllMenuItem);
176 setPreferredSize(
new java.awt.Dimension(717, 58));
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));
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);
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));
194 jLabel1.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.jLabel1.text"));
196 pageOfLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageOfLabel.text"));
198 pageButtonsLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageButtonsLabel.text"));
200 pageTotalLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
201 pageTotalLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageTotalLabel.text"));
203 pagesLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pagesLabel.text"));
205 pageNextButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_forward.png")));
206 pageNextButton.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageNextButton.text"));
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")));
211 pageNextButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
212 pageNextButton.setPreferredSize(
new java.awt.Dimension(23, 23));
214 pagePreviousButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_back.png")));
215 pagePreviousButton.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pagePreviousButton.text"));
216 pagePreviousButton.setActionCommand(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pagePreviousButton.actionCommand"));
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")));
221 pagePreviousButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
223 pageCurLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
224 pageCurLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageCurLabel.text"));
226 jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);
228 hitLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitLabel.text"));
229 hitLabel.setToolTipText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitLabel.toolTipText"));
231 hitButtonsLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitButtonsLabel.text"));
233 hitNextButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_forward.png")));
234 hitNextButton.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitNextButton.text"));
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")));
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")));
243 hitOfLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitOfLabel.text"));
245 hitTotalLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
246 hitTotalLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitTotalLabel.text"));
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));
251 hitPreviousButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_back.png")));
252 hitPreviousButton.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitPreviousButton.text"));
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")));
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")));
261 hitCountLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
262 hitCountLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitCountLabel.text"));
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));
267 jSeparator2.setOrientation(javax.swing.SwingConstants.VERTICAL);
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()
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)
287 .addComponent(hitNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
289 .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
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)
299 .addComponent(pageButtonsLabel)
300 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
301 .addComponent(pagePreviousButton)
303 .addComponent(pageNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
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)
311 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
313 layout.setVerticalGroup(
314 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
315 .addGroup(layout.createSequentialGroup()
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))
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});
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;
369 void refreshCurrentMarkup() {
370 setMarkup(getSelectedSource());
381 void setSources(String contentName, List<IndexedText> sources) {
382 this.contentName = contentName;
383 setPanelText(null,
false);
385 sourceComboBox.removeAllItems();
386 sources.forEach(sourceComboBox::addItem);
387 if (
false == sources.isEmpty()) {
388 sourceComboBox.setSelectedIndex(0);
397 public IndexedText getSelectedSource() {
398 return (IndexedText) sourceComboBox.getSelectedItem();
401 private void setPanelText(String text,
boolean detectDirection) {
402 text = StringUtils.defaultString(text);
404 if (detectDirection) {
407 final int len = text.length();
408 final int prefixLen =
"<pre>".length();
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);
414 extractedTextPane.applyComponentOrientation(direction);
416 extractedTextPane.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
419 extractedTextPane.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
422 extractedTextPane.setText(text);
423 extractedTextPane.setCaretPosition(0);
426 void scrollToAnchor(String anchor) {
427 extractedTextPane.scrollToReference(anchor);
434 void updateCurrentMatchDisplay(
int current) {
436 hitCountLabel.setText(
"-");
438 hitCountLabel.setText(Integer.toString(current));
446 void updateTotaMatcheslDisplay(
int total) {
448 hitTotalLabel.setText(
"-");
450 hitTotalLabel.setText(Integer.toString(total));
458 void updateCurrentPageDisplay(
int current) {
459 pageCurLabel.setText(Integer.toString(current));
466 void updateTotalPageslDisplay(
int total) {
467 pageTotalLabel.setText(Integer.toString(total));
474 void resetDisplay() {
475 setSources(
"",
new ArrayList<>());
476 hitTotalLabel.setText(
"-");
477 hitCountLabel.setText(
"-");
478 pageCurLabel.setText(
"-");
479 pageTotalLabel.setText(
"-");
487 void enablePrevMatchControl(
boolean enable) {
488 hitPreviousButton.setEnabled(enable);
496 void enableNextMatchControl(
boolean enable) {
497 hitNextButton.setEnabled(enable);
500 void addPrevMatchControlListener(ActionListener l) {
501 hitPreviousButton.addActionListener(l);
504 void addNextMatchControlListener(ActionListener l) {
505 hitNextButton.addActionListener(l);
513 void enablePrevPageControl(
boolean enable) {
514 pagePreviousButton.setEnabled(enable);
522 void enableNextPageControl(
boolean enable) {
523 pageNextButton.setEnabled(enable);
526 void addPrevPageControlListener(ActionListener l) {
527 pagePreviousButton.addActionListener(l);
530 void addNextPageControlListener(ActionListener l) {
531 pageNextButton.addActionListener(l);
534 void addSourceComboControlListener(ActionListener l) {
535 sourceComboBox.addActionListener(l);
543 void updateControls(IndexedText source) {
544 updatePageControls(source);
545 updateSearchControls(source);
553 void updatePageControls(IndexedText source) {
554 if (source == null) {
555 enableNextPageControl(
false);
556 enablePrevPageControl(
false);
557 updateCurrentPageDisplay(0);
558 updateTotalPageslDisplay(0);
562 updateCurrentPageDisplay(source.getCurrentPage());
563 int totalPages = source.getNumberPages();
564 updateTotalPageslDisplay(totalPages);
566 if (totalPages == 1) {
567 enableNextPageControl(
false);
568 enablePrevPageControl(
false);
570 enableNextPageControl(source.hasNextPage());
571 enablePrevPageControl(source.hasPreviousPage());
580 void updateSearchControls(IndexedText source) {
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());
588 enableNextMatchControl(
false);
589 enablePrevMatchControl(
false);
590 updateCurrentMatchDisplay(0);
591 updateTotaMatcheslDisplay(0);
600 private void scrollToCurrentHit(
final IndexedText source) {
601 if (source == null || !source.isSearchable()) {
606 EventQueue.invokeLater(() -> scrollToAnchor(source.getAnchorPrefix() + source.currentItem()));
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();
640 @NbBundle.Messages({
"# {0} - Content name",
641 "ExtractedContentPanel.SetMarkup.progress.loading=Loading text for {0}"})
643 progress = ProgressHandle.createHandle(Bundle.ExtractedContentPanel_SetMarkup_progress_loading(contentName));
645 progress.switchToIndeterminate();
647 return source.getText();
651 "ExtractedContentPanel.SetMarkup.error=There was an error getting the text for the selected source."})
659 String markup =
get();
660 if (markup != null) {
661 setPanelText(markup,
true);
663 setPanelText(
"",
false);
666 }
catch (InterruptedException | ExecutionException ex) {
667 logger.log(Level.SEVERE,
"Error getting marked up text", ex);
668 setPanelText(Bundle.ExtractedContentPanel_SetMarkup_error(),
true);
670 catch (java.util.concurrent.CancellationException ex) {
673 updateControls(source);
675 scrollToCurrentHit(source);