;+
; Project     :	SOHO - CDS
;
; Name        :	FREEZE_RAS_DUR
;
; Purpose     :	Freeze raster durations, using measured values.
;
; Category    :	Planning
;
; Explanation :	This routine calls the MOD_V_RASTER routine to modify the
;		raster duration to a negative value.  This tells the software
;		that the duration is actually measured, rather than calculated,
;		so it will then not be updated.
;
; Syntax      :	FREEZE_RAS_DUR  [, RAS_ID, RAS_VAR  [, DURATION ] ]
;
; Examples    :	
;
; Inputs      :	None required.
;
; Opt. Inputs :	RAS_ID, RAS_VAR	= The raster ID and variation numbers
;				  identifying the raster to be modified.  If
;				  not passed, then can be selected from menus.
;		DURATION	= The value to set the duration to.  If not
;				  passed, then taken from the database entry.
;
;		The user will have the option of modifying the above parameters
;		before committing the change.
;
; Outputs     :	None.
;
; Opt. Outputs:	None.
;
; Keywords    :	GROUP = The widget ID of the widget that calls FREEZE_RAS_DUR.
;			When this ID is specified, a death of the caller
;			results in a death of FREEZE_RAS_DUR.
;
; Calls       :	MOD_V_RASTER, XSTUDY
;
; Common      :	FREEZE_RAS_DUR is an internal common block.
;
; Restrictions:	None.
;
; Side effects:	None.
;
; Prev. Hist. :	None.
;
; History     :	Version 1, 01-Mar-1996, William Thompson, GSFC
;		Version 2, 20-Mar-1996, William Thompson, GSFC
;			Fix bug when don't select raster from XSHOW_RASTER
;		Version 3, 22-May-1997, William Thompson, GSFC
;			Change XSHOW_STUDY call to XSTUDY
;		Version 4, 9-Oct-1997, Chris Haskell, GSFC
;			Add an edit Telemetry Rate selection
;
; Contact     :	WTHOMPSON
;-
;
	PRO FREEZE_RD_EVENT, EVENT

	COMMON FREEZE_RAS_DUR2, RAS_WID, RV_WID, DUR_WID, TELEM_WID,RAS_ID,$
                RAS_VAR, DURATION,TELEMETRY
;
;  Get the widget event.
;
	WIDGET_CONTROL,EVENT.ID,GET_UVALUE=EV
;
;  Depending on the event, take the appropriate action.
;
	CASE EV OF 
	    'SHOW_STUDY': BEGIN
		XSTUDY, STUDY, /SELECT, GROUP=EVENT.TOP
		IF DATATYPE(STUDY,1) EQ 'Structure' THEN BEGIN
		    IF TAG_EXIST(STUDY,'STUDYVAR') THEN BEGIN
			RAS_ID = STUDY.RASTERS(0).RAS_ID
			RAS_VAR = STUDY.RASTERS(0).RAS_VAR
			GET_RASTER, RAS_ID, RAS_VAR, RASTER
			DURATION = RASTER.DURATION
                        TELEMETRY= RASTER.TEL_RATE
			GOTO, UPDATE_WIDGETS
		    ENDIF
		ENDIF
		END
;
	    'SHOW_RASTER': BEGIN
		XSHOW_RASTER, FRASTER, RASTER, /MODAL, GROUP=EVENT.TOP
		IF DATATYPE(RASTER,1) EQ 'Structure' THEN BEGIN
		    IF TAG_EXIST(RASTER,'RAS_VAR') THEN BEGIN
			RAS_ID = RASTER.RAS_ID
			RAS_VAR = RASTER.RAS_VAR
			DURATION = RASTER.DURATION
                        TELEMETRY= RASTER.TEL_RATE
			GOTO, UPDATE_WIDGETS
		    ENDIF
		ENDIF
		END
;
	    'COMMIT': BEGIN
		IF DURATION LE 0 THEN BEGIN
			XACK, 'The duration must be positive'
			GOTO, FINISH
		ENDIF
		
		CHK=WHERE(TELEMETRY EQ ['L','M','H'],COUNT)
                IF COUNT EQ 0 THEN BEGIN
		 XACK, 'The telemetry rate must be either L, M, or H'
		 GOTO,FINISH
		ENDIF
		
;
		IF XANSWER('Do you wish to commit this change?') THEN BEGIN
			WIDGET_CONTROL, /HOURGLASS
			ERRMSG = ''
			PRIV = !PRIV  &  !PRIV = 2
			IF NOT MOD_V_RASTER(RAS_ID, RAS_VAR,	$
				DURATION=-DURATION, $
                                TEL_RATE=TELEMETRY,ERRMSG=ERRMSG) THEN	$
				XACK, ERRMSG ELSE $
                                 XTEXT,'Update was successful',/just_reg,wait=2
			!PRIV = PRIV
		ENDIF
		END
;
	    'EXIT': WIDGET_CONTROL, EVENT.TOP, /DESTROY
;
	    'RAS_WID': RAS_ID = EVENT.VALUE
;
	    'RV_WID': RAS_VAR = EVENT.VALUE
;
	    'DUR_WID': DURATION = EVENT.VALUE

    	    'TELEM_WID': TELEMETRY = STRUPCASE(EVENT.VALUE)
;
	ENDCASE
	GOTO, FINISH
;
UPDATE_WIDGETS:
	WIDGET_CONTROL, RAS_WID, SET_VALUE=RAS_ID
	WIDGET_CONTROL, RV_WID,  SET_VALUE=RAS_VAR
	WIDGET_CONTROL, DUR_WID, SET_VALUE=DURATION
	WIDGET_CONTROL, TELEM_WID,SET_VALUE=TELEMETRY

;
FINISH:
	RETURN
	END
;
;==============================================================================
;
	PRO FREEZE_RAS_DUR, RAS_ID0, RAS_VAR0, DURATION0, GROUP=GROUP
;
	COMMON FREEZE_RAS_DUR2
;
	ON_ERROR, 2
;
	IF N_ELEMENTS(GROUP) EQ 0 THEN GROUP=0
;
;  Make sure one has privilege to write into the database.
;
	IF NOT PRIV_ZDBASE(/DEF) THEN MESSAGE, 'No write privilege to database'
;
;  If a copy of FREEZE_RAS_DUR is already running, then exit.
;
	IF XREGISTERED("freeze_ras_dur") NE 0 THEN RETURN
;
;  Define the main base.
;
	MAIN = WIDGET_BASE(GROUP_LEADER=GROUP, /COLUMN)
;
;  Define a base for the buttons, and define the buttons.
;
	BBASE = WIDGET_BASE(MAIN, /ROW)
	DUMMY = WIDGET_BUTTON(BBASE, UVALUE='SHOW_STUDY',	$
		VALUE='Browse study database')
	DUMMY = WIDGET_BUTTON(BBASE, UVALUE='SHOW_RASTER',	$
		VALUE='Select raster from database')
	DUMMY = WIDGET_BUTTON(BBASE, UVALUE='COMMIT', VALUE='Commit')
	DUMMY = WIDGET_BUTTON(BBASE, UVALUE='EXIT', VALUE='Exit')
;
;  Define a base for the raster IDs, and define the widgets.
;
	RBASE = WIDGET_BASE(MAIN, /ROW, /MAP, UVALUE='RBASE')
	RAS_WID = CW_FIELD(RBASE, VALUE='', /ROW, /INTEGER, /ALL_EVENTS, $
		TITLE='Raster ID:', UVALUE='RAS_WID')
	RV_WID = CW_FIELD(RBASE, VALUE='', /ROW, /INTEGER, /ALL_EVENTS,	$
		TITLE='Raster variation:', UVALUE='RV_WID')
;
;  Define the widget for the duration.
;
        CBASE = WIDGET_BASE(MAIN, /ROW, /MAP, UVALUE='CBASE')
	DUR_WID = CW_FIELD(CBASE, VALUE='', /ROW, /FLOAT, TITLE='Duration:', $
		UVALUE='DUR_WID', /ALL_EVENTS)
		
;
;  Define the widget for the telemetry rate
;
	TELEM_WID=CW_FIELD(CBASE,VALUE='',/ROW,/STRING,TITLE='Telemetry rate: ',$
		UVALUE='TELEM_WID',/ALL_EVENTS)

;
;  If the optional parameters were passed, then display them in the appropriate
;  places.
;
	WIDGET_CONTROL, MAIN, /REALIZE
	IF N_ELEMENTS(RAS_ID0)  EQ 0 THEN RAS_ID  = 0 ELSE BEGIN
		RAS_ID = RAS_ID0
		WIDGET_CONTROL, RAS_WID, SET_VALUE=RAS_ID
	ENDELSE
	IF N_ELEMENTS(RAS_VAR0) EQ 0 THEN RAS_VAR = 0 ELSE BEGIN
		RAS_VAR = RAS_VAR0
		WIDGET_CONTROL, RV_WID, SET_VALUE=RAS_VAR
	ENDELSE
;
        DURATION=''
	IF N_ELEMENTS(DURATION0) EQ 0 THEN BEGIN
		GET_RASTER, RAS_ID, RAS_VAR, RASTER
		IF RASTER.RAS_ID GT 0 THEN DURATION = RASTER.DURATION
	END ELSE DURATION = DURATION0
	IF N_ELEMENTS(DURATION) EQ 1 THEN WIDGET_CONTROL, DUR_WID,	$
		SET_VALUE=DURATION ELSE	DURATION = 0.0
;
;  Set it all going.
;
	XMANAGER, 'FREEZE_RD', MAIN
;
	END

