;+
;Program      : WFLIMB.PRO
;
; Name        : 
;
; Purpose     : 
;
; Category    : 
;
; Explanation : 
;
; Syntax      : 
;
; Examples    : 
;
; Inputs      : None
;
; Opt. Inputs : None
;
; Outputs     : None
;
; Opt. Outputs: None
;
; Keywords    : None
;
; Common      : 
;
; Restrictions:                                  
;
; Side effects: Not known
;
; History     : Version 1, 02-Sep-1995, B Podlipnik. Written
;
; Contact     : BP, borut@lasco1.mpae.gwdg.de
;-

PRO wflimb_event,event

@wflimb.com


WIDGET_CONTROL,event.id,GET_UVALUE=uvid
WIDGET_CONTROL,event.top,GET_UVALUE=uvd

image = uvd.image
sz= uvd.sz

CASE uvid OF

 "DONE": BEGIN
	   WIDGET_CONTROL,event.top,/DESTROY
	   GOTO,done
	 END

 "CANCEL": BEGIN
	     WIDGET_CONTROL,event.top,/DESTROY
             cflag = 1
	     GOTO,done
	   END

 "RCORR": BEGIN
           WIDGET_CONTROL,uvd.wtc,GET_VALUE=scorr
           rcorr = FLOAT(scorr(0))
           drc = dr / rcorr
           WIDGET_CONTROL,uvd.wlc,SET_VALUE=STRING(drc,FORMAT='(F8.3)')
          END

     "DRAW_L":   BEGIN
 IF n_elements(image) eq 0 then RETURN
 tn = Tag_Names( event, /STRUCTURE_NAME )
 CASE tn OF
  'WIDGET_DRAW':  BEGIN

         x = 0 > event.x < (sz(1)-1)
         y = 0 > event.y < (sz(2)-1)

         ;sx = STRCOMPRESS(STRING(x))
         ;sy = STRCOMPRESS(STRING(y))
         ;svalue = ' '+sx+' '+sy+' '+STRCOMPRESS(STRING(image(x,y)*1.0))

         uvd.x = event.x
         uvd.y = event.y

         ifact = uvd.izoom
         zoom_it, uvd.x,uvd.y, uvd.winl2s, uvd.winl2s, ifact, uvd.winl1, uvd.winl2,1

         IF (event.press NE 0 ) THEN uvd.press = event.press
         IF (event.release NE 0 ) THEN uvd.press = 0B
         IF (uvd.press NE 0 ) THEN BEGIN
          x = 0 > event.x < (sz(1)-1)
          y = 0 > event.y < (sz(2)-1)

          CASE uvd.press OF
              1B: BEGIN
                   uvd.x = event.x
                   uvd.y = event.y
       
                   IF flag_limb GT 0 AND flag_limb LT 4 THEN BEGIN
                    limb_x(flag_limb-1) = event.x
                    limb_y(flag_limb-1) = event.y
                    Cur_pts = STRING(flag_limb,FORMAT='(I2)') + " of 3"
                    WIDGET_CONTROL,uvd.wlcp,SET_VALUE=Cur_pts
 
                    IF flag_limb EQ 3 THEN BEGIN

                      CIR_3PNT,limb_x,limb_y,dr,x0,y0

                      WIDGET_CONTROL,uvd.wlx,SET_VALUE=STRING(x0,FORMAT='(F8.3)')
                      WIDGET_CONTROL,uvd.wly,SET_VALUE=STRING(y0,FORMAT='(F8.3)')
                      WIDGET_CONTROL,uvd.wlr,SET_VALUE=STRING(dr,FORMAT='(F8.3)')
                      WIDGET_CONTROL,uvd.wtc,GET_VALUE=scorr
                      rcorr = FLOAT(scorr(0))
                      drc = dr / rcorr
                      WIDGET_CONTROL,uvd.wlc,SET_VALUE=STRING(drc,FORMAT='(F8.3)')
 
                      theta = (findgen(360)/360) * 6.2832
                      xc = ((x0 + (dr * COS(theta)))>0.)<(sz(1)-1)
                      yc = ((y0 + (dr * SIN(theta)))>0.)<(sz(2)-1)
                      image(xc,yc) = uvd.maximg
                      TVSCL,image>uvd.minimg<uvd.maximg ; write in image and in header ?
                    ENDIF
                    flag_limb = flag_limb + 1
                   ENDIF
 
                 END

             2B: BEGIN
                  ;gamma correction
                  WIDGET_CONTROL,uvd.LDraw1,GET_DRAW_VIEW = xy
                  xt =  (x-xy(0)) / (uvd.ms/2.0) - 1
                  ;gct = 10^(TEMPORARY(xt))
                  gamma_ct, 10^(TEMPORARY(xt))
                 END

             4B: BEGIN       ;** Right mouse button

                 END

        ELSE: donothing = 0
       ENDCASE
      ENDIF
 
      WIDGET_CONTROL, event.top, SET_UVALUE=uvd ; ** set uvd.press to new value
     END

     ELSE: donothing = 0
    ENDCASE

   END     ; end of 'DRAW_L'
 
 "DRAW_Z":   BEGIN
  tn = Tag_Names( event, /STRUCTURE_NAME )
  CASE tn OF

   'WIDGET_DRAW':  BEGIN

    IF (event.press NE 0 ) THEN uvd.press = event.press
    IF (event.release NE 0 ) THEN uvd.press = 0B
    IF (uvd.press NE 0 ) THEN BEGIN

      CASE uvd.press OF
            1B: BEGIN     ;** Left mouse button - increment zoom

                uvd.izoom = uvd.izoom + 1
                IF uvd.izoom GT 20 THEN uvd.izoom = 20
  
                ifact = uvd.izoom
                a0 = uvd.a0

                zoom_it, uvd.x, uvd.y, uvd.winl2s, uvd.winl2s, ifact, uvd.winl1, uvd.winl2,1
               END
           2B: BEGIN
                zoom,/CONTINUOUS
               END
           4B: BEGIN       ;** Right mouse button - decrement zoom
                uvd.izoom = uvd.izoom -1
                IF uvd.izoom LT 2 THEN uvd.izoom = 1
 
                ifact = uvd.izoom
                a0 = uvd.a0

                zoom_it, uvd.x, uvd.y, uvd.winl2s, uvd.winl2s, ifact, uvd.winl1, uvd.winl2,1
               END
            ELSE: donothing = 0
      ENDCASE
    ENDIF
       
       WIDGET_CONTROL, event.top, SET_UVALUE=uvd ; ** set uvd.press to new value
      END ; end of 'WIDGET_DRAW'

    ELSE: donothing = 0
    ENDCASE
 
  END ; End DRAW_L

  "REPEAT": BEGIN
	     erase 
print,uvd.minimg,uvd.maximg
             TVSCL,image>uvd.minimg<uvd.maximg
             WIDGET_CONTROL,uvd.wlcp,SET_VALUE=" 0 of 3"
             flag_limb = 1
	   END

ELSE: donothing = 0
ENDCASE

done:

END

PRO wflimb,image,head,name,GROUP=GROUP,minimg=minimg,maximg=maximg

@wflimb.com

;IF NOT KEYWORD_SET(minimg) THEN minimg = min(image)
;IF NOT KEYWORD_SET(maximg) THEN maximg = max(image)
   
IF N_ELEMENTS(x0) EQ 0 THEN x0 = 0
IF N_ELEMENTS(y0) EQ 0 THEN y0 = 0
IF N_ELEMENTS(dr) EQ 0 THEN dr = 0
IF N_ELEMENTS(image) EQ 0 THEN BEGIN
  image = DIST(256,256)
  sz = size(image)
ENDIF

rcorr = 1.0 ; default

   detector = SXPAR(head,'DETECTOR')
   detector = STRCOMPRESS(detector,/REMOVE_ALL)

   CASE detector OF

     'C1': disk = 1.1
     'C2': disk = 2.0
     'C3': disk = 3.7

   ELSE: disk = 1.0 ; default
   ENDCASE

rcorr = disk

LimbBase = WIDGET_BASE(TITLE='Find Limb',/ROW)
CBase    = WIDGET_BASE(LimbBase,/COLUMN)
RBase    = WIDGET_BASE(LimbBase,/ROW)

ms = 450
drawl1 = WIDGET_DRAW(CBase,UVALUE="DRAW_L",Xsize=1024,Ysize=1024, $
                /scroll, x_scroll_size=ms, y_scroll_size=ms,/MOTION,/BUTTON)

wb2 = WIDGET_BASE(CBase,/ROW)
wl3 = WIDGET_LABEL(wb2,VALUE = "With left mouse button select 3 points on limb.")
wb3 = WIDGET_BASE(CBase,/ROW)
wl4 = WIDGET_LABEL(wb3,VALUE = "Current selected points on limb: ")
Cur_pts = " 0 of 3"
wl5 = WIDGET_LABEL(wb3,VALUE = Cur_pts)

winl2s =170
wb3 = WIDGET_BASE(LimbBase,/COLUMN)
drawl2 = WIDGET_DRAW(wb3,UVALUE="DRAW_Z",Xsize=winl2s,Ysize=winl2s, $
                /MOTION,/BUTTON)

wl6 = WIDGET_LABEL(wb3,VALUE = "Results: ")

wb4 = WIDGET_BASE(wb3,/ROW)
wl6 = WIDGET_LABEL(wb4,VALUE = "CENTER_X=")
wl7 = WIDGET_LABEL(wb4,VALUE = STRING(x0,FORMAT='(F8.3)'))

wb5 = WIDGET_BASE(wb3,/ROW)
wl6 = WIDGET_LABEL(wb5,VALUE = "CENTER_Y=")
wl8 = WIDGET_LABEL(wb5,VALUE = STRING(y0,FORMAT='(F8.3)'))

wb6 = WIDGET_BASE(wb3,/ROW)
wl6 = WIDGET_LABEL(wb6,VALUE = "RADIUS=")
wl9 = WIDGET_LABEL(wb6,VALUE = STRING(dr,FORMAT='(F8.3)'))

wb7 = WIDGET_BASE(wb3,/ROW)
wl6 = WIDGET_LABEL(wb7,VALUE = "Occulter Radius:")

wb8 = WIDGET_BASE(wb3,/ROW)
wt6 = WIDGET_TEXT(wb8,XSIZE=8,VALUE = STRING(rcorr,FORMAT='(F8.3)'), UVALUE = "RCORR",/EDITABLE)
wl6 = WIDGET_LABEL(wb8,VALUE = "Rs")

wb9 = WIDGET_BASE(wb3,/ROW)
wl6 = WIDGET_LABEL(wb9,VALUE = "Sun Radius:")

wb9 = WIDGET_BASE(wb3,/ROW)
wl6 = WIDGET_LABEL(wb9,VALUE = "RADIUS=")
wl10= WIDGET_LABEL(wb9,VALUE = STRING(dr/rcorr,FORMAT='(F8.3)'))

LBcol = WIDGET_BASE(wb3,/COLUMN)
tmp = WIDGET_BUTTON(LBcol,UVALUE="REPEAT",VALUE="Try again")
tmp = WIDGET_BUTTON(LBcol,UVALUE="CANCEL",VALUE="Cancel")
tmp = WIDGET_BUTTON(LBcol,UVALUE="DONE",VALUE="Dismiss")

;*------------------------ Done Creating Widgets -------------------------*

WIDGET_CONTROL,LimbBase,/REALIZE
sz = size(image)
WIDGET_CONTROL,drawl1,GET_VALUE = winl1, SET_DRAW_VIEW=[ms/2, ms/2]
WIDGET_CONTROL,drawl2,GET_VALUE = winl2

WSET,winl1
TVSCL,image>minimg<maximg

limb_x = intarr(3)
limb_y = intarr(3)
flag_limb = 1
press = 0
izoom = 4
a0 = bytarr(winl2s,winl2s)
x = 0 & y = 0

uvst = { LimbBase:LimbBase,    $ ; Base widget ID
            LDraw1:drawl1,	  $ ; 
	    LDraw2:drawl2,	  $
	    winl1:winl1,		  $
	    winl2:winl2,		  $
	    winl2s:winl2s,	  $
	    izoom:izoom,	  $
            wlcp:wl5,		  $
            wlx:wl7,		  $
            wly:wl8,		  $
            wlr:wl9,	          $
            wtc:wt6, $
            wlc:wl10, $
            Cur_pts:Cur_pts,	  $
	    x:x,	  $
	    y:y,	  $
       rcorr:rcorr, $
	    a0:a0,		  $
            ms:ms,		  $
	    image:image,	  $
	    minimg:minimg,		  $
	    maximg:maximg,		  $
	    sz:sz,		  $
	    press:press } 		  

WIDGET_CONTROL,LimbBase, SET_UVALUE = uvst

XMANAGER,"wflimb",LimbBase,EVENT_HANDLER="wflimb_event",GROUP_LEADER=GROUP,/MODAL
END
