Viewing contents of file '../idllib/contrib/tappin/graffer/gr_ds_pulldown.pro'
;+
; GR_DS_PULLDOWN
;	Dataset selection pulldown
;
; Usage:
;	gr_ds_pulldown, base
;
; Argument:
;	base	long	input	The ID of the parent base.
;
; History:
;	Extracted from GRAFFER: 9/12/96; SJT
;	Move event handler here: 17/1/97; SJT
;	Reduce size by putting erase & delete under "Other": 27/1/97; SJT
;	Add mouse-editing default option: 13/8/97; SJT
;-

pro Gr_dss_event, event

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

idraw_flag = 1
ichange = 1b
track_flag = strpos(tag_names(event, /struct), 'TRACK') ne -1
nch = 1

if (track_flag) then begin
    idraw_flag = 0
    ichange = 0b
    
    if (event.enter eq 0) then begin
        graff_msg, pdefs.ids.hlptxt, ''
        goto, miss_case
    endif
endif

case event.value of
    'Other': graff_msg, pdefs.ids.hlptxt, 'More complex dataset ' + $
      'operations'
    
    'Other/Select...': if (track_flag) then $
      graff_msg, pdefs.ids.hlptxt, 'Select current data set' $
    else begin
        graff_ch_dset, pdefs
        ichange = 0b
        idraw_flag = 0
    end
    
    'Other/Merge...': if (track_flag) then $
      graff_msg, pdefs.ids.hlptxt, 'Merge two data sets' $
    else begin
        gr_app_w, pdefs
        nch = 15
    end
    
    'Other/Sort...': if (track_flag) then $
      graff_msg, pdefs.ids.hlptxt, 'Change the order of the data sets' $
    else begin
        graff_sort_dss, pdefs
        nch = 15
    end
    
    'Other/Write...': if (track_flag) then $
      graff_msg, pdefs.ids.hlptxt, 'Save current dataset to a file' $
    else begin
        dir = pdefs.ds_dir
        wname = strmid(pdefs.name, 0, rstrpos(pdefs.name, '.'))+ $
          string(pdefs.cset, format = "('_',I0,'.dat')")
        fc = graff_fname(pdefs.ids.graffer, wname, dir, $
                         pdefs.popflag)
        if (fc eq '') then graff_msg, pdefs.ids.message,  $
          'No save file specified' $
        else begin
            gr_write_ds, pdefs, dir+fc
            pdefs.ds_dir = dir
        endelse
        ichange = 0b
        idraw_flag = 0
    end

    
    'Next':if (track_flag) then $
      graff_msg, pdefs.ids.hlptxt, 'Make next data set current' $
    else begin
        pdefs.cset = (pdefs.cset+1) mod pdefs.nsets
        graff_set_vals, pdefs, /set_only
        ichange = 0b
        idraw_flag = 0
    end
    
    'Previous':if (track_flag) then $
      graff_msg, pdefs.ids.hlptxt, 'Make previous data set current' $
    else begin
        pdefs.cset = pdefs.cset-1
        if (pdefs.cset eq -1) then pdefs.cset = pdefs.nsets-1
        graff_set_vals, pdefs, /set_only
        ichange = 0b
        idraw_flag = 0
    end
    
    'New':if (track_flag) then $
      graff_msg, pdefs.ids.hlptxt,  $
      'Create a new data set and make it current' $
    else begin
        pdefs.cset = pdefs.nsets
        pdefs.nsets = pdefs.nsets+1
        handle_value, pdefs.data, data, /no_copy
        data = [data, {graff_data, $
                       Ndata:    0l, $
                       Ndata2:   0l, $ ; ONly used in 2D Dss
                       Type:     0, $
                       Mode:     0, $
                       Xydata:   handle_create(), $
                       Descript: "", $
                       Pline:    1, $
                       Psym:     0, $
                       Symsize:  1., $
                       Line:     0, $
                       Colour:   1, $
                       Thick:    1, $
                       Zopts:    {graff_2d, $
                                  Format:    0, $
                                  N_levels:  -6, $
                                  Levels:    fltarr(30), $
                                  N_cols:    1, $
                                  Colours:   intarr(30)+1, $
                                  N_sty:     1, $
                                  Style:     intarr(30), $
                                  N_thick:   1, $
                                  Thick:     intarr(30)+1, $
                                  Range:     fltarr(2), $
                                  Pxsize:    0.5, $
                                  Label:     0, $
                                  Fill:      0b}, $
                       Sort:     0b, $
                       Noclip:   0b,  $
                       Medit:    pdefs.opts.mouse}]
        
        handle_value, data(pdefs.cset).xydata, fltarr(2, 2), /set
        
        handle_value, pdefs.data, data, /no_copy, /set
        
        graff_set_vals, pdefs, /set_only
        ichange = 0b
        idraw_flag = 0
    end
    
    'Other/Erase': if (track_flag) then $
      graff_msg, pdefs.ids.hlptxt, 'Erase the values in the current ' + $
      'data set' $
    else begin
        handle_value, pdefs.data, data, /no_copy
        
        data(pdefs.cset).ndata = 0
        data(pdefs.cset).type = 0
        handle_value, data(pdefs.cset).xydata, fltarr(2, 2), /set
        
        handle_value, pdefs.data, data, /no_copy, /set
    end
    
    'Other/Delete': if (track_flag) then $
      graff_msg, pdefs.ids.hlptxt, 'Delete the current data set' $
    else graff_dsdel, pdefs
endcase

if (ichange) then begin
    handle_value, pdefs.data, data, /no_copy
    if (data(pdefs.cset).type eq 9 or $
        data(pdefs.cset).type eq -4) then begin
        widget_control, pdefs.ids.plopts(0), map = 0
        widget_control, pdefs.ids.plopts(1), map = 1
    endif else begin
        widget_control, pdefs.ids.plopts(1), map = 0     
        widget_control, pdefs.ids.plopts(0), map = 1     
    endelse
    handle_value, pdefs.data, data, /no_copy, /set
endif

if (idraw_flag and (pdefs.opts.update eq 0)) then gr_plot_object, pdefs
if (ichange) then begin
    pdefs.chflag = 1b
    pdefs.transient.changes = pdefs.transient.changes+nch
    if (pdefs.transient.changes gt 20) then begin
        gr_bin_save, pdefs, /auto
        if (pdefs.opts.update eq 1) then gr_plot_object, pdefs
    endif
endif
widget_control, pdefs.ids.chtick, map = pdefs.chflag

Miss_case:

widget_control, base, set_uvalue = pdefs, /no_copy

end


pro Gr_ds_pulldown, base

dsops = [{cw_pdmenu_s, 0, 'Next'}, $
         {cw_pdmenu_s, 0, 'Previous'}, $
         {cw_pdmenu_s, 0, 'New'}, $
         {cw_pdmenu_s, 3, 'Other'}, $
         {cw_pdmenu_s, 0, 'Select...'}, $
         {cw_pdmenu_s, 0, 'Merge...'},  $
         {cw_pdmenu_s, 0, 'Sort...'},  $
         {cw_pdmenu_s, 0, 'Erase'}, $
         {cw_pdmenu_s, 0, 'Delete'}, $
         {cw_pdmenu_s, 2, 'Write...'}]

jb = widget_base(base, /row, xpad = 1, ypad = 1, space = 1, event_pro = $
                 'gr_dss_event', /align_center) 
junk = cw_pdtmenu(jb, dsops, uvalue = 'DSOPS', /track, $
                  /return_full_name, delimiter = '/', /row)

end