Viewing contents of file '../idllib/contrib/tappin/graffer/graff_pfunct.pro'
;+
; GRAFF_PFUNCT
;	Define a parametric function to graffer.
;
; Usage:
;	ichange=graff_pfunct(pdefs)
;
; Return value:
;	ichange	int	1 if the DO button was used, 0 if cancel
;
; Argument:
;	pdefs	struct	in/out	The Graffer plot structure
;
; History:
;	Original (after graff_funct): 5/10/95; SJT
;	Made to function returning "cancel" state: 18/12/96; SJT
;	Add CAPTURE key to text inputs: 6/2/97; SJT
;-

function Pfunct_event, event

widget_control, event.id, get_uvalue = but

iexit = 0

funct = strarr(2)
numpts = 0
range = fltarr(2)

widget_control, event.handler, get_uvalue = uvs, /no_copy
case but of
    'ACTION': begin
        if (event.value eq 1) then begin
            for j = 0, 1 do begin
                widget_control, uvs.fid(j), get_value = f
                funct(j) = f
            endfor
            widget_control, uvs.nid, get_value = numpts
            widget_control, uvs.minid, get_value = rng
            range(0) = rng
            widget_control, uvs.maxid, get_value = rng
            range(1) = rng
        endif
        iexit = event.value
    end
    
    'MIN': grf_focus_enter, uvs.minid
    'MAX': grf_focus_enter, uvs.nid
    'NUM': grf_focus_enter, uvs.fid(0)
    'FUNX': grf_focus_enter, uvs.fid(1)
    'FUNY': grf_focus_enter, uvs.maxid
    
    'POP': begin
        widget_control, event.top, /show
        widget_control, event.id, timer = 2.
    end
endcase
widget_control, event.handler, set_uvalue = uvs, /no_copy

return, {id:event.id, top:event.top, handler:event.handler, $
         Exited:iexit, funct:funct, numpts:numpts, range:range}

end

function Graff_pfunct, pdefs

uvs = { $
        Fid:    lonarr(2), $
        Nid:    0l, $
        Minid:  0l, $
        Maxid:  0l $
      }

;	Find if the dataset is already defined as a function

handle_value, pdefs.data, data, /no_copy
handle_value, data(pdefs.cset).xydata, xydata, /no_copy

if (data(pdefs.cset).type eq -3) then begin
    funct = xydata.funct
    range = xydata.range
    numpts = data(pdefs.cset).ndata
    dflag = 0b
endif else begin
    funct = strarr(2)
    range = findgen(2)
    numpts = 25
    dflag = data(pdefs.cset).ndata gt 0
endelse

widget_control, pdefs.ids.graffer, sensitive = 0

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

                                ; The actual function definition

if (dflag) then $
  junk = widget_text(base, xsize = 50, ysize = 4, value = $
                     ['CURRENT DATA SET IS XY DATA OR A', $
                      'SIMPLE FUNCTION, ENTERING A', $
                      'PARAMETRIC FUNCTION WILL OVERWRITE IT', $
                      'USE "CANCEL" NOW TO KEEP IT' $
                     ] $
                    )

uvs.fid(0) = graff_enter(base, xsize = 40, value = $
                         funct(0), uvalue = 'FUNX', label = 'X = ', $
                         /capture) 
uvs.fid(1) = graff_enter(base, xsize = 40, value = $
                         funct(1), uvalue = 'FUNY', label = 'Y = ', $
                         /capture) 

                                ; Parameter range

rgb = widget_base(base, /row, uvalue = 'POP')
uvs.minid = graff_enter(rgb, /float, xsize = 10, uvalue = $
                        'MIN', value = range(0), format = "(g10.3)", $
                        label = 'T range: Min:', /capture)
uvs.maxid = graff_enter(rgb, /float, xsize = 10, uvalue = $
                        'MAX', value = range(1), format = "(g10.3)",  $
                        label = ' Max:', /capture)

                                ; Number of points

uvs.nid = graff_enter(base, /int, xsize = 5, uvalue = $
                      'NUM', value = numpts, format = "(I0)",  $
                      label = 'Number of function evaluations:', $
                      /capture)

                                ; Control

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

                                ; Realise and do RYO event handling

widget_control, tlb, /real
widget_control, base, set_uvalue = uvs, event_func = 'pfunct_event', $
  /no_copy

if (pdefs.popflag) then widget_control, rgb, timer = 2.

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

widget_control, tlb, /destroy

widget_control, pdefs.ids.graffer, sensitive = 1

if (ev.exited eq -1) then begin ; The DONT button
    handle_value, data(pdefs.cset).xydata, xydata, /no_copy, /set
    handle_value, pdefs.data, data, /no_copy, /set
    return, 0
endif

xydata = {graff_pfunct,  $
          Range:ev.range,  $
          Funct:ev.funct}

data(pdefs.cset).ndata = ev.numpts 
data(pdefs.cset).type = -3

handle_value, data(pdefs.cset).xydata, xydata, /no_copy, /set
handle_value, pdefs.data, data, /no_copy, /set

return, 1

end