Viewing contents of file '../idllib/contrib/tappin/graffer/gr_key_def.pro'
;+
; GR_KEY_DEF
;	Define the plotting of a key on the plot.
;
; Usage:
;	ichange = gr_key_def(pdefs)
;
; Return value:
;	ichange	byte	Flag indicating if change has been made
;
; Argument:
;	pdefs	struct	in/out	The GRAFFER universal structure
;
; History:
;	Original: 30/1/97; SJT
;	Changed to be function returning change flag: 30/1/97; SJT
;	Add CAPTURE key to entry boxes: 6/2/97; SJT
;	Modify to include "single point" format: 15/5/97; SJT
;-

function Gr_key_event, event

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

iexit = 0

case but of
    'CANCEL': iexit = -1
    
    'DO': begin                 ; Retrieve values 
        handle_value, uv.key.list, list, /no_copy ; get rid of the old
                                ; one
        handle_value, uv.ds1, ds1, /no_copy
        widget_control, uv.listid, get_value = iuse
        locs = where(iuse, nuse)
        if (nuse ne 0) then  handle_value, uv.key.list, ds1(locs), $
          /no_copy, /set
        iexit = 1
    end
    
    'X0': begin
        uv.key.x(0) = event.value
        if (event.cr) then grf_focus_enter, uv.yid0
    end
    
    'Y0': begin
        uv.key.y(0) = event.value
        if (event.cr) then grf_focus_enter, uv.xid1
    end
    
    'X1': begin
        uv.key.x(1) = event.value
        if (event.cr) then grf_focus_enter, uv.yid1
    end
    
    'Y1': begin
        uv.key.y(1) = event.value
        if (event.cr) then grf_focus_enter, uv.cid
    end
    
    'COL': begin
        uv.key.cols = event.value
        if (event.cr) then grf_focus_enter, uv.tid
    end
    
    'TITLE': begin
        uv.key.title = event.value
        if (event.cr) then grf_focus_enter, uv.xid0
    end
    
    'USE': uv.key.use = event.value
    'CSYS': begin
        cn = uv.key.norm 
        uv.key.norm = event.value
        
        case event.value of
            0: case cn of
                0: dmy = [uv.key.x, uv.key.y]
                1: dmy = transpose(convert_coord(uv.key.x, uv.key.y, $
                                                 /to_data, /norm))
                2: begin
                    gr_fra2norm, uv.key.x, uv.key.y, xn, yn
                    dmy = transpose(convert_coord(xn, yn, /to_data, $
                                                  /norm))
                end
            endcase
            1: case cn of
                0: dmy = transpose(convert_coord(uv.key.x, uv.key.y, $
                                                 /data, /to_norm))
                1: dmy = [uv.key.x, uv.key.y]
                2: begin
                    gr_fra2norm, uv.key.x, uv.key.y, xn, yn
                    dmy = [xn, yn]
                end
            endcase
            2: case cn of
                0: begin
                    dmy = transpose(convert_coord(uv.key.x, uv.key.y, $
                                                  /data, /to_norm))
                    gr_fra2norm, dmy(0:1), dmy(2:3), xf, yf, /invert
                    dmy = [xf, yf]
                end
                1: begin
                    gr_fra2norm, uv.key.x, uv.key.y, xf, yf, /invert
                    dmy = [xf, yf]
                end
                2: dmy = [uv.key.x, uv.key.y]
            endcase
        endcase
        
        uv.key.x = dmy(0:1)
        uv.key.y = dmy(2:3)
        widget_control, uv.xid0, set_value = uv.key.x(0)
        widget_control, uv.xid1, set_value = uv.key.x(1)
        widget_control, uv.yid0, set_value = uv.key.y(0)
        widget_control, uv.yid1, set_value = uv.key.y(1)
    end
    
    'FRAME': uv.key.frame = event.value
    'POINT': uv.key.one_point = event.value
    
    'ALL': begin
        widget_control, uv.listid, get_value = iuse
        iuse(*) = 1
        widget_control, uv.listid, set_value = iuse
    end
    
    'PICK':                     ; Ignore it's easier to use GET_VALUE
endcase

widget_control, uv.allid, sensitive = uv.key.use
widget_control, event.handler, set_uvalue = uv, /no_copy

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

end

function Gr_key_def, pdefs

widget_control, pdefs.ids.graffer, sensitive = 0

bub = { $
        Key: pdefs.key, $
        Allid:  0l, $
        Xid0:   0l,  $
        Yid0:   0l,  $
        Xid1:   0l,  $
        Yid1:   0l, $
        Cid:    0l, $
        tid:    0l, $
        Listid: 0l,  $
        Ds1:    handle_create()}
        
tlb = widget_base(title = 'Graffer Key Define', group_leader = $
                  pdefs.ids.graffer, resource = 'Graffer')

base = widget_base(tlb, /column)

junk = cw_bbselector(base, ['No', 'Yes'], label_left = 'Draw a key on ' + $
                     'the plot?:', uvalue = 'USE', set_value = $
                     pdefs.key.use)

bub.allid = widget_base(base, /row)
jb = widget_base(bub.allid, /column)

junk = cw_bbselector(jb, ['Data', 'Normal', '"Frame"'], label_left = $
                     'Coordinate system:', uvalue = 'CSYS', set_value $
                     = pdefs.key.norm)

jjb = widget_base(jb, /row)
bub.xid0 = graff_enter(jjb, /float, xsize = 11, /all_event, label = $
                       'Lower left: X:', value = pdefs.key.x(0), $
                       uvalue = 'X0', /capture)
bub.yid0 = graff_enter(jjb, /float, xsize = 11, /all_event, label = $
                       'Y:', value = pdefs.key.y(0), uvalue = 'Y0', $
                       /capture)

jjb = widget_base(jb, /row)
bub.xid1 = graff_enter(jjb, /float, xsize = 11, /all_event, label = $
                       'Upper right: X:', value = pdefs.key.x(1), $
                       uvalue = 'X1', /capture)
bub.yid1 = graff_enter(jjb, /float, xsize = 11, /all_event, label = $
                       'Y:', value = pdefs.key.y(1), uvalue = 'Y1', $
                       /capture)

jjb = widget_base(jb, /row)
bub.cid = graff_enter(jjb, /int, xsize = 3, /all_event, label = $
                      'How many columns?: ', value = pdefs.key.cols, $
                      uvalue = 'COL', /capture)
junk = cw_bbselector(jjb, ['2', '1'], label_left = 'Plot 1 or 2 ' + $
                     'points', uvalue = 'POINT', set_value = $
                     pdefs.key.one_point)

junk = cw_bbselector(jb, ['No', 'Yes'], label_left = 'Draw a frame ' + $
                     'round the key?:', uvalue = 'FRAME', set_value = $
                     pdefs.key.frame)

bub.tid = graff_enter(jb, value = pdefs.key.title, /text, /all_event, $
                      label = 'Key title:', xsize = 20, uvalue = $
                      'TITLE', /capture)

handle_value, pdefs.data, data, /no_copy
handle_value, pdefs.key.list, list, /no_copy

ku = bytarr(n_elements(data))
if (n_elements(list) ne 0) then ku(list) = 1
ds1 = where(data.type ge -3 and data.type lt 8, n1d)

jb = widget_base(bub.allid, /column)

junk = widget_label(jb, value = 'Datasets to include')

bub.listid = cw_bgroup(jb, data(ds1).descript, column = ceil(n1d/10.), $
                       /nonexclusive, uvalue = 'PICK', set_value = $
                       ku(ds1), ids = buts)
handle_value, bub.ds1, ds1, /set, /no_copy

junk = widget_button(jb, value = 'All', uvalue = 'ALL')

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

jb = widget_base(base, /row, uvalue = 'POP')
junk = widget_button(jb, value = '   Cancel   ', uvalue = 'CANCEL')
junk = widget_button(jb, value = '    Do it    ', uvalue = 'DO')

widget_control, bub.allid, sensitive = pdefs.key.use

widget_control, tlb, /real
widget_control, base, set_uvalue = bub, event_func = 'gr_key_event', $
  /no_copy

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

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

widget_control, base, get_uvalue = uv, /no_copy
widget_control, tlb, /destroy

widget_control, pdefs.ids.graffer, sensitive = 1

if (ev.exited eq 1) then pdefs.key = uv.key

return, ev.exited eq 1

end