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 the Edit/Options/Wand Tool command. */
public class WandToolOptions implements PlugIn, DialogListener {
	private static final String[] modes = {"Legacy", "4-connected", "8-connected"};
	private static String mode = modes[0];
	private static double tolerance;
	private ImagePlus imp;
	private boolean showCheckbox;
	private static int startx, starty;
	private static int ID;

 	public void run(String arg) {
 		imp = WindowManager.getCurrentImage();
 		Roi roi = imp!=null?imp.getRoi():null;
 		boolean selection = roi!=null && roi.getType()==Roi.TRACED_ROI;
 		if (imp==null || (ID!=0&&imp.getID()!=ID) || !selection)
 			startx = starty = 0;
 		ID = imp!=null?imp.getID():0;
 		double sliderMax = 255;
 		int depth = imp!=null?imp.getBitDepth():0;
 		if (depth==16 || depth==32) {
 			sliderMax = imp.getProcessor().getMax();
 			if (depth==32) sliderMax+=0.0000000001;
 		}
 		showCheckbox = imp!=null && depth!=24 && WindowManager.getFrame("Threshold")==null
 			&& !imp.isThreshold();
		GenericDialog gd = new GenericDialog("Wand Tool");
		gd.addSlider("Tolerance: ", 0, sliderMax, tolerance);
		gd.addChoice("Mode:", modes, mode);
		if (showCheckbox) {
			gd.addCheckbox("Enable Thresholding", false);
			gd.setInsets(2,0,0);
			gd.addMessage("Thresholded objects are traced and \"Tolerance\"\nis ignored when thresholding is enabled.");
		}
		gd.addDialogListener(this); 
		gd.showDialog();
	}
	
	public boolean dialogItemChanged(GenericDialog gd, AWTEvent e) {
		if (gd.wasCanceled())
			return false;
		tolerance = gd.getNextNumber();
		mode = gd.getNextChoice();
		if (showCheckbox) {
			if (gd.getNextBoolean()) {
				imp.deleteRoi();
				IJ.run("Threshold...");
			}
		}
		if (startx>0||starty>0)
			IJ.doWand(startx, starty, tolerance, mode);
		return true;
	}

	public static String getMode() {
		return mode;
	}

	public static double getTolerance() {
		return tolerance;
	}
	
	public static final void setStart(int x, int y) {
		startx = x;
		starty = y;
	}

}
