Viewing contents of file '../idllib/contrib/tappin/graffer/gr_append.pro'
pro Gr_append, pdefs, n1, n2, delete=delete, sort=sort

;+
; GR_APPEND
;	Append one dataset to another optionally deleting the appended
;	dataset.
;
; Usage:
;	gr_append, pdefs, n1, n2[, /delete, /sort]
;
; Arguments:
;	pdefs	struct	in/out	The GRAFFER data structure.
;	n1	int	input	The index number of the appendee.
;	n2	int	input	The index number of the dataset to be
;				appended.
;
; Keywords:
;	delete	??	input	If set and non-zero, then delete the
;				dataset that was appended.
;	sort	??	input	If set and non-zero, then sort the
;				X-axis of the combined dataset.
;
; History:
;	Original: 11/11/96; SJT
;-

handle_value, pdefs.data, data, /no_copy

if (data(n2).ndata eq 0) then begin
    graff_msg, pdefs.ids.message,  $
      ["Merge datasets failed:",  $
       "No data in dataset being appended"]
endif else if (data(n1).type ne data(n2).type and data(n2).ndata gt 0) $
  then begin
    graff_msg, pdefs.ids.message,  $
      ["Merge datasets failed:",  $
       "Datasets not of same type."]
endif else if (data(n1).mode ne data(n2).mode and data(n2).ndata gt 0) $
  then begin
    graff_msg, pdefs.ids.message,  $
      ["Merge datasets failed:",  $
       "Coordinate systems different."]
endif else if (data(n2).type lt 0) then begin
    graff_msg, pdefs.ids.message,  $
      ["Merge datasets failed:",  $
       "Cannot merge functions."]
endif else if (data(n2).type ge 8) then begin
    graff_msg, pdefs.ids.message,  $
      ["Merge datasets failed:",  $
       "Cannot merge surface datasets."]
endif else begin
    handle_value, data(n1).xydata, xy1, /no_copy
    handle_value, data(n2).xydata, xy2, /no_copy
    
    if (data(n1).ndata eq 0) then begin
        xy1 = xy2
        data(n1).type = data(n2).type
        data(n1).mode = data(n2).mode
    endif else xy1 = [[xy1(*, 0:data(n1).ndata-1)], $
                      [xy2(*, 0:data(n2).ndata-1)]]
    
    if (keyword_set(sort)) then begin
        idx = sort(xy1(0, *))
        xy1 = xy1(*, idx)
    endif
    handle_value, data(n1).xydata, xy1, /no_copy, /set
    
    data(n1).ndata = data(n1).ndata + data(n2).ndata
    
    if (keyword_set(delete)) then begin
        if (n2 eq 0) then begin
            data = data(1:*)
        endif else if (n2 eq pdefs.nsets-1) then begin
            data = data(0:n2-1)
        endif else begin
            data = [data(0:N2-1), data(N2+1:*)]
        endelse
        pdefs.nsets = pdefs.nsets-1
        if (pdefs.cset eq n2) then begin
            pdefs.cset = n1-(n2 lt n1)
;;            widget_control, pdefs.ids.cset, set_value = n1
        endif else if (pdefs.cset gt n2) then pdefs.cset = pdefs.cset-1
    endif else handle_value, data(n2).xydata, xy2, /no_copy, /set
    
endelse

handle_value, pdefs.data, data, /no_copy, /set
graff_set_vals, pdefs, /set_only

end