Autopsy  4.4
Graphical digital forensics platform for The Sleuth Kit and other tools.
ExtractedContentPanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011-17 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.keywordsearch;
20 
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;
48 
53 class ExtractedContentPanel extends javax.swing.JPanel {
54 
55  private static Logger logger = Logger.getLogger(ExtractedContentPanel.class.getName());
56 
57  ExtractedContentPanel() {
58  initComponents();
59 
60  initControls();
61 
62  customizeComponents();
63 
64  }
65 
66  private void customizeComponents() {
67 
68  HTMLEditorKit editorKit = new HTMLEditorKit() {
69  @Override
70  public ViewFactory getViewFactory() {
71 
72  return new HTMLFactory() {
73  @Override
74  public View create(Element e) {
75  View v = super.create(e);
76  if (v instanceof InlineView) {
77  return new InlineView(e) {
78  @Override
79  public int getBreakWeight(int axis, float pos, float len) {
80  return GoodBreakWeight;
81  }
82 
83  @Override
84  public View breakView(int axis, int p0, float pos, float len) {
85  if (axis == View.X_AXIS) {
86  checkPainter();
87  int p1 = getGlyphPainter().getBoundedPosition(this, p0, pos, len);
88  if (p0 == getStartOffset() && p1 == getEndOffset()) {
89  return this;
90  }
91  return createFragment(p0, p1);
92  }
93  return this;
94  }
95  };
96  } else if (v instanceof ParagraphView) {
97  return new ParagraphView(e) {
98  @Override
99  protected SizeRequirements calculateMinorAxisRequirements(int axis, SizeRequirements r) {
100  if (r == null) {
101  r = new SizeRequirements();
102  }
103  float pref = layoutPool.getPreferredSpan(axis);
104  float min = layoutPool.getMinimumSpan(axis);
105  // Don't include insets, Box.getXXXSpan will include them.
106  r.minimum = (int) min;
107  r.preferred = Math.max(r.minimum, (int) pref);
108  r.maximum = Integer.MAX_VALUE;
109  r.alignment = 0.5f;
110  return r;
111  }
112  };
113  }
114  return v;
115  }
116  };
117  }
118  };
119 
120  // set font size manually in an effort to get fonts in this panel to look
121  // similar to what is in the 'String View' content viewer.
122  StyleSheet ss = editorKit.getStyleSheet();
123  ss.addRule("body {font-size: 8.5px;}"); //NON-NLS
124 
125  extractedTextPane.setEditorKit(editorKit);
126 
127  sourceComboBox.addItemListener(new ItemListener() {
128  @Override
129  public void itemStateChanged(ItemEvent e) {
130  if (e.getStateChange() == ItemEvent.SELECTED) {
131  IndexedText source = (IndexedText) e.getItem();
132  setMarkup(source);
133  }
134  }
135  });
136 
137  setSources(new ArrayList<IndexedText>());
138 
139  extractedTextPane.setComponentPopupMenu(rightClickMenu);
140  ActionListener actList = new ActionListener() {
141  @Override
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();
148  }
149  }
150  };
151  copyMenuItem.addActionListener(actList);
152  selectAllMenuItem.addActionListener(actList);
153  }
154 
160  @SuppressWarnings("unchecked")
161  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
162  private void initComponents() {
163 
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);
171  }};
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();
187 
188  copyMenuItem.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.copyMenuItem.text")); // NOI18N
189  rightClickMenu.add(copyMenuItem);
190 
191  selectAllMenuItem.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.selectAllMenuItem.text")); // NOI18N
192  rightClickMenu.add(selectAllMenuItem);
193 
194  setPreferredSize(new java.awt.Dimension(640, 58));
195 
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));
199 
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);
206 
207  sourceComboBox.setModel(new javax.swing.DefaultComboBoxModel<org.sleuthkit.autopsy.keywordsearch.IndexedText>());
208  sourceComboBox.setMinimumSize(new java.awt.Dimension(90, 20));
209  sourceComboBox.setPreferredSize(new java.awt.Dimension(90, 20));
210 
211  hitLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitLabel.text")); // NOI18N
212  hitLabel.setToolTipText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitLabel.toolTipText")); // NOI18N
213 
214  hitCountLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
215  hitCountLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitCountLabel.text")); // NOI18N
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));
219 
220  hitOfLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitOfLabel.text")); // NOI18N
221 
222  hitTotalLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
223  hitTotalLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitTotalLabel.text")); // NOI18N
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));
227 
228  hitButtonsLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitButtonsLabel.text")); // NOI18N
229 
230  hitPreviousButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_back.png"))); // NOI18N
231  hitPreviousButton.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitPreviousButton.text")); // NOI18N
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"))); // NOI18N
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"))); // NOI18N
239 
240  hitNextButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_forward.png"))); // NOI18N
241  hitNextButton.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.hitNextButton.text")); // NOI18N
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"))); // NOI18N
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"))); // NOI18N
249 
250  pageButtonsLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pageButtonsLabel.text")); // NOI18N
251 
252  pagePreviousButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_back.png"))); // NOI18N
253  pagePreviousButton.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pagePreviousButton.text")); // NOI18N
254  pagePreviousButton.setActionCommand(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pagePreviousButton.actionCommand")); // NOI18N
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"))); // NOI18N
259  pagePreviousButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
260 
261  pageNextButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/btn_step_forward.png"))); // NOI18N
262  pageNextButton.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pageNextButton.text")); // NOI18N
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"))); // NOI18N
267  pageNextButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
268  pageNextButton.setPreferredSize(new java.awt.Dimension(23, 23));
269 
270  pagesLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pagesLabel.text")); // NOI18N
271 
272  pageCurLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
273  pageCurLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pageCurLabel.text")); // NOI18N
274 
275  pageOfLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pageOfLabel.text")); // NOI18N
276 
277  pageTotalLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
278  pageTotalLabel.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.pageTotalLabel.text")); // NOI18N
279 
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()
285  .addContainerGap()
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)
297  .addGap(0, 0, 0)
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)
307  .addGap(18, 18, 18)
308  .addComponent(pageButtonsLabel)
309  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
310  .addComponent(pagePreviousButton)
311  .addGap(0, 0, 0)
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)
315  .addGap(30, 30, 30))
316  .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
317  );
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))
341  );
342  }// </editor-fold>//GEN-END:initComponents
343  // Variables declaration - do not modify//GEN-BEGIN:variables
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;
363  private javax.swing.JComboBox<org.sleuthkit.autopsy.keywordsearch.IndexedText> sourceComboBox;
364  // End of variables declaration//GEN-END:variables
365 
366  void refreshCurrentMarkup() {
367  IndexedText ms = (IndexedText) sourceComboBox.getSelectedItem();
368  setMarkup(ms);
369  }
370 
377  void setSources(List<IndexedText> sources) {
378  sourceComboBox.removeAllItems();
379  setPanelText(null, false);
380 
381  for (IndexedText ms : sources) {
382  sourceComboBox.addItem(ms);
383  }
384 
385  if (!sources.isEmpty()) {
386  sourceComboBox.setSelectedIndex(0);
387  }
388  }
389 
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));
400  }
401  return sources;
402  }
403 
409  public IndexedText getSelectedSource() {
410  return (IndexedText) sourceComboBox.getSelectedItem();
411  }
412 
413  private void setPanelText(String text, boolean detectDirection) {
414  if (text == null) {
415  text = "";
416  }
417 
418  if (detectDirection) {
419  //detect text direction using first 1024 chars and set it
420  //get first up to 1024 chars, strip <pre> tag and unescape html to get the string on which to detect
421  final int len = text.length();
422  final int prefixLen = "<pre>".length(); //NON-NLS
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);
427  //logger.log(Level.INFO, "ORIENTATION LEFT TO RIGHT: " + direction.isLeftToRight());
428  extractedTextPane.applyComponentOrientation(direction);
429  } else {
430  extractedTextPane.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
431  }
432  } else {
433  extractedTextPane.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
434  }
435 
436  extractedTextPane.setText(text);
437  extractedTextPane.setCaretPosition(0);
438  }
439 
440  private void initControls() {
441  hitPreviousButton.setEnabled(false);
442  hitNextButton.setEnabled(false);
443  }
444 
445  void scrollToAnchor(String anchor) {
446  extractedTextPane.scrollToReference(anchor);
447  }
448 
453  void updateCurrentMatchDisplay(int current) {
454  if (current == 0) {
455  hitCountLabel.setText("-");
456  } else {
457  hitCountLabel.setText(Integer.toString(current));
458  }
459  }
460 
465  void updateTotaMatcheslDisplay(int total) {
466  if (total == 0) {
467  hitTotalLabel.setText("-");
468  } else {
469  hitTotalLabel.setText(Integer.toString(total));
470  }
471  }
472 
477  void updateCurrentPageDisplay(int current) {
478  pageCurLabel.setText(Integer.toString(current));
479  }
480 
485  void updateTotalPageslDisplay(int total) {
486  pageTotalLabel.setText(Integer.toString(total));
487  }
488 
489  void resetDisplay() {
490  resetHitDisplay();
491  resetPagesDisplay();
492  }
493 
497  void resetHitDisplay() {
498  hitTotalLabel.setText("-");
499  hitCountLabel.setText("-");
500  }
501 
505  void resetPagesDisplay() {
506  pageCurLabel.setText("-");
507  pageTotalLabel.setText("-");
508  }
509 
515  void enablePrevMatchControl(boolean enable) {
516  hitPreviousButton.setEnabled(enable);
517  }
518 
524  void enableNextMatchControl(boolean enable) {
525  hitNextButton.setEnabled(enable);
526  }
527 
528  void addPrevMatchControlListener(ActionListener l) {
529  hitPreviousButton.addActionListener(l);
530  }
531 
532  void addNextMatchControlListener(ActionListener l) {
533  hitNextButton.addActionListener(l);
534  }
535 
541  void enablePrevPageControl(boolean enable) {
542  pagePreviousButton.setEnabled(enable);
543  }
544 
550  void enableNextPageControl(boolean enable) {
551  pageNextButton.setEnabled(enable);
552  }
553 
554  void addPrevPageControlListener(ActionListener l) {
555  pagePreviousButton.addActionListener(l);
556  }
557 
558  void addNextPageControlListener(ActionListener l) {
559  pageNextButton.addActionListener(l);
560  }
561 
562  void addSourceComboControlListener(ActionListener l) {
563  sourceComboBox.addActionListener(l);
564  }
565 
571  void updateControls(IndexedText source) {
572  updatePageControls(source);
573  updateSearchControls(source);
574  }
575 
581  void updatePageControls(IndexedText source) {
582  if (source == null) {
583  enableNextPageControl(false);
584  enablePrevPageControl(false);
585  updateCurrentPageDisplay(0);
586  updateTotalPageslDisplay(0);
587  return;
588  }
589 
590  updateCurrentPageDisplay(source.getCurrentPage());
591  int totalPages = source.getNumberPages();
592  updateTotalPageslDisplay(totalPages);
593 
594  if (totalPages == 1) {
595  enableNextPageControl(false);
596  enablePrevPageControl(false);
597  } else {
598  enableNextPageControl(source.hasNextPage());
599  enablePrevPageControl(source.hasPreviousPage());
600  }
601  }
602 
608  void updateSearchControls(IndexedText source) {
609  //setup search controls
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());
615  } else {
616  enableNextMatchControl(false);
617  enablePrevMatchControl(false);
618  updateCurrentMatchDisplay(0);
619  updateTotaMatcheslDisplay(0);
620  }
621  }
622 
628  private void scrollToCurrentHit(final IndexedText source) {
629  if (source == null || !source.isSearchable()) {
630  return;
631  }
632 
633  //scrolling required invokeLater to enqueue in EDT
634  EventQueue.invokeLater(() -> scrollToAnchor(source.getAnchorPrefix() + source.currentItem()));
635 
636  }
637 
643  private void setMarkup(IndexedText source) {
644  setPanelText(NbBundle.getMessage(this.getClass(), "ExtractedContentPanel.setMarkup.panelTxt"), false);
645  new SetMarkupWorker(source).execute();
646  }
647 
653  private final class SetMarkupWorker extends SwingWorker<String, Void> {
654 
655  private final IndexedText source;
656 
657  private ProgressHandle progress;
658 
659  SetMarkupWorker(IndexedText source) {
660  this.source = source;
661  }
662 
663  @Override
664  protected String doInBackground() throws Exception {
665  progress = ProgressHandle.createHandle(NbBundle.getMessage(this.getClass(), "ExtractedContentPanel.SetMarkup.progress.loading"));
666  progress.setDisplayName(NbBundle.getMessage(this.getClass(), "ExtractedContentPanel.SetMarkup.progress.displayName"));
667  progress.start();
668  progress.switchToIndeterminate();
669 
670  return source.getText();
671  }
672 
673  @NbBundle.Messages({
674  "ExtractedContentPanel.SetMarkup.error=There was an error getting the text for the selected source."})
675  @Override
676  protected void done() {
677  super.done();
678  progress.finish();
679 
680  // see if there are any errors
681  try {
682  String markup = get();
683  if (markup != null) {
684  setPanelText(markup, true);
685  } else {
686  setPanelText("", false);
687  }
688 
689  } catch (InterruptedException | ExecutionException ex) {
690  logger.log(Level.SEVERE, "Error getting marked up text", ex); //NON-NLS
691  setPanelText(Bundle.ExtractedContentPanel_SetMarkup_error(), true);
692  } // catch and ignore if we were cancelled
693  catch (java.util.concurrent.CancellationException ex) {
694  }
695 
696  updateControls(source);
697 
698  scrollToCurrentHit(source);
699  }
700  }
701 }

Copyright © 2012-2016 Basis Technology. Generated on: Tue Jun 13 2017
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.