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.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;
51 class ExtractedContentPanel
extends javax.swing.JPanel {
53 private static final Logger logger = Logger.getLogger(ExtractedContentPanel.class.getName());
54 private String contentName;
56 ExtractedContentPanel() {
58 setSources(
"",
new ArrayList<>());
59 hitPreviousButton.setEnabled(
false);
60 hitNextButton.setEnabled(
false);
67 HTMLEditorKit editorKit =
new HTMLEditorKit() {
69 public ViewFactory getViewFactory() {
71 return new HTMLFactory() {
73 public View create(Element e) {
74 View v = super.create(e);
75 if (v instanceof InlineView) {
76 return new InlineView(e) {
78 public int getBreakWeight(
int axis,
float pos,
float len) {
79 return GoodBreakWeight;
83 public View breakView(
int axis,
int p0,
float pos,
float len) {
84 if (axis == View.X_AXIS) {
86 int p1 = getGlyphPainter().getBoundedPosition(
this, p0, pos, len);
87 if (p0 == getStartOffset() && p1 == getEndOffset()) {
90 return createFragment(p0, p1);
95 }
else if (v instanceof ParagraphView) {
96 return new ParagraphView(e) {
98 protected SizeRequirements calculateMinorAxisRequirements(
int axis, SizeRequirements r) {
100 r =
new SizeRequirements();
102 float pref = layoutPool.getPreferredSpan(axis);
103 float min = layoutPool.getMinimumSpan(axis);
105 r.minimum = (int) min;
106 r.preferred = Math.max(r.minimum, (
int) pref);
107 r.maximum = Integer.MAX_VALUE;
122 editorKit.getStyleSheet().addRule(
"body {font-size: 8.5px;}");
123 extractedTextPane.setEditorKit(editorKit);
125 sourceComboBox.addItemListener(itemEvent -> {
126 if (itemEvent.getStateChange() == ItemEvent.SELECTED) {
127 refreshCurrentMarkup();
130 extractedTextPane.setComponentPopupMenu(rightClickMenu);
131 copyMenuItem.addActionListener(actionEvent -> extractedTextPane.copy());
132 selectAllMenuItem.addActionListener(actionEvent -> extractedTextPane.selectAll());
140 @SuppressWarnings(
"unchecked")
142 private
void initComponents() {
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);
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();
171 copyMenuItem.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.copyMenuItem.text"));
172 rightClickMenu.add(copyMenuItem);
174 selectAllMenuItem.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.selectAllMenuItem.text"));
175 rightClickMenu.add(selectAllMenuItem);
177 setPreferredSize(
new java.awt.Dimension(717, 58));
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));
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);
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));
195 jLabel1.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.jLabel1.text"));
197 pageOfLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageOfLabel.text"));
199 pageButtonsLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageButtonsLabel.text"));
201 pageTotalLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
202 pageTotalLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageTotalLabel.text"));
204 pagesLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pagesLabel.text"));
206 pageNextButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_forward.png")));
207 pageNextButton.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageNextButton.text"));
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")));
212 pageNextButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
213 pageNextButton.setPreferredSize(
new java.awt.Dimension(23, 23));
215 pagePreviousButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_back.png")));
216 pagePreviousButton.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pagePreviousButton.text"));
217 pagePreviousButton.setActionCommand(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pagePreviousButton.actionCommand"));
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")));
222 pagePreviousButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
224 pageCurLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
225 pageCurLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.pageCurLabel.text"));
227 jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);
229 hitLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitLabel.text"));
230 hitLabel.setToolTipText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitLabel.toolTipText"));
232 hitButtonsLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitButtonsLabel.text"));
234 hitNextButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_forward.png")));
235 hitNextButton.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitNextButton.text"));
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")));
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")));
244 hitOfLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitOfLabel.text"));
246 hitTotalLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
247 hitTotalLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitTotalLabel.text"));
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));
252 hitPreviousButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/btn_step_back.png")));
253 hitPreviousButton.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitPreviousButton.text"));
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")));
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")));
262 hitCountLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
263 hitCountLabel.setText(
org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class,
"ExtractedContentPanel.hitCountLabel.text"));
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));
268 jSeparator2.setOrientation(javax.swing.SwingConstants.VERTICAL);
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()
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)
288 .addComponent(hitNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
290 .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
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)
300 .addComponent(pageButtonsLabel)
301 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
302 .addComponent(pagePreviousButton)
304 .addComponent(pageNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
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)
312 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
314 layout.setVerticalGroup(
315 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
316 .addGroup(layout.createSequentialGroup()
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))
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});
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;
370 void refreshCurrentMarkup() {
371 setMarkup(getSelectedSource());
382 void setSources(String contentName, List<IndexedText> sources) {
383 this.contentName = contentName;
384 setPanelText(null,
false);
386 sourceComboBox.removeAllItems();
387 sources.forEach(sourceComboBox::addItem);
388 if (
false == sources.isEmpty()) {
389 sourceComboBox.setSelectedIndex(0);
398 public IndexedText getSelectedSource() {
399 return (IndexedText) sourceComboBox.getSelectedItem();
402 private void setPanelText(String text,
boolean detectDirection) {
403 text = StringUtils.defaultString(text);
405 if (detectDirection) {
408 final int len = text.length();
409 final int prefixLen =
"<pre>".length();
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);
415 extractedTextPane.applyComponentOrientation(direction);
417 extractedTextPane.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
420 extractedTextPane.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
423 extractedTextPane.setText(text);
424 extractedTextPane.setCaretPosition(0);
427 void scrollToAnchor(String anchor) {
428 extractedTextPane.scrollToReference(anchor);
435 void updateCurrentMatchDisplay(
int current) {
437 hitCountLabel.setText(
"-");
439 hitCountLabel.setText(Integer.toString(current));
447 void updateTotaMatcheslDisplay(
int total) {
449 hitTotalLabel.setText(
"-");
451 hitTotalLabel.setText(Integer.toString(total));
459 void updateCurrentPageDisplay(
int current) {
460 pageCurLabel.setText(Integer.toString(current));
467 void updateTotalPageslDisplay(
int total) {
468 pageTotalLabel.setText(Integer.toString(total));
475 void resetDisplay() {
476 setSources(
"",
new ArrayList<>());
477 hitTotalLabel.setText(
"-");
478 hitCountLabel.setText(
"-");
479 pageCurLabel.setText(
"-");
480 pageTotalLabel.setText(
"-");
488 void enablePrevMatchControl(
boolean enable) {
489 hitPreviousButton.setEnabled(enable);
497 void enableNextMatchControl(
boolean enable) {
498 hitNextButton.setEnabled(enable);
501 void addPrevMatchControlListener(ActionListener l) {
502 hitPreviousButton.addActionListener(l);
505 void addNextMatchControlListener(ActionListener l) {
506 hitNextButton.addActionListener(l);
514 void enablePrevPageControl(
boolean enable) {
515 pagePreviousButton.setEnabled(enable);
523 void enableNextPageControl(
boolean enable) {
524 pageNextButton.setEnabled(enable);
527 void addPrevPageControlListener(ActionListener l) {
528 pagePreviousButton.addActionListener(l);
531 void addNextPageControlListener(ActionListener l) {
532 pageNextButton.addActionListener(l);
535 void addSourceComboControlListener(ActionListener l) {
536 sourceComboBox.addActionListener(l);
544 void updateControls(IndexedText source) {
545 updatePageControls(source);
546 updateSearchControls(source);
554 void updatePageControls(IndexedText source) {
555 if (source == null) {
556 enableNextPageControl(
false);
557 enablePrevPageControl(
false);
558 updateCurrentPageDisplay(0);
559 updateTotalPageslDisplay(0);
563 updateCurrentPageDisplay(source.getCurrentPage());
564 int totalPages = source.getNumberPages();
565 updateTotalPageslDisplay(totalPages);
567 if (totalPages == 1) {
568 enableNextPageControl(
false);
569 enablePrevPageControl(
false);
571 enableNextPageControl(source.hasNextPage());
572 enablePrevPageControl(source.hasPreviousPage());
581 void updateSearchControls(IndexedText source) {
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());
589 enableNextMatchControl(
false);
590 enablePrevMatchControl(
false);
591 updateCurrentMatchDisplay(0);
592 updateTotaMatcheslDisplay(0);
601 private void scrollToCurrentHit(
final IndexedText source) {
602 if (source == null || !source.isSearchable()) {
607 EventQueue.invokeLater(() -> scrollToAnchor(source.getAnchorPrefix() + source.currentItem()));
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();
641 @NbBundle.Messages({
"# {0} - Content name",
642 "ExtractedContentPanel.SetMarkup.progress.loading=Loading text for {0}"})
644 progress = ProgressHandle.createHandle(Bundle.ExtractedContentPanel_SetMarkup_progress_loading(contentName));
646 progress.switchToIndeterminate();
648 return source.getText();
658 String markup =
get();
659 if (markup != null) {
660 setPanelText(markup,
true);
662 setPanelText(
"",
false);
665 }
catch (InterruptedException | CancellationException | ExecutionException ex) {
666 logger.log(Level.SEVERE,
"Error getting marked up text", ex);
667 setPanelText(Bundle.IndexedText_errorMessage_errorGettingText(),
true);
670 updateControls(source);
672 scrollToCurrentHit(source);