Package ij.io

Source Code of ij.io.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;
import ij.macro.Interpreter;

/** 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 = setExtension(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 = setExtension(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 && path.indexOf(".")==-1 && !((new File(path)).exists())) {
        // Is 'path' a macro variable?
        if (path.startsWith("&")) path=path.substring(1);
        Interpreter interp = Interpreter.getInstance();
        String path2 = interp!=null?interp.getStringVariable(path):null;
        if (path2!=null) path = path2;
      }
      if (path!=null) {
        Opener o = new Opener();
        dir = o.getDir(path);
        name = o.getName(path);
        return true;
      }
    }
    return false;
  }
 
  public static String setExtension(String name, String extension) {
    if (name==null || extension==null || extension.length()==0)
      return name;
    int dotIndex = name.lastIndexOf(".");
    if (dotIndex>=0 && (name.length()-dotIndex)<=5) {
      if (dotIndex+1<name.length() && Character.isDigit(name.charAt(dotIndex+1)))
        name += extension;
      else
        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);
      if (name!=null && name.indexOf(".")==-1)
        name = setExtension(name, ext);
    }
  }

  // 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);
            if (name!=null && name.indexOf(".")==-1)
              name = setExtension(name, ext);
          }
        }
      });
    } 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();
    if (name!=null && name.indexOf(".")==-1)
      name = setExtension(name, ext);
    dir = fd.getDirectory();
    if (name==null)
      Macro.abort();
    fd.dispose();
    if (ij==null)
      parent.dispose();
  }
 
  /** Returns the selected directory. */
  public String getDirectory() {
    OpenDialog.setLastDirectory(dir);
    return dir;
  }
 
  /** Returns the selected file name. */
  public String getFileName() {
    if (Recorder.record)
      Recorder.recordPath(title, dir+name);
    OpenDialog.setLastName(name);
    return name;
  }
   
}
TOP

Related Classes of ij.io.SaveDialog

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.