;******************************************************************************
;* File name: ql_update_mnu.pro                                               *
;*                                                                            *
;* Content  : 	ql_update_mnu                                                 *
;*                                                                            *
;*                                                                            *
;* Date		Author		Comment                                       *
;* -------------------------------------------------------------------------- *
;* 10-01-94	E.PETIT		Creation                                      *
;* 18-01-94	E.PETIT	   	Add display control structure                 *
;* 08-02-94     N.MORISSET     	Wavelength calibration                        *
;* 08-02-94	E.PETIT	   	Add Line Identification management            *
;* 14-02-94	J.PLATZER	Add color management                          *
;* 15-02-94	E.PETIT  	Modif due to line id process                  *
;* 22-02-94	E.PETIT  	Add elementary operation                      *
;* 28-02-94   	E.PETIT  	type 78 allowed for lambda calib              *
;* 01-03-94   	E.PETIT  	Modif to cut processing                       *
;* 09-03-94   	E.PETIT   	Modif to extract processing                   *
;* 10-03-94   	E.PETIT   	Modif to print processing                     *
;* 22-03-94   	E.PETIT   	OverPlot                                      *
;* 13-04-94   	E.PETIT   	Remove discret format                         *
;* 21-04-94   	E.PETIT   	Dispersion Calibration on lambda cal image    *
;* 10-05-94     J.PLATZER       Slit angle                                    *
;* 26-04-94   	E.PETIT   	QL <-> FITS                                   *
;* 18-05-94	E.PETIT	        Binning expansion                             *
;* 19-05-94	E.PETIT	        Gauss Fit                                     *
;* 24-05-94	E.PETIT	        slit ang on spectra only                      *
;* 18-08-94	E.PETIT	        Manual Wavelength calibration                 *
;* 12-09-94 	J>PLATZER	Spatial calibration                           *
;* 05-01-95	E.PETIT	 	Change color menu management                  *
;* 10-01-95	E.PETIT		Detector odd lines                            *
;***
;##############################################################################
;#Function  name   : ql_update_mnu                                            #
;#                                                                            #
;#Author           : Emmanuel PETIT                                           #
;#Language         : IDL                                                      #
;#Purpose          : Allowed/Inhibit menu option according to exec context    #
;#Creation date    : January 1994                                             #
;#External modules :                                                          #
;#                                                                            #
;#Call sequence    :                                                          #
;#                                                                            #
;#Arguments        :                                                          #
;#                                                                            #
;#Description      :                                                          #
;#                                                                            #
;#                                                                            #
;#                                                                            #
;##############################################################################
;***  

PRO ql_update_mnu, err
  ;============================================================================
  ;                       Common Block in use 
  ;============================================================================
  COMMON const_com
  COMMON menu_ctrl_com
  COMMON stack_com
  COMMON rrd_com
  COMMON load_flg_com
  COMMON curr_data_i_com
  COMMON curr_data_p_com
  COMMON mnu_idx_com
  COMMON mnu_idx2_com
  COMMON flag_com

  ;============================================================================
  ;                       Initialization
  ;============================================================================
  err  = 0
  nb_i = 0
  nb_p = 0
  ;============================================================================
  ;                       Processing 
  ;============================================================================
                
  WIDGET_CONTROL, /HOURGLASS 
  

  ; ------------------
  ; Reset control_flag
  ; ------------------
  menu_ctrl(*).flag = 0 

  ; Actions always allowed
  ; ----------------------
  IF (!version.os EQ 'vms') THEN  menu_ctrl(lrrdf_idx).flag = 1
  menu_ctrl(quit_idx).flag  = 1
  menu_ctrl(lff_idx).flag   = 1
  menu_ctrl(color_00_idx).flag   = 1
  menu_ctrl(color_03_idx).flag   = 1
  menu_ctrl(color_05_idx).flag   = 1
  menu_ctrl(color_13_idx).flag   = 1
  menu_ctrl(color_15_idx).flag   = 1
  menu_ctrl(color_38_idx).flag   = 1
  menu_ctrl(st_pixoffset_idx).flag   = 1




  ; compute number of selected item
  ; -------------------------------
  FOR i=0, STACK_SZ-1 DO BEGIN
    IF (stack_hd.i(i).free     EQ 1) AND $
       (stack_hd.i(i).selected EQ 1) THEN  nb_i = nb_i + 1
    IF (stack_hd.p(i).free     EQ 1) AND $
       (stack_hd.p(i).selected EQ 1)  THEN nb_p = nb_p + 1
  ENDFOR

  ; Images Operations
  ; -----------------  
  IF (nb_i GT 0) THEN BEGIN
    menu_ctrl(popi_idx).flag  = 1 
    menu_ctrl(deli_idx).flag  = 1 
  ENDIF
  IF (nb_i EQ 2) THEN BEGIN
    menu_ctrl(mnsi_idx).flag  = 1 
    menu_ctrl(divi_idx).flag  = 1 
    IF (clff_flag EQ 1) THEN menu_ctrl(clff_idx).flag  = 1 
  ENDIF
  IF (nb_i GE 2) THEN BEGIN
    menu_ctrl(plusi_idx).flag = 1 
    menu_ctrl(avgi_idx).flag  = 1 
    menu_ctrl(multi_idx).flag = 1 
  ENDIF
  
  ; Profiles operations
  ; -------------------  
  IF (nb_p GT 0) THEN BEGIN
    menu_ctrl(popp_idx).flag  = 1 
    menu_ctrl(delp_idx).flag  = 1 
  ENDIF
  IF (nb_p EQ 2) THEN BEGIN
    menu_ctrl(mnsp_idx).flag  = 1 
    menu_ctrl(divp_idx).flag  = 1 
  ENDIF
  IF (nb_p GE 2) THEN BEGIN
    menu_ctrl(plusp_idx).flag = 1 
    menu_ctrl(avgp_idx).flag  = 1 
    menu_ctrl(overp_idx).flag = 1 
    menu_ctrl(multp_idx).flag = 1 
  ENDIF
 
  ; Image Operation & trt
  ; ---------------------
  IF (load_flag_i EQ 1) THEN BEGIN
    menu_ctrl(zoomi_idx).flag   = 1
    menu_ctrl(pushi_idx).flag   = 1 
    menu_ctrl(clsi_idx).flag    = 1 
    menu_ctrl(extim_idx).flag   = 1 
    menu_ctrl(idctr_idx).flag   = 1 
    menu_ctrl(print_i_idx).flag = 1 
    menu_ctrl(cutim_idx).flag   = 1 
    menu_ctrl(sffi_idx).flag    = 1
    menu_ctrl(cstop_i_add_idx).flag   = 1 
    menu_ctrl(cstop_i_mult_idx).flag  = 1 

    IF (curr_header_i.SSBINNY GT 1) OR (curr_header_i.SSBINNZ GT 1) THEN $
      menu_ctrl(binni_idx).flag   = 1 

    find=ql_manage_proc(curr_dctrl_i,SEARCH,21)
    IF (curr_header_i.SSBINNZ EQ 1) AND (find EQ 0) THEN $
      menu_ctrl(cldol_idx).flag   = 1 

    ; Wavelength calibration, 
    ; Line Identification on Image
    ; ----------------------------
    IF (                                 $
        (curr_header_i.DATATYPE EQ 1) OR $	; Spectral/spatial Z
        (curr_header_i.DATATYPE EQ 21) OR $	; Spectral/spatial Y
        (curr_header_i.DATATYPE EQ 3)    $      ; Spectral/temporal
       )                                 $
    THEN BEGIN	      
      menu_ctrl(clsli_idx).flag   = 1
      menu_ctrl(clmli_idx).flag   = 1	; Manual W calibration
      find=ql_manage_proc(curr_dctrl_i,SEARCH,1)
      IF (find EQ 0) THEN BEGIN
        menu_ctrl(cllbi_idx).flag = 1
        menu_ctrl(lidim_idx).flag = 0 
      ENDIF ELSE BEGIN
        menu_ctrl(cllbi_idx).flag = 0
        menu_ctrl(lidim_idx).flag = 1 
        menu_ctrl(cldis_idx).flag = 1	
      ENDELSE
      find=ql_manage_proc(curr_dctrl_i,SEARCH,20)
      IF (find EQ 1) THEN menu_ctrl(lidim_idx).flag  = 1
    ENDIF

    ; Spatial calibration,image 
    ; -------------------------
    ; Z calibration                      
    IF (                                  $
        (curr_header_i.DATATYPE EQ 1)  OR $	; Spectral/spatial Z
        (curr_header_i.DATATYPE EQ 2)  OR $	; spatial Y/spatial Z
        (curr_header_i.DATATYPE EQ 7)     $	; Temporal/spatial Z
       )                                  $
    THEN BEGIN	      
     find=ql_manage_proc(curr_dctrl_i,SEARCH,3)
      IF (find EQ 0) THEN menu_ctrl(clszi_idx).flag = 1
    ENDIF

    ; Spatial calibration, profile
    ; ----------------------------
    ; Z calibration                      
    IF (                                  $
        (curr_header_p.DATATYPE EQ 9)     $	; spatial Z
       )                                  $
    THEN BEGIN	      
      menu_ctrl(clszp_idx).flag = 1
    ENDIF

    ; De-Stretching
    ; -------------
    IF (curr_header_i.DATATYPE EQ 1) THEN BEGIN	; Spectral/spatial Z
      find=ql_manage_proc(curr_dctrl_i,SEARCH,24)
      IF (find EQ 0) THEN menu_ctrl(cldst_idx).flag = 1 
    ENDIF

  ENDIF


  ; Profile Operations & trt
  ; ------------------------
  IF (load_flag_p NE 0) THEN BEGIN
    menu_ctrl(clsp_idx).flag  = 1
    FOR j=0,load_flag_p-1 DO BEGIN
      str = 'idx = pushp_'+ STRTRIM(STRING(j),2) + '_idx'
      res= EXECUTE (str)
      menu_ctrl(idx).flag  = 1 
    ENDFOR
  ENDIF


  ; Wavelength calibration, 
  ; Line Identification on Profiles, 
  ; display control, print
  ; --------------------------------
  IF (load_flag_p EQ 1) THEN BEGIN
    menu_ctrl(pdctr_idx).flag   = 1 
    menu_ctrl(print_p_idx).flag = 1 
    menu_ctrl(zoomp_idx).flag   = 1 
    menu_ctrl(sffp_idx).flag    = 1 
    menu_ctrl(cstop_p_add_idx).flag   = 1 
    menu_ctrl(cstop_p_mult_idx).flag  = 1 
    menu_ctrl(gauss_idx).flag  = 1

    IF ( (curr_header_p.DATATYPE EQ 8) AND $ ; Spectrum 
         (curr_dctrl_p.x.type EQ 0)        $ ; Not in log mode
       )                                   $
    THEN BEGIN
      menu_ctrl(clmlp_idx).flag  = 1	; Manual W Calibration 
      find=ql_manage_proc(curr_dctrl_p,SEARCH,1)
      IF (find EQ 0) THEN BEGIN
        menu_ctrl(cllbp_idx).flag  = 1
        menu_ctrl(lidpr_idx).flag  = 0 
      ENDIF ELSE BEGIN
        menu_ctrl(cllbp_idx).flag  = 0
        menu_ctrl(lidpr_idx).flag  = 1 
      ENDELSE
      find=ql_manage_proc(curr_dctrl_p,SEARCH,20)
      IF (find EQ 1) THEN menu_ctrl(lidpr_idx).flag  = 1
    ENDIF
  ENDIF

  ; Profile Over Plot
  ; -----------------
  IF (load_flag_p LT 1) THEN BEGIN
    menu_ctrl(print_p_idx).flag = 1 
  ENDIF

  ; -----------------------------
  ; Inhibit/uninhibit menu option
  ; -----------------------------
  FOR i=0,menu_index-1 DO BEGIN
    IF (menu_ctrl(i).flag EQ 0) THEN BEGIN
      WIDGET_CONTROL, menu_ctrl(i).id, SENSITIVE=0
    ENDIF ELSE BEGIN
      WIDGET_CONTROL, menu_ctrl(i).id, SENSITIVE=1
    ENDELSE   
  ENDFOR

  RETURN 
END
