package ij.plugin;
import java.awt.*;
import ij.*;
import ij.gui.*;
import ij.plugin.frame.Editor;
import ij.text.TextWindow;
/** This class creates a new macro or the Java source for a new plugin. */
public class NewPlugin implements PlugIn {
public static final int MACRO=0, PLUGIN=1, PLUGIN_FILTER=2, PLUGIN_FRAME=3, TEXT_FILE=4, TABLE=5;
private static int type = MACRO;
private static String name = "Macro";
private static String[] types = {"Macro", "Plugin", "Plugin Filter", "Plugin Frame", "Text File", "Table"};
private static int rows = 16;
private static int columns = 60;
private static boolean monospaced;
private boolean menuBar = true;
private Editor ed;
private int saveType = type;
private String saveName = name;
private int saveRows = rows;
private int saveColumns = columns;
private boolean saveMonospaced = monospaced;
public void run(String arg) {
if (arg.equals("")&&!showDialog())
return;
if (arg.equals("text")) {
type = TEXT_FILE;
arg = "";
}
if (arg.equals("")) {
if (type==MACRO || type==TEXT_FILE) {
if (type==TEXT_FILE && name.equals("Macro"))
name = "Untitled.txt";
createMacro(name);
} else if (type==TABLE) {
createTextWindow();
} else
createPlugin(name, type, arg);
} else
createPlugin("Converted_Macro.java", PLUGIN, arg);
if (IJ.macroRunning()) {
type = saveType;
name = saveName;
rows = saveRows;
columns = saveColumns;
monospaced = saveMonospaced;
}
IJ.register(NewPlugin.class);
}
public void createMacro(String name) {
int options = (monospaced?Editor.MONOSPACED:0)+(menuBar?Editor.MENU_BAR:0);
ed = new Editor(rows, columns, 0, options);
if (name.endsWith(".java"))
name = name.substring(0, name.length()-5);
//if (name.endsWith("_"))
// name = name.substring(0, name.length()-1);
if (type==MACRO && !(name.endsWith(".txt")))
name += ".txt";
ed.create(name, "");
}
void createTextWindow() {
String tableName = name;
if (tableName.equals("Macro")) tableName = "Table";
if (columns<128 || rows<75 )
new TextWindow(tableName, "", 350, 250);
else
new TextWindow(tableName, "", columns, rows);
}
public void createPlugin(String name, int type, String methods) {
ed = (Editor)IJ.runPlugIn("ij.plugin.frame.Editor", "");
if (ed==null) return;
if (name.equals("Macro") || name.equals("Macro.txt") || name.equals("Untitled.txt")) {
switch (type) {
case PLUGIN: name = "My_Plugin.java"; break;
case PLUGIN_FILTER: name = "Filter_Plugin.java"; break;
case PLUGIN_FRAME: name = "Plugin_Frame.java"; break;
}
}
String pluginName = name;
if (!(name.endsWith(".java") || name.endsWith(".JAVA"))) {
if (pluginName.endsWith(".txt"))
pluginName = pluginName.substring(0, pluginName.length()-4);
pluginName += ".java";
}
//if (name.indexOf('_')==-1) {
// pluginName = pluginName.substring(0, pluginName.length()-5);
// pluginName = pluginName + "_.java";
//}
String className = pluginName.substring(0, pluginName.length()-5);
String text = "";
text += "import ij.*;\n";
text += "import ij.process.*;\n";
text += "import ij.gui.*;\n";
text += "import java.awt.*;\n";
switch (type) {
case PLUGIN:
text += "import ij.plugin.*;\n";
text += "\n";
text += "public class "+className+" implements PlugIn {\n";
text += "\n";
text += "\tpublic void run(String arg) {\n";
if (methods.equals(""))
text += "\t\tIJ.showMessage(\""+className+"\",\"Hello world!\");\n";
else
text += methods;
text += "\t}\n";
break;
case PLUGIN_FILTER:
text += "import ij.plugin.filter.*;\n";
text += "\n";
text += "public class "+className+" implements PlugInFilter {\n";
text += "\tImagePlus imp;\n";
text += "\n";
text += "\tpublic int setup(String arg, ImagePlus imp) {\n";
text += "\t\tthis.imp = imp;\n";
text += "\t\treturn DOES_ALL;\n";
text += "\t}\n";
text += "\n";
text += "\tpublic void run(ImageProcessor ip) {\n";
text += "\t\tip.invert();\n";
text += "\t\timp.updateAndDraw();\n";
text += "\t\tIJ.wait(500);\n";
text += "\t\tip.invert();\n";
text += "\t\timp.updateAndDraw();\n";
text += "\t}\n";
break;
case PLUGIN_FRAME:
text += "import ij.plugin.frame.*;\n";
text += "\n";
text += "public class "+className+" extends PlugInFrame {\n";
text += "\n";
text += "\tpublic "+className+"() {\n";
text += "\t\tsuper(\""+className+"\");\n";
text += "\t\tTextArea ta = new TextArea(15, 50);\n";
text += "\t\tadd(ta);\n";
text += "\t\tpack();\n";
text += "\t\tGUI.center(this);\n";
text += "\t\tshow();\n";
text += "\t}\n";
break;
}
text += "\n";
text += "}\n";
ed.create(pluginName, text);
}
public boolean showDialog() {
GenericDialog gd = new GenericDialog("New Text Window");
gd.addStringField("Name:", name, 16);
gd.addChoice("Type:", types, types[type]);
gd.addMessage("");
gd.addNumericField("Width:", columns, 0, 3, "characters");
gd.addNumericField("Height:", rows, 0, 3, "lines");
gd.setInsets(5, 30, 0);
gd.addCheckbox("Menu Bar", menuBar);
gd.setInsets(0, 30, 0);
gd.addCheckbox("Monospaced Font", monospaced);
gd.showDialog();
if (gd.wasCanceled())
return false;
name = gd.getNextString();
type = gd.getNextChoiceIndex();
columns = (int)gd.getNextNumber();
rows = (int)gd.getNextNumber();
menuBar = gd.getNextBoolean();
monospaced = gd.getNextBoolean();
if (rows<1) rows = 1;
if (type!=TABLE && rows>100) rows = 100;
if (columns<1) columns = 1;
if (type!=TABLE && columns>200) columns = 200;
return true;
}
/** Returns the Editor the newly created macro or plugin was opened in. */
public Editor getEditor() {
return ed;
}
}