Viewing contents of file '../idllib/contrib/tappin/graffer/graff_sort_dss.pro'
;+
; GRAFF_SORT_DSS
;	Change data set
;
; Usage:
;	graff_sort_dss, pdefs
;
; Argument:
;	pdefs	struct	in/out	The plot definition structure.
;
; History:
;	Original (after graff_ch_dset): 6/12/96; SJT
;-

function Grf_sort_event, event

base = widget_info(event.top, /child)
widget_control, base, get_uvalue = uv, /no_copy
widget_control, event.id, get_uvalue = but

iexit = 0
case (but) of
    'POP': begin
        widget_control, event.top, /show
        widget_control, event.id, timer = 2.0
    end
    
    'CHOOSE': begin
        handle_value, uv.list, indlist
        if (uv.moving eq -1) then begin
            uv.moving = indlist(event.index)
            if (event.index eq 0) then indlist = indlist(1:*) $
            else if (event.index eq n_elements(indlist)-1) then $
              indlist = indlist(0:n_elements(indlist)-2) $
            else indlist = [indlist(0:event.index-1), $
                            indlist(event.index+1:*)]
            widget_control, event.id, set_value = ['<start>', $
                                                   uv.dlist(indlist)]
            widget_control, uv.label, set_value = 'Place it after'
        endif else begin
            if (event.index eq 0) then indlist = [uv.moving, indlist] $
            else if (event.index eq n_elements(indlist)) then $
              indlist = [indlist, uv.moving] $
              else indlist = [indlist(0:event.index-1), uv.moving, $
                              indlist(event.index:*)]
            uv.moving = -1
            widget_control, event.id, set_value = [uv.dlist(indlist)]
            widget_control, uv.label, set_value = 'Data set to move'
        endelse
        handle_value, uv.list, indlist, /set
    end
    
    'DO': iexit = 1
    
    'DONT': iexit = -1
end

widget_control, base, set_uvalue = uv, /no_copy

return, {id:event.handler, top:event.top, handler:event.handler, $
         Exit:iexit}
end

pro Graff_sort_dss, pdefs

handle_value, pdefs.data, data, /no_copy

tc = ['F(XY)', 'PF', 'F(Y)', 'F(X)', 'XY', 'XYE', 'XYEE', 'XYF', 'XYFF', $
      'XYFE', 'XYFEE', 'XYFFE', 'XYFFEE', 'Z']

dlist = data.descript

indlist = indgen(n_elements(dlist))
nlist = string(indlist+1, format = "(I3,')')")

llist = string([data.ndata, 0], format = "(' <',I0,'> ')")
lll = max(strlen(llist))
fmt = "(A"+string(lll, format = "(I0)")+")"
llist = string(llist, format = fmt)
nlist = nlist+llist
nlist = nlist+string(tc(data.type+4), format = "(A6, ' - ')")

dlist = nlist+dlist

widget_control, pdefs.ids.graffer, sensitive = 0

tlb = widget_base(title = 'Graffer data set sort', group = $
                  pdefs.ids.graffer, resource = 'Graffer')
base = widget_base(tlb, /column)

curr = widget_label(base, value = 'Data set to move', uvalue = 'POP')
junk = widget_list(base, value = dlist, uvalue = 'CHOOSE',  $
                   ysize = (12 < n_elements(dlist)))

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

uv = {dlist:dlist, $
      Label: curr, $
      List:handle_create(), $
      Moving: -1}
handle_value, uv.list, indlist, /set

widget_control, base, set_uvalue = uv, $
  event_func = 'grf_sort_event'

widget_control, tlb, /real
if (pdefs.popflag) then widget_control, curr, timer = 2.

;			DIY widget management here

repeat ev = widget_event(base) until ev.exit ne 0

widget_control, base, get_uvalue = uv, /no_copy
widget_control, tlb, /destroy
widget_control, pdefs.ids.graffer, sensitive = 1

if (ev.exit eq -1) then begin
    handle_value, pdefs.data, data, /no_copy, /set
    return
endif

handle_value, uv.list, indlist
handle_value, pdefs.key.list, list, /no_copy

data = data(indlist)
if (n_elements(list) ne 0) then begin
    ikey = bytarr(n_elements(data))
    ikey(list) = 1b
    ikey = ikey(indlist)
    list = where(ikey)
    handle_value, pdefs.key.list, list, /no_copy, /set
endif

loc = where(indlist eq pdefs.cset)
pdefs.cset = loc(0)
    
handle_value, pdefs.data, data, /no_copy, /set

graff_set_vals, pdefs, /set_only

handle_free, uv.list

end