;+ ***********************************************************************
; NAME:
;	MENUCALCPOS2D
;
; PURPOSE:
;	Cette procedure contient les WIDGETS pour letrace des cartes a 2
;	dimensions
;	"Button" 2D POS du menu principal
;
; CATEGORY:
;	NRH1 Menu
;
; CALLING SEQUENCE:
;	MENUCALCPOS2D
;
; INPUTS:
;	Non
;
; KEYWORD PARAMETERS:
;	Non
;
; OUTPUTS:
;	Non
;
; COMMON BLOCKS:
;	NRH1_GLOBAL
;	NRH1_HELIO
;
; MODIFICATION HISTORY: (bonmartin@obspm.fr)
;	03/12/98 adapte du logiciel XHELIO
;
; menucalcpos2d   modif 9-oct-1996
; appel sous programme IDL calcpos2d 
;
; Modif 13/11/97: Lecture heures de debut, fin de l'association depuis le
;                 widget state.heures
;                 Abandon de la possibilite d'editer les widgets texte
;                 donnant les heures de debut et fin des positions
;                 individuelles (widgets hrpew_d etc.); a quoi sert
;                 la possibilite d'intervenir sur ces widgets (hormis le
;                 choix de la position) ???
;                 Nouvelle gestion d'erreurs: ON_ERROR, 2 remplace par CATCH
;                 Ajout d'une option HELP
; Modif 3/2/98:	Trace de controle apres calcul des positions 2D: j'ai
;		remplace l'appel a la routine TRACECARTE, faite expres pour
;		ce test, par PLOTPHOT et PLOTPOS2D qui servent aussi dans
;		l'option MAP. KLK
;
;-*******************************************************************

PRO MENUCALCPOS2D_EVENT, ev

common NRH1_GLOBAL,nomfich,fichinfo
common NRH1_HELIO,mainstruct
common com_cpos2d,a,sa,b,sb,delta1,delta2,ihd1,ihf1,ihd2,ihf2, $
                  chd1,chd2,chf1,chf2, $
                  ihd,ihf,chd,chf, $ 
                  icpoit,icor,nomfich1,nomfich2,nomfich3, $
                  frequence,chfreq,idate,chdate, $
                  trp,ip,hdpos,compos,numew,numns, $
                  replot,xmin,xmax,ihdeb,ihfin,title, $
		  init

; Gestion d'erreurs:
err = 0
CATCH, err
IF err NE 0 THEN BEGIN
	message = 'Error in procedure MENUCALCPOS2D: '
	message = STRCOMPRESS(message + !ERR_STRING)
	WIDGET_CONTROL, state.txt_message,SET_VALUE=message,/APPEND
	print, message
	RETURN
END

; on charge les variables locales a isophote
stash = WIDGET_INFO ( ev.top, /CHILD )
WIDGET_CONTROL, stash, GET_UVALUE = state

; modif du fichier rh 1

IF (ev.id EQ state.file1) THEN BEGIN
   WIDGET_CONTROL, state.file1, GET_VALUE = fichier
;   err = newlitentete(1,fichier(0),file)
;   IF (err EQ 1) THEN RETURN
   nomfich1=fichier(0)
   err = newlecp1d(4,a,sa,FICHIER=fichier(0),/OLDMODE)
   IF (err EQ 1) THEN RETURN
   ihdeb=fichinfo(4).heurdeb
   ihfin=fichinfo(4).heurfin
   hdeb=MSH(fichinfo(4).heurdeb)
   hfin=MSH(fichinfo(4).heurfin)
   WIDGET_CONTROL, state.heures, SET_VALUE = [hdeb,hfin]
   delta1=fichinfo(4).paspix(0)
   nbpos1 = fichinfo(4).nbpix(1)/fichinfo(4).facbloc(1)
   options = 'EW pos.# ' + string(indgen(nbpos1))
   WIDGET_CONTROL, state.list_numposew, SET_VALUE = options
   numew=0
   ihd1=sa.tabe(1,0)
   ihf1=sa.tabe(1,0)+sa.tabe(2,0)*delta1
   chd1=MSH(ihd1) & chf1=MSH(ihf1)
   WIDGET_CONTROL, state.hrpew_d,SET_VALUE=chd1
   WIDGET_CONTROL, state.hrpew_f,SET_VALUE=chf1 
   ihd=ihd1 & ihf=ihf1
   init=0
; Construction des noms des fichier de positions 1D nord-sud et 2D
	STRFIC = STR_SEP(Fichier,'.')
	IF Strfic(1) EQ 'few' THEN BEGIN
		FICHNS = Strfic(0)+'.fns'
		FICH2d = Strfic(0)+'.f2d'
	ENDIF ELSE BEGIN
		FICHNS = Strfic(0)+ '.ns' + STRMID(Strfic(1),2,1)
		FICH2D = Strfic(0)+ '.2d' + STRMID(Strfic(1),2,1)
	ENDELSE

   WIDGET_CONTROL, state.file2, SET_VALUE = fichns
   WIDGET_CONTROL, state.file3, SET_VALUE = fich2d
   nomfich2=fichns
   err = newlecp1d(5,b,sb,FICHIER=fichns,/OLDMODE)
   IF (err EQ 1) THEN RETURN
   hdeb=MSH(fichinfo(5).heurdeb)
   hfin=MSH(fichinfo(5).heurfin)
   WIDGET_CONTROL, state.heures, SET_VALUE = [hdeb,hfin]
   delta2=fichinfo(5).paspix(0)
   nbpos2 = fichinfo(5).nbpix(1)/fichinfo(5).facbloc(1)
   options = 'NS pos. # ' + string(indgen(nbpos2))
   WIDGET_CONTROL, state.list_numposns, SET_VALUE = options
   numns=0
   ihd2=sb.tabe(1)
   ihf2=sb.tabe(1)+sb.tabe(2)*delta2
   chd2=MSH(ihd2) & chf2=MSH(ihf2) 
   WIDGET_CONTROL, state.hrpns_d,SET_VALUE=chd2
   WIDGET_CONTROL, state.hrpns_f,SET_VALUE=chf2 
   ihd=ihd2 & ihf=ihf2
ENDIF

IF (ev.id EQ state.file2) THEN BEGIN
   WIDGET_CONTROL, state.file2, GET_VALUE = fichier
;   err = newlitentete(1,fichier(0),file)
;   IF (err EQ 1) THEN RETURN
   nomfich2=fichier(0)
   err = newlecp1d(5,b,sb,FICHIER=fichier(0),/OLDMODE)
   IF (err EQ 1) THEN RETURN
   hdeb=MSH(fichinfo(5).heurdeb)
   hfin=MSH(fichinfo(5).heurfin)
   WIDGET_CONTROL, state.heures, SET_VALUE = [hdeb,hfin]
   delta2=fichinfo(5).paspix(0)
   nbpos2 = fichinfo(5).nbpix(1)/fichinfo(5).facbloc(1)
   options = '# ' + string(indgen(nbpos2))
   WIDGET_CONTROL, state.list_numposns, SET_VALUE = options
   numns=0
   ihd2=sb.tabe(1)
   ihf2=sb.tabe(1)+sb.tabe(2)*delta2
   chd2=MSH(ihd2) & chf2=MSH(ihf2) 
   WIDGET_CONTROL, state.hrpns_d,SET_VALUE=chd2
   WIDGET_CONTROL, state.hrpns_f,SET_VALUE=chf2 
   ihd=ihd2 & ihf=ihf2
   init=0
ENDIF

IF (ev.id EQ state.file3) THEN BEGIN
   WIDGET_CONTROL, state.file3, GET_VALUE = fichier
   nomfich3=fichier(0)
endif

IF (ev.id EQ state.list_numposew) THEN BEGIN
   numew=WIDGET_INFO(state.list_numposew,/droplist_select)
   message= " position EW: "+STRCOMPRESS(STRING(numew))
   WIDGET_CONTROL, state.txt_message,SET_VALUE=message,/APPEND
   ihd1=sa.tabe(1,numew)
   ihf1=sa.tabe(1,numew)+sa.tabe(2,numew)*delta1
   chd1=MSH(ihd1) & chf1=MSH(ihf1)
   WIDGET_CONTROL, state.hrpew_d,SET_VALUE=chd1
   WIDGET_CONTROL, state.hrpew_f,SET_VALUE=chf1    
ENDIF
IF (ev.id EQ state.list_numposns) THEN BEGIN
   numns=WIDGET_INFO(state.list_numposns,/droplist_select)
   message= " position NS: "+STRCOMPRESS(STRING(numns))
   WIDGET_CONTROL, state.txt_message,SET_VALUE=message,/APPEND
   ihd2=sb.tabe(1,numns)
   ihf2=sb.tabe(1,numns)+sb.tabe(2,numns)*delta2
   chd2=MSH(ihd2) & chf2=MSH(ihf2) 
   WIDGET_CONTROL, state.hrpns_d,SET_VALUE=chd2
   WIDGET_CONTROL, state.hrpns_f,SET_VALUE=chf2    
ENDIF

IF (ev.id EQ state.hrpew_d ) THEN BEGIN
; saisie heures de la position a associer
   WIDGET_CONTROL, state.hrpew_d,GET_VALUE=chd
   ihd=hms(chd)
   if(ihd lt ihd1 or ihd gt ihf1) then begin
      ihd=ihd1 & chd=chd1
      WIDGET_CONTROL, state.hrpew_d,SET_VALUE=chd
   endif
endif
IF (ev.id EQ state.hrpew_f ) THEN BEGIN
; saisie heures de la position a associer
   WIDGET_CONTROL, state.hrpew_f,GET_VALUE=chf
   ihf=hms(chf)
   if(ihf lt ihd1 or ihf gt ihf1) then begin
      ihf=ihf1 & chf=chf1
      WIDGET_CONTROL, state.hrpew_d,SET_VALUE=chf
   endif

endif

IF (ev.id EQ state.hrpns_d ) THEN BEGIN
; saisie heures de la position a associer
   WIDGET_CONTROL, state.hrpns_d,GET_VALUE=chd
   ihd=hms(chd)
   if(ihd lt ihd2 or ihd gt ihf2) then begin
      ihd=ihd2 & chd=chd2
      WIDGET_CONTROL, state.hrpew_d,SET_VALUE=chd
   endif

endif

IF (ev.id EQ state.hrpns_f ) THEN BEGIN
; saisie heures de la position a associer
   WIDGET_CONTROL, state.hrpns_f,GET_VALUE=chf
   ihf=hms(chf)
   if(ihf lt ihd2 or ihf gt ihf2) then begin
      ihf=ihf2 & chf=chf2
      WIDGET_CONTROL, state.hrpew_d,SET_VALUE=chf
   endif


endif


; bouton de controle association : 
IF ( ev.id EQ state.b_posdo ) THEN BEGIN
   IF ( ev.value EQ 0 ) THEN BEGIN	; 
   ; ********* init **********
      WIDGET_CONTROL, state.bgroup, GET_VALUE = choix_qualifiers
      icpoit=long(choix_qualifiers(0))
      icor=long(choix_qualifiers(1))

      xmin=fichinfo(4).valmin
      xmax=fichinfo(4).valmax
      chfreq=motcle(4,'FREQ')
      reads,chfreq,frequence,format='(f5.1)'
      chdate=fichinfo(4).date
      c2idate,fichinfo(4).date,idate
      if(delta1 ne delta2)then begin
	aux = fichinfo(4).nbpix(0)*abs(delta1-delta2)/fichinfo(4).paspix(0)
	IF aux GE 0.5 THEN BEGIN
		message= 'Different time steps in EW and SN data: ' +  $
			STRING(delta1) + ' vs. ' + STRING(delta2)
		WIDGET_CONTROL, state.txt_message,$
			SET_VALUE=STRCOMPRESS(message),/APPEND
		return
	ENDIF
      endif

;    tableau pour fichier position 2D :
;        nb positions associees 2D max =9
;        nb de points associes ds une position nbmax
;	 6 tableaux par position:
;                  -position en X heliographique
;		   -position en Y heliographique
;		   -flux EW associes
;		   -flux NS associes
;		   -diametre EW associes
;		   -diametre NS associes
;
      nbmaxew= (size(a))(3)
      nbmaxns= (size(b))(3)
      nbmax=max([nbmaxew,nbmaxns])
      trp=fltarr(6,nbmax,9)
      title=nomfich1 + '&' +nomfich2
; compos tableau du nb de points des positions communes EW-NS
; hdpos heure de debut heure de debut de la position
      compos=lonarr(9)
      hdpos=lonarr(9)
      ip=0
      replot=0
      init=1
   endif
   IF ( ev.value EQ 1 ) THEN BEGIN	; 
   ; ********* calculer **********
      if init ne 0 then begin
	ihd1=hms(chd1) & ihf1=hms(chf1) 
	ihd2=hms(chd2) & ihf2=hms(chf2)
	WIDGET_CONTROL, state.heures, GET_VALUE = test
	chd = test(0) & chf = test(1)
	ihd = hms(chd) & ihf = hms(chf)
	ihd = MAX([ihd,ihd1, ihd2])
	ihf = MIN([ihf,ihf1, ihf2])
	calcpos2d, a,sa,b,sb, ihd, ihf, ihdeb, ihfin, icpoit, icor, $
            delta1,delta2,frequence,idate,chdate, $
            trp,ip,hdpos,compos,numew,numns,message
       WIDGET_CONTROL, state.txt_message,SET_VALUE=message,/APPEND
       mess=" *** Plot for tests only. Push WRITE FILE to write the" $
                       + " data to a file  ***"
       WIDGET_CONTROL, state.txt_message,SET_VALUE=mess,/APPEND

         ip=ip+1
      end else begin
         message= "Push INIT before computing the 2D position"
         WIDGET_CONTROL, state.txt_message,SET_VALUE=message,/APPEND
      end
   endif
endif
IF ( ev.id EQ state.bgroup_control ) THEN BEGIN 
     IF ( ev.value EQ 0 ) THEN BEGIN
	AIDE, sujet='pos2d', message
	txt = WIDGET_MESSAGE( message, /INFORMATION,$
		TITLE = 'Heliographic Positions')
     ENDIF
  ; ******** update ********* on perd les modifs sur le fichier rh 
    IF ( ev.value EQ 1 ) THEN BEGIN
         WIDGET_CONTROL, state.heures, SET_VALUE = mainstruct.heures
     ENDIF
  ; ******* quit ********* 
     IF ( ev.value EQ 2 ) THEN BEGIN 
         WIDGET_CONTROL,state.file1,GET_VALUE = temp             
         WIDGET_CONTROL, stash, SET_UVALUE = state
         WIDGET_CONTROL, ev.top,/DESTROY   
         RETURN
     ENDIF
  ; ******* ecrire fichier *********
   IF ( ev.value EQ 3 ) THEN BEGIN

      npos=0
      if init eq 1 then npos=long(ip)
      if npos ne 0 or init eq 1 then begin
; rangement dans un tableau sur mesure
         nbmax2d=max(compos)
         trp=trp(*,0:nbmax2d-1,0:npos-1)
         WIDGET_CONTROL, state.file3, GET_VALUE = fichier
         nomfich3=fichier(0)

; fichier de type position 2D :
         nbrec=6
         chrec_cle=strarr(nbrec)
         chrec_cle= (['POS-EW', $
		      'POS-NS', $
		      'FLUX-EW', $
		      'FLUX-NS', $
		      'DIAMETRE-EW', $
		      'DIAMETRE-NS'])
;
         itete=lonarr(3,npos)
         itete(0,*)=lindgen(npos)
         itete(1,*)=hdpos(0:npos-1)
         itete(2,*)=compos(0:npos-1)
         chres='EW-NS'

; ecriture du fichier de positions associes 2D Helio
         ecrpos,xmin,xmax,delta1,ihdeb,ihfin,idate, $
         chfreq,chres,nbrec,chrec_cle, $
         nomfich3,npos,nbmax2d,itete,trp

         mainstruct.pewfile = nomfich1
         mainstruct.pnsfile = nomfich2
         mainstruct.p2dfile = nomfich3
      end else begin
         message= "pas de position 2D calculee, pas d ecriture" 
         WIDGET_CONTROL, state.txt_message,SET_VALUE=message,/APPEND
      end
   ENDIF     
ENDIF


IF ( ev.id EQ state.heures ) THEN BEGIN
   mainstruct.heures = ev.value
ENDIF

; on sauve les modifications
WIDGET_CONTROL, stash, SET_UVALUE = state
END



PRO MENUCALCPOS2D
;          
;                             les variables globales (mainstruct)
;          Utilisations des fenetres 5,6,7,8 pour les affichages 
;          (mainstruct.windows(5:8))

common NRH1_HELIO,mainstruct

Title = "COMPUTE 2D POSITIONS"
;         initialisation du button group

nb=2
Choix_Qualifiers = intarr(nb) ; pour les entrees du button group
FOR i = 0,nb-1 DO Choix_Qualifiers(i) = 0
Qualifiers = ['DYNAM. CORR. (POITIERS)','STATIC IONOSPHERIC CORR.']


valmax=10
valtri=10L
valnit=4

base = WIDGET_BASE (TITLE = title,/FRAME,/COLUMN, $
                    XOFFSET = 200,YOFFSET = 200 )
base_file = WIDGET_BASE ( base,/COLUMN,/FRAME )
;base_time = WIDGET_BASE(base,/COLUMN,/FRAME)          ; affich  hdeb, hfin
base_pos = WIDGET_BASE(base,/ROW,/frame)	      ; Saisie numpos ew,ns
base_qualifiers = WIDGET_BASE ( base,/ROW,/FRAME )

fich1=mainstruct.pewfile
str = "Input: 1D EW-positions: "
file1 = CW_PICKFILE_NRH(base_file, TITLE = str, $
              VALUE = fich1, FILTER = 'p*.e*')
fich2=mainstruct.pnsfile
str = "Input: 1D SN-positions: "
file2 = CW_PICKFILE_NRH(base_file, TITLE = str, $
              VALUE = fich2, FILTER = 'p*.n*')

fich3=mainstruct.p2dfile
str = "Output: 2D positions: "
file3 = CW_PICKFILE_NRH(base_file, TITLE = str, $
              VALUE = fich3, FILTER = 'p*.2d*')

; Lecture de l'entete du fichier

err = newlitentete(1,fich1,file)
IF err EQ 0 THEN BEGIN
   heure=[MSH(file.heurdeb), MSH(file.heurfin)]
ENDIF ELSE BEGIN
   heure=['00:00:00:00','24:00:00:00']
ENDELSE

;Groupe choix des positions a associer et des heures debut, fin
base_time = WIDGET_BASE(base_pos,/COLUMN,/FRAME)          ; affich  hdeb, hfin
b_posew=WIDGET_BASE ( base_pos,/COLUMN,/FRAME )
b_posns=WIDGET_BASE ( base_pos,/COLUMN,/FRAME )
b_posdo=CW_BGROUP ( base_pos,(['INIT FILE','COMPUTE']),/COLUMN )
list_numposew=widget_droplist(b_posew,value=['EW pos. #0'])

;Groupe de saisie des horaires de debut et de fin de calcul de pos. 2D
label = WIDGET_LABEL(base_time, VALUE='Select start & end time')
heures=CX_HEURES(base_time,VALUE=heure)

hrpew_d=cw_field(b_posew,title='Start:',/string, $
   value=['00:00:00:000'], xsize=10)
hrpew_f=cw_field(b_posew,title=' End :',/string, $
   value=['00:00:00:000'],xsize=10)
list_numposns=widget_droplist(b_posns,value=['NS pos. #0'])
hrpns_d=cw_field(b_posns,title='Start:',/string, $
   value=['00:00:00:000'], xsize=10)
hrpns_f=cw_field(b_posns,title=' End :',/string, $
   value=['00:00:00:000'],xsize=10)

;Groupe de saisie correction Poitiers, ionospherique
bgroup = CW_BGROUP(base_qualifiers,Qualifiers,COLUMN=column, $
                       /NONEXCLUSIVE,/FRAME,SET_VALUE=[0,0])

bgroup_control = CW_BGROUP ( base, ['HELP', 'UPDATE','QUIT','WRITE FILE'],$
                             /ROW, SPACE = 50 )
txt_message = WIDGET_TEXT( base, VALUE = ' ',YSIZE=3, /SCROLL)

state = {  bgroup:bgroup,nb:nb,$
          bgroup_control:bgroup_control , $
	  list_numposew:list_numposew,list_numposns:list_numposns, $
          hrpew_d:hrpew_d,hrpns_d:hrpns_d, $
          hrpew_f:hrpew_f,hrpns_f:hrpns_f, $
	  b_posdo:b_posdo, $
          file1:file1, file2:file2,file3:file3,$
          heures:heures,txt_message:txt_message}

WIDGET_CONTROL, WIDGET_INFO ( base, /CHILD ), SET_UVALUE = state 

WIDGET_CONTROL, base ,/REALIZE

XMANAGER,'MENUCALCPOS2D', base,GROUP_LEADER = mainstruct.root, /NO_BLOCK
END
