
;+ ***********************************************************************
; NAME:
;	MENUTRACEPOS
;
; PURPOSE:
;	Cette procedure contient les WIDGETS pour le trace des resultats
;	de calculs (Flux, Positions) sur les fichiers 1D du NRH
;	"Button" F(TIME) du menu principal
;
; CATEGORY:
;	NRH1 Menu
;
; CALLING SEQUENCE:
;	MENUTRACEPOS
;
; INPUTS:
;	Non
;
; KEYWORD PARAMETERS:
;	Non
;
; OUTPUTS:
;	Non
;
; COMMON BLOCKS:
;	NRH1_GLOBAL
;	NRH1_HELIO
;
; MODIFICATION HISTORY: (bonmartin@obspm.fr)
;	16/11/98 adapte du logiciel XHELIO
;- *************************************************************************

PRO MENUTRACEPOS_EVENT, ev

common NRH1_GLOBAL,nomfich,fichinfo
common NRH1_HELIO,mainstruct

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


;------- Lecture du fichier position ------------------------------------------
 
IF (ev.id EQ state.files(0)) THEN BEGIN
   WIDGET_CONTROL, state.files(0), GET_VALUE = fichier
   
   err = newlitentete(1,fichier(0),file)
   IF err EQ 1 THEN RETURN

   type = motcle(1, 'LABEL')
   type = STRUPCASE(STRMID(type, 0, 3))
   IF (type EQ 'EST' OR type EQ 'NOR') THEN $	; liste des parametres a tracer
		Qualifiers = [ motcle(1, 'BLOC0'), $
			motcle(1, 'BLOC1'), $
			motcle(1, 'BLOC2'), $
			motcle(1, 'BLOC3'), $
			motcle(1, 'BLOC4')] $
   ELSE Qualifiers = [ motcle(1, 'BLOC0'), $
			motcle(1, 'BLOC1'), $
			motcle(1, 'BLOC2'), $
			motcle(1, 'BLOC3'), $
			motcle(1, 'BLOC4'), $
			motcle(1, 'BLOC5')]
   WIDGET_CONTROL, state.bgroup, SET_VALUE = Qualifiers

   Nbpos = File.nbpix(1)/File.facbloc(1)
   tabpos = intarr(nbpos)
   tabpos(*) = 0
   tabpos(0) = 1 
   heure=[string(0.),string(0.)]
   WIDGET_CONTROL, state.heures, GET_VALUE = heure
   IF hms(heure(0)) EQ hms(heure(1)) THEN BEGIN
	hdeb=MSH(file.heurdeb)
	hfin=MSH(file.heurfin)
	WIDGET_CONTROL, state.heures, SET_VALUE = [hdeb,hfin]
   ENDIF
   options = '# ' + string(indgen(nbpos))
   WIDGET_CONTROL, state.numpos, SET_VALUE = options	; Init. tab. positions
ENDIF

;------- Format trace: choix page, echelle ordonnee ---------------------------

IF ( ev.id EQ state.sw_plot ) THEN BEGIN	; Echelle lin ou log (ordonnee)
	WIDGET_CONTROL, state.sw_plot, GET_VALUE = position
	IF position EQ 2 THEN echlog = 1 ELSE echlog = 0
ENDIF

;------- Actions: mise a jour parametres, sortie ou trace ---------------------

IF ( ev.id EQ state.bgroup) THEN BEGIN	; choix du parametre a tracer
    state.fonction = ev.index
		minmax = [0.,0.] 
	        WIDGET_CONTROL, state.minmax, SET_VALUE = minmax
ENDIF

IF ( ev.id EQ state.bgroup_control ) THEN BEGIN 
  ; ******** update ********* on recupere les variables globales
    IF ( ev.value EQ 0 ) THEN BEGIN
	WIDGET_CONTROL, state.files(0), GET_VALUE = fichier
	err = newlitentete(1,fichier(0),file)
	IF err EQ 1 THEN RETURN
	hdeb=MSH(file.heurdeb)
	hfin=MSH(file.heurfin)
	WIDGET_CONTROL, state.heures, SET_VALUE = [hdeb,hfin]
	minmax = [0.,0.] 
	WIDGET_CONTROL, state.minmax, SET_VALUE = minmax
   ENDIF
  ; ******* quit *********
     IF ( ev.value EQ 1 ) THEN BEGIN                       
         WIDGET_CONTROL, stash, SET_UVALUE = state
         WIDGET_CONTROL, ev.top,/DESTROY   
         RETURN
     ENDIF
  ; ******* trace *********
    IF ( ev.value EQ 2 OR ev.value EQ 3 ) THEN BEGIN
      ; *******   On recupere  toutes les valeurs des widgets *********
	IF ev.value EQ 3 THEN oldpage = 1 ELSE oldpage = 0
	index_qualifiers = state.fonction
        WIDGET_CONTROL, state.heures, GET_VALUE = heures
        WIDGET_CONTROL, state.minmax, GET_VALUE = minmax
        WIDGET_CONTROL, state.files(0), GET_VALUE = fichier      
      	numero = WIDGET_INFO(state.numpos, /DROPLIST_SELECT)

	WIDGET_CONTROL, state.sw_plot, GET_VALUE = position
	IF position EQ 2 THEN echlog = 1 ELSE echlog = 0

;     choix de fenetre a utiliser
	IF oldpage EQ 0 THEN $
	      win = get_window(11,14,TITLE='Time history plot')

	IF oldpage EQ 1 THEN BEGIN
		minmax = [0.,0.] 
	        WIDGET_CONTROL, state.minmax, SET_VALUE = minmax
	ENDIF

;  Definition de l'emplacement du cadre / des cadres modif 18/12/96 KLK
        x0 = 0.23 & x1 = 0.8 & y0 = 0.1 & y1 = 0.9
        !p.position(0) = x0 & !P.position(2) = x1 
	IF( !P.MULTI(2) EQ 0) THEN BEGIN
		distcad = y1-y0	; Distance between successive frames
		!p.position(3) = $
		   y1 - 0.21*distcad & !P.position(1) = y0 + 0.21*distcad
	ENDIF ELSE BEGIN
		distcad = (y1-y0)/!P.MULTI(2)	; Distance between successive frames
		IF(!P.MULTI(1) GT 1) THEN $
			PRINT, 'Probleme def. des cadres: plusieurs colonnes'
		IF(!P.MULTI(0) EQ 0) THEN ymaxc = y1 - .21*distcad ELSE $
			ymaxc = y0 + (!P.MULTI(0)-.21)*distcad
		yminc = ymaxc - .58*distcad
		!p.position(1) = yminc & !P.position(3) = ymaxc
	ENDELSE
; fin modif

	lun=4  
	s = STRPOS(fichier(0), '.')
	type = STRUPCASE(STRMID(fichier(0), s+1, 1))
	IF type EQ '2' THEN $
		err = newlecp2d(lun, a, sa, FICHIER=fichier(0), /OLDMODE) $
			ELSE err=newlecp1d(lun,a,sa,FICHIER=fichier(0), /OLDMODE)
	IF (err EQ 1) THEN RETURN 
;  ***** AFFICHAGE DES POSITIONS ******
	IF (mainstruct.laser EQ 1) THEN BEGIN
	        NRH1_postscript,/on
		tracepos,a,sa,lun,numero, index_qualifiers, MINMAX=minmax, $
			HEURES = heures, oldpage = oldpage, ECHLOG = echlog, $
			CHARSIZE=charsize, noerase = noerase
		NRH1_postscript,/off
	ENDIF
	tracepos,a,sa,lun,numero, index_qualifiers, MINMAX=minmax, $
		 HEURES = heures, oldpage = oldpage, ECHLOG = echlog, $
		CHARSIZE=charsize, noerase = noerase
	mainstruct.heures=heures
	message = "Plot source # " + STRCOMPRESS(string(numero))
	WIDGET_CONTROL, state.txt_message, SET_VALUE=message, /APPEND
    ENDIF
ENDIF


;------- Agrandissement d'un segment temporel (ZOOM) ---- ---------------------

IF ( ev.id EQ state.zoom ) THEN BEGIN
     message = "Delimit the field to be plotted with the cursor"
     WIDGET_CONTROL, state.txt_message, SET_VALUE=message, /APPEND
 
     result=NRH1_getzone()
     IF N_ELEMENTS(result) EQ 1 THEN RETURN
     IF result(0) LT result(2) THEN BEGIN
        mainstruct.heures(0)=MSH(result(0))
        mainstruct.heures(1)=MSH(result(2))
	IF result(1) LT result(3) THEN minmax = [result(1), result(3)] $
		ELSE minmax = [result(3), result(1)] 
     ENDIF ELSE BEGIN
        	tracepos,a,sa,lun,numero, state.fonction, $
		MINMAX=minmax, HEURES = heures, $
		oldpage = oldpage, ECHLOG = echlog, CHARSIZE=charsize,$
		noerase = noerase
		mainstruct.heures(0)=MSH(result(2))
        	mainstruct.heures(1)=MSH(result(0))
		minmax = [0., 0.]
     ENDELSE
     WIDGET_CONTROL, state.heures, SET_VALUE = mainstruct.heures
     WIDGET_CONTROL, state.minmax, SET_VALUE = minmax
ENDIF

;------- Mesure au curseur (CURSOR) ---- ---------------------
IF ( ev.id EQ state.curseur ) THEN BEGIN
	message = "Click on a point"
	WIDGET_CONTROL, state.txt_message, SET_VALUE=message, /APPEND
	result=NRH1_getzone(SINGLE=1)
	message = "   Time: " + MSH(result(0)) + ", ordinate: " + $
		STRCOMPRESS(STRING(result(1)))
	WIDGET_CONTROL, state.txt_message, SET_VALUE=message, /APPEND
ENDIF

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







PRO MENUTRACEPOS
;          Utilisations des fenetres 11 et 12 pour les affichages 
;          (mainstruct.windows(11:12))

common NRH1_GLOBAL,nomfich,fichinfo
common NRH1_HELIO,mainstruct

Title = "TIME HISTORY PLOT parameters"
;         initialisation du button group
column = 2            
Qualifiers = [' ',' ',' ',' ',' ',' ']

files = lonarr ( 1 ) 

base = WIDGET_BASE (TITLE = title,/FRAME,/COLUMN, XOFFSET = 200,$
                                                  YOFFSET = 200 )
base_file = WIDGET_BASE ( base,/COLUMN,/FRAME )

base_zone = WIDGET_BASE(base, COLUMN=2, /FRAME)      ; Saisie hdeb, hfin
base_time = WIDGET_BASE(base_zone, COLUMN=2, /FRAME)
base_numpos = WIDGET_BASE(base, column=2, /FRAME)
base_plot = WIDGET_BASE(base, column=2, /FRAME)
zoom = WIDGET_BUTTON ( base,$
                           VALUE = 'ZOOM',XSIZE=50 )
curseur = WIDGET_BUTTON(base,VALUE='CURSOR')

sw_plot = CW_SWITCH( base_plot, ['Lin. scale', 'Log. scale'], VALUE = 1)

files(0)= CW_PICKFILE_NRH(base_file, TITLE = 'Input file: ', $
;              VALUE = mainstruct.pewfile, FILTER='p*.* f*.*')
              VALUE = mainstruct.pewfile, FILTER='[p,f]*.[e,n,2]*') ; modif 10/11/97

WIDGET_CONTROL,files(0),GET_VALUE = fichier

; Lecture fichier 
err = newlitentete(1,fichier(0),file)
IF (err EQ 0) THEN BEGIN
	Nbpos = File.nbpix(1)/File.facbloc(1)
	heure=[MSH(file.heurdeb), MSH(file.heurfin)]
ENDIF ELSE BEGIN
	nbpos=8
	heure=['00:00:00','00:00:00']
ENDELSE

;Groupe de saisie des horaires de debut et de fin de visualisation
nb = N_ELEMENTS (Qualifiers)
selpos=intarr(nbpos)
selpos(*)=0
selpos(0)=1

lab_parpos = WIDGET_LABEL(base_numpos, VALUE = "Plot one of: ")
bgroup = WIDGET_LIST(base_numpos,VALUE=Qualifiers, $
	SCR_XSIZE=20*!d.x_ch_size, SCR_YSIZE=12*!d.y_ch_size)
lab_numpos = WIDGET_LABEL(base_numpos, VALUE = "Source: ")
numpos = WIDGET_DROPLIST(base_numpos, VALUE= ['# 0'])  
fonction = 0	; par defaut: tracer le premier des parametres

heures=CX_HEURES(base_time,VALUE=heure)
minmax = CX_canaux(base_time, VALUE = [0.0000, 0.0000])

base_qualifiers = WIDGET_BASE ( base,/ROW,/FRAME )

bgroup_control = CW_BGROUP ( base, ['UPDATE','QUIT','PLOT','OPLOT'],$
                              /ROW, SPACE = 50 )

txt_message = WIDGET_TEXT( base, VALUE = ' ', YSIZE=5, /SCROLL)

state = { base:base, bgroup:bgroup, bgroup_control:bgroup_control , $
	curseur:curseur, files:files, heures:heures, $
	minmax:minmax, numpos:numpos, $
	fonction:fonction, $
	sw_plot:sw_plot, txt_message:txt_message, $
	zoom:zoom }

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

WIDGET_CONTROL, base ,/REALIZE


XMANAGER,'MENUTRACEPOS', base,GROUP_LEADER = mainstruct.root, /NO_BLOCK

stash = WIDGET_INFO ( base, /CHILD )
WIDGET_CONTROL, stash, GET_UVALUE = state


END






