| DirectoryChooser |

    package ij.io;
    import ij.*;
    import ij.gui.*;
    import ij.plugin.frame.Recorder;
    import ij.util.Java2;
    import java.awt.*;
    import java.io.*;
    import javax.swing.*;
    import javax.swing.filechooser.*;

    /** This class displays a dialog box that allows the user can select a directory. */
     public class DirectoryChooser {
        private String directory;
        private static String defaultDir;

        /** Display a dialog using the specified title. */
        public DirectoryChooser(String title) {
            if (IJ.isMacOSX() && IJ.isJava14())
                getDirectoryUsingFileDialog(title);
            else if (IJ.isJava2()) {
                if (EventQueue.isDispatchThread())
                    getDirectoryUsingJFileChooserOnThisThread(title);
                else
                    getDirectoryUsingJFileChooser(title);
            } else {
                OpenDialog od = new OpenDialog(title, null);
                directory = od.getDirectory();
            }
        }

        // runs JFileChooser on event dispatch thread to avoid possible thread deadlocks
        void getDirectoryUsingJFileChooser(final String title) {
            Java2.setSystemLookAndFeel();
            try {
                EventQueue.invokeAndWait(new Runnable() {
                    public void run() {
                        JFileChooser chooser = new JFileChooser();
                        if (defaultDir!=null)
                            chooser.setCurrentDirectory(new File(defaultDir));
                        chooser.setDialogTitle(title);
                        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                        chooser.setApproveButtonText("Select");
                        if (chooser.showOpenDialog(null)==JFileChooser.APPROVE_OPTION) {
                            File dir = chooser.getCurrentDirectory();
                            File file = chooser.getSelectedFile();
                            directory = dir.getPath();
                            if (!directory.endsWith(File.separator))
                                directory += File.separator;
                            defaultDir = directory;
                            String fileName = file.getName();
                            if (fileName.indexOf(":\\")!=-1)
                                directory = defaultDir = fileName;
                            else
                                directory += fileName+File.separator;
                        }
                    }
                });
            } catch (Exception e) {}
        }

        // Choose a directory using JFileChooser on the current thread
        void getDirectoryUsingJFileChooserOnThisThread(final String title) {
            Java2.setSystemLookAndFeel();
            try {
                JFileChooser chooser = new JFileChooser();
                if (defaultDir!=null)
                    chooser.setCurrentDirectory(new File(defaultDir));
                chooser.setDialogTitle(title);
                chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                chooser.setApproveButtonText("Select");
                if (chooser.showOpenDialog(null)==JFileChooser.APPROVE_OPTION) {
                    File dir = chooser.getCurrentDirectory();
                    File file = chooser.getSelectedFile();
                    directory = dir.getPath();
                    if (!directory.endsWith(File.separator))
                        directory += File.separator;
                    defaultDir = directory;
                    String fileName = file.getName();
                    if (fileName.indexOf(":\\")!=-1)
                        directory = defaultDir = fileName;
                    else
                        directory += fileName+File.separator;
                }
            } catch (Exception e) {}
        }

        // On Mac OS X, we can select directories using the native file open dialog
        void getDirectoryUsingFileDialog(String title) {
            boolean saveUseJFC = Prefs.useJFileChooser;
            Prefs.useJFileChooser = false;
            System.setProperty("apple.awt.fileDialogForDirectories", "true");
            OpenDialog od = new OpenDialog(title, null);
            if (od.getDirectory()==null)
                directory = null;
            else
                directory = od.getDirectory() + od.getFileName() + "/";
            System.setProperty("apple.awt.fileDialogForDirectories", "false");
            Prefs.useJFileChooser = saveUseJFC;
        }

        /** Returns the directory selected by the user. */
        public String getDirectory() {
            //IJ.log("getDirectory: "+directory);
            return directory;
        }

    }

| DirectoryChooser |