;============================================================================
;+
; PROJECT: HESSI
;
; NAME: cw_energy_range
;
; PURPOSE: Create a compound widget that allows users to select an energy range.
; User can enter low or high energy independently (either by choosing from a
; droplist or by typing text, or can choose low and high from a standard set of
; energy ranges.
; Widget_control can be called with set_value and get_value, just as with simple
; widgets.
; Generates an event (described below) that the calling program can respond to.
;
; CATEGORY: HESSI WIDGETS
;
; CALLING SEQUENCE:
; widget_id = cw_energy_range ( parent, $
; value=energy_range, $
; uvalue='energy_range', $
; _extra=_extra, $
; help=help )
;
; INPUTS:
; parent - widget id of widget calling cw_energy_range
;
; OPTIONAL INPUTS (KEYWORDS):
; value - initial energy range as fltarr(2)
; uvalue - user value to assign to compound widget
; _extra - any other keywords - will get passed to widget_base of compound widget
; help - if set, just lists this header documentation
;
;
; OUTPUTS:
; Function value returned is widget id of compound widget.
;
; OPTIONAL OUTPUTS: None
;
; Calls:
;
; COMMON BLOCKS: None
;
; PROCEDURE:
;
; RESTRICTIONS: None
;
; SIDE EFFECTS: Generates an event with the following structure:
; { id: 0L, top: 0L, handler: 0L, value:fltarr(2) }
;
;
; EXAMPLES:
;
; HISTORY:
; Kim Tolbert, rewrote hsi_cw_energy_range to make it general
;
;-
;============================================================================
;-- This procedure is called when widget_control, id, set_value=xxx is called
pro cw_energy_range_set_value, id, value
stash = widget_info ( id, /child )
widget_control, stash, get_uvalue=state, /no_copy
widget_control, state.w_energy_range, set_value=value
state.value = value
widget_control, stash, set_uvalue=state, /no_copy
end
;-- This function is called when widget_control, id, get_value=xxx is called
function cw_energy_range_get_value, id
stash = widget_info ( id, /child )
widget_control, stash, get_uvalue=state, /no_copy
widget_control, state.w_energy_range, get_value=value
state.value = value
widget_control, stash, set_uvalue=state, /no_copy
return, value
end
;--- Event handler for compound widget
function cw_energy_range_event, event
error = 0
;help,event,/st
;print,'error = ', error
base = event.handler
stash = widget_info(base, /child)
widget_control, stash, get_uvalue=state
old_value = state.value
widget_control, event.id, get_uvalue=uvalue
;print,'uvalue=',uvalue
widget_control, state.base, get_value=value
state.value = value
if uvalue eq 'choices' then begin
if event.index ne 0 then state.value = state.choices[*,event.index]
widget_control, state.w_choices, set_droplist_select=0
endif
widget_control, state.base, set_value=state.value
if total(state.value - old_value) ne 0. then ret = {id: base, top: event.top, handler: 0L, value: state.value}
widget_control, stash, set_uvalue = state
;stop, 'end of event handler'
return,ret
end
;--------------
function cw_energy_range, parent, $
ch_energy=ch_energy, $
uvalue=uvalue, $
value=value, $
_extra=_extra, $
help=help
if keyword_set( help ) then begin
doc_menu, 'cw_energy_range'
return, 0
end
checkvar, value, [6., 100.]
checkvar, uvalue, 0
checkvar, ch_energy, [1.,10.,100.,1000.]
format = '(f12.1)'
choices = [ [0.,0.], [get_edge_products(ch_energy, /edges_2)] ]
choices_str = 'Standard: '
for i = 1,n_elements(choices(0,*))-1 do $
choices_str = [choices_str, $
strtrim(string(choices[0,i], format='(f8.0)'), 2) + ' - ' + $
strtrim(string(choices[1,i], format='(f8.0)'), 2) ]
; user value uval passed directly to the base
base = widget_base( parent, $
event_func='cw_energy_range_event', $
func_get_value = "cw_energy_range_get_value", $
pro_set_value = "cw_energy_range_set_value", $
uvalue=uvalue, $
_extra=_extra, $
/column, $
/base_align_left, $
space=0, $
xpad=0, $
ypad=0, $
/frame )
;w_label = widget_label (base, /align_center, value='Note: Energy range of 0. - 0. means use full energy range available.')
;dummy = widget_base (base)
base1 = widget_base (base, /row)
w_energy_range = cw_range ( base1, $
label1='Energy Range (keV) Low: ', $
label2='High: ', $
value=value, $
format=format, $
dropvals1 = trim(choices[0,1:*]), $
dropvals2 = trim(choices[1,1:*]), $
uvalue='energy_range', $
xsize=7 )
base2 = widget_base ( base1, /align_center, /column)
w_choices = widget_droplist ( base2, $
value=choices_str, $
uvalue='choices' )
state = { base: base, $
w_energy_range: w_energy_range, $
w_choices: w_choices, $
choices: choices, $
value: value }
widget_control, widget_info( base, /child ), set_uvalue=state
return, base
end