package ij.plugin;
import ij.*;
import ij.gui.*;
import ij.io.*;
import ij.util.*;
import java.awt.*;
import java.io.*;
import java.util.*;
import java.lang.reflect.*;
/** Implements the Plugins/Shortcuts/Install... command. */
public class Installer implements PlugIn {
private static String[] menus = {"Shortcuts", "Plugins", "Import", "Save As",
"Filters", "Tools", "Utilities"};
private static final String TITLE = "Installer";
private static String command = "";
private static String shortcut = "";
private static String defaultPlugin = "";
private static String menuStr = menus[0];
public void run(String arg) {
installPlugin();
}
void installPlugin() {
String[] plugins = getPlugins();
if (plugins==null || plugins.length==0) {
IJ.error("No plugins found");
return;
}
GenericDialog gd = new GenericDialog("Install Plugin", IJ.getInstance());
gd.addChoice("Plugin:", plugins, defaultPlugin);
gd.addChoice("Menu:", menus, menuStr);
gd.addStringField("Command:", command, 16);
gd.addStringField("Shortcut:", shortcut, 3);
gd.addStringField("Argument:", "", 12);
gd.showDialog();
if (gd.wasCanceled())
return;
String plugin = gd.getNextChoice();
menuStr = gd.getNextChoice();
command = gd.getNextString();
shortcut = gd.getNextString();
String argument = gd.getNextString();
IJ.register(Installer.class);
defaultPlugin = plugin;
if (command.equals("")) {
IJ.showMessage(TITLE, "Command required");
return;
}
if (shortcut.length()>1)
shortcut = shortcut.replace('f','F');
char menu = ' ';
if (menuStr.equals(menus[0]))
menu = Menus.SHORTCUTS_MENU;
else if (menuStr.equals(menus[1]))
menu = Menus.PLUGINS_MENU;
else if (menuStr.equals(menus[2]))
menu = Menus.IMPORT_MENU;
else if (menuStr.equals(menus[3]))
menu = Menus.SAVE_AS_MENU;
else if (menuStr.equals(menus[4]))
menu = Menus.FILTERS_MENU;
else if (menuStr.equals(menus[5]))
menu = Menus.TOOLS_MENU;
else if (menuStr.equals(menus[6]))
menu = Menus.UTILITIES_MENU;
if (!argument.equals(""))
plugin += "(\"" + argument +"\")";
int err = Menus.installPlugin(plugin,menu,command,shortcut,IJ.getInstance());
switch (err) {
case Menus.COMMAND_IN_USE:
IJ.showMessage(TITLE, "The command \""+command+"\" \nis already being used.");
return;
case Menus.INVALID_SHORTCUT:
IJ.showMessage(TITLE, "The shortcut must be a single character or \"F1\"-\"F12\".");
return;
case Menus.SHORTCUT_IN_USE:
IJ.showMessage("The \""+shortcut+"\" shortcut is already being used.");
return;
default:
command = "";
shortcut = "";
break;
}
if (!plugin.endsWith(")"))
installAbout(plugin);
}
void installAbout(String plugin) {
boolean hasShowAboutMethod=false;
PluginClassLoader loader = new PluginClassLoader(Menus.getPlugInsPath());
try {
Class c = loader.loadClass(plugin);
Method m = c.getDeclaredMethod("showAbout", new Class[0]);
if (m!=null)
hasShowAboutMethod = true;
}
catch (Exception e) {}
//IJ.write("installAbout: "+plugin+" "+hasShowAboutMethod);
if (hasShowAboutMethod)
Menus.installPlugin(plugin+"(\"about\")",Menus.ABOUT_MENU,plugin+"...","",IJ.getInstance());
}
String[] getPlugins() {
String path = Menus.getPlugInsPath();
if (path==null)
return null;
File f = new File(path);
String[] list = f.list();
if (list==null) return null;
Vector v = new Vector();
for (int i=0; i<list.length; i++) {
String className = list[i];
boolean isClassFile = className.endsWith(".class");
if (className.indexOf('_')>=0 && isClassFile && className.indexOf('$')<0 ) {
className = className.substring(0, className.length()-6);
v.addElement(className);
} else {
if (!isClassFile)
getSubdirectoryPlugins(path, className, v);
}
}
list = new String[v.size()];
v.copyInto((String[])list);
StringSorter.sort(list);
return list;
}
/** Looks for plugins in a subdirectorie of the plugins directory. */
void getSubdirectoryPlugins(String path, String dir, Vector v) {
//IJ.write("getSubdirectoryPlugins: "+path+dir);
if (dir.endsWith(".java"))
return;
File f = new File(path, dir);
if (!f.isDirectory())
return;
String[] list = f.list();
if (list==null)
return;
dir += "/";
for (int i=0; i<list.length; i++) {
String name = list[i];
if (name.indexOf('_')>=0 && name.endsWith(".class") && name.indexOf('$')<0 ) {
name = name.substring(0, name.length()-6); // remove ".class"
v.addElement(name);
//IJ.write("File: "+f+"/"+name);
}
}
}
}