package ij.plugin;
import ij.*;
import ij.gui.*;
import ij.util.*;
import java.awt.*;
import java.io.*;
import java.util.*;
/** Implements the Plugins/Hotkeys/Install and Remove commands. */
public class Hotkeys implements PlugIn {
private static final String TITLE = "Hotkeys";
private static String command = "";
private static String shortcut = "";
public void run(String arg) {
if (arg.equals("install"))
installHotkey();
else if (arg.equals("remove"))
removeHotkey();
else {
Executer e = new Executer(arg);
e.run();
}
IJ.register(Hotkeys.class);
}
void installHotkey() {
String[] commands = getAllCommands();
GenericDialog gd = new GenericDialog("Create Shortcut");
gd.addChoice("Command:", commands, command);
gd.addStringField("Shortcut:", shortcut, 3);
gd.showDialog();
if (gd.wasCanceled())
return;
command = gd.getNextChoice();
shortcut = gd.getNextString();
if (shortcut.equals("")) {
IJ.showMessage(TITLE, "Shortcut required");
return;
}
if (shortcut.length()>1)
shortcut = shortcut.replace('f','F');
String plugin = "ij.plugin.Hotkeys("+"\""+command+"\")";
int err = Menus.installPlugin(plugin,Menus.SHORTCUTS_MENU,"*"+command,shortcut,IJ.getInstance());
switch (err) {
case Menus.COMMAND_IN_USE:
IJ.showMessage(TITLE, "The command \"" + command + "\" is already installed.");
break;
case Menus.INVALID_SHORTCUT:
IJ.showMessage(TITLE, "The shortcut must be a single character or F1-F24.");
break;
case Menus.SHORTCUT_IN_USE:
IJ.showMessage("The \""+shortcut+"\" shortcut is already being used.");
break;
default:
shortcut = "";
break;
}
}
void removeHotkey() {
String[] commands = getInstalledCommands();
if (commands==null) {
IJ.showMessage("Remove...", "No installed commands found.");
return;
}
GenericDialog gd = new GenericDialog("Remove");
gd.addChoice("Command:", commands, "");
gd.addMessage("The command is not removed\nuntil ImageJ is restarted.");
gd.showDialog();
if (gd.wasCanceled())
return;
command = gd.getNextChoice();
int err = Menus.uninstallPlugin(command);
boolean removed = true;
if(err==Menus.COMMAND_NOT_FOUND)
removed = deletePlugin(command);
if (removed) {
IJ.showStatus("\""+command + "\" removed; ImageJ restart required");
} else
IJ.showStatus("\""+command + "\" not removed");
}
boolean deletePlugin(String command) {
String plugin = (String)Menus.getCommands().get(command);
String name = plugin+".class";
File file = new File(Menus.getPlugInsPath(), name);
if (file==null || !file.exists())
return false;
else
return IJ.showMessageWithCancel("Delete Plugin?", "Permanently delete \""+name+"\"?");
}
String[] getAllCommands() {
Vector v = new Vector();
for (Enumeration en=Menus.getCommands().keys(); en.hasMoreElements();) {
String cmd = (String)en.nextElement();
if (!cmd.startsWith("*"))
v.addElement(cmd);
}
String[] list = new String[v.size()];
v.copyInto((String[])list);
StringSorter.sort(list);
return list;
}
String[] getInstalledCommands() {
Vector v = new Vector();
Hashtable commandTable = Menus.getCommands();
for (Enumeration en=commandTable.keys(); en.hasMoreElements();) {
String cmd = (String)en.nextElement();
if (cmd.startsWith("*"))
v.addElement(cmd);
else {
String plugin = (String)commandTable.get(cmd);
if (plugin.indexOf("_")>=0 && !plugin.startsWith("ij."))
v.addElement(cmd);
}
}
if (v.size()==0)
return null;
String[] list = new String[v.size()];
v.copyInto((String[])list);
StringSorter.sort(list);
return list;
}
}