function save_data, data, descrip, str, $
	 index=index, base=base, howmany=howmany 
		 
;
;+ 
;   Name: save_data
;
;   Purpose: save data(images and text descriptions as widget user values.
;	     an index is maintained to allow queue type operation
;
;   Input Parameters:
;      data - data set to save
;
;      descrip - string descriptor - for SolarA, probably  -idx2list 
;                put - could be fileid and string indicating indices 
;      str - any other associated data - for SolarA, is probably
;             structure or array of structures defining data 
;
;   Original intent of three input arguments was to allow association
;    of 1, 2, or 3 data sets under a single index 
;   **** update to return structure 
;   Can be used for non-images (cubes, other things, etc)
;-
;
;
if not keyword_set(base) then begin		; start from scratch
   if not keyword_set(howmany) then howmany=10  ; size of queue 
   buttons=make_array(3,howmany,/long)		; three things can
						; be stored/index
;
   structure='{dummy, top:0L, label:0L, list:0L, butbase:0L' 	+ $
	   ',buttons:' + fmt_tag(size(buttons)) 		+ $ 
	   ',index:0L'						+ $
	   ',dsets:'   + fmt_tag(size(sindgen(howmany))) + '}'
;
   structure=make_str(structure)
; 
   base=widget_base(/column)
   desc_label=widget_label(base,value= $
	' Saved Data',/frame)
   label=widget_label(base, value=string(replicate(32b,40)))
   uv=strcompress('SD' + sindgen(howmany),/remove_all)
   desc_list=widget_list(base,value=uv)
   button_base=widget_base(base)
;  use button array for uvalues
   xmenu, structure.dsets, button_base, buttons=data_but,/row
   xmenu, structure.dsets, button_base, buttons=str_but,/row 
   xmenu, structure.dsets, button_base, buttons=desc_but,/row 
;
   uv=strcompress('SD' + sindgen(howmany))
;
;  initialize structure 
   structure.top=base
   structure.label=label
   structure.list=desc_list
   structure.butbase=button_base
   structure.buttons=[[data_but],[str_but],[desc_but]]
   structure.dsets=uv
   structure.index=-1				;queue pointer
;
   widget_control,set_uvalue=structure, base
   widget_control,base, /realize
   widget_control,button_base,sensitive=0,map=0 ; no events for these
   widget_control,base, map=0			; hide for now
   widget_control,structure.list,set_uvalue=uv
endif else widget_control, get_uvalue=structure, base 
;
; save data
;
; queue operation if index not explicitly stated
if n_elements(index) eq 0 then begin
   index=(structure.index+1) mod n_elements(structure.buttons(0,*))
   structure.index=index 
endif else $
	index=index mod n_elements(structure.buttons(0,*)) 
;
;
help,index
; store data
;
if n_params() lt 1 then data='no data'
if n_params() lt 2 then descrip=''
if n_params() lt 3 then str = ''
;
widget_control, set_uvalue=data    , structure.buttons(0,index) ;  
widget_control, set_uvalue=descrip , structure.buttons(1,index) ;  
widget_control, set_uvalue=str     , structure.buttons(2,index) ;  
;
widget_control, get_uvalue=list, structure.list	; update list widget
list(index)=descrip
widget_control, set_value=list, set_uvalue=list, structure.list
widget_control, set_uvalue=structure, base
;
return, base 
end
