Viewing contents of file '../idllib/contrib/tappin/graffer/graff_zfunct.pro'
;+
; GRAFF_ZFUNCT
;	Define a 2-D function to graffer.
;
; Usage:
;	ichange = graff_zfunct(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): 10/12/96; SJT
;	Made to function returning "cancel" state: 18/12/96; SJT
;	Add CAPTURE key to text inputs: 6/2/97; SJT
;-

function Zfunct_event, event

widget_control, event.id, get_uvalue = but

iexit = 0

funct = ''
numpts = intarr(2)
range = fltarr(2, 2)
widget_control, event.handler, get_uvalue = uvs, /no_copy
case but of
    'ACTION': begin
        if (event.value eq 1) then begin
            widget_control, uvs.fid, get_value = funct
            for j = 0, 1 do begin
                widget_control, uvs.nid(j), get_value = np
                numpts(j) = np
                for k = 0, 1 do begin
                    widget_control, uvs.rgid(j, k), get_value = rng
                    range(j, k) = rng
                endfor
            endfor
        endif
        iexit = event.value
    end
    
    'XMIN': grf_focus_enter, uvs.rgid(1, 0)
    'XMAX': grf_focus_enter, uvs.rgid(0, 1)
    'YMIN': grf_focus_enter, uvs.rgid(1, 1)
    'YMAX': grf_focus_enter, uvs.nid(0)
    'NUM1': grf_focus_enter, uvs.nid(1)
    'NUM2': grf_focus_enter, uvs.fid
    'FUNC': grf_focus_enter, uvs.rgid(0, 0)
    
    '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_zfunct, pdefs

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

;	Find if the dataset is already defined as a 2-D function

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

if (data(pdefs.cset).type eq -4) then begin
    funct = xydata.funct
    range = xydata.range
    numpts = [data(pdefs.cset).ndata, data(pdefs.cset).ndata2] 
    dflag = 0b
endif else begin
    funct = ''
    range = fltarr(2, 2)
    numpts = [25, 25]
    dflag = (data(pdefs.cset).ndata(0) gt 0)
endelse

widget_control, pdefs.ids.graffer, sensitive = 0

tlb = widget_base(title = 'Graffer 2-D 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', $
                      '1-D FUNCTION ENTERING A', $
                      '2-D FUNCTION WILL OVERWRITE IT', $
                      'USE "CANCEL" NOW TO KEEP IT' $
                     ] $
                    )

uvs.fid = graff_enter(base, xsize = 40, value = funct, label $
                      = 'Function:', uvalue = 'FUNC', /capture)

                                ; X axis range

rgb = widget_base(base, /row, uvalue = 'POP')
uvs.rgid(0, 0) = graff_enter(rgb, /float, xsize = 10, $
                             uvalue = 'XMIN', value = range(0, 0), $
                             format = "(g10.3)", label = $
                             'X axis range: Min:', /capture)
uvs.rgid(1, 0) = graff_enter(rgb, /float, xsize = 10, $
                             uvalue = 'XMAX', value = range(1, 0), $
                             format = "(g10.3)", label = ' Max:', $
                             /capture)

                                ; Y axis range

rgb = widget_base(base, /row)
uvs.rgid(0, 1) = graff_enter(rgb, /float, xsize = 10, $
                             uvalue = 'YMIN', value = range(0, 1), $
                             format = "(g10.3)", label =  $
                             'Y axis range: Min:', /capture)
uvs.rgid(1, 1) = graff_enter(rgb, /float, xsize = 10, $
                             uvalue = 'YMAX', value = range(1, 1), $
                             format = "(g10.3)", label = ' Max:', $
                             /capture)

                                ; Number of points

njb = widget_base(base, /row)
uvs.nid(0) = graff_enter(njb, /int, xsize = 5, uvalue = $
                         'NUM1', value = numpts, format = "(I0)", $
                         label = 'Number of function evaluations X:', $
                         /capture)
uvs.nid(1) = graff_enter(njb, /int, xsize = 5, uvalue = $
                         'NUM2', value = numpts, format = "(I0)", $
                         label = 'Y:', /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 = 'zfunct_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_zfunct,  $
          Range:ev.range, $
          Funct:ev.funct}

data(pdefs.cset).ndata = ev.numpts(0)
data(pdefs.cset).ndata2 = ev.numpts(1)

data(pdefs.cset).type = -4

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

return, 1

end