// // ShortcutPanel.java // /* LOCI Plugins for ImageJ: a collection of ImageJ plugins including the Bio-Formats Importer, Bio-Formats Exporter, Bio-Formats Macro Extensions, Data Browser and Stack Slicer. Copyright (C) 2005-@year@ Melissa Linkert, Curtis Rueden and Christopher Peterson. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package loci.plugins.shortcut; import ij.IJ; import ij.plugin.PlugIn; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.util.ArrayList; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.WindowConstants; import javax.swing.border.EmptyBorder; import loci.plugins.util.WindowTools; /** * A plugin that displays a small window containing shortcuts to the LOCI * plugins, including the Bio-Formats Importer, Bio-Formats Exporter, * Stack Colorizer and Stack Slicer. * * Files dragged and dropped onto the window will be opened using the * Bio-Formats Importer plugin. * * <dl><dt><b>Source code:</b></dt> * <dd><a href="http://trac.openmicroscopy.org.uk/ome/browser/bioformats.git/components/loci-plugins/src/loci/plugins/shortcut/ShortcutPanel.java">Trac</a>, * <a href="http://git.openmicroscopy.org/?p=bioformats.git;a=blob;f=components/loci-plugins/src/loci/plugins/shortcut/ShortcutPanel.java;hb=HEAD">Gitweb</a></dd></dl> * * @author Curtis Rueden ctrueden at wisc.edu */ public class ShortcutPanel extends JPanel implements ActionListener, PlugIn { // -- Constants -- /** Name of plugin to use for opening dropped files. */ protected static final String OPENER_PLUGIN = "Bio-Formats Importer"; /** Name of this plugin, ignored when parsing the plugins list. */ protected static final String SHORTCUT_PLUGIN = "LOCI Plugins Shortcut Window"; /** Name of the 'LOCI' submenu. */ protected static final String NORMAL_MENU = "Plugins>LOCI"; /** Name of the 'About Plugins' submenu. */ protected static final String HELP_MENU = "Help>About Plugins"; /** Number of pixels for window border. */ protected static final int BORDER = 10; // -- Fields -- /** Index of plugin to use to open dropped files. */ protected static int openerIndex; /** Details for installed LOCI plugins. */ protected static String[] names, plugins, args; static { // load list of LOCI plugins int index = -1; ArrayList<String> vNames = new ArrayList<String>(); ArrayList<String> vPlugins = new ArrayList<String>(); ArrayList<String> vArgs = new ArrayList<String>(); // read from configuration file try { URL url = ShortcutPanel.class.getResource("ShortcutPanel.class"); String path = url.toString(); path = path.substring(0, path.indexOf("!")) + "!/plugins.config"; url = new URL(path); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); while (true) { String line = in.readLine(); if (line == null) break; // determine plugin type boolean normal = line.startsWith(NORMAL_MENU); boolean help = line.startsWith(HELP_MENU); if (!normal && !help) continue; // parse plugin information int quote1 = line.indexOf("\""); if (quote1 < 0) continue; int quote2 = line.indexOf("\"", quote1 + 1); if (quote2 < 0) continue; int quote3 = line.indexOf("\"", quote2 + 1); if (quote3 < 0) continue; int quote4 = line.indexOf("\"", quote3 + 1); if (quote4 < 0) continue; String name = line.substring(quote1 + 1, quote2); if (help) name = "About " + name.substring(0, name.length() - 3); String plugin = line.substring(quote2 + 2, quote3 - 1).trim(); String arg = line.substring(quote3 + 1, quote4); if (name.equals(OPENER_PLUGIN)) index = vNames.size(); if (!name.equals(SHORTCUT_PLUGIN)) { vNames.add(name); vPlugins.add(plugin); vArgs.add(arg); } } in.close(); } catch (IOException exc) { exc.printStackTrace(); } openerIndex = index; names = vNames.toArray(new String[0]); plugins = vPlugins.toArray(new String[0]); args = vArgs.toArray(new String[0]); } // -- Constructor -- /** Constructs a shortcut panel. */ public ShortcutPanel() { setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); setBorder(new EmptyBorder(BORDER, BORDER, BORDER, BORDER)); setTransferHandler(new ShortcutTransferHandler(this)); JButton[] b = new JButton[names.length]; Dimension prefSize = new Dimension(-1, -1); Dimension maxSize = new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); for (int i=0; i<names.length; i++) { b[i] = new JButton(names[i]); Dimension d = b[i].getPreferredSize(); if (d.width > prefSize.width) prefSize.width = d.width; if (d.height > prefSize.height) prefSize.height = d.height; } for (int i=0; i<b.length; i++) { b[i].setPreferredSize(prefSize); b[i].setMaximumSize(maxSize); b[i].addActionListener(this); add(b[i]); } } // -- ShortcutPanel API methods -- /** * Opens the given location (e.g., file) * with the Bio-Formats Importer plugin. */ public void open(String id) { String arg = args[openerIndex] + "open=[" + id + "] "; runPlugIn(plugins[openerIndex], arg); } /** Executes the given plugin, in a separate thread. */ public static void runPlugIn(final String className, final String arg) { // NB: If we don't run in a separate thread, there are GUI update // problems with the ImageJ status bar and log window. new Thread() { public void run() { try { IJ.runPlugIn(className, arg); } catch (Throwable t) { WindowTools.reportException(t); } } }.start(); } // -- ActionListener API methods -- /** Handles button presses. */ public void actionPerformed(ActionEvent e) { JButton b = (JButton) e.getSource(); String name = b.getText(); for (int i=0; i<names.length; i++) { if (name.equals(names[i])) { runPlugIn(plugins[i], args[i]); break; } } } // -- PlugIn API methods -- /** Executes the plugin. */ public void run(String arg) { JFrame frame = new JFrame("LOCI Plugins Shortcut Window"); frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); frame.setContentPane(new ShortcutPanel()); frame.pack(); WindowTools.placeWindow(frame); frame.setVisible(true); } }