package ij;
import ij.process.*;
import ij.gui.*;
import ij.io.*;
import ij.measure.*;
import ij.plugin.filter.*;
import ij.macro.Interpreter;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import java.util.Locale;
import java.util.Hashtable;
/** The class contains static methods that perform macro operations. */
public class Macro {
public static final String MACRO_CANCELED = "Macro canceled";
// A table of Thread as keys and String as values, so
// Macro options are local to each calling thread.
static private Hashtable table = new Hashtable();
static boolean abort;
public static boolean open(String path) {
if (path==null || path.equals("")) {
Opener o = new Opener();
return true;
}
Opener o = new Opener();
ImagePlus img = o.openImage(path);
if (img==null)
return false;
img.show();
return true;
}
public static boolean saveAs(String path) {
ImagePlus imp = WindowManager.getCurrentImage();
if (imp==null)
return false;
FileSaver fs = new FileSaver(imp);
if (path==null || path.equals(""))
return fs.saveAsTiff();
if (imp.getStackSize()>1)
return fs.saveAsTiffStack(path);
else
return fs.saveAsTiff(path);
}
public static String getName(String path) {
int i = path.lastIndexOf('/');
if (i==-1)
i = path.lastIndexOf('\\');
if (i>0)
return path.substring(i+1);
else
return path;
}
public static String getDir(String path) {
int i = path.lastIndexOf('/');
if (i==-1)
i = path.lastIndexOf('\\');
if (i>0)
return path.substring(0, i+1);
else
return "";
}
/** Aborts the currently running macro or any plugin using IJ.run(). */
public static void abort() {
abort = true;
//IJ.log("Abort: "+Thread.currentThread().getName());
if (Thread.currentThread().getName().endsWith("Macro$")) {
table.remove(Thread.currentThread());
throw new RuntimeException(MACRO_CANCELED);
}
}
/** If a command started using run(name, options) is running,
and the current thread is the same thread,
returns the options string, otherwise, returns null.
@see ij.gui.GenericDialog
@see ij.io.OpenDialog
*/
public static String getOptions() {
//IJ.log("getOptions: "+Thread.currentThread().hashCode()); //ts
if (Thread.currentThread().getName().startsWith("Run$_")) {
Object options = table.get(Thread.currentThread());
return options==null?null:options+" ";
} else
return null;
}
/** Define a set of Macro options for the current Thread. */
public static void setOptions(String options) {
//IJ.log("setOptions: "+Thread.currentThread().hashCode()+" "+options); //ts
if (options==null || options.equals(""))
table.remove(Thread.currentThread());
else
table.put(Thread.currentThread(), options);
}
/** Define a set of Macro options for a Thread. */
public static void setOptions(Thread thread, String options) {
if (null==thread)
throw new RuntimeException("Need a non-null thread instance");
if (null==options)
table.remove(thread);
else
table.put(thread, options);
}
public static String getValue(String options, String key, String defaultValue) {
key = trimKey(key);
key += '=';
int index=-1;
do { // Require that key not be preceded by a letter
index = options.indexOf(key, ++index);
if (index<0) return defaultValue;
} while (index!=0&&Character.isLetter(options.charAt(index-1)));
options = options.substring(index+key.length(), options.length());
if (options.charAt(0)=='\'') {
index = options.indexOf("'",1);
if (index<0)
return defaultValue;
else
return options.substring(1, index);
} else if (options.charAt(0)=='[') {
index = options.indexOf("]",1);
if (index<0)
return defaultValue;
else
return options.substring(1, index);
} else {
//if (options.indexOf('=')==-1) {
// options = options.trim();
// IJ.log("getValue: "+key+" |"+options+"|");
// if (options.length()>0)
// return options;
// else
// return defaultValue;
//}
index = options.indexOf(" ");
if (index<0)
return defaultValue;
else
return options.substring(0, index);
}
}
public static String trimKey(String key) {
int index = key.indexOf(" ");
if (index>-1)
key = key.substring(0,index);
index = key.indexOf(":");
if (index>-1)
key = key.substring(0,index);
key = key.toLowerCase(Locale.US);
return key;
}
}