;******************************************************************************
;* File name: ql_zoom_prf.pro                                                 *
;*                                                                            *
;* Content  : 	ql_zoomp_event                                                *
;*              ql_zoomp_trt                                                  * 
;*                                                                            *
;*                                                                            *
;* Date		Author		Comment                                       *
;* -------------------------------------------------------------------------- *
;* 20-04-94	E.PETIT		Creation                                      *
;* 18-08-94	E.PETIT		Bug correction                                *
;*                                                                            *
;******************************************************************************

;***
;##############################################################################
;#Function  name   : ql_zoomp_event                                           #
;#LEVEL            :                                                          #
;#                                                                            #
;#Author           : Emmanuel PETIT                                           #
;#Language         : IDL                                                      #
;#Purpose          : manage profile zoom control                              #
;#Creation date    : 20-04-94                                                 #
;#External modules :                                                          #
;#                                                                            #
;#Call sequence    :                                                          #
;#                                                                            #
;#Arguments        :                                                          #
;#                                                                            #
;#Description      :                                                          #
;#                                                                            #
;#                                                                            #
;##############################################################################


PRO ql_zoomp_event, ev           
  ;============================================================================
  ;                       Common Block in use
  ;============================================================================
  COMMON base_id_com
  COMMON widget_id_com
  COMMON flag_com
  COMMON curr_data_p_com
  COMMON zoomp_com
  COMMON const_com
  COMMON dispcal_com
  COMMON color_com

  ;============================================================================
  ;                       Initialization
  ;============================================================================
  ret = 0
  err = 0

  ;============================================================================
  ;                       Processing 
  ;============================================================================
  WIDGET_CONTROL, ev.id, GET_UVALUE = value
 
  zp_h_save     = zp_h
  zp_l_save     = zp_l
  zp_a_save     = zp_a
  zp_box_x_save = zp_box_x
  zp_box_y_save = zp_box_y

  CASE value OF
    'ZP_H_SLD': BEGIN                 
               WIDGET_CONTROL, zp_h_txt, SET_VALUE = STRING(ev.value, FORMAT='(I4.4)')
               zp_h = FLOAT (ev.value)
             END
    'ZP_H_TXT':BEGIN
               WIDGET_CONTROL, zp_h_txt, GET_VALUE=str
               val = ql_atoi (str(0), 1, curr_dctrl_p.y.plot_sz, err)
               IF ( err NE 0) THEN BEGIN
                 ql_err_msg, err 
                 val = zp_h_save
               ENDIF
               WIDGET_CONTROL, zp_h_sld, SET_VALUE=val
               WIDGET_CONTROL, zp_h_txt, SET_VALUE=STRING(val,FORMAT='(I4.4)')
               zp_h = FLOAT (val)
             END     

    'ZP_L_SLD': BEGIN                 
               WIDGET_CONTROL, zp_l_txt, SET_VALUE = STRING(ev.value, FORMAT='(I4.4)')
               zp_l = FLOAT (ev.value)
             END
    'ZP_L_TXT':BEGIN
               WIDGET_CONTROL, zp_l_txt, GET_VALUE=str
               val = ql_atoi (str(0), 1,curr_dctrl_p.x.plot_sz, err)
               IF ( err NE 0) THEN BEGIN
                 ql_err_msg, err 
                 val = zp_l_save
               ENDIF
               WIDGET_CONTROL, zp_l_sld, SET_VALUE=val
               WIDGET_CONTROL, zp_l_txt, SET_VALUE=STRING(val,FORMAT='(I4.4)')
               zp_l = FLOAT (val)
             END     


    'QUIT':BEGIN
               WIDGET_CONTROL, ev.top, /DESTROY
               zp_flag = 0 
               mode = 'Info       '
               STRPUT, p_ban_d_fix_str, mode, 70
               WIDGET_CONTROL, p_ban_d_fix_lbl, SET_VALUE=p_ban_d_fix_str

               ; free application
               ; ----------------
               IF (cldisp_flag EQ 1) THEN BEGIN		; During disp calib.
                 WIDGET_CONTROL, disp_base             , SENSITIVE=1
               ENDIF ELSE BEGIN
                 WIDGET_CONTROL, menu_base             , SENSITIVE=1
                 WIDGET_CONTROL, prf_stack_base        , SENSITIVE=1
                 WIDGET_CONTROL, im_stack_base         , SENSITIVE=1
               ENDELSE
               ql_update_mnu, err			; Update menu state
             END     

    'UNZOOM':BEGIN
               curr_dctrl_p.x.plot_min  = xplmin_init
               curr_dctrl_p.x.plot_max  = xplmax_init  
               curr_dctrl_p.y.plot_min  = yplmin_init  
               curr_dctrl_p.y.plot_max  = yplmax_init 
               curr_dctrl_p.x.index_min = zpindex_1 
               curr_dctrl_p.x.index_max = zpindex_2
               ret = ql_display_data(curr_data_p, 100, curr_dctrl_p , err)
             END    

    'SCALE':BEGIN
               curr_dctrl_p.x.plot_min  = curr_dctrl_p.x.min
               curr_dctrl_p.x.plot_max  = curr_dctrl_p.x.max
               curr_dctrl_p.y.plot_min  = curr_dctrl_p.y.min
               curr_dctrl_p.y.plot_max  = curr_dctrl_p.y.max
               curr_dctrl_p.x.index_min = 0
               curr_dctrl_p.x.index_max = curr_dctrl_p.x.nb_dot-1 
               ret = ql_display_data(curr_data_p, 100, curr_dctrl_p , err)
             END    

    'VALID':BEGIN
                xplotmin = curr_dctrl_p.x.plot_min
                xplotmax = curr_dctrl_p.x.plot_max
                xplotsz  = curr_dctrl_p.x.plot_sz
                xnb_dot  = curr_dctrl_p.x.nb_dot
          
                yplotmin = curr_dctrl_p.y.plot_min
                yplotmax = curr_dctrl_p.y.plot_max
                yplotsz  = curr_dctrl_p.y.plot_sz

          
                x0dev    = ROUND (zpxdev + zp_box_x(0))   - curr_dctrl_p.x.offset
                y0dev    = ROUND (zpydev + zp_box_y(3))   - curr_dctrl_p.y.offset
                x1dev    = ROUND (zpxdev + zp_box_x(2))-1 - curr_dctrl_p.x.offset
                y1dev    = ROUND (zpydev + zp_box_y(1))-1 - curr_dctrl_p.y.offset
          
                x0       = xplotmin + ((x0dev/(xplotsz-1)) * (xplotmax-xplotmin))
                y0       = yplotmin + ((y0dev/(yplotsz-1)) * (yplotmax-yplotmin))
                x1       = xplotmin + ((x1dev/(xplotsz-1)) * (xplotmax-xplotmin))
                y1       = yplotmin + ((y1dev/(yplotsz-1)) * (yplotmax-yplotmin))

                ; Compute indexes
                ; ---------------
                i = 0
                WHILE (curr_x_p(i) LT x0) AND (i LT xnb_dot-1) DO i = i + 1
                IF ( i GE xnb_dot) THEN i = -1
                curr_dctrl_p.x.index_min = i
                i = 0
                WHILE (curr_x_p(i) LT x1) AND (i LT xnb_dot-1) DO i = i + 1
                IF (i LE 0) OR (i GE xnb_dot) THEN i = -1
                curr_dctrl_p.x.index_max = i
  

                ; Update display (caller dependant)
                ; ----------------------------------                
                IF (cldisp_flag EQ 1) THEN BEGIN		; During disp calib.
                  upd_dctrl_p, curr_dctrl_p
                  curr_dctrl_p.x.plot_min = x0
                  curr_dctrl_p.x.plot_max = x1
                  curr_dctrl_p.y.plot_min = y0
                  curr_dctrl_p.y.plot_max = y1
                 
                  ret = ql_display_data(curr_data_p, 100, curr_dctrl_p , err)
                
                  curr_dctrl_p.symbol = 1
                  curr_dctrl_p.color  = white
                  ret = ql_display_data(curr_data_p, 120, curr_dctrl_p , err)
                
                  IF (disp_state EQ 3) OR (disp_state EQ 6) OR (disp_state EQ 0) THEN BEGIN
                    curr_dctrl_p.color       = yellow
                    curr_dctrl_p.symbol      = 0
                    IF (first_ip EQ 1) THEN BEGIN
                      xfit  = xfit1
                      yfit  = yfit1                       
                      ret = ql_display_data(yfit, 300, curr_dctrl_p , err)

                      ; Mark inflexion point
                      ; -------------------
                      xfit                 = [x_infpt(0)]
                      yfit                 = [y_infpt(0)]
                      curr_dctrl_p.color   = green
                      curr_dctrl_p.symbol  = 4
                      ret= ql_display_data(yfit, 300, curr_dctrl_p , err)
                   ENDIF
                                  
                    IF (first_ip EQ 2) THEN BEGIN
                      xfit  = xfit1
                      yfit  = yfit1                       
                      ret = ql_display_data(yfit, 300, curr_dctrl_p , err)
                      
                      xfit  = xfit2
                      yfit  = yfit2                       
                      ret = ql_display_data(yfit, 300, curr_dctrl_p , err)
                      ; Mark inflexion point
                      ; -------------------
                      xfit                 = [x_infpt(1)]
                      yfit                 = [y_infpt(1)]
                      curr_dctrl_p.color   = green
                      curr_dctrl_p.symbol  = 4
                      ret= ql_display_data(yfit, 300, curr_dctrl_p , err) 
                    ENDIF
                  ENDIF 
                ENDIF ELSE BEGIN
                  curr_dctrl_p.x.plot_min = x0
                  curr_dctrl_p.x.plot_max = x1
                  curr_dctrl_p.y.plot_min = y0
                  curr_dctrl_p.y.plot_max = y1
                  symb                    = curr_dctrl_p.symbol
                  color                   = curr_dctrl_p.color 
                 
                  ret = ql_display_data (curr_data_p, 100, curr_dctrl_p, err)

              ENDELSE
             END     
  ENDCASE

                          
  ; Update  area
  ; ------------
  ql_refresh, PROFILE

  IF ((value NE 'QUIT') AND (value NE 'VALID')) THEN BEGIN
    a          = zp_a * PI/180.0 
    r          = SQRT (zp_l^2 + zp_h^2)/2.0
    a0         = ATAN (zp_h/zp_l)
    Theta      = [a+(PI-a0) , a+a0, a-a0, a+(PI+a0), a+(PI-a0) ]
    zp_box_x   = r*COS(Theta)
    zp_box_y   = r*SIN(Theta)

    ; Clipping
    ; --------
    IF (zp_a GE 0) THEN BEGIN
      x_zp_inf = zp_box_x(0) & x_zp_sup = zp_box_x(2)
      y_zp_inf = zp_box_y(3) & y_zp_sup = zp_box_y(1)
    ENDIF ELSE BEGIN
      x_zp_inf = zp_box_x(3) & x_zp_sup = zp_box_x(1)
      y_zp_inf = zp_box_y(2) & y_zp_sup = zp_box_y(0)
    ENDELSE

    IF (                                                                              $
        (ROUND(x_zp_center+x_zp_inf)+1 LT curr_dctrl_p.x.offset)                          OR $
        (ROUND(x_zp_center+x_zp_sup)-1 GT curr_dctrl_p.x.offset + curr_dctrl_p.x.plot_sz) OR $
        (ROUND(y_zp_center+y_zp_inf)+1 LT curr_dctrl_p.y.offset)                          OR $
        (ROUND(y_zp_center+y_zp_sup)-1 GT curr_dctrl_p.y.offset + curr_dctrl_p.y.plot_sz)    $
       ) THEN BEGIN
      zp_h     = zp_h_save
      zp_l     = zp_l_save
      zp_a     = zp_a_save
      zp_box_x = zp_box_x_save
      zp_box_y = zp_box_y_save
    ENDIF
   
    ; Drawing
    ; -------
    PLOTS, x_zp_center+zp_box_x , y_zp_center+zp_box_y, /DEVICE, COLOR=yellow

  ENDIF
END

;***
;##############################################################################
;#Function  name   : ql_zoomp_trt                                             #
;#LEVEL            :                                                          #
;#                                                                            #
;#Author           : Emmanuel PETIT                                           #
;#Language         : IDL                                                      #
;#Purpose          : Zoom profile                                             #
;#Creation date    : April 1994                                               #
;#External modules :                                                          #
;#                                                                            #
;#Call sequence    :                                                          #
;#                                                                            #
;#Arguments        :                                                          #
;#                                                                            #
;#Description      :                                                          #
;#                                                                            #
;#                                                                            #
;##############################################################################
;*** 

PRO  ql_zoomp_trt, ev
  ;============================================================================
  ;                       Common Block in use
  ;============================================================================
  COMMON base_id_com
  COMMON widget_id_com
  COMMON flag_com
  COMMON curr_data_p_com
  COMMON zoomp_com
  COMMON const_com
  COMMON dispcal_com
  COMMON color_com

  ;============================================================================
  ;                       Initialization
  ;============================================================================
  title       = 'Profile Zoom'     
  zp_a        = 0.0
  x_zp_center    = FLOAT ((curr_dctrl_p.x.offset + curr_dctrl_p.x.plot_sz/2.0)-1)
  y_zp_center    = FLOAT ((curr_dctrl_p.y.offset + curr_dctrl_p.y.plot_sz/2.0)-1)


  zp_l        = FLOAT(curr_dctrl_p.x.nb_dot/2)
  zp_h        = FLOAT(curr_dctrl_p.y.nb_dot/2)

  a           = zp_a * PI/180.0 
  r           = SQRT (zp_l^2 + zp_h^2)/2.0
  a0          = ATAN (zp_h/zp_l)
  Theta       = [a+(PI-a0) , a+a0, a-a0, a+(PI+a0), a+(PI-a0) ]
  zp_box_x    = r*COS(Theta)
  zp_box_y    = r*SIN(Theta)

  x_zp_inf       = zp_box_x(0) 
  x_zp_sup       = zp_box_x(2)
  y_zp_inf       = zp_box_y(3)  
  y_zp_sup       = zp_box_y(1)

  xplmin_init = curr_dctrl_p.x.plot_min
  xplmax_init = curr_dctrl_p.x.plot_max

  yplmin_init = curr_dctrl_p.y.plot_min
  yplmax_init = curr_dctrl_p.y.plot_max
 
  zpindex_1   = curr_dctrl_p.x.index_min
  zpindex_2   = curr_dctrl_p.x.index_max
  ;============================================================================
  ;                       Processing 
  ;============================================================================
  WIDGET_CONTROL, /HOURGLASS 

  WIDGET_CONTROL, root_base, SENSITIVE=0	; lock during init

  ;---------------
  ;Base Hierarchie
  ;---------------
   zp_base = WIDGET_BASE (TITLE=title,XOFFSET=745,YOFFSET=475,/COLUMN)
     zp_sz_base   = WIDGET_BASE (zp_base ,/COLUMN)
     zp_ctrl_base = WIDGET_BASE (zp_base ,/COLUMN)

  ; ------------------
  ; Widgets Definition
  ; ------------------
  ;--------------------------- Control --------------------------------

  ret   = WIDGET_LABEL(zp_sz_base , VALUE = 'Height', FONT = Hd_Font_Bold)
  dummy = WIDGET_BASE (zp_sz_base  ,/ROW)
  zp_h_sld = $
    WIDGET_SLIDER (dummy                                       , $
                   MINIMUM = 1                                 , $
                   MAXIMUM = curr_dctrl_p.y.plot_sz            , $
                   VALUE   = zp_h                              , $
                   UVALUE  ='ZP_H_SLD'                         , $
                   XSIZE   = 120                               , $
                   YSIZE   = 20                                , $
                   /DRAG                                       , $
                   /SUPPRESS_VALUE)          
  zp_h_txt  = $
      WIDGET_TEXT  (dummy                                      , $
                    UVALUE = 'ZP_H_TXT'                        , $
                    VALUE  = STRING(zp_h,FORMAT='(I4.4)')      , $
                    FONT   = Hd_Font                           , $
                    XSIZE  = 4                                 , $
                    YSIZE  = 1                                 , $
                    /EDITABLE)

  ret   = WIDGET_LABEL(zp_sz_base , VALUE = 'Length', FONT = Hd_Font_Bold)
  dummy = WIDGET_BASE (zp_sz_base  ,/ROW)
  zp_l_sld = $
    WIDGET_SLIDER (dummy                                       , $
                   MINIMUM = 1                                 , $
                   MAXIMUM = curr_dctrl_p.x.plot_sz            , $
                   VALUE   = zp_l                              , $
                   UVALUE  ='ZP_L_SLD'                         , $
                   XSIZE   = 120                               , $
                   YSIZE   = 20                                , $
                   /DRAG                                       , $
                   /SUPPRESS_VALUE)          
  zp_l_txt  = $
      WIDGET_TEXT  (dummy                                      , $
                    UVALUE = 'ZP_L_TXT'                        , $
                    VALUE  = STRING(zp_l, FORMAT='(I4.4)')     , $
                    FONT   = Hd_Font                           , $
                    XSIZE  = 4                                 , $
                    YSIZE  = 1                                 , $
                    /EDITABLE)

 ;--------------------------- Command --------------------------------

  dummy1   = WIDGET_BASE   (zp_ctrl_base ,/ROW)
  dummy2   = WIDGET_BASE   (zp_ctrl_base ,/ROW)
  zp_quit  = WIDGET_BUTTON (dummy1               , $
                            VALUE  = 'QUIT  '    , $
                            FONT   = Hd_Font_Bold, $
                            UVALUE = 'QUIT')

  zp_valid = WIDGET_BUTTON (dummy1               , $
                            VALUE  = 'VALID'     , $
                            FONT   = Hd_Font_Bold, $
                            UVALUE = 'VALID')

  IF (cldisp_flag EQ 0) THEN BEGIN		; Not During disp calib.
    zp_uzoom = WIDGET_BUTTON (dummy2               , $
                              VALUE  = 'UNZOOM'    , $
                              FONT   = Hd_Font_Bold, $
                              UVALUE = 'UNZOOM')

    zp_scale = WIDGET_BUTTON (dummy2               , $
                              VALUE  = 'FULL SCALE', $
                              FONT   = Hd_Font_Bold, $
                              UVALUE = 'SCALE')
   ENDIF

  ; ----------------
  ; Widgets Creation
  ; ----------------   
  WIDGET_CONTROL, zp_base , /REALIZE

  ; Inhibition of application except pclic
  ; --------------------------------------
  IF (cldisp_flag EQ 1) THEN BEGIN		; During disp calib.
    WIDGET_CONTROL, disp_base         , SENSITIVE=0
  ENDIF ELSE BEGIN
    WIDGET_CONTROL, menu_base             , SENSITIVE=0
    WIDGET_CONTROL, prf_stack_base        , SENSITIVE=0
    WIDGET_CONTROL, im_stack_base         , SENSITIVE=0
  ENDELSE

  ; Update banner and state flags
  ; ------------------------------
  zp_flag = 1 					; Set ext image flag
  mode = 'Prf Zoom   '
  STRPUT, p_ban_d_fix_str, mode, 70
  WIDGET_CONTROL, p_ban_d_fix_lbl, SET_VALUE=p_ban_d_fix_str

  WIDGET_CONTROL, root_base, SENSITIVE=1	; delock 

  ; ------------------
  ; Call Event manager
  ; ------------------
  XMANAGER, "ql_zoomp",zp_base    

END
