blob: a6c237571f1f0ce5a51cb7f6c838e05539e68526 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * - Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * - Neither the name of Sun Microsystems nor the names of its
16 * contributors may be used to endorse or promote products derived
17 * from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
20 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32/*
33 */
34
35import javax.swing.*;
36import javax.swing.filechooser.*;
37import javax.swing.plaf.FileChooserUI;
38import javax.swing.plaf.basic.BasicFileChooserUI;
39
40import java.awt.*;
41import java.io.File;
42import java.awt.event.*;
43import java.beans.*;
44import java.util.Vector;
45
46import static javax.swing.JFileChooser.*;
47
48/**
49 *
50 * A demo which makes extensive use of the file chooser.
51 *
52 * @author Jeff Dinkins
53 */
54public class FileChooserDemo extends JPanel implements ActionListener {
55 private static JFrame frame;
56
57 private final Vector<SupportedLaF> supportedLaFs = new Vector();
58
59 private static class SupportedLaF {
60 private final String name;
61 private final LookAndFeel laf;
62
63 SupportedLaF(String name, LookAndFeel laf) {
64 this.name = name;
65 this.laf = laf;
66 }
67
68 public String toString() {
69 return name;
70 }
71 }
72
73
74 private JButton showButton;
75
76 private JCheckBox showAllFilesFilterCheckBox;
77 private JCheckBox showImageFilesFilterCheckBox;
78 private JCheckBox showFullDescriptionCheckBox;
79
80 private JCheckBox useFileViewCheckBox;
81 private JCheckBox useFileSystemViewCheckBox;
82 private JCheckBox accessoryCheckBox;
83 private JCheckBox setHiddenCheckBox;
84 private JCheckBox useEmbedInWizardCheckBox;
85 private JCheckBox useControlsCheckBox;
86 private JCheckBox enableDragCheckBox;
87
88 private JRadioButton singleSelectionRadioButton;
89 private JRadioButton multiSelectionRadioButton;
90
91 private JRadioButton openRadioButton;
92 private JRadioButton saveRadioButton;
93 private JRadioButton customButton;
94
95 private JComboBox lafComboBox;
96
97 private JRadioButton justFilesRadioButton;
98 private JRadioButton justDirectoriesRadioButton;
99 private JRadioButton bothFilesAndDirectoriesRadioButton;
100
101 private JTextField customField;
102
103 private final ExampleFileView fileView;
104
105 private final ExampleFileSystemView fileSystemView;
106
107 private final static Dimension hpad10 = new Dimension(10,1);
108 private final static Dimension vpad20 = new Dimension(1,20);
109 private final static Dimension vpad7 = new Dimension(1, 7);
110 private final static Dimension vpad4 = new Dimension(1, 4);
111 private final static Insets insets = new Insets(5, 10, 0, 10);
112
113 private final FilePreviewer previewer;
114 private final JFileChooser chooser;
115
116 public FileChooserDemo() {
117 UIManager.LookAndFeelInfo[] installedLafs = UIManager.getInstalledLookAndFeels();
118 for (UIManager.LookAndFeelInfo lafInfo : installedLafs) {
119 try {
120 Class lnfClass = Class.forName(lafInfo.getClassName());
121 LookAndFeel laf = (LookAndFeel)(lnfClass.newInstance());
122 if (laf.isSupportedLookAndFeel()) {
123 String name = lafInfo.getName();
124 supportedLaFs.add(new SupportedLaF(name, laf));
125 }
126 } catch (Exception e) { // If ANYTHING weird happens, don't add it
127 }
128 }
129
130 setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
131
132 chooser = new JFileChooser();
133 previewer = new FilePreviewer(chooser);
134
135 // Create Custom FileView
136 fileView = new ExampleFileView();
137 fileView.putIcon("jpg", new ImageIcon(getClass().getResource("/resources/images/jpgIcon.jpg")));
138 fileView.putIcon("gif", new ImageIcon(getClass().getResource("/resources/images/gifIcon.gif")));
139
140 // Create Custom FileSystemView
141 fileSystemView = new ExampleFileSystemView();
142
143 // create a radio listener to listen to option changes
144 OptionListener optionListener = new OptionListener();
145
146 // Create options
147 openRadioButton = new JRadioButton("Open");
148 openRadioButton.setSelected(true);
149 openRadioButton.addActionListener(optionListener);
150
151 saveRadioButton = new JRadioButton("Save");
152 saveRadioButton.addActionListener(optionListener);
153
154 customButton = new JRadioButton("Custom");
155 customButton.addActionListener(optionListener);
156
157 customField = new JTextField(8) {
158 public Dimension getMaximumSize() {
159 return new Dimension(getPreferredSize().width, getPreferredSize().height);
160 }
161 };
162 customField.setText("Doit");
163 customField.setAlignmentY(JComponent.TOP_ALIGNMENT);
164 customField.setEnabled(false);
165 customField.addActionListener(optionListener);
166
167 ButtonGroup group1 = new ButtonGroup();
168 group1.add(openRadioButton);
169 group1.add(saveRadioButton);
170 group1.add(customButton);
171
172 // filter buttons
173 showAllFilesFilterCheckBox = new JCheckBox("Show \"All Files\" Filter");
174 showAllFilesFilterCheckBox.addActionListener(optionListener);
175 showAllFilesFilterCheckBox.setSelected(true);
176
177 showImageFilesFilterCheckBox = new JCheckBox("Show JPG and GIF Filters");
178 showImageFilesFilterCheckBox.addActionListener(optionListener);
179 showImageFilesFilterCheckBox.setSelected(false);
180
181 accessoryCheckBox = new JCheckBox("Show Preview");
182 accessoryCheckBox.addActionListener(optionListener);
183 accessoryCheckBox.setSelected(false);
184
185 // more options
186 setHiddenCheckBox = new JCheckBox("Show Hidden Files");
187 setHiddenCheckBox.addActionListener(optionListener);
188
189 showFullDescriptionCheckBox = new JCheckBox("With File Extensions");
190 showFullDescriptionCheckBox.addActionListener(optionListener);
191 showFullDescriptionCheckBox.setSelected(true);
192 showFullDescriptionCheckBox.setEnabled(false);
193
194 useFileViewCheckBox = new JCheckBox("Use FileView");
195 useFileViewCheckBox.addActionListener(optionListener);
196 useFileViewCheckBox.setSelected(false);
197
198 useFileSystemViewCheckBox = new JCheckBox("Use FileSystemView", false);
199 useFileSystemViewCheckBox.addActionListener(optionListener);
200
201 useEmbedInWizardCheckBox = new JCheckBox("Embed in Wizard");
202 useEmbedInWizardCheckBox.addActionListener(optionListener);
203 useEmbedInWizardCheckBox.setSelected(false);
204
205 useControlsCheckBox = new JCheckBox("Show Control Buttons");
206 useControlsCheckBox.addActionListener(optionListener);
207 useControlsCheckBox.setSelected(true);
208
209 enableDragCheckBox = new JCheckBox("Enable Dragging");
210 enableDragCheckBox.addActionListener(optionListener);
211
212 // File or Directory chooser options
213 ButtonGroup group3 = new ButtonGroup();
214 justFilesRadioButton = new JRadioButton("Just Select Files");
215 justFilesRadioButton.setSelected(true);
216 group3.add(justFilesRadioButton);
217 justFilesRadioButton.addActionListener(optionListener);
218
219 justDirectoriesRadioButton = new JRadioButton("Just Select Directories");
220 group3.add(justDirectoriesRadioButton);
221 justDirectoriesRadioButton.addActionListener(optionListener);
222
223 bothFilesAndDirectoriesRadioButton = new JRadioButton("Select Files or Directories");
224 group3.add(bothFilesAndDirectoriesRadioButton);
225 bothFilesAndDirectoriesRadioButton.addActionListener(optionListener);
226
227 singleSelectionRadioButton = new JRadioButton("Single Selection", true);
228 singleSelectionRadioButton.addActionListener(optionListener);
229
230 multiSelectionRadioButton = new JRadioButton("Multi Selection");
231 multiSelectionRadioButton.addActionListener(optionListener);
232
233 ButtonGroup group4 = new ButtonGroup();
234 group4.add(singleSelectionRadioButton);
235 group4.add(multiSelectionRadioButton);
236
237
238 // Create show button
239 showButton = new JButton("Show FileChooser");
240 showButton.addActionListener(this);
241 showButton.setMnemonic('s');
242
243 // Create laf combo box
244 lafComboBox = new JComboBox(supportedLaFs);
245 lafComboBox.setEditable(false);
246 lafComboBox.addActionListener(optionListener);
247
248 // ********************************************************
249 // ******************** Dialog Type ***********************
250 // ********************************************************
251 JPanel control1 = new InsetPanel(insets);
252 control1.setBorder(BorderFactory.createTitledBorder("Dialog Type"));
253
254 control1.setLayout(new BoxLayout(control1, BoxLayout.Y_AXIS));
255 control1.add(Box.createRigidArea(vpad20));
256 control1.add(openRadioButton);
257 control1.add(Box.createRigidArea(vpad7));
258 control1.add(saveRadioButton);
259 control1.add(Box.createRigidArea(vpad7));
260 control1.add(customButton);
261 control1.add(Box.createRigidArea(vpad4));
262 JPanel fieldWrapper = new JPanel();
263 fieldWrapper.setLayout(new BoxLayout(fieldWrapper, BoxLayout.X_AXIS));
264 fieldWrapper.setAlignmentX(Component.LEFT_ALIGNMENT);
265 fieldWrapper.add(Box.createRigidArea(hpad10));
266 fieldWrapper.add(Box.createRigidArea(hpad10));
267 fieldWrapper.add(customField);
268 control1.add(fieldWrapper);
269 control1.add(Box.createRigidArea(vpad20));
270 control1.add(Box.createGlue());
271
272 // ********************************************************
273 // ***************** Filter Controls **********************
274 // ********************************************************
275 JPanel control2 = new InsetPanel(insets);
276 control2.setBorder(BorderFactory.createTitledBorder("Filter Controls"));
277 control2.setLayout(new BoxLayout(control2, BoxLayout.Y_AXIS));
278 control2.add(Box.createRigidArea(vpad20));
279 control2.add(showAllFilesFilterCheckBox);
280 control2.add(Box.createRigidArea(vpad7));
281 control2.add(showImageFilesFilterCheckBox);
282 control2.add(Box.createRigidArea(vpad4));
283 JPanel checkWrapper = new JPanel();
284 checkWrapper.setLayout(new BoxLayout(checkWrapper, BoxLayout.X_AXIS));
285 checkWrapper.setAlignmentX(Component.LEFT_ALIGNMENT);
286 checkWrapper.add(Box.createRigidArea(hpad10));
287 checkWrapper.add(Box.createRigidArea(hpad10));
288 checkWrapper.add(showFullDescriptionCheckBox);
289 control2.add(checkWrapper);
290 control2.add(Box.createRigidArea(vpad20));
291 control2.add(Box.createGlue());
292
293 // ********************************************************
294 // ****************** Display Options *********************
295 // ********************************************************
296 JPanel control3 = new InsetPanel(insets);
297 control3.setBorder(BorderFactory.createTitledBorder("Display Options"));
298 control3.setLayout(new BoxLayout(control3, BoxLayout.Y_AXIS));
299 control3.add(Box.createRigidArea(vpad20));
300 control3.add(setHiddenCheckBox);
301 control3.add(Box.createRigidArea(vpad7));
302 control3.add(useFileViewCheckBox);
303 control3.add(Box.createRigidArea(vpad7));
304 control3.add(useFileSystemViewCheckBox);
305 control3.add(Box.createRigidArea(vpad7));
306 control3.add(accessoryCheckBox);
307 control3.add(Box.createRigidArea(vpad7));
308 control3.add(useEmbedInWizardCheckBox);
309 control3.add(Box.createRigidArea(vpad7));
310 control3.add(useControlsCheckBox);
311 control3.add(Box.createRigidArea(vpad7));
312 control3.add(enableDragCheckBox);
313 control3.add(Box.createRigidArea(vpad20));
314 control3.add(Box.createGlue());
315
316 // ********************************************************
317 // ************* File & Directory Options *****************
318 // ********************************************************
319 JPanel control4 = new InsetPanel(insets);
320 control4.setBorder(BorderFactory.createTitledBorder("File and Directory Options"));
321 control4.setLayout(new BoxLayout(control4, BoxLayout.Y_AXIS));
322 control4.add(Box.createRigidArea(vpad20));
323 control4.add(justFilesRadioButton);
324 control4.add(Box.createRigidArea(vpad7));
325 control4.add(justDirectoriesRadioButton);
326 control4.add(Box.createRigidArea(vpad7));
327 control4.add(bothFilesAndDirectoriesRadioButton);
328 control4.add(Box.createRigidArea(vpad20));
329 control4.add(singleSelectionRadioButton);
330 control4.add(Box.createRigidArea(vpad7));
331 control4.add(multiSelectionRadioButton);
332 control4.add(Box.createRigidArea(vpad20));
333 control4.add(Box.createGlue());
334
335
336 // ********************************************************
337 // **************** Look & Feel Switch ********************
338 // ********************************************************
339 JPanel panel = new JPanel();
340 panel.add(new JLabel("Look and Feel: "));
341 panel.add(lafComboBox);
342 panel.add(showButton);
343
344 // ********************************************************
345 // ****************** Wrap 'em all up *********************
346 // ********************************************************
347 JPanel wrapper = new JPanel();
348 wrapper.setLayout(new BoxLayout(wrapper, BoxLayout.X_AXIS));
349
350 add(Box.createRigidArea(vpad20));
351
352 wrapper.add(Box.createRigidArea(hpad10));
353 wrapper.add(Box.createRigidArea(hpad10));
354 wrapper.add(control1);
355 wrapper.add(Box.createRigidArea(hpad10));
356 wrapper.add(control2);
357 wrapper.add(Box.createRigidArea(hpad10));
358 wrapper.add(control3);
359 wrapper.add(Box.createRigidArea(hpad10));
360 wrapper.add(control4);
361 wrapper.add(Box.createRigidArea(hpad10));
362 wrapper.add(Box.createRigidArea(hpad10));
363
364 add(wrapper);
365 add(Box.createRigidArea(vpad20));
366 add(panel);
367 add(Box.createRigidArea(vpad20));
368 }
369
370 public void actionPerformed(ActionEvent e) {
371 if (customButton.isSelected()) {
372 chooser.setApproveButtonText(customField.getText());
373 }
374 if (chooser.isMultiSelectionEnabled()) {
375 chooser.setSelectedFiles(null);
376 } else {
377 chooser.setSelectedFile(null);
378 }
379 // clear the preview from the previous display of the chooser
380 JComponent accessory = chooser.getAccessory();
381 if (accessory != null) {
382 ((FilePreviewer)accessory).loadImage(null);
383 }
384
385 if (useEmbedInWizardCheckBox.isSelected()) {
386 WizardDialog wizard = new WizardDialog(frame, true);
387 wizard.setVisible(true);
388 wizard.dispose();
389 return;
390 }
391
392 int retval = chooser.showDialog(frame, null);
393 if (retval == APPROVE_OPTION) {
394 JOptionPane.showMessageDialog(frame, getResultString());
395 } else if (retval == CANCEL_OPTION) {
396 JOptionPane.showMessageDialog(frame, "User cancelled operation. No file was chosen.");
397 } else if (retval == ERROR_OPTION) {
398 JOptionPane.showMessageDialog(frame, "An error occured. No file was chosen.");
399 } else {
400 JOptionPane.showMessageDialog(frame, "Unknown operation occured.");
401 }
402 }
403
404 private void resetFileFilters(boolean enableFilters,
405 boolean showExtensionInDescription) {
406 chooser.resetChoosableFileFilters();
407 if (enableFilters) {
408 FileFilter jpgFilter = createFileFilter("JPEG Compressed Image Files",
409 showExtensionInDescription, "jpg");
410 FileFilter gifFilter = createFileFilter("GIF Image Files",
411 showExtensionInDescription, "gif");
412 FileFilter bothFilter = createFileFilter("JPEG and GIF Image Files",
413 showExtensionInDescription, "jpg",
414 "gif");
415 chooser.addChoosableFileFilter(bothFilter);
416 chooser.addChoosableFileFilter(jpgFilter);
417 chooser.addChoosableFileFilter(gifFilter);
418 }
419 }
420
421 private FileFilter createFileFilter(String description,
422 boolean showExtensionInDescription, String...extensions) {
423 if (showExtensionInDescription) {
424 description = createFileNameFilterDescriptionFromExtensions(
425 description, extensions);
426 }
427 return new FileNameExtensionFilter(description, extensions);
428 }
429
430 private String createFileNameFilterDescriptionFromExtensions(
431 String description, String[] extensions) {
432 String fullDescription = (description == null) ?
433 "(" : description + " (";
434 // build the description from the extension list
435 fullDescription += "." + extensions[0];
436 for (int i = 1; i < extensions.length; i++) {
437 fullDescription += ", .";
438 fullDescription += extensions[i];
439 }
440 fullDescription += ")";
441 return fullDescription;
442 }
443
444 private class WizardDialog extends JDialog implements ActionListener {
445 CardLayout cardLayout;
446 JPanel cardPanel;
447 JLabel messageLabel;
448 JButton backButton, nextButton, closeButton;
449
450 WizardDialog(JFrame frame, boolean modal) {
451 super(frame, "Embedded JFileChooser Demo", modal);
452
453 cardLayout = new CardLayout();
454 cardPanel = new JPanel(cardLayout);
455 getContentPane().add(cardPanel, BorderLayout.CENTER);
456
457 messageLabel = new JLabel("", JLabel.CENTER);
458 cardPanel.add(chooser, "fileChooser");
459 cardPanel.add(messageLabel, "label");
460 cardLayout.show(cardPanel, "fileChooser");
461 chooser.addActionListener(this);
462
463 JPanel buttonPanel = new JPanel();
464 backButton = new JButton("< Back");
465 nextButton = new JButton("Next >");
466 closeButton = new JButton("Close");
467
468 buttonPanel.add(backButton);
469 buttonPanel.add(nextButton);
470 buttonPanel.add(closeButton);
471
472 getContentPane().add(buttonPanel, BorderLayout.SOUTH);
473
474 backButton.setEnabled(false);
475 getRootPane().setDefaultButton(nextButton);
476
477 backButton.addActionListener(this);
478 nextButton.addActionListener(this);
479 closeButton.addActionListener(this);
480
481 pack();
482 setLocationRelativeTo(frame);
483 }
484
485 public void actionPerformed(ActionEvent evt) {
486 Object src = evt.getSource();
487 String cmd = evt.getActionCommand();
488
489 if (src == backButton) {
490 back();
491 } else if (src == nextButton) {
492 FileChooserUI ui = chooser.getUI();
493 if (ui instanceof BasicFileChooserUI) {
494 // Workaround for bug 4528663. This is necessary to
495 // pick up the contents of the file chooser text field.
496 // This will trigger an APPROVE_SELECTION action.
497 ((BasicFileChooserUI)ui).getApproveSelectionAction().actionPerformed(null);
498 } else {
499 next();
500 }
501 } else if (src == closeButton) {
502 close();
503 } else if (cmd == APPROVE_SELECTION) {
504 next();
505 } else if (cmd == CANCEL_SELECTION) {
506 close();
507 }
508 }
509
510 private void back() {
511 backButton.setEnabled(false);
512 nextButton.setEnabled(true);
513 cardLayout.show(cardPanel, "fileChooser");
514 getRootPane().setDefaultButton(nextButton);
515 chooser.requestFocus();
516 }
517
518 private void next() {
519 backButton.setEnabled(true);
520 nextButton.setEnabled(false);
521 messageLabel.setText(getResultString());
522 cardLayout.show(cardPanel, "label");
523 getRootPane().setDefaultButton(closeButton);
524 closeButton.requestFocus();
525 }
526
527 private void close() {
528 setVisible(false);
529 }
530
531 public void dispose() {
532 chooser.removeActionListener(this);
533
534 // The chooser is hidden by CardLayout on remove
535 // so fix it here
536 cardPanel.remove(chooser);
537 chooser.setVisible(true);
538
539 super.dispose();
540 }
541 }
542
543 private String getResultString() {
544 String resultString;
545 String filter = chooser.getFileFilter().getDescription();
546 String path = null;
547 boolean isDirMode = (chooser.getFileSelectionMode() == DIRECTORIES_ONLY);
548 boolean isMulti = chooser.isMultiSelectionEnabled();
549
550 if (isMulti) {
551 File [] files = chooser.getSelectedFiles();
552 if (files != null && files.length > 0) {
553 path = "";
554 for (File file : files) {
555 path = path + "<br>" + file.getPath();
556 }
557 }
558 } else {
559 File file = chooser.getSelectedFile();
560 if (file != null) {
561 path = "<br>" + file.getPath();
562 }
563 }
564 if (path != null) {
565 path = path.replace(" ", "&nbsp;");
566 filter = filter.replace(" ", "&nbsp;");
567 resultString =
568 "<html>You chose " + (isMulti ? "these" : "this") + " " +
569 (isDirMode ? (isMulti ? "directories" : "directory")
570 : (isMulti ? "files" : "file")) +
571 ": <code>" + path +
572 "</code><br><br>with filter: <br><code>" + filter;
573 } else {
574 resultString = "Nothing was chosen";
575 }
576 return resultString;
577 }
578
579
580
581
582 /** An ActionListener that listens to the radio buttons. */
583 private class OptionListener implements ActionListener {
584 public void actionPerformed(ActionEvent e) {
585 JComponent c = (JComponent) e.getSource();
586 boolean selected = false;
587 if (c instanceof JToggleButton) {
588 selected = ((JToggleButton)c).isSelected();
589 }
590
591 if (c == openRadioButton) {
592 chooser.setDialogType(OPEN_DIALOG);
593 customField.setEnabled(false);
594 repaint();
595 } else if (c == useEmbedInWizardCheckBox) {
596 useControlsCheckBox.setEnabled(!selected);
597 useControlsCheckBox.setSelected(!selected);
598 chooser.setControlButtonsAreShown(!selected);
599 } else if (c == useControlsCheckBox) {
600 chooser.setControlButtonsAreShown(selected);
601 } else if (c == enableDragCheckBox) {
602 chooser.setDragEnabled(selected);
603 } else if (c == saveRadioButton) {
604 chooser.setDialogType(SAVE_DIALOG);
605 customField.setEnabled(false);
606 repaint();
607 } else if (c == customButton || c == customField) {
608 customField.setEnabled(true);
609 chooser.setDialogType(CUSTOM_DIALOG);
610 repaint();
611 } else if (c == showAllFilesFilterCheckBox) {
612 chooser.setAcceptAllFileFilterUsed(selected);
613 } else if (c == showImageFilesFilterCheckBox) {
614 resetFileFilters(selected,
615 showFullDescriptionCheckBox.isSelected());
616 showFullDescriptionCheckBox.setEnabled(selected);
617 } else if (c == setHiddenCheckBox) {
618 chooser.setFileHidingEnabled(!selected);
619 } else if (c == accessoryCheckBox) {
620 if (selected) {
621 chooser.setAccessory(previewer);
622 } else {
623 chooser.setAccessory(null);
624 }
625 } else if (c == useFileViewCheckBox) {
626 if (selected) {
627 chooser.setFileView(fileView);
628 } else {
629 chooser.setFileView(null);
630 }
631 } else if (c == useFileSystemViewCheckBox) {
632 if (selected) {
633 chooser.setFileSystemView(fileSystemView);
634 } else {
635 // Restore default behaviour
636 chooser.setFileSystemView(FileSystemView.getFileSystemView());
637 }
638 } else if (c == showFullDescriptionCheckBox) {
639 resetFileFilters(showImageFilesFilterCheckBox.isSelected(),
640 selected);
641 } else if (c == justFilesRadioButton) {
642 chooser.setFileSelectionMode(FILES_ONLY);
643 } else if (c == justDirectoriesRadioButton) {
644 chooser.setFileSelectionMode(DIRECTORIES_ONLY);
645 } else if (c == bothFilesAndDirectoriesRadioButton) {
646 chooser.setFileSelectionMode(FILES_AND_DIRECTORIES);
647 } else if (c == singleSelectionRadioButton) {
648 if (selected) {
649 chooser.setMultiSelectionEnabled(false);
650 }
651 } else if (c == multiSelectionRadioButton) {
652 if (selected) {
653 chooser.setMultiSelectionEnabled(true);
654 }
655 } else if (c == lafComboBox) {
656 SupportedLaF supportedLaF = ((SupportedLaF)lafComboBox.getSelectedItem());
657 LookAndFeel laf = supportedLaF.laf;
658 try {
659 UIManager.setLookAndFeel(laf);
660 SwingUtilities.updateComponentTreeUI(frame);
661 if(chooser != null) {
662 SwingUtilities.updateComponentTreeUI(chooser);
663 }
664 frame.pack();
665 } catch (UnsupportedLookAndFeelException exc) {
666 // This should not happen because we already checked
667 ((DefaultComboBoxModel)lafComboBox.getModel()).removeElement(supportedLaF);
668 }
669 }
670
671 }
672 }
673
674 private class FilePreviewer extends JComponent implements PropertyChangeListener {
675 ImageIcon thumbnail = null;
676
677 public FilePreviewer(JFileChooser fc) {
678 setPreferredSize(new Dimension(100, 50));
679 fc.addPropertyChangeListener(this);
680 }
681
682 public void loadImage(File f) {
683 if (f == null) {
684 thumbnail = null;
685 } else {
686 ImageIcon tmpIcon = new ImageIcon(f.getPath());
687 if(tmpIcon.getIconWidth() > 90) {
688 thumbnail = new ImageIcon(
689 tmpIcon.getImage().getScaledInstance(90, -1, Image.SCALE_DEFAULT));
690 } else {
691 thumbnail = tmpIcon;
692 }
693 }
694 }
695
696 public void propertyChange(PropertyChangeEvent e) {
697 String prop = e.getPropertyName();
698 if (prop == SELECTED_FILE_CHANGED_PROPERTY) {
699 if(isShowing()) {
700 loadImage((File) e.getNewValue());
701 repaint();
702 }
703 }
704 }
705
706 public void paint(Graphics g) {
707 if(thumbnail != null) {
708 int x = getWidth()/2 - thumbnail.getIconWidth()/2;
709 int y = getHeight()/2 - thumbnail.getIconHeight()/2;
710 if(y < 0) {
711 y = 0;
712 }
713
714 if(x < 5) {
715 x = 5;
716 }
717 thumbnail.paintIcon(this, g, x, y);
718 }
719 }
720 }
721
722 public static void main(String s[]) {
723 /*
724 NOTE: By default, the look and feel will be set to the
725 Cross Platform Look and Feel (which is currently Metal).
726 The user may someday be able to override the default
727 via a system property. If you as the developer want to
728 be sure that a particular L&F is set, you can do so
729 by calling UIManager.setLookAndFeel(). For example, the
730 first code snippet below forcibly sets the UI to be the
731 System Look and Feel. The second code snippet forcibly
732 sets the look and feel to the Cross Platform L&F.
733
734 Snippet 1:
735 try {
736 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
737 } catch (Exception exc) {
738 System.err.println("Error loading L&F: " + exc);
739 }
740
741 Snippet 2:
742 try {
743 UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
744 } catch (Exception exc) {
745 System.err.println("Error loading L&F: " + exc);
746 }
747 */
748
749 FileChooserDemo panel = new FileChooserDemo();
750
751 frame = new JFrame("FileChooserDemo");
752 frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
753 frame.getContentPane().add("Center", panel);
754 frame.pack();
755 frame.setVisible(true);
756 }
757
758 private static class InsetPanel extends JPanel {
759 Insets i;
760 InsetPanel(Insets i) {
761 this.i = i;
762 }
763 public Insets getInsets() {
764 return i;
765 }
766 }
767}