package ij.plugin; import ij.*; import ij.gui.*; import ij.process.*; import ij.io.*; import ij.plugin.filter.*; import java.awt.*; import java.awt.event.*; import java.util.Vector; /** This plugin implements most of the Edit/Options/Colors command. */ public class Colors implements PlugIn, ItemListener { public static final String[] colors = {"red","green","blue","magenta","cyan","yellow","orange","black","white"}; private Choice fchoice, bchoice, schoice; private Color fc2, bc2, sc2; public void run(String arg) { if (arg.equals("point")) pointToolOptions(); else showDialog(); } void showDialog() { Color fc =Toolbar.getForegroundColor(); String fname = getColorName(fc, "black"); Color bc =Toolbar.getBackgroundColor(); String bname = getColorName(bc, "white"); Color sc =Roi.getColor(); String sname = getColorName(sc, "yellow"); GenericDialog gd = new GenericDialog("Colors"); gd.addChoice("Foreground:", colors, fname); gd.addChoice("Background:", colors, bname); gd.addChoice("Selection:", colors, sname); Vector choices = gd.getChoices(); fchoice = (Choice)choices.elementAt(0); bchoice = (Choice)choices.elementAt(1); schoice = (Choice)choices.elementAt(2); fchoice.addItemListener(this); bchoice.addItemListener(this); schoice.addItemListener(this); gd.showDialog(); if (gd.wasCanceled()) { if (fc2!=fc) Toolbar.setForegroundColor(fc); if (bc2!=bc) Toolbar.setBackgroundColor(bc); if (sc2!=sc) { Roi.setColor(sc); ImagePlus imp = WindowManager.getCurrentImage(); if (imp!=null && imp.getRoi()!=null) imp.draw(); } return; } fname = gd.getNextChoice(); bname = gd.getNextChoice(); sname = gd.getNextChoice(); fc2 = getColor(fname, Color.black); bc2 = getColor(bname, Color.white); sc2 = getColor(sname, Color.yellow); if (fc2!=fc) Toolbar.setForegroundColor(fc2); if (bc2!=bc) Toolbar.setBackgroundColor(bc2); if (sc2!=sc) { Roi.setColor(sc2); ImagePlus imp = WindowManager.getCurrentImage(); if (imp!=null) imp.draw(); Toolbar.getInstance().repaint(); } } public static String getColorName(Color c, String defaultName) { if (c==null) return defaultName; String name = defaultName; if (c.equals(Color.red)) name = colors[0]; else if (c.equals(Color.green)) name = colors[1]; else if (c.equals(Color.blue)) name = colors[2]; else if (c.equals(Color.magenta)) name = colors[3]; else if (c.equals(Color.cyan)) name = colors[4]; else if (c.equals(Color.yellow)) name = colors[5]; else if (c.equals(Color.orange)) name = colors[6]; else if (c.equals(Color.black)) name = colors[7]; else if (c.equals(Color.white)) name = colors[8]; return name; } public static Color getColor(String name, Color defaultColor) { if (name==null) return defaultColor; Color c = defaultColor; if (name.equals(colors[0])) c = Color.red; else if (name.equals(colors[1])) c = Color.green; else if (name.equals(colors[2])) c = Color.blue; else if (name.equals(colors[3])) c = Color.magenta; else if (name.equals(colors[4])) c = Color.cyan; else if (name.equals(colors[5])) c = Color.yellow; else if (name.equals(colors[6])) c = Color.orange; else if (name.equals(colors[7])) c = Color.black; else if (name.equals(colors[8])) c = Color.white; return c; } public static Color decode(String hexColor, Color defaultColor) { Color color = getColor(hexColor, Color.gray); if (color==Color.gray) { if (hexColor.startsWith("#")) hexColor = hexColor.substring(1); int len = hexColor.length(); if (!(len==6 || len==8)) return defaultColor; float alpha = len==8?parseHex(hexColor.substring(0,2)):1f; if (len==8) hexColor = hexColor.substring(2); float red = parseHex(hexColor.substring(0,2)); float green = parseHex(hexColor.substring(2,4)); float blue = parseHex(hexColor.substring(4,6)); color = new Color(red, green, blue, alpha); } return color; } /** Converts a hex color (e.g., "ffff00") into "red", "green", "yellow", etc. Returns null if the color is not one of the eight primary colors. */ public static String hexToColor(String hex) { if (hex==null) return null; if (hex.startsWith("#")) hex = hex.substring(1); String color = null; if (hex.equals("ff0000")) color = "red"; else if (hex.equals("00ff00")) color = "green"; else if (hex.equals("0000ff")) color = "blue"; else if (hex.equals("000000")) color = "black"; else if (hex.equals("ffffff")) color = "white"; else if (hex.equals("ffff00")) color = "yellow"; else if (hex.equals("00ffff")) color = "cyan"; else if (hex.equals("ff00ff")) color = "magenta"; return color; } /** Converts a Color into a string ("red", "green", #aa55ff, etc.). */ public static String colorToString(Color color) { String str = color!=null?"#"+Integer.toHexString(color.getRGB()):"none"; if (str.length()==9 && str.startsWith("#ff")) str = "#"+str.substring(3); String str2 = hexToColor(str); return str2!=null?str2:str; } private static float parseHex(String hex) { float value = 0f; try {value=Integer.parseInt(hex,16);} catch(Exception e) { } return value/255f; } public void itemStateChanged(ItemEvent e) { Choice choice = (Choice)e.getSource(); String item = choice.getSelectedItem(); Color color = getColor(item, Color.black); if (choice==fchoice) Toolbar.setForegroundColor(color); else if (choice==bchoice) Toolbar.setBackgroundColor(color); else if (choice==schoice) { Roi.setColor(color); ImagePlus imp = WindowManager.getCurrentImage(); if (imp!=null && imp.getRoi()!=null) imp.draw(); Toolbar.getInstance().repaint(); } } // Point tool options void pointToolOptions() { boolean saveNoPointLabels = Prefs.noPointLabels; Color sc =Roi.getColor(); String sname = getColorName(sc, "yellow"); GenericDialog gd = new GenericDialog("Point Tool"); gd.addNumericField("Mark Width:", Analyzer.markWidth, 0, 2, "pixels"); gd.addCheckbox("Auto-Measure", Prefs.pointAutoMeasure); gd.addCheckbox("Auto-Next Slice", Prefs.pointAutoNextSlice); gd.addCheckbox("Add to ROI Manager", Prefs.pointAddToManager); gd.addCheckbox("Label Points", !Prefs.noPointLabels); gd.addChoice("Selection Color:", colors, sname); Vector choices = gd.getChoices(); schoice = (Choice)choices.elementAt(0); schoice.addItemListener(this); gd.showDialog(); if (gd.wasCanceled()) { if (sc2!=sc) { Roi.setColor(sc); ImagePlus imp = WindowManager.getCurrentImage(); if (imp!=null && imp.getRoi()!=null) imp.draw(); Toolbar.getInstance().repaint(); } return; } int width = (int)gd.getNextNumber(); if (width<0) width = 0; Analyzer.markWidth = width; Prefs.pointAutoMeasure = gd.getNextBoolean(); Prefs.pointAutoNextSlice = gd.getNextBoolean(); Prefs.pointAddToManager = gd.getNextBoolean(); Prefs.noPointLabels = !gd.getNextBoolean(); sname = gd.getNextChoice(); sc2 = getColor(sname, Color.yellow); if (Prefs.pointAutoNextSlice&&!Prefs.pointAddToManager) Prefs.pointAutoMeasure = true; if (Prefs.noPointLabels!=saveNoPointLabels) { ImagePlus imp = WindowManager.getCurrentImage(); if (imp!=null) imp.draw(); } if (sc2!=sc) { Roi.setColor(sc2); ImagePlus imp = WindowManager.getCurrentImage(); if (imp!=null) imp.draw(); Toolbar.getInstance().repaint(); } } }