Viewing contents of file '../idllib/contrib/tappin/graffer/graff_tlv.pro'
;+
; GRAFF_TLV
;	Construct a graffer data set from top-level variables
;
; Usage:
;	ichange = graff_tlv(pdefs)
;
; Return value
;	ichange	int	1 if changed, 0 if not
;
; Argument:
;	pdefs	struct	in/out	The graffer control/data structure
;
; WARNING:
;	This routine uses the undocumented IDL internal ROUTINE_NAMES
;	to recover values -- it is possible that this could cease to
;       work in later IDL releases - though I hope it won't.
;
; History:
;	Original: 21/9/95; SJT
;	Add x=findgen(ny) when no X variable given: 28/10/96; SJT
;	MOve GRF_TLV_GET to a separate file: 6/12/96; SJT
;	Made to function returning "cancel" state: 18/12/96; SJT
;	Add CAPTURE key to entry boxes: 6/2/97; SJT
;-


function Grf_tlv_event, event

common Gr_tlvs_masks, exlm, exhm, eylm, eyhm

base = widget_info(event.top, /child)
widget_control, base, get_uvalue = uvs, /no_copy

widget_control, event.id, get_uvalue = object

iexit = 0
case object of
    'POP': begin
        widget_control, event.top, /show
        widget_control, event.id, timer = 2
    end
    
    'ACTION': if (event.value eq -1) then begin
        iexit = -1 
    endif else begin
        iexit = 1
        
        widget_control, uvs.yid, get_value = yvar
        y = grf_tlv_get(yvar, ny)
        if (ny eq 0) then begin
            widget_control, uvs.mid, set_value = 'Y: '+yvar+ $
              ' Undefined or non-numeric'
            iexit = 0
            goto, donefor
        endif else y = float(y)
    
        widget_control, uvs.xid, get_value = xvar
        if (xvar eq '') then begin
            x = findgen(ny)
            nx = ny
        endif else begin
            x = grf_tlv_get(xvar, nx)
            if (nx eq 0) then begin
                widget_control, uvs.mid, set_value = 'X: '+xvar+ $
                  ' Undefined or non-numeric'
                iexit = 0
                goto, donefor
            endif else x = float(x)
        endelse
        
        if (nx ne ny) then begin
            widget_control, uvs.mid, set_value = 'Length of X and Y must ' + $
              'be equal'
            iexit = 0
            goto, donefor
        endif
        
        if (uvs.type ne 0) then begin
            nce = ([0, 1, 2, 1, 2, 2, 3, 3, 4])(uvs.type)
            errs = fltarr(nce, nx)
            irr = 0
            if (exlm(uvs.type)) then begin
                widget_control, uvs.eloxid, get_value = elvar
                if (elvar eq '') then begin
                    widget_control, uvs.mid, set_value = 'Requested ' + $
                      'data type needs a lower X error'
                    iexit = 0
                    goto, donefor
                endif
                errtmp = grf_tlv_get(elvar, nerl)
                if (nerl ne nx) then begin
                    widget_control, uvs.mid, set_value = $
                      'Errors and data must be same length'
                    iexit = 0
                    goto, donefor
                endif else errs(irr, *) = errtmp
                irr = irr+1
            endif
            if (exhm(uvs.type)) then begin
                widget_control, uvs.ehixid, get_value = elvar
                if (elvar eq '') then begin
                    widget_control, uvs.mid, set_value = 'Requested ' + $
                      'data type needs a upper X error'
                    iexit = 0
                    goto, donefor
                endif
                errtmp = grf_tlv_get(elvar, nerl)
                if (nerl ne nx) then begin
                    widget_control, uvs.mid, set_value = $
                      'Errors and data must be same length'
                    iexit = 0
                    goto, donefor
                endif else errs(irr, *) = errtmp
                irr = irr+1
            endif
            
            if (eylm(uvs.type)) then begin
                widget_control, uvs.eloyid, get_value = elvar
                if (elvar eq '') then begin
                    widget_control, uvs.mid, set_value = 'Requested ' + $
                      'data type needs a lower Y error'
                    iexit = 0
                    goto, donefor
                endif
                errtmp = grf_tlv_get(elvar, nerl)
                if (nerl ne nx) then begin
                    widget_control, uvs.mid, set_value = $
                      'Errors and data must be same length'
                    iexit = 0
                    goto, donefor
                endif else errs(irr, *) = errtmp
                irr = irr+1
            endif
            if (eyhm(uvs.type)) then begin
                widget_control, uvs.ehiyid, get_value = elvar
                if (elvar eq '') then begin
                    widget_control, uvs.mid, set_value = 'Requested ' + $
                      'data type needs a upper Y error'
                    iexit = 0
                    goto, donefor
                endif
                errtmp = grf_tlv_get(elvar, nerl)
                if (nerl ne nx) then begin
                    widget_control, uvs.mid, set_value = $
                      'Errors and data must be same length'
                    iexit = 0
                    goto, donefor
                endif else errs(irr, *) = errtmp
                irr = irr+1
            endif
            
            
        endif 
    endelse
    
    'X': grf_focus_enter, uvs.yid
    'Y': grf_focus_enter, uvs.eloxid
    'ELOX': grf_focus_enter, uvs.ehixid
    'EHIX': grf_focus_enter, uvs.eloyid
    'ELOY': grf_focus_enter, uvs.ehiyid
    'EHIY': grf_focus_enter, uvs.xid
    
    'ERRS': begin
        uvs.type = event.value
        widget_control, uvs.eloxid, sensitive = exlm(uvs.type)
        widget_control, uvs.ehixid, sensitive = exhm(uvs.type)
        widget_control, uvs.eloyid, sensitive = eylm(uvs.type)
        widget_control, uvs.ehiyid, sensitive = eyhm(uvs.type)
    end
endcase

Donefor:

if (iexit eq 1) then begin
    uvs.x = handle_create()
    uvs.y = handle_create()
    handle_value, uvs.x, x, /set, /no_copy
    handle_value, uvs.y, y, /set, /no_copy
    if (uvs.type ge 1) then begin
        uvs.err = handle_create()
        handle_value, uvs.err, errs, /set, /no_copy
    endif
endif

widget_control, base, set_uvalue = uvs, /no_copy

return, {id:event.handler, top:event.top, handler:0l, exited:iexit}

end





function Graff_tlv, pdefs

common Gr_tlvs_masks, exlm, exhm, eylm, eyhm

uvs = { $
        Xid:   0l, $
        Yid:   0l, $
        Eloxid:0l, $
        Ehixid:0l, $
        Eloyid:0l, $
        Ehiyid:0l, $
        Errid: 0l, $
        Errids:0l, $
        Mid:   0l, $
        X:     0l, $
        Y:     0l, $
        Err:   0l, $
        Type:  0 $
      }

;	Check out the type of the current ds

handle_value, pdefs.data, data, /no_copy

fflag = (data(pdefs.cset).type lt 0)

exlm = [0, 0, 0, 1, 1, 1, 1, 1, 1]
exhm = [0, 0, 0, 0, 1, 0, 0, 1, 1]
eylm = [0, 1, 1, 0, 0, 1, 1, 1, 1]
eyhm = [0, 0, 1, 0, 0, 0, 1, 0, 1]

; 	desensitize the main graffer panel and define the bases for
; 	this one.

widget_control, pdefs.ids.graffer, sensitive = 0

tlb = widget_base(title = 'Graffer from Variables',  $
                  group_leader = pdefs.ids.graffer, resource = $
                  'Graffer')
base = widget_base(tlb, /column)

if (fflag) then $
  junk = widget_text(base, xsize = 30, ysize = 3, value = $
                     ['CURRENT DATA SET IS A FUNCTION', $
                      'ENTERING DATA WILL OVERWRITE IT', $
                      'USE "CANCEL" NOW TO KEEP IT' $
                     ] $
                    )

                                ; The entry boxes for X & Y

uvs.xid = graff_enter(base, value = '', /text, uvalue = 'X', $
                      label = 'X Variable:', xsize = 12, /capture)
uvs.yid = graff_enter(base, value = '', /text, uvalue = 'Y', $
                      label = 'Y Variable:', xsize = 12, /capture)

uvs.eloxid = graff_enter(base, value = '', /text, uvalue = 'ELOX', $
                         label = 'Lower X error:', xsize = 12, /capture)
widget_control, uvs.eloxid, sensitive = exlm(data(pdefs.cset).type > 0)

uvs.ehixid = graff_enter(base, value = '', /text, uvalue = 'EHIX', $
                      label = 'Upper X error:', xsize = 12, /capture)
widget_control, uvs.ehixid, sensitive = exhm(data(pdefs.cset).type > 0)

uvs.eloyid = graff_enter(base, value = '', /text, uvalue = 'ELOY', $
                      label = 'Lower Y error:', xsize = 12, /capture)
widget_control, uvs.eloyid, sensitive = eylm(data(pdefs.cset).type > 0)

uvs.ehiyid = graff_enter(base, value = '', /text, uvalue = 'EHIY', $
                      label = 'Upper Y error:', xsize = 12, /capture)
widget_control, uvs.ehiyid, sensitive = eyhm(data(pdefs.cset).type > 0)

if (data(pdefs.cset).mode eq 0) then emds = ['None', $
                                             '±Y', $
                                             '-Y +Y', $
                                             '±X', $
                                             '-X +X', $
                                             '±X ±Y', $
                                             '±X -Y +Y', $
                                             '-X +X ±Y', $
                                             '-X +X -Y +Y'] $
else emds = ['None', $
             '±Theta', $
             '-Theta +Theta', $
             '±R', $
             '-R +R', $
             '±R ±Theta', $
             '±R -Theta +Theta', $
             '-R +R ±Theta', $
             '-R +R -Theta +Theta']

errid = cw_bbselector(base, emds, ids = errids, $
                      /return_index, set_value = data(pdefs.cset).type $
                      > 0, label_left = 'Errors present : ', uvalue = 'ERRS')

uvs.mid = graff_enter(base, value = '', ysize = 2, xsize = 30, $
                      /column, /display, label = 'Messages', uvalue = $
                      'POP')    ; Needs a UVALUE as we use this one
                                ; for the timer events.

                                ; Control

junk = cw_bgroup(base, ['Do it', 'Cancel'], button_uvalue = [1, -1], $
                 uvalue = 'ACTION', /row)



                                ; Realise and do RYO event handling

widget_control, tlb, /real

grf_focus_enter, uvs.xid
if (pdefs.popflag) then widget_control, uvs.mid, timer = 2.

widget_control, base, event_func = 'grf_tlv_event', set_uvalue = $
  uvs, /no_copy

repeat begin
    ev = widget_event(base)
endrep until (ev.exited ne 0)

widget_control, base, get_uvalue = uvs, /no_copy
widget_control, tlb, /destroy
widget_control, pdefs.ids.graffer, /sensitive 

if (ev.exited eq -1) then begin ; Restore the data set and return
    
    handle_value, pdefs.data, data, /no_copy, /set
    return, 0
endif

handle_value, uvs.x, x, /no_copy
handle_value, uvs.y, y, /no_copy
handle_free, uvs.x
handle_free, uvs.y

xydata = fltarr(([2, 3, 4, 3, 4, 4, 5, 5, 6])(uvs.type), n_elements(x))

xydata(0, *) = x
xydata(1, *) = y

if (uvs.type ge 1) then begin
    handle_value, uvs.err, err, /no_copy
    handle_free, uvs.err
    xydata(2, 0) = err
endif


handle_value, data(pdefs.cset).xydata, xydata, /no_copy, /set
data(pdefs.cset).ndata = n_elements(x)
data(pdefs.cset).type = uvs.type

handle_value, pdefs.data, data, /no_copy, /set

return, 1

end