Viewing contents of file '../idllib/contrib/tappin/graffer/gr_cont_menus.pro'
;+
; GR_CONT_MENU
;	Make the menu to set the properties of a contoured ds.
;
; Usage:
;	gr_cont_menu, pdefs, data
;
; Arguments:
;	pdefs	struct	input	The Graffer data & control structure.
;	data	struct	in/out	The data structure extracted from pdefs
; History:
;	Original: 9/12/96; SJT
;	Sort the levels: 16/5/97; SJT
;-

function Cont_event, event

widget_control, event.id, get_uvalue = but
widget_control, event.handler, get_uvalue = uv, /no_copy

iexit = 0
track_flag = strpos(tag_names(event, /struct), 'TRACK') ne -1
if (track_flag) then begin
    if (event.enter eq 0) then begin
        graff_msg, uv.msg, ''
        goto, miss_case
    endif
endif

case but of
    'DO': if (track_flag) then $
      graff_msg, uv.msg, 'Exit this menu and apply changes' $
    else begin
        iexit = 1
        if (uv.zopts.n_levels gt 0) then begin
            widget_control, uv.levels, get_value = levels
            uv.zopts.levels = levels(sort(levels))
            uv.zopts.n_levels = n_elements(levels)
        endif else begin
            widget_control, uv.nlevels, get_value = n_levels
            uv.zopts.n_levels = -n_levels
        endelse
        
        widget_control, uv.colour, get_value = col
        uv.zopts.colours = col
        uv.zopts.n_cols = n_elements(col)
        
        widget_control, uv.thick, get_value = thk
        uv.zopts.thick = thk
        uv.zopts.n_thick = n_elements(thk)
        
        widget_control, uv.style, get_value = sty
        uv.zopts.style = sty
        uv.zopts.n_sty = n_elements(sty)
        
        widget_control, uv.label, get_value = labi
        uv.zopts.label = labi
        
    end
    
    'CANCEL': if (track_flag) then $
      graff_msg, uv.msg, 'Exit this menu and abandon changes' $
    else iexit = -1
    
    'CMODE': if (track_flag) then $
      graff_msg, uv.msg, 'Toggle explicit/automatic contour levels' $
    else begin
        uv.zopts.n_levels = 2*event.value-1
        widget_control, uv.levels, sensitive = event.value eq 1
        widget_control, uv.nlevels, sensitive = event.value eq 0
    end
    
    'LEVEL': if (track_flag) then $
      graff_msg, uv.msg, 'Set explicit contour levels'
    
    'NLEVEL': if (track_flag) then $
      graff_msg, uv.msg, 'Set number of automatic levels'
    
    'COLOUR': if (track_flag) then $
      graff_msg, uv.msg, 'Set contour colours'
    
    'THICK': if (track_flag) then $
      graff_msg, uv.msg, 'Set contour thicknesses'
    
    'STYLE': if (track_flag) then $
      graff_msg, uv.msg, 'Set contour line styles'
    
    'LABEL': if (track_flag) then $
      graff_msg, uv.msg, 'Set contour labelling interval'
    
    'FILL': if (track_flag) then $
      graff_msg, uv.msg, 'Toggle filled/outline contours' $
    else uv.zopts.fill = event.value
    
    'POP': begin
        widget_control, event.top, /show
        widget_control, event.id, timer = 2
    end
endcase

Miss_case:

widget_control, event.handler, set_uvalue = uv, /no_copy

return, { $
          Id:event.id,  $
          Top:event.top,  $
          Handler:0l,  $
          Exited:iexit $
        }

end

pro Gr_cont_menus, pdefs, data

i = pdefs.cset

widget_control, pdefs.ids.graffer, sensitive = 0

tlb = widget_base(title = 'Graffer Contour Options', group_leader = $
                  pdefs.ids.graffer, resource = 'Graffer') 
base = widget_base(tlb, /column, xpad = 1, ypad = 1, space = 1)
obase = widget_base(base, /row, xpad = 1, ypad = 1, space = 1)

jb = widget_base(obase, /column, xpad = 1, ypad = 1, space = 1, /frame)

iexpl = data(i).zopts.n_levels gt 0
junk = cw_bbselector(jb, ['Automatic levels', 'Explicit levels'], $
                     uvalue = 'CMODE', set_value = iexpl, /track)

if (iexpl) then l0 = data(i).zopts.levels(0:data(i).zopts.n_levels-1)  $
else l0 = 0

c_levels = graff_enter(jb, /float, /array, /track, uvalue = $
                       'LEVEL', value = l0, format = $
                       "(g11.4)", xsize = 12, ysize = 6, $ $
                       /scroll, /column, label = 'Levels', /capture)
widget_control, c_levels, sensitive = iexpl

c_nlevels = graff_enter(jb, /int, /track, uvalue = 'NLEVEL', value = $
                        abs(data(i).zopts.n_levels), xsize = 12, ysize $
                        = 1, /column, label = '# Levels', /capture)
widget_control, c_nlevels, sensitive = iexpl eq 0


jb = widget_base(obase, /column, xpad = 1, ypad = 1, space = 1, /frame)

if (data(i).zopts.n_cols eq 0) then begin
    data(i).zopts.n_cols = 1
    data(i).zopts.colours(0) = 1
end

c_colour = graff_enter(jb, /int, /array, /track, uvalue = 'COLOUR', $
                       /capture, value = $
                       data(i).zopts.colours(0:data(i).zopts.n_cols-1), $
                       format = "(i0)", xsize = 6, ysize = 4, $
                       /scroll, /column, label = 'Colours')

if (data(i).zopts.n_thick eq 0) then begin
    data(i).zopts.n_thick = 1
    data(i).zopts.thick(0) = 1
end

c_thick = graff_enter(jb, /int, /array, /track, uvalue = 'THICK', $
                      /capture, value = $
                      data(i).zopts.thick(0:data(i).zopts.n_thick-1), $ 
                      format = "(I0)", xsize = 6, ysize = 4, $
                      /scroll, /column, label = 'Thicknesses')

jb = widget_base(obase, /column, xpad = 1, ypad = 1, space = 1, /frame)

if (data(i).zopts.n_sty eq 0) then begin
    data(i).zopts.n_sty = 1
    data(i).zopts.style(0) = 0
end

c_style = graff_enter(jb, /int, /array, /track, uvalue = 'STYLE', $
                      /capture, value = $
                      data(i).zopts.style(0:data(i).zopts.n_sty-1), $
                      format = "(I0)", xsize = 6, ysize = 6, $
                      /scroll, /column, label = 'Styles')

junk = cw_bbselector(jb, ['Outline', 'Filled'], uvalue = 'FILL', $
                     set_value = data(i).zopts.fill, /track)

c_label = graff_enter(jb, /int, /track, uvalue = 'LABEL',  $
                      value = data(i).zopts.label, format = '(I0)', $
                      xsize = 6, ysize = 1, label = 'Label interval', $
                      /capture, /column)

msg = graff_enter(base, /display, /text, label = 'Operation:', xsize = $
                  40, ysize = 1)

obase = widget_base(base, /row, xpad = 1, ypad = 1, space = 1, uvalue $
                    = 'POP') 
junk = widget_button(obase, value = '     Cancel    ', uvalue = $
                     'CANCEL', /track)
junk = widget_button(obase, value = '      Do it     ', uvalue = 'DO', $
                     /track)

uv = { $
       Levels:c_levels,  $
       Nlevels:c_nlevels,  $
       Colour:c_colour,  $
       Thick:c_thick,  $
       Style:c_style, $ $
       label:c_label, $
       Msg:msg,  $
       zopts:data(i).zopts $
     }

widget_control, tlb, /real

widget_control, base, set_uvalue = uv, /no_copy, event_func = $
  'cont_event'

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

;	RYO widget management to allow us to get the values back from
;	the event handler without using a common block, even after the
;	hierarchy has been destroyed.

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

widget_control, base, get_uvalue = uv, /no_copy

widget_control, tlb, /destroy
if (ev.exited eq 1) then data(i).zopts = uv.zopts

widget_control, pdefs.ids.graffer, sensitive = 1

end