diff -r 4ebc2e2fb97c -r 71c04702a3d5 src/demo/share/jfc/FileChooserDemo/FileChooserDemo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/demo/share/jfc/FileChooserDemo/FileChooserDemo.java Tue Sep 12 19:03:39 2017 +0200 @@ -0,0 +1,850 @@ +/* + * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * This source code is provided to illustrate the usage of a given feature + * or technique and has been deliberately simplified. Additional steps + * required for a production-quality application, such as security checks, + * input validation and proper error handling, might not be present in + * this sample code. + */ + + + +import java.lang.reflect.InvocationTargetException; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.UIManager.LookAndFeelInfo; +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Image; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.List; +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.ButtonGroup; +import javax.swing.DefaultComboBoxModel; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JRadioButton; +import javax.swing.JTextField; +import javax.swing.JToggleButton; +import javax.swing.LookAndFeel; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.WindowConstants; +import javax.swing.filechooser.FileFilter; +import javax.swing.filechooser.FileNameExtensionFilter; +import javax.swing.filechooser.FileSystemView; +import java.util.ArrayList; +import javax.swing.plaf.FileChooserUI; +import javax.swing.plaf.basic.BasicFileChooserUI; +import java.io.File; +import static javax.swing.JFileChooser.*; + + +/** + * + * A demo which makes extensive use of the file chooser. + * + * @author Jeff Dinkins + */ +@SuppressWarnings("serial") +public class FileChooserDemo extends JPanel implements ActionListener { + + public static final String NIMBUS_LAF_NAME = "Nimbus"; + private static JFrame frame; + private final List supportedLaFs = + new ArrayList(); + private static SupportedLaF nimbusLaF; + + + private static class SupportedLaF { + + private final String name; + private final LookAndFeel laf; + + SupportedLaF(String name, LookAndFeel laf) { + this.name = name; + this.laf = laf; + } + + @Override + public String toString() { + return name; + } + } + private JButton showButton; + private JCheckBox showAllFilesFilterCheckBox; + private JCheckBox showImageFilesFilterCheckBox; + private JCheckBox showFullDescriptionCheckBox; + private JCheckBox useFileViewCheckBox; + private JCheckBox useFileSystemViewCheckBox; + private JCheckBox accessoryCheckBox; + private JCheckBox setHiddenCheckBox; + private JCheckBox useEmbedInWizardCheckBox; + private JCheckBox useControlsCheckBox; + private JCheckBox enableDragCheckBox; + private JRadioButton singleSelectionRadioButton; + private JRadioButton multiSelectionRadioButton; + private JRadioButton openRadioButton; + private JRadioButton saveRadioButton; + private JRadioButton customButton; + private JComboBox lafComboBox; + private JRadioButton justFilesRadioButton; + private JRadioButton justDirectoriesRadioButton; + private JRadioButton bothFilesAndDirectoriesRadioButton; + private JTextField customField; + private final ExampleFileView fileView; + private final ExampleFileSystemView fileSystemView; + private static final Dimension hpad10 = new Dimension(10, 1); + private static final Dimension vpad20 = new Dimension(1, 20); + private static final Dimension vpad7 = new Dimension(1, 7); + private static final Dimension vpad4 = new Dimension(1, 4); + private static final Insets insets = new Insets(5, 10, 0, 10); + private final FilePreviewer previewer; + private final JFileChooser chooser; + + @SuppressWarnings("LeakingThisInConstructor") + public FileChooserDemo() { + UIManager.LookAndFeelInfo[] installedLafs = UIManager. + getInstalledLookAndFeels(); + for (UIManager.LookAndFeelInfo lafInfo : installedLafs) { + try { + Class lnfClass = Class.forName(lafInfo.getClassName()); + LookAndFeel laf = (LookAndFeel) (lnfClass.newInstance()); + if (laf.isSupportedLookAndFeel()) { + String name = lafInfo.getName(); + SupportedLaF supportedLaF = new SupportedLaF(name, laf); + supportedLaFs.add(supportedLaF); + if (NIMBUS_LAF_NAME.equals(name)) { + nimbusLaF = supportedLaF; + } + } + } catch (Exception ignored) { + // If ANYTHING weird happens, don't add this L&F + } + } + + setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + + chooser = new JFileChooser(); + previewer = new FilePreviewer(chooser); + + // Create Custom FileView + fileView = new ExampleFileView(); + fileView.putIcon("jpg", new ImageIcon(getClass().getResource( + "/resources/images/jpgIcon.jpg"))); + fileView.putIcon("gif", new ImageIcon(getClass().getResource( + "/resources/images/gifIcon.gif"))); + + // Create Custom FileSystemView + fileSystemView = new ExampleFileSystemView(); + + // create a radio listener to listen to option changes + OptionListener optionListener = new OptionListener(); + + // Create options + openRadioButton = new JRadioButton("Open"); + openRadioButton.setSelected(true); + openRadioButton.addActionListener(optionListener); + + saveRadioButton = new JRadioButton("Save"); + saveRadioButton.addActionListener(optionListener); + + customButton = new JRadioButton("Custom"); + customButton.addActionListener(optionListener); + + customField = new JTextField(8) { + + @Override + public Dimension getMaximumSize() { + return new Dimension(getPreferredSize().width, + getPreferredSize().height); + } + }; + customField.setText("Doit"); + customField.setAlignmentY(JComponent.TOP_ALIGNMENT); + customField.setEnabled(false); + customField.addActionListener(optionListener); + + ButtonGroup group1 = new ButtonGroup(); + group1.add(openRadioButton); + group1.add(saveRadioButton); + group1.add(customButton); + + // filter buttons + showAllFilesFilterCheckBox = new JCheckBox("Show \"All Files\" Filter"); + showAllFilesFilterCheckBox.addActionListener(optionListener); + showAllFilesFilterCheckBox.setSelected(true); + + showImageFilesFilterCheckBox = new JCheckBox("Show JPG and GIF Filters"); + showImageFilesFilterCheckBox.addActionListener(optionListener); + showImageFilesFilterCheckBox.setSelected(false); + + accessoryCheckBox = new JCheckBox("Show Preview"); + accessoryCheckBox.addActionListener(optionListener); + accessoryCheckBox.setSelected(false); + + // more options + setHiddenCheckBox = new JCheckBox("Show Hidden Files"); + setHiddenCheckBox.addActionListener(optionListener); + + showFullDescriptionCheckBox = new JCheckBox("With File Extensions"); + showFullDescriptionCheckBox.addActionListener(optionListener); + showFullDescriptionCheckBox.setSelected(true); + showFullDescriptionCheckBox.setEnabled(false); + + useFileViewCheckBox = new JCheckBox("Use FileView"); + useFileViewCheckBox.addActionListener(optionListener); + useFileViewCheckBox.setSelected(false); + + useFileSystemViewCheckBox = new JCheckBox("Use FileSystemView", false); + useFileSystemViewCheckBox.addActionListener(optionListener); + + useEmbedInWizardCheckBox = new JCheckBox("Embed in Wizard"); + useEmbedInWizardCheckBox.addActionListener(optionListener); + useEmbedInWizardCheckBox.setSelected(false); + + useControlsCheckBox = new JCheckBox("Show Control Buttons"); + useControlsCheckBox.addActionListener(optionListener); + useControlsCheckBox.setSelected(true); + + enableDragCheckBox = new JCheckBox("Enable Dragging"); + enableDragCheckBox.addActionListener(optionListener); + + // File or Directory chooser options + ButtonGroup group3 = new ButtonGroup(); + justFilesRadioButton = new JRadioButton("Just Select Files"); + justFilesRadioButton.setSelected(true); + group3.add(justFilesRadioButton); + justFilesRadioButton.addActionListener(optionListener); + + justDirectoriesRadioButton = new JRadioButton("Just Select Directories"); + group3.add(justDirectoriesRadioButton); + justDirectoriesRadioButton.addActionListener(optionListener); + + bothFilesAndDirectoriesRadioButton = new JRadioButton( + "Select Files or Directories"); + group3.add(bothFilesAndDirectoriesRadioButton); + bothFilesAndDirectoriesRadioButton.addActionListener(optionListener); + + singleSelectionRadioButton = new JRadioButton("Single Selection", true); + singleSelectionRadioButton.addActionListener(optionListener); + + multiSelectionRadioButton = new JRadioButton("Multi Selection"); + multiSelectionRadioButton.addActionListener(optionListener); + + ButtonGroup group4 = new ButtonGroup(); + group4.add(singleSelectionRadioButton); + group4.add(multiSelectionRadioButton); + + + // Create show button + showButton = new JButton("Show FileChooser"); + showButton.addActionListener(this); + showButton.setMnemonic('s'); + + // Create laf combo box + lafComboBox = new JComboBox(supportedLaFs.toArray()); + lafComboBox.setSelectedItem(nimbusLaF); + lafComboBox.setEditable(false); + lafComboBox.addActionListener(optionListener); + + // ******************************************************** + // ******************** Dialog Type *********************** + // ******************************************************** + JPanel control1 = new InsetPanel(insets); + control1.setBorder(BorderFactory.createTitledBorder("Dialog Type")); + + control1.setLayout(new BoxLayout(control1, BoxLayout.Y_AXIS)); + control1.add(Box.createRigidArea(vpad20)); + control1.add(openRadioButton); + control1.add(Box.createRigidArea(vpad7)); + control1.add(saveRadioButton); + control1.add(Box.createRigidArea(vpad7)); + control1.add(customButton); + control1.add(Box.createRigidArea(vpad4)); + JPanel fieldWrapper = new JPanel(); + fieldWrapper.setLayout(new BoxLayout(fieldWrapper, BoxLayout.X_AXIS)); + fieldWrapper.setAlignmentX(Component.LEFT_ALIGNMENT); + fieldWrapper.add(Box.createRigidArea(hpad10)); + fieldWrapper.add(Box.createRigidArea(hpad10)); + fieldWrapper.add(customField); + control1.add(fieldWrapper); + control1.add(Box.createRigidArea(vpad20)); + control1.add(Box.createGlue()); + + // ******************************************************** + // ***************** Filter Controls ********************** + // ******************************************************** + JPanel control2 = new InsetPanel(insets); + control2.setBorder(BorderFactory.createTitledBorder("Filter Controls")); + control2.setLayout(new BoxLayout(control2, BoxLayout.Y_AXIS)); + control2.add(Box.createRigidArea(vpad20)); + control2.add(showAllFilesFilterCheckBox); + control2.add(Box.createRigidArea(vpad7)); + control2.add(showImageFilesFilterCheckBox); + control2.add(Box.createRigidArea(vpad4)); + JPanel checkWrapper = new JPanel(); + checkWrapper.setLayout(new BoxLayout(checkWrapper, BoxLayout.X_AXIS)); + checkWrapper.setAlignmentX(Component.LEFT_ALIGNMENT); + checkWrapper.add(Box.createRigidArea(hpad10)); + checkWrapper.add(Box.createRigidArea(hpad10)); + checkWrapper.add(showFullDescriptionCheckBox); + control2.add(checkWrapper); + control2.add(Box.createRigidArea(vpad20)); + control2.add(Box.createGlue()); + + // ******************************************************** + // ****************** Display Options ********************* + // ******************************************************** + JPanel control3 = new InsetPanel(insets); + control3.setBorder(BorderFactory.createTitledBorder("Display Options")); + control3.setLayout(new BoxLayout(control3, BoxLayout.Y_AXIS)); + control3.add(Box.createRigidArea(vpad20)); + control3.add(setHiddenCheckBox); + control3.add(Box.createRigidArea(vpad7)); + control3.add(useFileViewCheckBox); + control3.add(Box.createRigidArea(vpad7)); + control3.add(useFileSystemViewCheckBox); + control3.add(Box.createRigidArea(vpad7)); + control3.add(accessoryCheckBox); + control3.add(Box.createRigidArea(vpad7)); + control3.add(useEmbedInWizardCheckBox); + control3.add(Box.createRigidArea(vpad7)); + control3.add(useControlsCheckBox); + control3.add(Box.createRigidArea(vpad7)); + control3.add(enableDragCheckBox); + control3.add(Box.createRigidArea(vpad20)); + control3.add(Box.createGlue()); + + // ******************************************************** + // ************* File & Directory Options ***************** + // ******************************************************** + JPanel control4 = new InsetPanel(insets); + control4.setBorder(BorderFactory.createTitledBorder( + "File and Directory Options")); + control4.setLayout(new BoxLayout(control4, BoxLayout.Y_AXIS)); + control4.add(Box.createRigidArea(vpad20)); + control4.add(justFilesRadioButton); + control4.add(Box.createRigidArea(vpad7)); + control4.add(justDirectoriesRadioButton); + control4.add(Box.createRigidArea(vpad7)); + control4.add(bothFilesAndDirectoriesRadioButton); + control4.add(Box.createRigidArea(vpad20)); + control4.add(singleSelectionRadioButton); + control4.add(Box.createRigidArea(vpad7)); + control4.add(multiSelectionRadioButton); + control4.add(Box.createRigidArea(vpad20)); + control4.add(Box.createGlue()); + + + // ******************************************************** + // **************** Look & Feel Switch ******************** + // ******************************************************** + JPanel panel = new JPanel(); + panel.add(new JLabel("Look and Feel: ")); + panel.add(lafComboBox); + panel.add(showButton); + + // ******************************************************** + // ****************** Wrap 'em all up ********************* + // ******************************************************** + JPanel wrapper = new JPanel(); + wrapper.setLayout(new BoxLayout(wrapper, BoxLayout.X_AXIS)); + + add(Box.createRigidArea(vpad20)); + + wrapper.add(Box.createRigidArea(hpad10)); + wrapper.add(Box.createRigidArea(hpad10)); + wrapper.add(control1); + wrapper.add(Box.createRigidArea(hpad10)); + wrapper.add(control2); + wrapper.add(Box.createRigidArea(hpad10)); + wrapper.add(control3); + wrapper.add(Box.createRigidArea(hpad10)); + wrapper.add(control4); + wrapper.add(Box.createRigidArea(hpad10)); + wrapper.add(Box.createRigidArea(hpad10)); + + add(wrapper); + add(Box.createRigidArea(vpad20)); + add(panel); + add(Box.createRigidArea(vpad20)); + } + + public void actionPerformed(ActionEvent e) { + if (customButton.isSelected()) { + chooser.setApproveButtonText(customField.getText()); + } + if (chooser.isMultiSelectionEnabled()) { + chooser.setSelectedFiles(null); + } else { + chooser.setSelectedFile(null); + } + // clear the preview from the previous display of the chooser + JComponent accessory = chooser.getAccessory(); + if (accessory != null) { + ((FilePreviewer) accessory).loadImage(null); + } + + if (useEmbedInWizardCheckBox.isSelected()) { + WizardDialog wizard = new WizardDialog(frame, true); + wizard.setVisible(true); + wizard.dispose(); + return; + } + + int retval = chooser.showDialog(frame, null); + if (retval == APPROVE_OPTION) { + JOptionPane.showMessageDialog(frame, getResultString()); + } else if (retval == CANCEL_OPTION) { + JOptionPane.showMessageDialog(frame, + "User cancelled operation. No file was chosen."); + } else if (retval == ERROR_OPTION) { + JOptionPane.showMessageDialog(frame, + "An error occurred. No file was chosen."); + } else { + JOptionPane.showMessageDialog(frame, "Unknown operation occurred."); + } + } + + private void resetFileFilters(boolean enableFilters, + boolean showExtensionInDescription) { + chooser.resetChoosableFileFilters(); + if (enableFilters) { + FileFilter jpgFilter = createFileFilter( + "JPEG Compressed Image Files", + showExtensionInDescription, "jpg"); + FileFilter gifFilter = createFileFilter("GIF Image Files", + showExtensionInDescription, "gif"); + FileFilter bothFilter = createFileFilter("JPEG and GIF Image Files", + showExtensionInDescription, "jpg", + "gif"); + chooser.addChoosableFileFilter(bothFilter); + chooser.addChoosableFileFilter(jpgFilter); + chooser.addChoosableFileFilter(gifFilter); + } + } + + private FileFilter createFileFilter(String description, + boolean showExtensionInDescription, String... extensions) { + if (showExtensionInDescription) { + description = createFileNameFilterDescriptionFromExtensions( + description, extensions); + } + return new FileNameExtensionFilter(description, extensions); + } + + private String createFileNameFilterDescriptionFromExtensions( + String description, String[] extensions) { + String fullDescription = (description == null) ? "(" : description + + " ("; + // build the description from the extension list + fullDescription += "." + extensions[0]; + for (int i = 1; i < extensions.length; i++) { + fullDescription += ", ."; + fullDescription += extensions[i]; + } + fullDescription += ")"; + return fullDescription; + } + + + private class WizardDialog extends JDialog implements ActionListener { + + CardLayout cardLayout; + JPanel cardPanel; + JLabel messageLabel; + JButton backButton, nextButton, closeButton; + + @SuppressWarnings("LeakingThisInConstructor") + WizardDialog(JFrame frame, boolean modal) { + super(frame, "Embedded JFileChooser Demo", modal); + + cardLayout = new CardLayout(); + cardPanel = new JPanel(cardLayout); + getContentPane().add(cardPanel, BorderLayout.CENTER); + + messageLabel = new JLabel("", JLabel.CENTER); + cardPanel.add(chooser, "fileChooser"); + cardPanel.add(messageLabel, "label"); + cardLayout.show(cardPanel, "fileChooser"); + chooser.addActionListener(this); + + JPanel buttonPanel = new JPanel(); + backButton = new JButton("< Back"); + nextButton = new JButton("Next >"); + closeButton = new JButton("Close"); + + buttonPanel.add(backButton); + buttonPanel.add(nextButton); + buttonPanel.add(closeButton); + + getContentPane().add(buttonPanel, BorderLayout.SOUTH); + + backButton.setEnabled(false); + getRootPane().setDefaultButton(nextButton); + + backButton.addActionListener(this); + nextButton.addActionListener(this); + closeButton.addActionListener(this); + + pack(); + setLocationRelativeTo(frame); + } + + public void actionPerformed(ActionEvent evt) { + Object src = evt.getSource(); + String cmd = evt.getActionCommand(); + + if (src == backButton) { + back(); + } else if (src == nextButton) { + FileChooserUI ui = chooser.getUI(); + if (ui instanceof BasicFileChooserUI) { + // Workaround for bug 4528663. This is necessary to + // pick up the contents of the file chooser text field. + // This will trigger an APPROVE_SELECTION action. + ((BasicFileChooserUI) ui).getApproveSelectionAction(). + actionPerformed(null); + } else { + next(); + } + } else if (src == closeButton) { + close(); + } else if (APPROVE_SELECTION.equals(cmd)) { + next(); + } else if (CANCEL_SELECTION.equals(cmd)) { + close(); + } + } + + private void back() { + backButton.setEnabled(false); + nextButton.setEnabled(true); + cardLayout.show(cardPanel, "fileChooser"); + getRootPane().setDefaultButton(nextButton); + chooser.requestFocus(); + } + + private void next() { + backButton.setEnabled(true); + nextButton.setEnabled(false); + messageLabel.setText(getResultString()); + cardLayout.show(cardPanel, "label"); + getRootPane().setDefaultButton(closeButton); + closeButton.requestFocus(); + } + + private void close() { + setVisible(false); + } + + @Override + public void dispose() { + chooser.removeActionListener(this); + + // The chooser is hidden by CardLayout on remove + // so fix it here + cardPanel.remove(chooser); + chooser.setVisible(true); + + super.dispose(); + } + } + + private String getResultString() { + String resultString; + String filter; + if (chooser.getFileFilter() == null) { + filter = ""; + } else { + filter = chooser.getFileFilter().getDescription(); + } + String path = null; + boolean isDirMode = (chooser.getFileSelectionMode() == DIRECTORIES_ONLY); + boolean isMulti = chooser.isMultiSelectionEnabled(); + + if (isMulti) { + File[] files = chooser.getSelectedFiles(); + if (files != null && files.length > 0) { + path = ""; + for (File file : files) { + path = path + "
" + file.getPath(); + } + } + } else { + File file = chooser.getSelectedFile(); + if (file != null) { + path = "
" + file.getPath(); + } + } + if (path != null) { + path = path.replace(" ", " "); + filter = filter.replace(" ", " "); + resultString = + "You chose " + (isMulti ? "these" : "this") + " " + (isDirMode ? (isMulti + ? "directories" : "directory") + : (isMulti ? "files" : "file")) + ": " + path + + "

with filter:
" + filter; + } else { + resultString = "Nothing was chosen"; + } + return resultString; + } + + + /** An ActionListener that listens to the radio buttons. */ + private class OptionListener implements ActionListener { + + public void actionPerformed(ActionEvent e) { + JComponent c = (JComponent) e.getSource(); + boolean selected = false; + if (c instanceof JToggleButton) { + selected = ((JToggleButton) c).isSelected(); + } + + if (c == openRadioButton) { + chooser.setDialogType(OPEN_DIALOG); + customField.setEnabled(false); + repaint(); + } else if (c == useEmbedInWizardCheckBox) { + useControlsCheckBox.setEnabled(!selected); + useControlsCheckBox.setSelected(!selected); + chooser.setControlButtonsAreShown(!selected); + } else if (c == useControlsCheckBox) { + chooser.setControlButtonsAreShown(selected); + } else if (c == enableDragCheckBox) { + chooser.setDragEnabled(selected); + } else if (c == saveRadioButton) { + chooser.setDialogType(SAVE_DIALOG); + customField.setEnabled(false); + repaint(); + } else if (c == customButton || c == customField) { + customField.setEnabled(true); + chooser.setDialogType(CUSTOM_DIALOG); + repaint(); + } else if (c == showAllFilesFilterCheckBox) { + chooser.setAcceptAllFileFilterUsed(selected); + } else if (c == showImageFilesFilterCheckBox) { + resetFileFilters(selected, + showFullDescriptionCheckBox.isSelected()); + showFullDescriptionCheckBox.setEnabled(selected); + } else if (c == setHiddenCheckBox) { + chooser.setFileHidingEnabled(!selected); + } else if (c == accessoryCheckBox) { + if (selected) { + chooser.setAccessory(previewer); + } else { + chooser.setAccessory(null); + } + } else if (c == useFileViewCheckBox) { + if (selected) { + chooser.setFileView(fileView); + } else { + chooser.setFileView(null); + } + } else if (c == useFileSystemViewCheckBox) { + if (selected) { + chooser.setFileSystemView(fileSystemView); + } else { + // Restore default behaviour + chooser.setFileSystemView(FileSystemView.getFileSystemView()); + } + } else if (c == showFullDescriptionCheckBox) { + resetFileFilters(showImageFilesFilterCheckBox.isSelected(), + selected); + } else if (c == justFilesRadioButton) { + chooser.setFileSelectionMode(FILES_ONLY); + } else if (c == justDirectoriesRadioButton) { + chooser.setFileSelectionMode(DIRECTORIES_ONLY); + } else if (c == bothFilesAndDirectoriesRadioButton) { + chooser.setFileSelectionMode(FILES_AND_DIRECTORIES); + } else if (c == singleSelectionRadioButton) { + if (selected) { + chooser.setMultiSelectionEnabled(false); + } + } else if (c == multiSelectionRadioButton) { + if (selected) { + chooser.setMultiSelectionEnabled(true); + } + } else if (c == lafComboBox) { + SupportedLaF supportedLaF = ((SupportedLaF) lafComboBox. + getSelectedItem()); + LookAndFeel laf = supportedLaF.laf; + try { + UIManager.setLookAndFeel(laf); + SwingUtilities.updateComponentTreeUI(frame); + if (chooser != null) { + SwingUtilities.updateComponentTreeUI(chooser); + } + frame.pack(); + } catch (UnsupportedLookAndFeelException exc) { + // This should not happen because we already checked + ((DefaultComboBoxModel) lafComboBox.getModel()). + removeElement(supportedLaF); + } + } + + } + } + + + private class FilePreviewer extends JComponent implements + PropertyChangeListener { + + ImageIcon thumbnail = null; + + @SuppressWarnings("LeakingThisInConstructor") + public FilePreviewer(JFileChooser fc) { + setPreferredSize(new Dimension(100, 50)); + fc.addPropertyChangeListener(this); + } + + public void loadImage(File f) { + if (f == null) { + thumbnail = null; + } else { + ImageIcon tmpIcon = new ImageIcon(f.getPath()); + if (tmpIcon.getIconWidth() > 90) { + thumbnail = new ImageIcon( + tmpIcon.getImage().getScaledInstance(90, -1, + Image.SCALE_DEFAULT)); + } else { + thumbnail = tmpIcon; + } + } + } + + public void propertyChange(PropertyChangeEvent e) { + String prop = e.getPropertyName(); + if (SELECTED_FILE_CHANGED_PROPERTY.equals(prop)) { + if (isShowing()) { + loadImage((File) e.getNewValue()); + repaint(); + } + } + } + + @Override + public void paint(Graphics g) { + if (thumbnail != null) { + int x = getWidth() / 2 - thumbnail.getIconWidth() / 2; + int y = getHeight() / 2 - thumbnail.getIconHeight() / 2; + if (y < 0) { + y = 0; + } + + if (x < 5) { + x = 5; + } + thumbnail.paintIcon(this, g, x, y); + } + } + } + + public static void main(String s[]) { + try { + SwingUtilities.invokeAndWait(new Runnable() { + + public void run() { + /* + * NOTE: By default, the look and feel will be set to the + * Cross Platform Look and Feel (which is currently Metal). + * The following code tries to set the Look and Feel to Nimbus. + * http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/nimbus.html + */ + try { + for (LookAndFeelInfo info : UIManager. + getInstalledLookAndFeels()) { + if (NIMBUS_LAF_NAME.equals(info.getName())) { + UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (Exception ignored) { + } + + FileChooserDemo panel = new FileChooserDemo(); + + frame = new JFrame("FileChooserDemo"); + frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + frame.getContentPane().add("Center", panel); + frame.pack(); + frame.setVisible(true); + } + }); + } catch (InterruptedException ex) { + Logger.getLogger(FileChooserDemo.class.getName()).log(Level.SEVERE, + null, + ex); + } catch (InvocationTargetException ex) { + Logger.getLogger(FileChooserDemo.class.getName()).log(Level.SEVERE, + null, + ex); + } + } + + + private static class InsetPanel extends JPanel { + + Insets i; + + InsetPanel(Insets i) { + this.i = i; + } + + @Override + public Insets getInsets() { + return i; + } + } +}