19 package org.sleuthkit.autopsy.corecomponents;
21 import java.awt.Color;
22 import java.awt.Cursor;
23 import java.awt.Dialog;
24 import java.awt.EventQueue;
25 import java.beans.PropertyChangeEvent;
26 import java.beans.PropertyChangeListener;
27 import java.util.List;
29 import java.util.concurrent.ExecutionException;
30 import java.util.function.Function;
31 import java.util.logging.Level;
32 import java.util.prefs.Preferences;
33 import java.util.stream.Collectors;
34 import javax.swing.JOptionPane;
35 import javax.swing.ListSelectionModel;
36 import javax.swing.SortOrder;
37 import javax.swing.SwingWorker;
38 import org.apache.commons.lang3.StringUtils;
39 import org.netbeans.api.progress.ProgressHandle;
40 import org.openide.DialogDescriptor;
41 import org.openide.DialogDisplayer;
42 import org.openide.NotifyDescriptor;
43 import org.openide.explorer.ExplorerManager;
44 import org.openide.nodes.AbstractNode;
45 import org.openide.nodes.Children;
46 import org.openide.nodes.Node;
47 import org.openide.nodes.NodeEvent;
48 import org.openide.nodes.NodeListener;
49 import org.openide.nodes.NodeMemberEvent;
50 import org.openide.nodes.NodeReorderEvent;
51 import org.openide.util.NbBundle;
52 import org.openide.util.NbPreferences;
53 import org.openide.util.lookup.ServiceProvider;
73 @ServiceProvider(service = DataResultViewer.class)
74 @SuppressWarnings(
"PMD.SingularField")
77 private static final long serialVersionUID = 1L;
109 "DataResultViewerThumbnail.thumbnailSizeComboBox.small=Small Thumbnails",
110 "DataResultViewerThumbnail.thumbnailSizeComboBox.medium=Medium Thumbnails",
111 "DataResultViewerThumbnail.thumbnailSizeComboBox.large=Large Thumbnails"
114 super(explorerManager);
116 iconView.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
117 thumbnailSizeComboBox.setModel(
new javax.swing.DefaultComboBoxModel<>(
new String[]{
118 Bundle.DataResultViewerThumbnail_thumbnailSizeComboBox_small(),
119 Bundle.DataResultViewerThumbnail_thumbnailSizeComboBox_medium(),
120 Bundle.DataResultViewerThumbnail_thumbnailSizeComboBox_large()}));
121 thumbnailSizeComboBox.setSelectedIndex(1);
124 currentPageImages = 0;
129 buttonBarPanel.setLayout(
new WrapLayout(java.awt.FlowLayout.LEFT));
137 @SuppressWarnings(
"unchecked")
139 private
void initComponents() {
140 java.awt.GridBagConstraints gridBagConstraints;
142 buttonBarPanel =
new javax.swing.JPanel();
143 pagesPanel =
new javax.swing.JPanel();
144 pageNumberPane =
new javax.swing.JPanel();
145 pageLabel =
new javax.swing.JLabel();
146 pageNumLabel =
new javax.swing.JLabel();
147 pageButtonPanel =
new javax.swing.JPanel();
148 pagesLabel =
new javax.swing.JLabel();
149 pagePrevButton =
new javax.swing.JButton();
150 pageNextButton =
new javax.swing.JButton();
151 pageGotoPane =
new javax.swing.JPanel();
152 goToPageLabel =
new javax.swing.JLabel();
153 goToPageField =
new javax.swing.JTextField();
154 imagePane =
new javax.swing.JPanel();
155 imagesLabel =
new javax.swing.JLabel();
156 imagesRangeLabel =
new javax.swing.JLabel();
157 thumbnailSizeComboBox =
new javax.swing.JComboBox<>();
158 sortPane =
new javax.swing.JPanel();
159 sortLabel =
new javax.swing.JLabel();
160 sortButton =
new javax.swing.JButton();
161 filePathLabel =
new javax.swing.JLabel();
162 iconView =
new org.openide.explorer.view.IconView();
164 setLayout(
new java.awt.BorderLayout());
166 buttonBarPanel.setLayout(
new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));
168 pagesPanel.setLayout(
new java.awt.GridBagLayout());
170 pageNumberPane.setLayout(
new java.awt.GridBagLayout());
173 gridBagConstraints =
new java.awt.GridBagConstraints();
174 gridBagConstraints.gridx = 0;
175 gridBagConstraints.gridy = 0;
176 gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
177 gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
178 gridBagConstraints.weighty = 1.0;
179 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 0, 9);
180 pageNumberPane.add(pageLabel, gridBagConstraints);
182 pageNumLabel.setText(
org.openide.util.NbBundle.getMessage(
DataResultViewerThumbnail.class,
"DataResultViewerThumbnail.pageNumLabel.text"));
183 gridBagConstraints =
new java.awt.GridBagConstraints();
184 gridBagConstraints.gridx = 1;
185 gridBagConstraints.gridy = 0;
186 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
187 gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
188 gridBagConstraints.weightx = 1.0;
189 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 0, 15);
190 pageNumberPane.add(pageNumLabel, gridBagConstraints);
192 gridBagConstraints =
new java.awt.GridBagConstraints();
193 gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
194 gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
195 pagesPanel.add(pageNumberPane, gridBagConstraints);
197 buttonBarPanel.add(pagesPanel);
199 pageButtonPanel.setLayout(
new java.awt.GridBagLayout());
202 gridBagConstraints =
new java.awt.GridBagConstraints();
203 gridBagConstraints.gridx = 0;
204 gridBagConstraints.gridy = 0;
205 gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
206 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
207 gridBagConstraints.weighty = 1.0;
208 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 0, 9);
209 pageButtonPanel.add(pagesLabel, gridBagConstraints);
211 pagePrevButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back.png")));
212 pagePrevButton.setText(
org.openide.util.NbBundle.getMessage(
DataResultViewerThumbnail.class,
"DataResultViewerThumbnail.pagePrevButton.text"));
213 pagePrevButton.setBorder(null);
214 pagePrevButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png")));
215 pagePrevButton.setFocusable(
false);
216 pagePrevButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
217 pagePrevButton.setMargin(
new java.awt.Insets(0, 0, 0, 0));
218 pagePrevButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back_hover.png")));
219 pagePrevButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
220 pagePrevButton.addActionListener(
new java.awt.event.ActionListener() {
221 public void actionPerformed(java.awt.event.ActionEvent evt) {
222 pagePrevButtonActionPerformed(evt);
225 gridBagConstraints =
new java.awt.GridBagConstraints();
226 gridBagConstraints.gridx = 1;
227 gridBagConstraints.gridy = 0;
228 gridBagConstraints.gridheight = 2;
229 gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
230 pageButtonPanel.add(pagePrevButton, gridBagConstraints);
232 pageNextButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png")));
233 pageNextButton.setText(
org.openide.util.NbBundle.getMessage(
DataResultViewerThumbnail.class,
"DataResultViewerThumbnail.pageNextButton.text"));
234 pageNextButton.setBorder(null);
235 pageNextButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_forward_disabled.png")));
236 pageNextButton.setFocusable(
false);
237 pageNextButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
238 pageNextButton.setMargin(
new java.awt.Insets(0, 0, 0, 0));
239 pageNextButton.setMaximumSize(
new java.awt.Dimension(27, 23));
240 pageNextButton.setMinimumSize(
new java.awt.Dimension(27, 23));
241 pageNextButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_forward_hover.png")));
242 pageNextButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
243 pageNextButton.addActionListener(
new java.awt.event.ActionListener() {
244 public void actionPerformed(java.awt.event.ActionEvent evt) {
245 pageNextButtonActionPerformed(evt);
248 gridBagConstraints =
new java.awt.GridBagConstraints();
249 gridBagConstraints.gridx = 2;
250 gridBagConstraints.gridy = 0;
251 gridBagConstraints.gridheight = 2;
252 gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
253 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 0, 15);
254 pageButtonPanel.add(pageNextButton, gridBagConstraints);
256 buttonBarPanel.add(pageButtonPanel);
258 pageGotoPane.setLayout(
new java.awt.GridBagLayout());
260 goToPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataResultViewerThumbnail.class,
"DataResultViewerThumbnail.goToPageLabel.text"));
261 gridBagConstraints =
new java.awt.GridBagConstraints();
262 gridBagConstraints.gridx = 0;
263 gridBagConstraints.gridy = 0;
264 gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
265 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
266 gridBagConstraints.weighty = 1.0;
267 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 0, 9);
268 pageGotoPane.add(goToPageLabel, gridBagConstraints);
270 goToPageField.setText(
org.openide.util.NbBundle.getMessage(
DataResultViewerThumbnail.class,
"DataResultViewerThumbnail.goToPageField.text"));
271 goToPageField.addActionListener(
new java.awt.event.ActionListener() {
272 public void actionPerformed(java.awt.event.ActionEvent evt) {
273 goToPageFieldActionPerformed(evt);
276 gridBagConstraints =
new java.awt.GridBagConstraints();
277 gridBagConstraints.gridx = 1;
278 gridBagConstraints.gridy = 0;
279 gridBagConstraints.gridheight = 2;
280 gridBagConstraints.ipadx = 75;
281 gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
282 gridBagConstraints.weightx = 1.0;
283 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 0, 15);
284 pageGotoPane.add(goToPageField, gridBagConstraints);
286 buttonBarPanel.add(pageGotoPane);
288 imagePane.setLayout(
new java.awt.GridBagLayout());
290 imagesLabel.setText(
org.openide.util.NbBundle.getMessage(
DataResultViewerThumbnail.class,
"DataResultViewerThumbnail.imagesLabel.text"));
291 gridBagConstraints =
new java.awt.GridBagConstraints();
292 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 0, 9);
293 imagePane.add(imagesLabel, gridBagConstraints);
295 imagesRangeLabel.setText(
org.openide.util.NbBundle.getMessage(
DataResultViewerThumbnail.class,
"DataResultViewerThumbnail.imagesRangeLabel.text"));
296 gridBagConstraints =
new java.awt.GridBagConstraints();
297 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 0, 15);
298 imagePane.add(imagesRangeLabel, gridBagConstraints);
300 buttonBarPanel.add(imagePane);
302 thumbnailSizeComboBox.addActionListener(
new java.awt.event.ActionListener() {
303 public void actionPerformed(java.awt.event.ActionEvent evt) {
304 thumbnailSizeComboBoxActionPerformed(evt);
307 buttonBarPanel.add(thumbnailSizeComboBox);
309 sortPane.setLayout(
new java.awt.GridBagLayout());
312 gridBagConstraints =
new java.awt.GridBagConstraints();
313 gridBagConstraints.gridx = 1;
314 gridBagConstraints.gridy = 0;
315 gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
316 gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
317 gridBagConstraints.weighty = 1.0;
318 sortPane.add(sortLabel, gridBagConstraints);
321 sortButton.addActionListener(
new java.awt.event.ActionListener() {
322 public void actionPerformed(java.awt.event.ActionEvent evt) {
323 sortButtonActionPerformed(evt);
326 gridBagConstraints =
new java.awt.GridBagConstraints();
327 gridBagConstraints.gridx = 0;
328 gridBagConstraints.gridy = 0;
329 gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
330 gridBagConstraints.insets =
new java.awt.Insets(0, 15, 0, 9);
331 sortPane.add(sortButton, gridBagConstraints);
333 buttonBarPanel.add(sortPane);
335 add(buttonBarPanel, java.awt.BorderLayout.NORTH);
337 filePathLabel.setText(
org.openide.util.NbBundle.getMessage(
DataResultViewerThumbnail.class,
"DataResultViewerThumbnail.filePathLabel.text"));
338 add(filePathLabel, java.awt.BorderLayout.SOUTH);
339 add(iconView, java.awt.BorderLayout.CENTER);
351 goToPage(goToPageField.getText());
356 switch (thumbnailSizeComboBox.getSelectedIndex()) {
369 if (thumbSize != newIconSize) {
370 thumbSize = newIconSize;
371 Node root = this.getExplorerManager().getRootContext();
372 ((ThumbnailViewChildren) root.getChildren()).setThumbsSize(thumbSize);
379 this.getExplorerManager().setExploredContext(root);
385 List<Node.Property<?>> childProperties = ResultViewerPersistence.getAllChildProperties(this.getExplorerManager().getRootContext(), 100);
386 SortChooser sortChooser =
new SortChooser(childProperties, ResultViewerPersistence.loadSortCriteria(rootNode));
387 DialogDescriptor dialogDescriptor =
new DialogDescriptor(sortChooser, sortChooser.getDialogTitle());
388 Dialog createDialog = DialogDisplayer.getDefault().createDialog(dialogDescriptor);
389 createDialog.setVisible(
true);
390 final Object dialogReturnValue = dialogDescriptor.getValue();
391 if (DialogDescriptor.OK_OPTION == dialogReturnValue) {
393 List<SortCriterion> criteria = sortChooser.getCriteria();
396 Map<Node.Property<?>, SortCriterion> criteriaMap = criteria.stream()
397 .collect(Collectors.toMap(SortCriterion::getProperty,
402 int numProperties = childProperties.size();
403 for (
int i = 0; i < numProperties; i++) {
404 Node.Property<?> prop = childProperties.get(i);
405 String propName = prop.getName();
406 SortCriterion criterion = criteriaMap.get(prop);
407 final String columnSortOrderKey = ResultViewerPersistence.getColumnSortOrderKey(rootNode, propName);
408 final String columnSortRankKey = ResultViewerPersistence.getColumnSortRankKey(rootNode, propName);
410 if (criterion != null) {
411 preferences.putBoolean(columnSortOrderKey, criterion.getSortOrder() == SortOrder.ASCENDING);
412 preferences.putInt(columnSortRankKey, criterion.getSortRank() + 1);
414 preferences.remove(columnSortOrderKey);
415 preferences.remove(columnSortRankKey);
449 return (selectedNode != null);
454 setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
455 if (selectionListener == null) {
458 if (rootNodeChildren != null) {
459 rootNodeChildren.cancelLoadingThumbnails();
468 if (givenNode != null && givenNode.getChildren().getNodesCount() > 0) {
475 rootNodeChildren =
new ThumbnailViewChildren(givenNode, thumbSize);
476 final Node root =
new AbstractNode(rootNodeChildren);
478 pageUpdater.setRoot(root);
479 root.addNodeListener(pageUpdater);
480 this.getExplorerManager().setRootContext(root);
483 rootNodeChildren = null;
484 Node emptyNode =
new AbstractNode(Children.LEAF);
485 this.getExplorerManager().setRootContext(emptyNode);
486 iconView.setBackground(Color.BLACK);
489 this.setCursor(null);
495 return NbBundle.getMessage(this.getClass(),
"DataResultViewerThumbnail.title");
505 super.resetComponent();
507 this.currentPage = -1;
508 currentPageImages = 0;
514 this.iconView.removeAll();
515 this.iconView = null;
516 super.clearComponent();
520 if (currentPage < totalPages) {
527 if (currentPage > 1) {
536 newPage = Integer.parseInt(pageNumText);
537 }
catch (NumberFormatException e) {
542 if (newPage > totalPages || newPage < 1) {
543 JOptionPane.showMessageDialog(
this,
544 NbBundle.getMessage(
this.getClass(),
"DataResultViewerThumbnail.goToPageTextField.msgDlg", totalPages),
545 NbBundle.getMessage(
this.getClass(),
"DataResultViewerThumbnail.goToPageTextField.err"),
546 JOptionPane.WARNING_MESSAGE);
550 currentPage = newPage;
556 EventQueue.invokeLater(() -> {
557 setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
561 new SwingWorker<Object, Void>() {
562 private ProgressHandle progress;
565 protected Object doInBackground()
throws Exception {
566 pagePrevButton.setEnabled(
false);
567 pageNextButton.setEnabled(
false);
568 goToPageField.setEnabled(
false);
569 progress = ProgressHandle.createHandle(
570 NbBundle.getMessage(
this.getClass(),
"DataResultViewerThumbnail.genThumbs"));
572 progress.switchToIndeterminate();
574 Node root = explorerManager.getRootContext();
575 Node pageNode = root.getChildren().getNodeAt(currentPage - 1);
576 explorerManager.setExploredContext(pageNode);
577 currentPageImages = pageNode.getChildren().getNodesCount();
582 protected void done() {
589 }
catch (InterruptedException | ExecutionException ex) {
591 =
new NotifyDescriptor.Message(
592 NbBundle.getMessage(
this.getClass(),
"DataResultViewerThumbnail.switchPage.done.errMsg",
594 NotifyDescriptor.ERROR_MESSAGE);
595 DialogDisplayer.getDefault().notify(d);
596 logger.log(Level.SEVERE,
"Error making thumbnails: {0}", ex.getMessage());
598 catch (java.util.concurrent.CancellationException ex) {
607 "# {0} - sort criteria",
"DataResultViewerThumbnail.sortLabel.textTemplate=Sorted by: {0}",
608 "DataResultViewerThumbnail.sortLabel.text=Sorted by: ---"})
610 if (totalPages == 0) {
611 pagePrevButton.setEnabled(
false);
612 pageNextButton.setEnabled(
false);
613 goToPageField.setEnabled(
false);
614 pageNumLabel.setText(
"");
615 imagesRangeLabel.setText(
"");
616 thumbnailSizeComboBox.setEnabled(
false);
617 sortButton.setEnabled(
false);
618 sortLabel.setText(DataResultViewerThumbnail_sortLabel_text());
621 pageNumLabel.setText(NbBundle.getMessage(
this.getClass(),
"DataResultViewerThumbnail.pageNumbers.curOfTotal",
622 Integer.toString(currentPage), Integer.toString(totalPages)));
623 final int imagesFrom = (currentPage - 1) * ThumbnailViewChildren.IMAGES_PER_PAGE + 1;
624 final int imagesTo = currentPageImages + (currentPage - 1) * ThumbnailViewChildren.IMAGES_PER_PAGE;
625 imagesRangeLabel.setText(imagesFrom +
"-" + imagesTo);
627 pageNextButton.setEnabled(!(currentPage == totalPages));
628 pagePrevButton.setEnabled(!(currentPage == 1));
629 goToPageField.setEnabled(totalPages > 1);
630 sortButton.setEnabled(
true);
631 thumbnailSizeComboBox.setEnabled(
true);
632 if (rootNode != null) {
633 String sortString = ResultViewerPersistence.loadSortCriteria(rootNode).stream()
634 .map(SortCriterion::toString)
635 .collect(Collectors.joining(
" "));
636 sortString = StringUtils.defaultIfBlank(sortString,
"---");
637 sortLabel.setText(Bundle.DataResultViewerThumbnail_sortLabel_textTemplate(sortString));
639 sortLabel.setText(DataResultViewerThumbnail_sortLabel_text());
651 void setRoot(Node root) {
661 totalPages = root.getChildren().getNodesCount();
663 if (totalPages == 0) {
669 if (currentPage == -1 || currentPage > totalPages) {
674 final Node pageNode = root.getChildren().getNodeAt(currentPage - 1);
677 if (pageNode != null) {
678 pageNode.addNodeListener(
new NodeListener() {
680 public void childrenAdded(NodeMemberEvent nme) {
681 currentPageImages = pageNode.getChildren().getNodesCount();
686 public void childrenRemoved(NodeMemberEvent nme) {
687 currentPageImages = 0;
692 public void childrenReordered(NodeReorderEvent nre) {
696 public void nodeDestroyed(NodeEvent ne) {
700 public void propertyChange(PropertyChangeEvent evt) {
730 if (evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) {
731 setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
734 if (selectedNodes.length == 1) {
735 AbstractFile af = selectedNodes[0].getLookup().lookup(AbstractFile.class);
737 filePathLabel.setText(
"");
740 String uPath = af.getUniquePath();
741 filePathLabel.setText(uPath);
742 filePathLabel.setToolTipText(uPath);
743 }
catch (TskCoreException e) {
744 logger.log(Level.WARNING,
"Could not get unique path for content: {0}", af.getName());
748 filePathLabel.setText(
"");
javax.swing.JTextField goToPageField
javax.swing.JLabel goToPageLabel
void setNode(Node givenNode)
javax.swing.JLabel pageNumLabel
void propertyChange(PropertyChangeEvent evt)
boolean isSupported(Node selectedNode)
DataResultViewer createInstance()
javax.swing.JPanel pageGotoPane
void pageNextButtonActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JPanel pageNumberPane
javax.swing.JPanel sortPane
void nodeDestroyed(NodeEvent ne)
void childrenAdded(NodeMemberEvent nme)
static final int ICON_SIZE_SMALL
javax.swing.JPanel pageButtonPanel
javax.swing.JPanel pagesPanel
DataResultViewerThumbnail()
javax.swing.JButton pagePrevButton
javax.swing.JPanel imagePane
javax.swing.JLabel filePathLabel
ThumbnailViewChildren rootNodeChildren
javax.swing.JLabel imagesRangeLabel
javax.swing.JComboBox< String > thumbnailSizeComboBox
static final int ICON_SIZE_MEDIUM
DataResultViewerThumbnail(ExplorerManager explorerManager)
org.openide.explorer.view.IconView iconView
javax.swing.JLabel pagesLabel
NodeSelectionListener selectionListener
void sortButtonActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JLabel sortLabel
void childrenRemoved(NodeMemberEvent nme)
void goToPageFieldActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JLabel imagesLabel
javax.swing.JLabel pageLabel
synchronized static Logger getLogger(String name)
javax.swing.JButton pageNextButton
void childrenReordered(NodeReorderEvent nre)
static final int ICON_SIZE_LARGE
javax.swing.JButton sortButton
void pagePrevButtonActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JPanel buttonBarPanel
void thumbnailSizeComboBoxActionPerformed(java.awt.event.ActionEvent evt)
ExplorerManager getExplorerManager()
void goToPage(String pageNumText)
void propertyChange(PropertyChangeEvent evt)