//////////////////////////////////////////////////////////////
// Example macro tool based on the BigCursorTool 
// example available on the ImageJ web site at 
// http://rsb.info.nih.gov/ij/macros/tools/BigCursorTool.txt
/////////////////////////////////////////////////////////////
// Author: Gilles Carpentier, Faculte des Sciences et 
// Technologies,  Universite Paris 12 Val de Marne, France

// The example image at "/ij/macros/images/multicursor.jpg"
// shows how this full size cursor can be used to "multipoint " a panel of 4
// microscopic images of the same field in fluorescence mode. The example panel
// contains a triple lableling of cloned myoblast cells (mouse). From the left to right; the red 
// channel (red fluorescence), the green channel (green fluorescence), the blue channel 
// (blue fluorescence,hoechst), and the composite images of the three channels.

// Cell culture and immunochemistry; Juliette peltzer.
// Images from the courtasy of Dr angelica Keller.

// The number of cursors can be changed by double clicking on 
// the tool icon and the cursor coordinates and section are displayed 
// when the "1" key is pressed on the numeric keypad.

  var nCursors = 4;  // maximum of 4
  var x,  y, unit, quadrantx, xlocation, ylocation;
  var pw, ph,  unit;

  // This macro runs when the user clicks and drags on the image.
  macro "MultiCursor Tool -C00cL08f8L515eLb1be" {
      getCursorLoc(x, y, z, flags);
      w = getWidth();  h = getHeight();
      xinit = getWidth/nCursors; // width of the sub-images of the panel
      yinit = getHeight; // height of the sub-images of the panel
      spacer = 0;  //size of the white spacer of the subimages in the panel
      h=yinit; // height of the polygone forming cursor
      px = newArray(19);
      py = newArray(19);
      x2=x; y2=y;   
      getVoxelSize(pw, ph, pd, unit);     
      while (flags&16!=0) {
          getCursorLoc(x, y, z, flags);
          if (x<0) x=0;
          if (x > w) x=w-1;

          // determination of the sub-image in which is the cursor at a given time (quadrant):
          // used to deduce the x cursor coordinates reported to the origin of the sub-images. 
          a=0;
          quadrant=0;
          quadrantx=0;
          for (a =0; a<4; a ++) {
              quadrant=((a*xinit) + (a*spacer));
              if (x >= (quadrant) && x < ((quadrant)+xinit + spacer))
                  quadrantx=(a+1);
          }

          xlocation=(x- ((quadrantx-1)*(xinit)) -((quadrantx-1)* spacer));
          x = xlocation;
          if (xlocation > (xinit-1))
              x=xlocation - (xlocation-(xinit-1));
          ylocation = y;
          if (ylocation > (yinit-1))
              y=ylocation - (ylocation-(yinit-1));
          if (ylocation < 0) y=0;

          if (x!=x2 || y!=y2) {
              px[0]=0; py[0]=y;
              px[1]=w; py[1]=y;
              px[2]=((3*xinit)+(3*spacer)+x); py[2]=y;
              px[3]=((3*xinit)+(3*spacer)+x); py[3]=0;
              px[4]=((3*xinit)+(3*spacer)+x); py[4]=h;
              px[5]=((3*xinit)+(3*spacer)+x); py[5]=y;
              px[6]=((2*xinit)+(2*spacer)+x); py[6]=y;
              px[7]=((2*xinit)+(2*spacer)+x); py[7]=0;
              px[8]=((2*xinit)+(2*spacer)+x); py[8]=h;
              px[9]=((2*xinit)+(2*spacer)+x); py[9]=y;
              px[10]=(xinit+spacer+x); py[10]=y;
              px[11]=(xinit+spacer+x); py[11]=0;
              px[12]=(xinit+spacer+x); py[12]=h;
              px[13]=(xinit+spacer+x); py[13]=y;
              px[14]=x; py[14]=y;
              px[15]=x; py[15]=0;
              px[16]=x; py[16]=h;
              px[17]=x; py[17]=y;
              px[18]=0; py[18]=y;
              makeSelection("polgon", px, py);
              showStatus(d2s(x*pw,2)+", "+d2s(y*ph,2)+ " " +unit);
          }
          x2=x; y2=y;
          wait(10);
      };
  }

  // This macro runs when the user double clicks on the tool
  // icon or selects "MultiCursor Tool Options" from the
  // Plugins>Macros menu.
  // The name of this macro must be the same as the name of the
  // tool (without the hex icon description) followed by " Options".
  macro "MultiCursor Tool Options" {
      nCursors = getNumber("Number of Cursors (1-4): ", nCursors);
      if (nCursors<1) nCursors = 1;
      if (nCursors>4) nCursors = 4;
  }

  // This macro runs when the user selects "Display Coordinates" 
  // from the Plugins>Macros menu or when the user presses the
  // "1" key on the numeric keypad.
  macro "Display Coordinates [N1]" {
      showMessage("MultiCursor ", "X Coordinate: "+x*pw
        +"\nY Coordinate:  "+y*ph
        +"\nUnit: "+unit
        +"\nSection: "+quadrantx);
  }