package ij.plugin;
import ij.*;
import ij.gui.*;
import ij.process.*;
import ij.io.*;
import ij.plugin.filter.*;
import ij.plugin.frame.LineWidthAdjuster;
import java.awt.*;
/** This plugin implements most of the commands
in the Edit/Options sub-menu. */
public class Options implements PlugIn {
public void run(String arg) {
if (arg.equals("misc"))
{miscOptions(); return;}
else if (arg.equals("line"))
{lineWidth(); return;}
else if (arg.equals("io"))
{io(); return;}
else if (arg.equals("conv"))
{conversions(); return;}
else if (arg.equals("display"))
{appearance(); return;}
else if (arg.equals("dicom"))
{dicom(); return;}
}
// Miscellaneous Options
void miscOptions() {
String key = IJ.isMacintosh()?"command":"control";
GenericDialog gd = new GenericDialog("Miscellaneous Options", IJ.getInstance());
gd.addStringField("Divide by zero value:", ""+FloatBlitter.divideByZeroValue, 10);
gd.addCheckbox("Use pointer cursor", Prefs.usePointerCursor);
gd.addCheckbox("Hide \"Process Stack?\" dialog", IJ.hideProcessStackDialog);
gd.addCheckbox("Require "+key+" key for shortcuts", Prefs.requireControlKey);
gd.addCheckbox("Move isolated plugins to Misc. menu", Prefs.moveToMisc);
gd.addCheckbox("Run single instance listener", Prefs.runSocketListener);
gd.addCheckbox("Debug mode", IJ.debugMode);
gd.addHelp(IJ.URL+"/docs/menus/edit.html#misc");
gd.showDialog();
if (gd.wasCanceled())
return;
String divValue = gd.getNextString();
if (divValue.equalsIgnoreCase("infinity") || divValue.equalsIgnoreCase("infinite"))
FloatBlitter.divideByZeroValue = Float.POSITIVE_INFINITY;
else if (divValue.equalsIgnoreCase("NaN"))
FloatBlitter.divideByZeroValue = Float.NaN;
else if (divValue.equalsIgnoreCase("max"))
FloatBlitter.divideByZeroValue = Float.MAX_VALUE;
else {
Float f;
try {f = new Float(divValue);}
catch (NumberFormatException e) {f = null;}
if (f!=null)
FloatBlitter.divideByZeroValue = f.floatValue();
}
IJ.register(FloatBlitter.class);
Prefs.usePointerCursor = gd.getNextBoolean();
IJ.hideProcessStackDialog = gd.getNextBoolean();
Prefs.requireControlKey = gd.getNextBoolean();
Prefs.moveToMisc = gd.getNextBoolean();
Prefs.runSocketListener = gd.getNextBoolean();
IJ.debugMode = gd.getNextBoolean();
}
void lineWidth() {
int width = (int)IJ.getNumber("Line Width:", Line.getWidth());
if (width==IJ.CANCELED) return;
Line.setWidth(width);
LineWidthAdjuster.update();
ImagePlus imp = WindowManager.getCurrentImage();
if (imp!=null && imp.isProcessor()) {
ImageProcessor ip = imp.getProcessor();
ip.setLineWidth(Line.getWidth());
Roi roi = imp.getRoi();
if (roi!=null && roi.isLine()) imp.draw();
}
}
// Input/Output options
void io() {
GenericDialog gd = new GenericDialog("I/O Options");
gd.addNumericField("JPEG quality (0-100):", FileSaver.getJpegQuality(), 0, 3, "");
gd.addNumericField("GIF and PNG transparent index:", Prefs.getTransparentIndex(), 0, 3, "");
gd.addStringField("File extension for tables:", Prefs.get("options.ext", ".txt"), 4);
gd.addCheckbox("Use JFileChooser to open/save", Prefs.useJFileChooser);
if (!IJ.isMacOSX())
gd.addCheckbox("Use_file chooser to import sequences", Prefs.useFileChooser);
gd.addCheckbox("Save TIFF and raw in Intel byte order", Prefs.intelByteOrder);
gd.setInsets(15, 20, 0);
gd.addMessage("Results Table Options");
gd.setInsets(3, 40, 0);
gd.addCheckbox("Copy_column headers", Prefs.copyColumnHeaders);
gd.setInsets(0, 40, 0);
gd.addCheckbox("Copy_row numbers", !Prefs.noRowNumbers);
gd.setInsets(0, 40, 0);
gd.addCheckbox("Save_column headers", !Prefs.dontSaveHeaders);
gd.setInsets(0, 40, 0);
gd.addCheckbox("Save_row numbers", !Prefs.dontSaveRowNumbers);
gd.showDialog();
if (gd.wasCanceled())
return;
int quality = (int)gd.getNextNumber();
if (quality<0) quality = 0;
if (quality>100) quality = 100;
FileSaver.setJpegQuality(quality);
int transparentIndex = (int)gd.getNextNumber();
Prefs.setTransparentIndex(transparentIndex);
String extension = gd.getNextString();
if (!extension.startsWith("."))
extension = "." + extension;
Prefs.set("options.ext", extension);
Prefs.useJFileChooser = gd.getNextBoolean();
if (!IJ.isMacOSX())
Prefs.useFileChooser = gd.getNextBoolean();
Prefs.intelByteOrder = gd.getNextBoolean();
Prefs.copyColumnHeaders = gd.getNextBoolean();
Prefs.noRowNumbers = !gd.getNextBoolean();
Prefs.dontSaveHeaders = !gd.getNextBoolean();
Prefs.dontSaveRowNumbers = !gd.getNextBoolean();
return;
}
// Conversion Options
void conversions() {
double[] weights = ColorProcessor.getWeightingFactors();
boolean weighted = !(weights[0]==1d/3d && weights[1]==1d/3d && weights[2]==1d/3d);
//boolean weighted = !(Math.abs(weights[0]-1d/3d)<0.0001 && Math.abs(weights[1]-1d/3d)<0.0001 && Math.abs(weights[2]-1d/3d)<0.0001);
GenericDialog gd = new GenericDialog("Conversion Options");
gd.addCheckbox("Scale When Converting", ImageConverter.getDoScaling());
String prompt = "Weighted RGB Conversions";
if (weighted)
prompt += " (" + IJ.d2s(weights[0]) + "," + IJ.d2s(weights[1]) + ","+ IJ.d2s(weights[2]) + ")";
gd.addCheckbox(prompt, weighted);
gd.showDialog();
if (gd.wasCanceled())
return;
ImageConverter.setDoScaling(gd.getNextBoolean());
Prefs.weightedColor = gd.getNextBoolean();
if (!Prefs.weightedColor)
ColorProcessor.setWeightingFactors(1d/3d, 1d/3d, 1d/3d);
else if (Prefs.weightedColor && !weighted)
ColorProcessor.setWeightingFactors(0.299, 0.587, 0.114);
return;
}
void appearance() {
GenericDialog gd = new GenericDialog("Appearance", IJ.getInstance());
gd.addCheckbox("Interpolate zoomed images", Prefs.interpolateScaledImages);
gd.addCheckbox("Open images at 100%", Prefs.open100Percent);
gd.addCheckbox("Black canvas", Prefs.blackCanvas);
gd.addCheckbox("No image border", Prefs.noBorder);
gd.addCheckbox("Use inverting lookup table", Prefs.useInvertingLut);
gd.addCheckbox("Antialiased tool icons", Prefs.antialiasedTools);
gd.addNumericField("Menu font size:", Menus.getFontSize(), 0, 3, "points");
gd.addHelp(IJ.URL+"/docs/menus/edit.html#appearance");
gd.showDialog();
if (gd.wasCanceled())
return;
boolean interpolate = gd.getNextBoolean();
Prefs.open100Percent = gd.getNextBoolean();
boolean blackCanvas = gd.getNextBoolean();
boolean noBorder = gd.getNextBoolean();
boolean useInvertingLut = gd.getNextBoolean();
boolean antialiasedTools = gd.getNextBoolean();
boolean change = antialiasedTools!=Prefs.antialiasedTools;
Prefs.antialiasedTools = antialiasedTools;
if (change) Toolbar.getInstance().repaint();
int menuSize = (int)gd.getNextNumber();
if (interpolate!=Prefs.interpolateScaledImages) {
Prefs.interpolateScaledImages = interpolate;
ImagePlus imp = WindowManager.getCurrentImage();
if (imp!=null)
imp.draw();
}
if (blackCanvas!=Prefs.blackCanvas) {
Prefs.blackCanvas = blackCanvas;
ImagePlus imp = WindowManager.getCurrentImage();
if (imp!=null) {
ImageWindow win = imp.getWindow();
if (win!=null) {
if (Prefs.blackCanvas) {
win.setForeground(Color.white);
win.setBackground(Color.black);
} else {
win.setForeground(Color.black);
win.setBackground(Color.white);
}
imp.repaintWindow();
}
}
}
if (noBorder!=Prefs.noBorder) {
Prefs.noBorder = noBorder;
ImagePlus imp = WindowManager.getCurrentImage();
if (imp!=null) imp.repaintWindow();
}
if (useInvertingLut!=Prefs.useInvertingLut) {
invertLuts(useInvertingLut);
Prefs.useInvertingLut = useInvertingLut;
}
if (menuSize!=Menus.getFontSize() && !IJ.isMacintosh()) {
Menus.setFontSize(menuSize);
IJ.showMessage("Appearance", "Restart ImageJ to use the new font size");
}
}
void invertLuts(boolean useInvertingLut) {
int[] list = WindowManager.getIDList();
if (list==null) return;
for (int i=0; i<list.length; i++) {
ImagePlus imp = WindowManager.getImage(list[i]);
if (imp==null) return;
ImageProcessor ip = imp.getProcessor();
if (useInvertingLut != ip.isInvertedLut() && !ip.isColorLut()) {
ip.invertLut();
int nImages = imp.getStackSize();
if (nImages==1)
ip.invert();
else {
ImageStack stack2 = imp.getStack();
for (int slice=1; slice<=nImages; slice++)
stack2.getProcessor(slice).invert();
stack2.setColorModel(ip.getColorModel());
}
}
}
}
// DICOM options
void dicom() {
GenericDialog gd = new GenericDialog("DICOM Options");
gd.addCheckbox("Open as 32-bit float", Prefs.openDicomsAsFloat);
//gd.addCheckbox("Calculate voxel depth", Prefs.calculateDicomVoxelDepth);
gd.addMessage("Orthogonal Views");
gd.setInsets(5, 40, 0);
gd.addCheckbox("Rotate YZ", Prefs.rotateYZ);
gd.setInsets(0, 40, 0);
gd.addCheckbox("Flip XZ", Prefs.flipXZ);
gd.showDialog();
if (gd.wasCanceled())
return;
Prefs.openDicomsAsFloat = gd.getNextBoolean();
//Prefs.calculateDicomVoxelDepth = gd.getNextBoolean();
Prefs.rotateYZ = gd.getNextBoolean();
Prefs.flipXZ = gd.getNextBoolean();
}
} // class Options