/* TODO: sorted */ public static MenuItem installPlugin(String menuPath, String name, String command) { if (Menus.getCommands().get(name) != null) { IJ.log("The user plugin " + name + " would override an existing command!"); return null; } MenuItem item = null; if (IJ.getInstance() != null) { int croc = menuPath.lastIndexOf('>'); Menu menu = getMenu(menuPath); item = new MenuItem(name); menu.add(item); item.addActionListener(IJ.getInstance()); } Menus.getCommands().put(name, command); return item; }
/** Install the plugins now */ public void run(String arg) { if ("update".equals(arg)) { Menus.updateImageJMenus(); ClassLoader loader = IJ.getClassLoader(); if (loader != null && (loader instanceof FijiClassLoader)) return; } FijiClassLoader classLoader = new FijiClassLoader(true); try { classLoader.addPath(path); } catch (IOException e) { } try { // IJ.setClassLoader(classLoader); Class ij = Class.forName("ij.IJ"); java.lang.reflect.Method method = ij.getDeclaredMethod("setClassLoader", new Class[] {ClassLoader.class}); method.setAccessible(true); method.invoke(null, new Object[] {classLoader}); } catch (Exception e) { e.printStackTrace(); } installScripts(); installPlugins(path, ".", menuPath); /* make sure "Update Menus" runs _this_ plugin */ Menus.getCommands().put("Update Menus", "fiji.User_Plugins(\"update\")"); Menus.getCommands().put("Refresh Menus", "fiji.User_Plugins(\"update\")"); Menus.getCommands().put("Compile and Run...", "fiji.Compile_and_Run"); if (IJ.getInstance() != null) { Menu help = Menus.getMenuBar().getHelpMenu(); for (int i = help.getItemCount() - 1; i >= 0; i--) { MenuItem item = help.getItem(i); String name = item.getLabel(); if (name.equals("Update Menus")) item.setLabel("Refresh Menus"); } } // make sure "Edit>Options>Memory & Threads runs Fiji's plugin Menus.getCommands().put("Memory & Threads...", "fiji.Memory"); SampleImageLoader.install(); Main.installRecentCommands(); }
@Override public Map<String, Throwable> findPlugins(final List<PluginInfo<?>> plugins) { final Map<String, MenuPath> menuTable = parseMenus(IJ.getInstance()); final Hashtable<?, ?> commands = Menus.getCommands(); final int startSize = plugins.size(); for (final Object key : commands.keySet()) { final PluginInfo<Command> pe = createEntry(key, commands, menuTable); if (pe != null) plugins.add(pe); } final int pluginCount = plugins.size() - startSize; final int ignoredCount = commands.size() - pluginCount; log.info("Found " + pluginCount + " legacy plugins (plus " + ignoredCount + " ignored)."); return null; }
public void run(String arg) { if (arg.equals("menus")) { updateMenus(); return; } if (IJ.getApplet() != null) return; // File file = new File(Prefs.getHomeDir() + File.separator + "ij.jar"); // if (isMac() && !file.exists()) // file = new File(Prefs.getHomeDir() + File.separator + // "ImageJ.app/Contents/Resources/Java/ij.jar"); URL url = getClass().getResource("/ij/IJ.class"); String ij_jar = url == null ? null : url.toString().replaceAll("%20", " "); if (ij_jar == null || !ij_jar.startsWith("jar:file:")) { error("Could not determine location of ij.jar"); return; } int exclamation = ij_jar.indexOf('!'); ij_jar = ij_jar.substring(9, exclamation); if (IJ.debugMode) IJ.log("Updater: " + ij_jar); File file = new File(ij_jar); if (!file.exists()) { error("File not found: " + file.getPath()); return; } if (!file.canWrite()) { String msg = "No write access: " + file.getPath(); if (IJ.isVista()) msg += Prefs.vistaHint; error(msg); return; } String[] list = openUrlAsList(IJ.URL + "/download/jars/list.txt"); int count = list.length + 2; String[] versions = new String[count]; String[] urls = new String[count]; String uv = getUpgradeVersion(); if (uv == null) return; versions[0] = "v" + uv; urls[0] = IJ.URL + "/upgrade/ij.jar"; if (versions[0] == null) return; for (int i = 1; i < count - 1; i++) { String version = list[i - 1]; versions[i] = version.substring(0, version.length() - 1); // remove letter urls[i] = IJ.URL + "/download/jars/ij" + version.substring(1, 2) + version.substring(3, 6) + ".jar"; } versions[count - 1] = "daily build"; urls[count - 1] = IJ.URL + "/ij.jar"; int choice = showDialog(versions); if (choice == -1) return; if (!versions[choice].startsWith("daily") && versions[choice].compareTo("v1.39") < 0 && Menus.getCommands().get("ImageJ Updater") == null) { String msg = "This command is not available in versions of ImageJ prior\n" + "to 1.39 so you will need to install the plugin version at\n" + "<" + IJ.URL + "/plugins/imagej-updater.html>."; if (!IJ.showMessageWithCancel("Update ImageJ", msg)) return; } byte[] jar = getJar(urls[choice]); // file.renameTo(new File(file.getParent()+File.separator+"ij.bak")); if (version().compareTo("1.37v") >= 0) Prefs.savePreferences(); // if (!renameJar(file)) return; // doesn't work on Vista saveJar(file, jar); if (choice < count - 1) // force macro Function Finder to download fresh list new File(IJ.getDirectory("macros") + "functions.html").delete(); System.exit(0); }
private Object tryOpen(String directory, String name, String path) { // set up a stream to read in 132 bytes from the file header // These can be checked for "magic" values which are diagnostic // of some image types InputStream is; byte[] buf = new byte[132]; try { if (0 == path.indexOf("http://")) is = new java.net.URL(path).openStream(); else is = new FileInputStream(path); is.read(buf, 0, 132); is.close(); } catch (IOException e) { // couldn't open the file for reading return null; } name = name.toLowerCase(); width = PLUGIN_NOT_FOUND; // Temporarily suppress "plugin not found" errors if LOCI Bio-Formats plugin is installed if (Menus.getCommands().get("Bio-Formats Importer") != null && IJ.getVersion().compareTo("1.37u") >= 0) IJ.suppressPluginNotFoundError(); // OK now we get to the interesting bit // GJ: added Biorad PIC confocal file handler // ------------------------------------------ // These make 12345 if you read them as the right kind of short // and should have this value in every Biorad PIC file if (buf[54] == 57 && buf[55] == 48) { return tryPlugIn("Biorad_Reader", path); } // GJ: added Gatan Digital Micrograph DM3 handler // ---------------------------------------------- // check if the file ends in .DM3 or .dm3, // and bytes make an int value of 3 which is the DM3 version number if (name.endsWith(".dm3") && buf[0] == 0 && buf[1] == 0 && buf[2] == 0 && buf[3] == 3) { return tryPlugIn("DM3_Reader", path); } // IPLab file handler // Little-endian IPLab files start with "iiii" or "mmmm". if (name.endsWith(".ipl") || (buf[0] == 105 && buf[1] == 105 && buf[2] == 105 && buf[3] == 105) || (buf[0] == 109 && buf[1] == 109 && buf[2] == 109 && buf[3] == 109)) { return tryPlugIn("IPLab_Reader", path); } // Packard InstantImager format (.img) handler -> check HERE // before Analyze check below! // Check extension and signature bytes KAJ_ if (name.endsWith(".img") && buf[0] == 75 && buf[1] == 65 && buf[2] == 74 && buf[3] == 0) { return tryPlugIn("InstantImager_Reader", path); } // Analyze format (.img/.hdr) handler // Opens the file using the Nifti_Reader if it is installed, // otherwise the Analyze_Reader is used. Note that // the Analyze_Reader plugin opens and displays the // image and does not implement the ImagePlus class. if (name.endsWith(".img") || name.endsWith(".hdr")) { if (Menus.getCommands().get("NIfTI-Analyze") != null) return tryPlugIn("Nifti_Reader", path); else return tryPlugIn("Analyze_Reader", path); } // NIFTI format (.nii) handler if (name.endsWith(".nii") || name.endsWith(".nii.gz") || name.endsWith(".nii.z")) { return tryPlugIn("Nifti_Reader", path); } // Image Cytometry Standard (.ics) handler // http://valelab.ucsf.edu/~nico/IJplugins/Ics_Opener.html if (name.endsWith(".ics")) { return tryPlugIn("Ics_Opener", path); } // Princeton Instruments SPE image file (.spe) handler // http://rsb.info.nih.gov/ij/plugins/spe.html if (name.endsWith(".spe")) { return tryPlugIn("OpenSPE_", path); } // Zeiss Confocal LSM 510 image file (.lsm) handler // http://rsb.info.nih.gov/ij/plugins/lsm-reader.html if (name.endsWith(".lsm")) { Object obj = tryPlugIn("LSM_Reader", path); if (obj == null && Menus.getCommands().get("Show LSMToolbox") != null) obj = tryPlugIn("LSM_Toolbox", "file=" + path); return obj; } // BM: added Bruker file handler 29.07.04 if (name.equals("ser") || name.equals("fid") || name.equals("2rr") || name.equals("2ii") || name.equals("3rrr") || name.equals("3iii") || name.equals("2dseq")) { ij.IJ.showStatus("Opening Bruker " + name + " File"); return tryPlugIn("BrukerOpener", name + "|" + path); } // AVI: open AVI files using AVI_Reader plugin if (name.endsWith(".avi")) { return tryPlugIn("AVI_Reader", path); } // QuickTime: open .mov and .pict files using QT_Movie_Opener plugin if (name.endsWith(".mov") || name.endsWith(".pict")) { return tryPlugIn("QT_Movie_Opener", path); } // ZVI file handler // Little-endian ZVI and Thumbs.db files start with d0 cf 11 e0 // so we can only look at the extension. if (name.endsWith(".zvi")) { return tryPlugIn("ZVI_Reader", path); } // University of North Carolina (UNC) file format handler // 'magic' numbers are (int) offsets to data structures and // may change in future releases. if (name.endsWith(".unc") || (buf[3] == 117 && buf[7] == -127 && buf[11] == 36 && buf[14] == 32 && buf[15] == -127)) { return tryPlugIn("UNC_Reader", path); } // Amira file handler // http://wbgn013.biozentrum.uni-wuerzburg.de/ImageJ/amira-io.html if (buf[0] == 0x23 && buf[1] == 0x20 && buf[2] == 0x41 && buf[3] == 0x6d && buf[4] == 0x69 && buf[5] == 0x72 && buf[6] == 0x61 && buf[7] == 0x4d && buf[8] == 0x65 && buf[9] == 0x73 && buf[10] == 0x68 && buf[11] == 0x20) { return tryPlugIn("AmiraMeshReader_", path); } // Deltavision file handler // Open DV files generated on Applied Precision DeltaVision systems if (name.endsWith(".dv") || name.endsWith(".r3d")) { return tryPlugIn("Deltavision_Opener", path); } // Albert Cardona: read .mrc files (little endian). // Documentation at: http://ami.scripps.edu/prtl_data/mrc_specification.htm. // The parsing of the header is a bare minimum of what could be done. if (name.endsWith(".mrc")) { return tryPlugIn("Open_MRC_Leginon", path); } // Albert Cardona: read .dat files from the EMMENU software if (name.endsWith(".dat") && 1 == buf[1] && 0 == buf[2]) { // 'new format' only return tryPlugIn("Open_DAT_EMMENU", path); } // Timo Rantalainen and Michael Doube: read Stratec pQCT files. // File name is IDDDDDDD.MHH, where D is decimal and H is hex. if (name.matches("[iI]\\d{7}\\.[mM]\\p{XDigit}{2}")) { return tryPlugIn("org.doube.bonej.pqct.Read_Stratec_File", path); } // Michael Doube: read Scanco ISQ files // File name is ADDDDDDD.ISQ;D where D is a decimal and A is a letter try { String isqMagic = new String(buf, 0, 16, "UTF-8"); if (name.matches("[a-z]\\d{7}.isq;\\d+") || isqMagic.equals("CTDATA-HEADER_V1")) return tryPlugIn("org.bonej.io.ISQReader", path); } catch (Exception e) { } // David Mills: read Queen Mary MCD files if (name.endsWith(".mcd")) { return tryPlugIn("mcdReader", path); } // David Mills: read Queen Mary TOM files if (name.endsWith(".tom")) { return tryPlugIn("tomReader", path); } // ****************** MODIFY HERE ****************** // do what ever you have to do to recognise your own file type // and then call appropriate plugin using the above as models // e.g.: /* // A. Dent: Added XYZ handler // ---------------------------------------------- // check if the file ends in .xyz, and bytes 0 and 1 equal 42 if (name.endsWith(".xyz") && buf[0]==42 && buf[1]==42) { // Ok we've identified the file type - now load it return tryPlugIn("XYZ_Reader", path); } */ return null; }
/** * Run the command associated with a menu label if there is one * * @param menuLabel the label of the menu item to run */ public static void runPlugIn(String menuLabel) { String className = (String) Menus.getCommands().get(menuLabel); if (className != null) IJ.runPlugIn(className, null); }
static { Hashtable commands = Menus.getCommands(); bioformats = commands != null && commands.get("Bio-Formats Importer") != null; }