// "StartupMacros"
// The macros and macro tools in this file ("StartupMacros.txt") are 
// automatically installed in the Plugins>Macros submenu and
//  in the tool bar when ImageJ starts up.

//  About the drawing tools.
//
//  This is a set of drawing tools similar to the pencil, paintbrush, 
//  eraser and flood fill (paint bucket) tools in NIH Image. The 
//  pencil and paintbrush draw in the current foreground color 
//  and the eraser draws in the current background color. The
//  flood fill tool fills the selected area using the foreground color.
//  Hold down the alt key to have the pencil and paintbrush draw 
//  using the background color or to have the flood fill tool fill 
//  using the background color. Set the foreground and background 
//  colors by double-clicking on the flood fill tool or on the eye  
//  dropper tool.  Double-click on the pencil, paintbrush or eraser 
//  tool  to set the drawing width for that tool.
//
// Icons contributed by Tony Collins.

   // Global variables
   var pencilWidth=1,  eraserWidth=10, leftClick=16, alt=8;
   var brushWidth = 10; //call("ij.Prefs.get", "startup.brush", "10");
   var floodType =  "8-connected"; //call("ij.Prefs.get", "startup.flood", "8-connected");

   // The macro named "AutoRun" runs when ImageJ starts.
   // macro "AutoRun" {print("AutoRun");}

   // The macro named "AutoRunAndHide" runs when ImageJ starts
   // and the file containing it is not displayed when ImageJ opens it.
   // macro "AutoRunAndHide" {}

   macro "AutoRun" {
      //run("My Plugin");
  }

  //macro "Unused Tool -" {}

  macro "Abort Macro or Plugin (or press Esc key) Action Tool - CbooP51b1f5fbbf5f1b15510T5c10X" {
      setKeyDown("Esc");
  }
 
  var xx = requires138b(); // check version at install
  function requires138b() {requires("1.38b"); return 0; }

    var dCmds = newMenu("Developer Menu Tool",
      newArray("ImageJ Website","News", "ImageJ Wiki", "Resources", "Macro Language", "Macros", "Macro Functions", 
      "Startup Macros...", "Plugins", "Source Code", "List Archives", "-", "Record...", "Capture Screen ", 
      "Monitor Memory...", "List Commands...", "Control Panel...", "Search...", "Debug Mode"));
      
  macro "Developer Menu Tool - C037T0b11DT7b09eTcb09v" {
       cmd = getArgument();
       if (cmd=="ImageJ Website")
           run("URL...", "url=http://rsbweb.nih.gov/ij/");
       else if (cmd=="News")
           run("URL...", "url=http://rsbweb.nih.gov/ij/notes.html");
       else if (cmd=="ImageJ Wiki")
           run("URL...", "url=http://imagejdocu.tudor.lu/imagej-documentation-wiki/");
       else if (cmd=="Resources")
           run("URL...", "url=http://rsbweb.nih.gov/ij/developer/");
       else if (cmd=="Macro Language")
           run("URL...", "url=http://rsbweb.nih.gov/ij/developer/macro/macros.html");
       else if (cmd=="Macros")
           run("URL...", "url=http://rsbweb.nih.gov/ij/macros/");
        else if (cmd=="Macro Functions")
           run("URL...", "url=http://rsbweb.nih.gov/ij/developer/macro/functions.html");
        else if (cmd=="Plugins")
           run("URL...", "url=http://rsbweb.nih.gov/ij/plugins/");
        else if (cmd=="Source Code")
           run("URL...", "url=http://rsbweb.nih.gov/ij/developer/source/");
        else if (cmd=="List Archives")
           run("URL...", "url=https://list.nih.gov/archives/imagej.html");
        else if (cmd=="Debug Mode")
           setOption("DebugMode", true);
	 else if (cmd!="-")
            run(cmd);
  }

  var sCmds = newMenu("Stacks Menu Tool", 
       newArray("Add Slice", "Delete Slice", "Next Slice [>]", "Previous Slice [<]", "Set Slice...", "-",
       "Convert Images to Stack", "Convert Stack to Images", "Make Montage...", "Reslice [/]...", "Z Project...",
       "3D Project...", "Plot Z-axis Profile", "-", "Start Animation", "Stop Animation", "Animation Options...",
       "-", "MRI Stack (528K)"));
  macro "Stacks Menu Tool - C037T0b11ST8b09tTcb09k" {
      cmd = getArgument();
      if (cmd!="-") run(cmd);
  }


  var luts = getLutList();
  var lCmds = newMenu("LUT Menu Tool", luts);
  macro "LUT Menu Tool - C037T0b11LT6b09UTcb09T" {
       cmd = getArgument();
  	if (cmd!="-") run(cmd);
  }
  function getLutList() {
      lutdir = getDirectory("startup")+"luts"+File.separator;
      list = newArray("No LUTs in the '/ImageJ/luts' folder");
      if (!File.exists(lutdir))
           return list;
      rawlist = getFileList(lutdir);
      if (rawlist.length==0)
           return list;
      count = 0;
      for (i=0; i< rawlist.length; i++)
          if (endsWith(rawlist[i], ".lut")) count++;
      if (count==0)
          return list;
      list = newArray(count);
      index = 0;
      for (i=0; i< rawlist.length; i++) {
          if (endsWith(rawlist[i], ".lut"))
              list[index++] = substring(rawlist[i], 0, lengthOf(rawlist[i])-4);
      }
      return list;
  }

   macro "Pencil Tool - C037L494fL4990L90b0Lc1c3L82a4Lb58bL7c4fDb4L5a5dL6b6cD7b" {
        getCursorLoc(x, y, z, flags);
        if (flags&alt!=0)
              setColorToBackgound();
        draw(pencilWidth);
   }

   macro "Paintbrush Tool - C037La077Ld098L6859L4a2fL2f4fL3f99L5e9bL9b98L6888L5e8dL888c" {
        getCursorLoc(x, y, z, flags);
        if (flags&alt!=0)
              setColorToBackgound();
        draw(brushWidth);
   }

    macro "Flood Fill Tool -C037B21P085373b75d0L4d1aL3135L4050L6166D57D77D68La5adLb6bcD09D94" {
        requires("1.34j");
        setupUndo();
        getCursorLoc(x, y, z, flags);
        if (flags&alt!=0) setColorToBackgound();
        floodFill(x, y, floodType);
     }

   function draw(width) {
        requires("1.32g");
        setupUndo();
        getCursorLoc(x, y, z, flags);
        setLineWidth(width);
        moveTo(x,y);
        x2=-1; y2=-1;
        while (true) {
            getCursorLoc(x, y, z, flags);
            if (flags&leftClick==0) exit();
            if (x!=x2 || y!=y2)
                lineTo(x,y);
            x2=x; y2 =y;
            wait(10);
        }
   }

   function setColorToBackgound() {
       savep = getPixel(0, 0);
       makeRectangle(0, 0, 1, 1);
       run("Clear");
       background = getPixel(0, 0);
       run("Select None");
       setPixel(0, 0, savep);
       setColor(background);
   }

  // Runs when the user double-clicks on the pencil tool icon
  macro 'Pencil Tool Options...' {
       pencilWidth = getNumber("Pencil Width (pixels):", pencilWidth);
  }

  // Runs when the user double-clicks on the paint brush tool icon
  macro 'Paintbrush Tool Options...' {
      brushWidth = getNumber("Brush Width (pixels):", brushWidth);
    call("ij.Prefs.set", "startup.brush", brushWidth);
  }

  // Runs when the user double-clicks on the flood fill tool icon
  macro 'Flood Fill Tool Options...' {
      Dialog.create("Flood Fill Tool");
      Dialog.addChoice("Flood Type:", newArray("4-connected", "8-connected"), floodType);
      Dialog.show();
      floodType = Dialog.getChoice();
      call("ij.Prefs.set", "startup.flood", floodType);
  }

  
// This tool draws arrows. Double click on the
// tool icon to set the line width. Double click
// on the eye dropper tool to define the color.
// Press "z" to undo.
  var lineWidth=2;
  macro "Arrow Tool -C037L1ee1L65e1La9e1" {
      leftButton=16; rightButton=4; alt=8;
      getCursorLoc(x, y, z, flags); 
      xstart = x; ystart = y; 
      x2=x; y2=y;
      setOption("disablePopupMenu", true); 
      while (flags!=0) { 
          getCursorLoc(x, y, z, flags); 
          if (x!=x2 || y!=y2) 
              makeLine(xstart, ystart, x, y); 
          x2=x; y2=y; 
          wait(10); 
      }
      setOption("disablePopupMenu", false);
       if (x!=xstart || y!=ystart)
          drawArrow(xstart, ystart, x, y, lineWidth);
      run("Select None");   
  }
  function drawArrow(x1, y1, x2, y2, lineWidth) {
      setupUndo();
      setLineWidth(lineWidth);
      size = 12+12*lineWidth*0.25;
      dx = x2-x1;
      dy = y2-y1;
      ra = sqrt(dx*dx + dy*dy);
      dx /= ra;
      dy /= ra;
      x3 = round(x2-dx*size);
      y3 = round(y2-dy*size);
      r = 0.3*size;
      x4 = round(x3+dy*r);
      y4 = round(y3-dx*r);
      x5 = round(x3-dy*r);
      y5 = round(y3+dx*r);
      drawLine(x1, y1, x2, y2);
      if (!isKeyDown("alt")) 
          {moveTo(x4,y4); lineTo(x2,y2); lineTo(x5,y5);}
  }

 //  This is a tool macro similar to the spray can tool in NIH Image.
//  Double-click on the tool icon to set the spray width, dot size
//  and flow rate.

  var sprayCanWidth=75, sprayCanDotSize=1, sprayCanRate=6;

   macro 'Spray Can Tool - C037D20D22D24D41D43D62D82Da2L93b3D84Dc4L75d5L757f Ld5dfLa7d7LabdbLa9d9LacdcLa7ac' {
         setLineWidth(sprayCanDotSize);
         radius=sprayCanWidth/2; radius2=radius*radius;
         start = getTime();
         autoUpdate(false);
         n = 5*exp(0.9*(10-sprayCanRate));
         if (n<=5) n = 0;
         while (true) {
            getCursorLoc(x, y, z, flags);
            if (flags&16==0) exit();
            x2 = (random()-0.5)*sprayCanWidth;
            y2 = (random()-0.5)*sprayCanWidth;
            if (x2*x2+y2*y2<radius2) {
                x += x2;
                y += y2;
                drawLine(x, y, x, y);
                if (getTime()>start+50) {
                    updateDisplay();
                    start = getTime();
                 }
            }
          
            for (i=0; i<n; i++);
        }
   }

  // ImageJ runs this macro when user double-clicks on the spay can tool icon
  macro 'Spray Can Tool Options' {
    Dialog.create("Spray Can Options");
    Dialog.addNumber("Spray Width (pixels):", sprayCanWidth);
    Dialog.addNumber("Dot Size (pixels):", sprayCanDotSize);
    Dialog.addNumber("Flow Rate (1-10):", sprayCanRate);
    Dialog.show();
    sprayCanWidth = Dialog.getNumber();
    sprayCanDotSize = Dialog.getNumber();
    sprayCanRate = Dialog.getNumber();
    if (sprayCanRate<1) sprayCanRate = 1;
    if (sprayCanRate>10) sprayCanRate = 10;
 }

  // ImageJ runs this macro when user double-clicks on the tool icon
  macro "Arrow Tool Options" {
      lineWidth = getNumber("Line Width:", lineWidth);
 }
  macro "Set Drawing Color..."{ 
      run("Color Picker..."); 
  }

  macro "-" {} //menu divider
   macro "About Startup Macros..." {
       path = getDirectory("macros")+"/About Startup Macros";
       if (!File.exists(path))
           exit("\"About Startup Macros\" not found in ImageJ/macros/.");
       open(path);
   }

macro "Count Spots [f1]" {
    run("Find Maxima...", "noise=500 output=Count");
}


  var pmCmds = newMenu("Popup Menu",
       newArray("Help...", "Rename...", "Duplicate...", "Original Scale", "Paste Control...",
       "-", "Record...", "Capture Screen ", "Monitor Memory...", "List Commands...", "Control Panel...", "Startup Macros...", "Search...",
       "-", "Find Maxima..."));

  macro "Popup Menu" {
      cmd = getArgument();
      if (cmd=="Help...")
           showMessage("About Popup Menu",
               "To customize this menu, edit the line that starts with\n\"var pmCmds\" in ImageJ/macros/StartupMacros.txt.");
      else
          run(cmd);
  }

  macro "Save As JPEG... [j]" {
     quality = call("ij.plugin.JpegWriter.getQuality");
     quality = getNumber("JPEG quality (0-100):", quality);
     run("Input/Output...", "jpeg="+quality);
     saveAs("Jpeg");
  }






