| SaveDialog |

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

    /** This class displays a dialog window from
        which the user can save a file. */
    public class SaveDialog {

        private String dir;
        private String name;
        private String title;
        private String ext;

        /** Displays a file save dialog with 'title' as the
            title, 'defaultName' as the initial file name, and
            'extension' (e.g. ".tif") as the default extension.
        */
        public SaveDialog(String title, String defaultName, String extension) {
            this.title = title;
            ext = extension;
            if (isMacro())
                return;
            String defaultDir = OpenDialog.getDefaultDirectory();
            defaultName = addExtension(defaultName, extension);
            if (Prefs.useJFileChooser)
                jSave(title, defaultDir, defaultName);
            else
                save(title, defaultDir, defaultName);
            if (name!=null && dir!=null)
                OpenDialog.setDefaultDirectory(dir);
            IJ.showStatus(title+": "+dir+name);
        }

        /** Displays a file save dialog, using the specified
            default directory and file name and extension. */
        public SaveDialog(String title, String defaultDir, String defaultName, String extension) {
            this.title = title;
            ext = extension;
            if (isMacro())
                return;
            defaultName = addExtension(defaultName, extension);
            if (Prefs.useJFileChooser)
                jSave(title, defaultDir, defaultName);
            else
                save(title, defaultDir, defaultName);
            IJ.showStatus(title+": "+dir+name);
        }

        boolean isMacro() {
            String macroOptions = Macro.getOptions();
            if (macroOptions!=null) {
                String path = Macro.getValue(macroOptions, title, null);
                if (path==null)
                    path = Macro.getValue(macroOptions, "path", null);
                //if (path==null && oneRunArg) {
                //  path = macroOptions;
                //}
                if (path!=null) {
                    Opener o = new Opener();
                    dir = o.getDir(path);
                    name = o.getName(path);
                    return true;
                }
            }
            return false;
        }

        String addExtension(String name, String extension) {
            if (name!=null && extension!=null) {
                int dotIndex = name.lastIndexOf(".");
                if (dotIndex>=0)
                    name = name.substring(0, dotIndex) + extension;
                else
                    name += extension;
            }
            return name;
        }

        // Save using JFileChooser.
        void jSave(String title, String defaultDir, String defaultName) {
            Java2.setSystemLookAndFeel();
            if (EventQueue.isDispatchThread())
                jSaveDispatchThread(title, defaultDir, defaultName);
            else
                jSaveInvokeAndWait(title, defaultDir, defaultName);
        }

        // Save using JFileChooser.
        // assumes we are running on the event dispatch thread
        void jSaveDispatchThread(String title, String defaultDir, String defaultName) {
            JFileChooser fc = new JFileChooser();
            fc.setDialogTitle(title);
            if (defaultDir!=null) {
                File f = new File(defaultDir);
                if (f!=null)
                    fc.setCurrentDirectory(f);
            }
            if (defaultName!=null)
                fc.setSelectedFile(new File(defaultName));
            int returnVal = fc.showSaveDialog(IJ.getInstance());
            if (returnVal!=JFileChooser.APPROVE_OPTION)
                {Macro.abort(); return;}
            File f = fc.getSelectedFile();
            if(f.exists()) {
                int ret = JOptionPane.showConfirmDialog (fc,
                    "The file "+ f.getName() + " already exists. \nWould you like to replace it?",
                    "Replace?",
                    JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
                if (ret!=JOptionPane.OK_OPTION) f = null;
            }
            if (f==null)
                Macro.abort();
            else {
                dir = fc.getCurrentDirectory().getPath()+File.separator;
                name = fc.getName(f);
            }
        }

        // Save using JFileChooser. Runs on event
        // dispatch thread to avoid thread deadlocks.
        void jSaveInvokeAndWait(final String title, final String defaultDir, final String defaultName) {
            try {
                EventQueue.invokeAndWait(new Runnable() {
                    public void run() {
                        JFileChooser fc = new JFileChooser();
                        fc.setDialogTitle(title);
                        if (defaultDir!=null) {
                            File f = new File(defaultDir);
                            if (f!=null)
                                fc.setCurrentDirectory(f);
                        }
                        if (defaultName!=null)
                            fc.setSelectedFile(new File(defaultName));
                        int returnVal = fc.showSaveDialog(IJ.getInstance());
                        if (returnVal!=JFileChooser.APPROVE_OPTION)
                            {Macro.abort(); return;}
                        File f = fc.getSelectedFile();
                        if(f.exists()) {
                            int ret = JOptionPane.showConfirmDialog (fc,
                                "The file "+ f.getName() + " already exists. \nWould you like to replace it?",
                                "Replace?",
                                JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
                            if (ret!=JOptionPane.OK_OPTION) f = null;
                        }
                        if (f==null)
                            Macro.abort();
                        else {
                            dir = fc.getCurrentDirectory().getPath()+File.separator;
                            name = fc.getName(f);
                        }
                    }
                });
            } catch (Exception e) {}
        }

        // Save using FileDialog
        void save(String title, String defaultDir, String defaultName) {
            ImageJ ij = IJ.getInstance();
            Frame parent = ij!=null?ij:new Frame();
            FileDialog fd = new FileDialog(parent, title, FileDialog.SAVE);
            if (defaultName!=null)
                fd.setFile(defaultName);
            if (defaultDir!=null)
                fd.setDirectory(defaultDir);
            fd.show();
            name = fd.getFile();
            dir = fd.getDirectory();
            if (name==null)
                Macro.abort();
            fd.dispose();
            if (ij==null)
                parent.dispose();
        }

        /** Returns the selected directory. */
        public String getDirectory() {
            OpenDialog.lastDir = dir;
            return dir;
        }

        /** Returns the selected file name. */
        public String getFileName() {
            if (Recorder.record) {
                Recorder.recordPath(title, dir+name);
                //String cmd = Recorder.getCommandName();
                //if (cmd.endsWith("..."))
                //  cmd = cmd.substring(0, cmd.length()-3);
                //Recorder.record("saveAs", cmd, dir+name);
                //Recorder.setCommand(null);
            }
            OpenDialog.lastName = name;
            return name;
        }

    }

| SaveDialog |