Autopsy  4.15.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
ResultsPanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy
3  *
4  * Copyright 2019-2020 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.discovery;
20 
21 import com.google.common.eventbus.Subscribe;
22 import java.awt.Cursor;
23 import java.awt.Image;
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.DefaultComboBoxModel;
31 import javax.swing.JOptionPane;
32 import javax.swing.SwingUtilities;
33 import javax.swing.SwingWorker;
34 import org.openide.util.NbBundle.Messages;
39 import org.sleuthkit.datamodel.AbstractFile;
42 
47 final class ResultsPanel extends javax.swing.JPanel {
48 
49  private static final long serialVersionUID = 1L;
50  private final static Logger logger = Logger.getLogger(ResultsPanel.class.getName());
51  private final VideoThumbnailViewer videoThumbnailViewer;
52  private final ImageThumbnailViewer imageThumbnailViewer;
53  private final DocumentPreviewViewer documentPreviewViewer;
54  private List<FileSearchFiltering.FileFilter> searchFilters;
55  private FileSearch.AttributeType groupingAttribute;
56  private FileGroup.GroupSortingAlgorithm groupSort;
57  private FileSorter.SortingMethod fileSortMethod;
58  private GroupKey selectedGroupKey;
59  private int currentPage = 0;
60  private int previousPageSize = 10;
61  private FileSearchData.FileType resultType;
62  private int groupSize = 0;
63  private PageWorker pageWorker;
64  private final List<SwingWorker<Void, Void>> resultContentWorkers = new ArrayList<>();
65 
69  @Messages({"ResultsPanel.viewFileInDir.name=View File in Directory",
70  "ResultsPanel.openInExternalViewer.name=Open in External Viewer"})
71  ResultsPanel() {
72  initComponents();
73  imageThumbnailViewer = new ImageThumbnailViewer();
74  videoThumbnailViewer = new VideoThumbnailViewer();
75  documentPreviewViewer = new DocumentPreviewViewer();
76  videoThumbnailViewer.addListSelectionListener((e) -> {
77  if (resultType == FileSearchData.FileType.VIDEO) {
78  if (!e.getValueIsAdjusting()) {
79  //send populateMesage
80  DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.PopulateInstancesListEvent(getInstancesForSelected()));
81  } else {
82  //send clearSelection message
83  DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.ClearInstanceSelectionEvent());
84  }
85  }
86  });
87  imageThumbnailViewer.addListSelectionListener((e) -> {
88  if (resultType == FileSearchData.FileType.IMAGE) {
89  if (!e.getValueIsAdjusting()) {
90  //send populateMesage
91  DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.PopulateInstancesListEvent(getInstancesForSelected()));
92  } else {
93  //send clearSelection message
94  DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.ClearInstanceSelectionEvent());
95  }
96 
97  }
98  });
99  documentPreviewViewer.addListSelectionListener((e) -> {
100  if (resultType == FileSearchData.FileType.DOCUMENTS) {
101  if (!e.getValueIsAdjusting()) {
102  //send populateMesage
103  DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.PopulateInstancesListEvent(getInstancesForSelected()));
104  } else {
105  //send clearSelection message
106  DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.ClearInstanceSelectionEvent());
107  }
108  }
109  });
110  }
111 
119  private List<AbstractFile> getInstancesForSelected() {
120  if (null != resultType) {
121  switch (resultType) {
122  case VIDEO:
123  return videoThumbnailViewer.getInstancesForSelected();
124  case IMAGE:
125  return imageThumbnailViewer.getInstancesForSelected();
126  case DOCUMENTS:
127  return documentPreviewViewer.getInstancesForSelected();
128  default:
129  break;
130  }
131  }
132  return new ArrayList<>();
133  }
134 
140  @Subscribe
141  void handleSearchStartedEvent(DiscoveryEventUtils.SearchStartedEvent searchStartedEvent) {
142  SwingUtilities.invokeLater(() -> {
143  setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
144  });
145  }
146 
152  @Subscribe
153  void handlePageRetrievedEvent(DiscoveryEventUtils.PageRetrievedEvent pageRetrievedEvent) {
154  SwingUtilities.invokeLater(() -> {
155  //send populateMesage
156  DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.PopulateInstancesListEvent(getInstancesForSelected()));
157 
158  currentPage = pageRetrievedEvent.getPageNumber();
159  updateControls();
160  resetResultViewer();
161  if (null != pageRetrievedEvent.getType()) {
162  switch (pageRetrievedEvent.getType()) {
163  case IMAGE:
164  populateImageViewer(pageRetrievedEvent.getSearchResults());
165  resultsViewerPanel.add(imageThumbnailViewer);
166  break;
167  case VIDEO:
168  populateVideoViewer(pageRetrievedEvent.getSearchResults());
169  resultsViewerPanel.add(videoThumbnailViewer);
170  break;
171  case DOCUMENTS:
172  populateDocumentViewer(pageRetrievedEvent.getSearchResults());
173  resultsViewerPanel.add(documentPreviewViewer);
174  break;
175  default:
176  break;
177  }
178  }
179  resultsViewerPanel.revalidate();
180  resultsViewerPanel.repaint();
181  }
182  );
183  }
184 
189  synchronized void resetResultViewer() {
190  resultsViewerPanel.remove(imageThumbnailViewer);
191  resultsViewerPanel.remove(videoThumbnailViewer);
192  resultsViewerPanel.remove(documentPreviewViewer);
193  //cancel any unfished thumb workers
194  for (SwingWorker<Void, Void> thumbWorker : resultContentWorkers) {
195  if (!thumbWorker.isDone()) {
196  thumbWorker.cancel(true);
197  }
198  }
199  //clear old thumbnails
200  resultContentWorkers.clear();
201  videoThumbnailViewer.clearViewer();
202  imageThumbnailViewer.clearViewer();
203  documentPreviewViewer.clearViewer();
204  }
205 
212  synchronized void populateVideoViewer(List<ResultFile> files) {
213  for (ResultFile file : files) {
214  VideoThumbnailWorker thumbWorker = new VideoThumbnailWorker(file);
215  thumbWorker.execute();
216  //keep track of thumb worker for possible cancelation
217  resultContentWorkers.add(thumbWorker);
218  }
219  }
220 
227  synchronized void populateImageViewer(List<ResultFile> files) {
228  for (ResultFile file : files) {
229  ImageThumbnailWorker thumbWorker = new ImageThumbnailWorker(file);
230  thumbWorker.execute();
231  //keep track of thumb worker for possible cancelation
232  resultContentWorkers.add(thumbWorker);
233  }
234  }
235 
242  synchronized void populateDocumentViewer(List<ResultFile> files) {
243  for (ResultFile file : files) {
244  DocumentPreviewWorker documentWorker = new DocumentPreviewWorker(file);
245  documentWorker.execute();
246  //keep track of thumb worker for possible cancelation
247  resultContentWorkers.add(documentWorker);
248  }
249  }
250 
256  @Subscribe
257  void handleGroupSelectedEvent(DiscoveryEventUtils.GroupSelectedEvent groupSelectedEvent) {
258  SwingUtilities.invokeLater(() -> {
259  searchFilters = groupSelectedEvent.getFilters();
260  groupingAttribute = groupSelectedEvent.getGroupingAttr();
261  groupSort = groupSelectedEvent.getGroupSort();
262  fileSortMethod = groupSelectedEvent.getFileSort();
263  selectedGroupKey = groupSelectedEvent.getGroupKey();
264  resultType = groupSelectedEvent.getResultType();
265  groupSize = groupSelectedEvent.getGroupSize();
266  setPage(0);
267  });
268  }
269 
276  @Subscribe
277  void handleNoResultsEvent(DiscoveryEventUtils.NoResultsEvent noResultsEvent) {
278  SwingUtilities.invokeLater(() -> {
279  groupSize = 0;
280  currentPage = 0;
281  updateControls();
282  videoThumbnailViewer.clearViewer();
283  imageThumbnailViewer.clearViewer();
284  documentPreviewViewer.clearViewer();
285  resultsViewerPanel.revalidate();
286  resultsViewerPanel.repaint();
287  });
288  }
289 
295  @Subscribe
296  void handleSearchCompleteEvent(DiscoveryEventUtils.SearchCompleteEvent searchCompleteEvent) {
297  SwingUtilities.invokeLater(() -> {
298  setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
299  });
300  }
301 
308  @Subscribe
309  private synchronized void setPage(int startingEntry
310  ) {
311  int pageSize = pageSizeComboBox.getItemAt(pageSizeComboBox.getSelectedIndex());
312  synchronized (this) {
313  if (pageWorker != null && !pageWorker.isDone()) {
314  pageWorker.cancel(true);
315  }
316  CentralRepository centralRepo = null;
317  if (CentralRepository.isEnabled()) {
318  try {
319  centralRepo = CentralRepository.getInstance();
320  } catch (CentralRepoException ex) {
321  centralRepo = null;
322  logger.log(Level.SEVERE, "Error loading central repository database, no central repository options will be available for Discovery", ex);
323  }
324  }
325  if (groupSize != 0) {
326  pageWorker = new PageWorker(searchFilters, groupingAttribute, groupSort, fileSortMethod, selectedGroupKey, startingEntry, pageSize, resultType, centralRepo);
327  pageWorker.execute();
328  } else {
329  SwingUtilities.invokeLater(() -> {
330  pageSizeComboBox.setEnabled(true);
331  });
332  }
333  }
334  }
335 
339  @Messages({"# {0} - currentPage",
340  "# {1} - totalPages",
341  "ResultsPanel.currentPage.displayValue=Page: {0} of {1}"})
342  private void updateControls() {
343  previousPageSize = pageSizeComboBox.getItemAt(pageSizeComboBox.getSelectedIndex());
344  int pageSize = pageSizeComboBox.getItemAt(pageSizeComboBox.getSelectedIndex());
345  //handle edge case where group size is 0 and we want the empty results to be labeled paged 1 of 1 not page 1 of 0
346  double maxPageDouble = groupSize == 0 ? 1 : Math.ceil((double) groupSize / pageSize);
347  currentPageLabel.setText(Bundle.ResultsPanel_currentPage_displayValue(currentPage + 1, maxPageDouble));
348  previousPageButton.setEnabled(currentPage != 0);
349  nextPageButton.setEnabled(groupSize > ((currentPage + 1) * pageSize));
350  gotoPageField.setEnabled(groupSize > pageSize);
351  pageSizeComboBox.setEnabled(true);
352  }
353 
359  @SuppressWarnings("unchecked")
360  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
361  private void initComponents() {
362  java.awt.GridBagConstraints gridBagConstraints;
363 
364  javax.swing.JPanel pagingPanel = new javax.swing.JPanel();
365  previousPageButton = new javax.swing.JButton();
366  currentPageLabel = new javax.swing.JLabel();
367  nextPageButton = new javax.swing.JButton();
368  javax.swing.JLabel pageControlsLabel = new javax.swing.JLabel();
369  javax.swing.JLabel gotoPageLabel = new javax.swing.JLabel();
370  gotoPageField = new javax.swing.JTextField();
371  javax.swing.JLabel pageSizeLabel = new javax.swing.JLabel();
372  pageSizeComboBox = new javax.swing.JComboBox<>();
373  javax.swing.Box.Filler filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0));
374  javax.swing.Box.Filler filler2 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0));
375  javax.swing.Box.Filler filler3 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0));
376  javax.swing.Box.Filler filler4 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0));
377  resultsViewerPanel = new javax.swing.JPanel();
378 
379  setMinimumSize(new java.awt.Dimension(700, 200));
380  setPreferredSize(new java.awt.Dimension(700, 700));
381  setLayout(new java.awt.BorderLayout());
382 
383  pagingPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
384  pagingPanel.setMinimumSize(new java.awt.Dimension(400, 39));
385  pagingPanel.setPreferredSize(new java.awt.Dimension(700, 39));
386  pagingPanel.setLayout(new java.awt.GridBagLayout());
387 
388  previousPageButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back.png"))); // NOI18N
389  previousPageButton.setBorder(null);
390  previousPageButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png"))); // NOI18N
391  previousPageButton.setEnabled(false);
392  previousPageButton.setFocusable(false);
393  previousPageButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back_hover.png"))); // NOI18N
394  previousPageButton.addActionListener(new java.awt.event.ActionListener() {
395  public void actionPerformed(java.awt.event.ActionEvent evt) {
396  previousPageButtonActionPerformed(evt);
397  }
398  });
399  gridBagConstraints = new java.awt.GridBagConstraints();
400  gridBagConstraints.gridx = 3;
401  gridBagConstraints.gridy = 0;
402  gridBagConstraints.gridheight = 2;
403  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
404  gridBagConstraints.insets = new java.awt.Insets(6, 12, 6, 0);
405  pagingPanel.add(previousPageButton, gridBagConstraints);
406 
407  org.openide.awt.Mnemonics.setLocalizedText(currentPageLabel, org.openide.util.NbBundle.getMessage(ResultsPanel.class, "ResultsPanel.currentPageLabel.text")); // NOI18N
408  currentPageLabel.setMaximumSize(new java.awt.Dimension(190, 23));
409  currentPageLabel.setMinimumSize(new java.awt.Dimension(90, 23));
410  currentPageLabel.setPreferredSize(new java.awt.Dimension(100, 23));
411  gridBagConstraints = new java.awt.GridBagConstraints();
412  gridBagConstraints.gridx = 0;
413  gridBagConstraints.gridy = 0;
414  gridBagConstraints.gridheight = 2;
415  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
416  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
417  gridBagConstraints.insets = new java.awt.Insets(6, 14, 6, 0);
418  pagingPanel.add(currentPageLabel, gridBagConstraints);
419 
420  nextPageButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png"))); // NOI18N
421  nextPageButton.setBorder(null);
422  nextPageButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward_disabled.png"))); // NOI18N
423  nextPageButton.setEnabled(false);
424  nextPageButton.setFocusable(false);
425  nextPageButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward_hover.png"))); // NOI18N
426  nextPageButton.addActionListener(new java.awt.event.ActionListener() {
427  public void actionPerformed(java.awt.event.ActionEvent evt) {
428  nextPageButtonActionPerformed(evt);
429  }
430  });
431  gridBagConstraints = new java.awt.GridBagConstraints();
432  gridBagConstraints.gridx = 4;
433  gridBagConstraints.gridy = 0;
434  gridBagConstraints.gridheight = 2;
435  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
436  gridBagConstraints.insets = new java.awt.Insets(6, 0, 6, 0);
437  pagingPanel.add(nextPageButton, gridBagConstraints);
438 
439  pageControlsLabel.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
440  org.openide.awt.Mnemonics.setLocalizedText(pageControlsLabel, org.openide.util.NbBundle.getMessage(ResultsPanel.class, "ResultsPanel.pageControlsLabel.text")); // NOI18N
441  pageControlsLabel.setMaximumSize(new java.awt.Dimension(133, 23));
442  pageControlsLabel.setMinimumSize(new java.awt.Dimension(33, 23));
443  pageControlsLabel.setPreferredSize(new java.awt.Dimension(60, 23));
444  gridBagConstraints = new java.awt.GridBagConstraints();
445  gridBagConstraints.gridx = 2;
446  gridBagConstraints.gridy = 0;
447  gridBagConstraints.gridheight = 2;
448  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
449  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
450  gridBagConstraints.insets = new java.awt.Insets(6, 18, 6, 0);
451  pagingPanel.add(pageControlsLabel, gridBagConstraints);
452 
453  gotoPageLabel.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
454  org.openide.awt.Mnemonics.setLocalizedText(gotoPageLabel, org.openide.util.NbBundle.getMessage(ResultsPanel.class, "ResultsPanel.gotoPageLabel.text")); // NOI18N
455  gotoPageLabel.setMaximumSize(new java.awt.Dimension(170, 23));
456  gotoPageLabel.setMinimumSize(new java.awt.Dimension(70, 23));
457  gotoPageLabel.setPreferredSize(new java.awt.Dimension(100, 23));
458  gridBagConstraints = new java.awt.GridBagConstraints();
459  gridBagConstraints.gridx = 6;
460  gridBagConstraints.gridy = 0;
461  gridBagConstraints.gridheight = 2;
462  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
463  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
464  gridBagConstraints.insets = new java.awt.Insets(6, 18, 6, 0);
465  pagingPanel.add(gotoPageLabel, gridBagConstraints);
466 
467  gotoPageField.setEnabled(false);
468  gotoPageField.setMinimumSize(new java.awt.Dimension(30, 22));
469  gotoPageField.setName(""); // NOI18N
470  gotoPageField.setPreferredSize(new java.awt.Dimension(26, 22));
471  gotoPageField.addActionListener(new java.awt.event.ActionListener() {
472  public void actionPerformed(java.awt.event.ActionEvent evt) {
473  gotoPageFieldActionPerformed(evt);
474  }
475  });
476  gridBagConstraints = new java.awt.GridBagConstraints();
477  gridBagConstraints.gridx = 7;
478  gridBagConstraints.gridy = 0;
479  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
480  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
481  gridBagConstraints.insets = new java.awt.Insets(6, 5, 0, 0);
482  pagingPanel.add(gotoPageField, gridBagConstraints);
483 
484  pageSizeLabel.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
485  org.openide.awt.Mnemonics.setLocalizedText(pageSizeLabel, org.openide.util.NbBundle.getMessage(ResultsPanel.class, "ResultsPanel.pageSizeLabel.text")); // NOI18N
486  pageSizeLabel.setMaximumSize(new java.awt.Dimension(160, 23));
487  pageSizeLabel.setMinimumSize(new java.awt.Dimension(60, 23));
488  pageSizeLabel.setPreferredSize(new java.awt.Dimension(90, 23));
489  gridBagConstraints = new java.awt.GridBagConstraints();
490  gridBagConstraints.gridx = 9;
491  gridBagConstraints.gridy = 0;
492  gridBagConstraints.gridheight = 2;
493  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
494  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
495  gridBagConstraints.insets = new java.awt.Insets(6, 18, 6, 0);
496  pagingPanel.add(pageSizeLabel, gridBagConstraints);
497 
498  pageSizeComboBox.setModel(new DefaultComboBoxModel<Integer>(new Integer[] {25,50,75,100,125,150,175,200}));
499  pageSizeComboBox.setSelectedIndex(3);
500  pageSizeComboBox.addItemListener(new java.awt.event.ItemListener() {
501  public void itemStateChanged(java.awt.event.ItemEvent evt) {
502  pageSizeChanged(evt);
503  }
504  });
505  gridBagConstraints = new java.awt.GridBagConstraints();
506  gridBagConstraints.gridx = 10;
507  gridBagConstraints.gridy = 0;
508  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
509  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
510  gridBagConstraints.insets = new java.awt.Insets(6, 5, 0, 277);
511  pagingPanel.add(pageSizeComboBox, gridBagConstraints);
512  gridBagConstraints = new java.awt.GridBagConstraints();
513  gridBagConstraints.gridx = 11;
514  gridBagConstraints.gridy = 0;
515  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
516  gridBagConstraints.weightx = 0.1;
517  pagingPanel.add(filler1, gridBagConstraints);
518  gridBagConstraints = new java.awt.GridBagConstraints();
519  gridBagConstraints.gridx = 1;
520  gridBagConstraints.gridy = 0;
521  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
522  pagingPanel.add(filler2, gridBagConstraints);
523  gridBagConstraints = new java.awt.GridBagConstraints();
524  gridBagConstraints.gridx = 5;
525  gridBagConstraints.gridy = 0;
526  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
527  pagingPanel.add(filler3, gridBagConstraints);
528  gridBagConstraints = new java.awt.GridBagConstraints();
529  gridBagConstraints.gridx = 8;
530  gridBagConstraints.gridy = 0;
531  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
532  pagingPanel.add(filler4, gridBagConstraints);
533 
534  add(pagingPanel, java.awt.BorderLayout.PAGE_START);
535 
536  resultsViewerPanel.setMinimumSize(new java.awt.Dimension(0, 160));
537  resultsViewerPanel.setPreferredSize(new java.awt.Dimension(700, 700));
538  resultsViewerPanel.setLayout(new java.awt.BorderLayout());
539  add(resultsViewerPanel, java.awt.BorderLayout.CENTER);
540  }// </editor-fold>//GEN-END:initComponents
541 
547  private void previousPageButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_previousPageButtonActionPerformed
548  if (currentPage > 0) {
549  disablePagingControls();
550  int previousPage = currentPage - 1;
551  int pageSize = pageSizeComboBox.getItemAt(pageSizeComboBox.getSelectedIndex());
552  setPage(previousPage * pageSize);
553  }
554  }//GEN-LAST:event_previousPageButtonActionPerformed
555 
561  private void nextPageButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nextPageButtonActionPerformed
562  disablePagingControls();
563  int nextPage = currentPage + 1;
564  int pageSize = pageSizeComboBox.getItemAt(pageSizeComboBox.getSelectedIndex());
565  setPage(nextPage * pageSize);
566  }//GEN-LAST:event_nextPageButtonActionPerformed
567 
573  @Messages({"# {0} - selectedPage",
574  "# {1} - maxPage",
575  "ResultsPanel.invalidPageNumber.message=The selected page number {0} does not exist. Please select a value from 1 to {1}.",
576  "ResultsPanel.invalidPageNumber.title=Invalid Page Number"})
577  private void gotoPageFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_gotoPageFieldActionPerformed
578  int newPage;
579  try {
580  newPage = Integer.parseInt(gotoPageField.getText());
581  } catch (NumberFormatException e) {
582  //ignore input
583  return;
584  }
585  int pageSize = pageSizeComboBox.getItemAt(pageSizeComboBox.getSelectedIndex());
586  if ((newPage - 1) < 0 || groupSize <= ((newPage - 1) * pageSize)) {
587  JOptionPane.showMessageDialog(this,
588  Bundle.ResultsPanel_invalidPageNumber_message(newPage, Math.ceil((double) groupSize / pageSize)),
589  Bundle.ResultsPanel_invalidPageNumber_title(),
590  JOptionPane.WARNING_MESSAGE);
591  return;
592  }
593  disablePagingControls();
594  setPage((newPage - 1) * pageSize);
595  }//GEN-LAST:event_gotoPageFieldActionPerformed
596 
597  private void pageSizeChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_pageSizeChanged
598  if (evt.getStateChange() == ItemEvent.SELECTED) {
599  disablePagingControls();
600  int previousPage = currentPage - 1;
601  int pageSize = pageSizeComboBox.getItemAt(pageSizeComboBox.getSelectedIndex());
602  if (previousPageSize != pageSize) {
603  previousPage = 0;
604  }
605  setPage(previousPage * pageSize);
606  }
607  }//GEN-LAST:event_pageSizeChanged
608 
612  private void disablePagingControls() {
613  nextPageButton.setEnabled(false);
614  previousPageButton.setEnabled(false);
615  gotoPageField.setEnabled(false);
616  pageSizeComboBox.setEnabled(false);
617  }
618 
619  // Variables declaration - do not modify//GEN-BEGIN:variables
620  private javax.swing.JLabel currentPageLabel;
621  private javax.swing.JTextField gotoPageField;
622  private javax.swing.JButton nextPageButton;
623  private javax.swing.JComboBox<Integer> pageSizeComboBox;
624  private javax.swing.JButton previousPageButton;
625  private javax.swing.JPanel resultsViewerPanel;
626  // End of variables declaration//GEN-END:variables
627 
632  private class VideoThumbnailWorker extends SwingWorker<Void, Void> {
633 
634  private final VideoThumbnailsWrapper thumbnailWrapper;
635 
642  VideoThumbnailWorker(ResultFile file) {
643  thumbnailWrapper = new VideoThumbnailsWrapper(file);
644  videoThumbnailViewer.addVideo(thumbnailWrapper);
645  }
646 
647  @Override
648  protected Void doInBackground() throws Exception {
649  FileSearch.getVideoThumbnails(thumbnailWrapper);
650  return null;
651  }
652 
653  @Override
654  protected void done() {
655  try {
656  get();
657  } catch (InterruptedException | ExecutionException ex) {
658  logger.log(Level.WARNING, "Video Worker Exception for file: " + thumbnailWrapper.getResultFile().getFirstInstance().getId(), ex);
659  } catch (CancellationException ignored) {
660  //we want to do nothing in response to this since we allow it to be cancelled
661  }
662  videoThumbnailViewer.repaint();
663  }
664  }
665 
670  private class ImageThumbnailWorker extends SwingWorker<Void, Void> {
671 
672  private final ImageThumbnailWrapper thumbnailWrapper;
673 
680  ImageThumbnailWorker(ResultFile file) {
681  thumbnailWrapper = new ImageThumbnailWrapper(file);
682  imageThumbnailViewer.addImage(thumbnailWrapper);
683  }
684 
685  @Override
686  protected Void doInBackground() throws Exception {
687  Image thumbnail = ImageUtils.getThumbnail(thumbnailWrapper.getResultFile().getFirstInstance(), ImageUtils.ICON_SIZE_LARGE);
688  if (thumbnail != null) {
689  thumbnailWrapper.setImageThumbnail(thumbnail);
690  }
691  return null;
692  }
693 
694  @Override
695  protected void done() {
696  try {
697  get();
698  } catch (InterruptedException | ExecutionException ex) {
699  logger.log(Level.WARNING, "Image Worker Exception for file: " + thumbnailWrapper.getResultFile().getFirstInstance().getId(), ex);
700  } catch (CancellationException ignored) {
701  //we want to do nothing in response to this since we allow it to be cancelled
702  }
703  imageThumbnailViewer.repaint();
704  }
705 
706  }
707 
712  private class DocumentPreviewWorker extends SwingWorker<Void, Void> {
713 
714  private final DocumentWrapper documentWrapper;
715 
722  DocumentPreviewWorker(ResultFile file) {
723  documentWrapper = new DocumentWrapper(file);
724  documentPreviewViewer.addDocument(documentWrapper);
725  }
726 
727  @Messages({"ResultsPanel.unableToCreate.text=Unable to create summary."})
728  @Override
729  protected Void doInBackground() throws Exception {
730  TextSummary preview = FileSearch.summarize(documentWrapper.getResultFile().getFirstInstance());
731  if (preview == null) {
732  preview = new TextSummary(Bundle.ResultsPanel_unableToCreate_text(), null, 0);
733  }
734  documentWrapper.setSummary(preview);
735  return null;
736  }
737 
738  @Messages({"ResultsPanel.documentPreview.text=Document preview creation cancelled."})
739  @Override
740  protected void done() {
741  try {
742  get();
743  } catch (InterruptedException | ExecutionException ex) {
744  documentWrapper.setSummary(new TextSummary(ex.getMessage(), null, 0));
745  logger.log(Level.WARNING, "Document Worker Exception", ex);
746  } catch (CancellationException ignored) {
747  documentWrapper.setSummary(new TextSummary(Bundle.ResultsPanel_documentPreview_text(), null, 0));
748  //we want to do nothing in response to this since we allow it to be cancelled
749  }
750  documentPreviewViewer.repaint();
751  }
752 
753  }
754 
755 }
static BufferedImage getThumbnail(Content content, int iconSize)

Copyright © 2012-2020 Basis Technology. Generated on: Mon Jul 6 2020
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.