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             if (source.hasNextPage()) {
 
  594                 enableNextPageControl(
true);
 
  596                 enableNextPageControl(
false);
 
  599             if (source.hasPreviousPage()) {
 
  600                 enablePrevPageControl(
true);
 
  602                 enablePrevPageControl(
false);
 
  613     void updateSearchControls(IndexedText source) {
 
  615         if (source != null && source.isSearchable()) {
 
  617             updateCurrentMatchDisplay(source.currentItem());
 
  618             updateTotaMatcheslDisplay(source.getNumberHits());
 
  620             if (source.hasNextItem() || source.hasNextPage()) {
 
  621                 enableNextMatchControl(
true);
 
  623                 enableNextMatchControl(
false);
 
  626             if (source.hasPreviousItem() || source.hasPreviousPage()) {
 
  627                 enablePrevMatchControl(
true);
 
  629                 enablePrevMatchControl(
false);
 
  633             enableNextMatchControl(
false);
 
  634             enablePrevMatchControl(
false);
 
  635             updateCurrentMatchDisplay(0);
 
  636             updateTotaMatcheslDisplay(0);
 
  645     private void scrollToCurrentHit(
final IndexedText source) {
 
  646         if (source == null || !source.isSearchable()) {
 
  651         EventQueue.invokeLater(() -> scrollToAnchor(source.getAnchorPrefix() + source.currentItem()));
 
  660     private void setMarkup(IndexedText source) {
 
  661         setPanelText(NbBundle.getMessage(
this.getClass(), 
"ExtractedContentPanel.setMarkup.panelTxt"), 
false);
 
  662         new SetMarkupWorker(source).execute();
 
  682             progress = ProgressHandle.createHandle(NbBundle.getMessage(
this.getClass(), 
"ExtractedContentPanel.SetMarkup.progress.loading"));
 
  683             progress.setDisplayName(NbBundle.getMessage(
this.getClass(), 
"ExtractedContentPanel.SetMarkup.progress.displayName"));
 
  685             progress.switchToIndeterminate();
 
  687             return source.getText();
 
  691             "ExtractedContentPanel.SetMarkup.error=There was an error getting the text for the selected source."})
 
  699                 String markup = 
get();
 
  700                 if (markup != null) {
 
  701                     setPanelText(markup, 
true);
 
  703                     setPanelText(
"", 
false);
 
  706             } 
catch (InterruptedException | ExecutionException ex) {
 
  707                 logger.log(Level.SEVERE, 
"Error getting marked up text", ex); 
 
  708                 setPanelText(Bundle.ExtractedContentPanel_SetMarkup_error(), 
true);
 
  710             catch (java.util.concurrent.CancellationException ex) {
 
  713             updateControls(source);
 
  715             scrollToCurrentHit(source);