package ij.io; import ij.*; import ij.gui.*; import ij.plugin.frame.Recorder; import ij.util.Java2; import ij.macro.Interpreter; import java.awt.*; import java.io.*; import javax.swing.*; import javax.swing.filechooser.*; /** This class displays a dialog window from which the user can select an input file. */ public class OpenDialog { private String dir; private String name; private boolean recordPath; private static String defaultDirectory; private static Frame sharedFrame; private String title; private static String lastDir, lastName; /** Displays a file open dialog with 'title' as the title. If 'path' is non-blank, it is used and the dialog is not displayed. Uses and updates the ImageJ default directory. */ public OpenDialog(String title, String path) { String macroOptions = Macro.getOptions(); if (macroOptions!=null && (path==null||path.equals(""))) { path = Macro.getValue(macroOptions, title, path); if (path==null || path.equals("")) path = Macro.getValue(macroOptions, "path", path); if ((path==null || path.equals("")) && title!=null && title.equals("Open As String")) path = Macro.getValue(macroOptions, "OpenAsString", path); path = lookupPathVariable(path); } if (path==null || path.equals("")) { if (Prefs.useJFileChooser) jOpen(title, getDefaultDirectory(), null); else open(title, getDefaultDirectory(), null); if (name!=null) defaultDirectory = dir; this.title = title; recordPath = true; } else { decodePath(path); recordPath = IJ.macroRunning(); } IJ.register(OpenDialog.class); } /** Displays a file open dialog, using the specified default directory and file name. */ public OpenDialog(String title, String defaultDir, String defaultName) { String path = null; String macroOptions = Macro.getOptions(); if (macroOptions!=null) path = Macro.getValue(macroOptions, title, path); if (path!=null) decodePath(path); else { if (Prefs.useJFileChooser) jOpen(title, defaultDir, defaultName); else open(title, defaultDir, defaultName); this.title = title; recordPath = true; } } public static String lookupPathVariable(String path) { if (path!=null && path.indexOf(".")==-1 && !((new File(path)).exists())) { if (path.startsWith("&")) path=path.substring(1); Interpreter interp = Interpreter.getInstance(); String path2 = interp!=null?interp.getStringVariable(path):null; if (path2!=null) path = path2; } return path; } // Uses JFileChooser to display file open dialog box. void jOpen(String title, String path, String fileName) { Java2.setSystemLookAndFeel(); if (EventQueue.isDispatchThread()) jOpenDispatchThread(title, path, fileName); else jOpenInvokeAndWait(title, path, fileName); } // Uses the JFileChooser class to display the dialog box. // Assumes we are running on the event dispatch thread void jOpenDispatchThread(String title, String path, final String fileName) { JFileChooser fc = new JFileChooser(); fc.setDialogTitle(title); File fdir = null; if (path!=null) fdir = new File(path); if (fdir!=null) fc.setCurrentDirectory(fdir); if (fileName!=null) fc.setSelectedFile(new File(fileName)); int returnVal = fc.showOpenDialog(IJ.getInstance()); if (returnVal!=JFileChooser.APPROVE_OPTION) {Macro.abort(); return;} File file = fc.getSelectedFile(); if (file==null) {Macro.abort(); return;} name = file.getName(); dir = fc.getCurrentDirectory().getPath()+File.separator; } // Run JFileChooser on event dispatch thread to avoid deadlocks void jOpenInvokeAndWait(final String title, final String path, final String fileName) { try { EventQueue.invokeAndWait(new Runnable() { public void run() { JFileChooser fc = new JFileChooser(); fc.setDialogTitle(title); File fdir = null; if (path!=null) fdir = new File(path); if (fdir!=null) fc.setCurrentDirectory(fdir); if (fileName!=null) fc.setSelectedFile(new File(fileName)); int returnVal = fc.showOpenDialog(IJ.getInstance()); if (returnVal!=JFileChooser.APPROVE_OPTION) {Macro.abort(); return;} File file = fc.getSelectedFile(); if (file==null) {Macro.abort(); return;} name = file.getName(); dir = fc.getCurrentDirectory().getPath()+File.separator; } }); } catch (Exception e) {} } // Uses the AWT FileDialog class to display the dialog box void open(String title, String path, String fileName) { Frame parent = IJ.getInstance(); if (parent==null) { if (sharedFrame==null) sharedFrame = new Frame(); parent = sharedFrame; } FileDialog fd = new FileDialog(parent, title); if (path!=null) fd.setDirectory(path); if (fileName!=null) fd.setFile(fileName); //GUI.center(fd); fd.show(); name = fd.getFile(); if (name==null) { if (IJ.isMacOSX()) System.setProperty("apple.awt.fileDialogForDirectories", "false"); Macro.abort(); } else dir = fd.getDirectory(); } void decodePath(String path) { int i = path.lastIndexOf('/'); if (i==-1) i = path.lastIndexOf('\\'); if (i>0) { dir = path.substring(0, i+1); name = path.substring(i+1); } else { dir = ""; name = path; } } /** Returns the selected directory. */ public String getDirectory() { lastDir = dir; return dir; } /** Returns the selected file name. */ public String getFileName() { if (Recorder.record && recordPath) Recorder.recordPath(title, dir+name); lastName = name; return name; } /** Returns the current working directory, which may be null. The returned string always ends with the separator character ("/" or "\").*/ public static String getDefaultDirectory() { if (defaultDirectory==null) defaultDirectory = Prefs.getDefaultDirectory(); return defaultDirectory; } /** Sets the current working directory. */ public static void setDefaultDirectory(String defaultDir) { defaultDirectory = defaultDir; if (!defaultDirectory.endsWith(File.separator)) defaultDirectory = defaultDirectory + File.separator; } /** Returns the path to the last directory opened by the user using a file open or file save dialog, or using drag and drop. Returns null if the users has not opened a file. */ public static String getLastDirectory() { return lastDir; } /** Sets the path to the directory containing the last file opened by the user. */ public static void setLastDirectory(String dir) { lastDir = dir; } /** Returns the name of the last file opened by the user using a file open or file save dialog, or using drag and drop. Returns null if the users has not opened a file. */ public static String getLastName() { return lastName; } /** Sets the name of the last file opened by the user. */ public static void setLastName(String name) { lastName = name; } }