| NewPlugin |

    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;
        }

    }

| NewPlugin |