;+
; Project     : SOHO - CDS     
;                   
; Name        : SEL_LINE_EVENT
;               
; Purpose     : Processes events from the SEL_LINE_MENU.
;               
; Explanation : Any events originating within the widgets realized by 
;               SEL_LINE_MENU are handled by this routine.
;               
; Use         : Only by XMANAGER
;    
; Inputs      : ev  -  the event structure
;               
; Opt. Inputs : None
;               
; Outputs     : None
;               
; Opt. Outputs: None
;               
; Keywords    : None
;
; Calls       : None
;               
; Restrictions: For use with SEL_LINE_MENU.
;               
; Side effects: None
;               
; Category    : Telemetry
;               
; Prev. Hist. : None
;
; Written     : C D Pike, RAL, 3-Apr-95
;               
; Modified    : Improve sorting by element.  CDP, 12-Apr-95
;               Limit number of lines to size of array given.  CDP, 9-Nov-95
;
; Version     : Version 3, 9-Nov-95
;-            

PRO sel_line_event, ev

;
;  COMMON blocks for widget id's
;
common tp_el, in_array, out_array, edid, butt, ll_desc
common tp_sell,sel_line_base, line_list_id, base_1, lls, line, nlls
common obs_spec, tp_obs
common general, info_line, info_base      

;
;  interpret ionization state
;
ions = ['?','I','II','III','IV','V','VI','VII','VIII','IX','X','XI','XII',$
        'XIII','XIV','XV','XVI','XVII','XVIII','XIX','XX','XXI','XXII',$
        'XXIII','XXIV','XXV','XXVI']

;
;  interpret type of event
;
type = TAG_NAMES(ev, /STRUCTURE)

;
;  could have been a BUTTON
;                    ======
;
IF (type EQ 'WIDGET_BUTTON') THEN BEGIN
   WIDGET_CONTROL, ev.id, GET_VALUE=value, get_uvalue=uvalue
 
;
;  OK request received, kill duplicates, sort by wavelength and exit
; 
   IF (value EQ 'OK') THEN BEGIN
      n = where(out_array(0,*) ne '')
      if n(0) ge 0 then begin
         no = (size(out_array))(2)
         temp = strarr(n_elements(n))
         for i=0,n_elements(n)-1 do begin
            tarr = out_array(*,i)
            temp(i) = arr2str(tarr)
         endfor
         nd = rem_dup(temp)
         if nd(0) ge 0 then begin
            temp=out_array
            out_array(*,*) = ''
            out_array(*,0:n_elements(nd)-1) = temp(*,nd)
         endif
      endif
;
;  sort by wavelength
;
      blank = where(out_array(3,*) eq '')
      if blank(0) ge 0 then out_array(3,blank) = '9999'
      s = sort(out_array(3,*))
      for i=0,4 do out_array(i,*)  = out_array(i,s)
      blank = where(out_array(3,*) eq '9999')
      if blank(0) ge 0 then out_array(3,blank) = ''
      widget_control, edid, set_value=out_array
      WIDGET_CONTROL, sel_line_base, /destroy
   ENDIF

;
;  CANCEL (ie exit and forget) request received
; 
   IF (value EQ 'Cancel') THEN BEGIN
      WIDGET_CONTROL, sel_line_base, /destroy
   ENDIF

;
;  RESET request received
; 
   IF (value EQ 'Reset') THEN BEGIN
      widget_control, edid, get_value=out_array
      n = where(out_array(0,*) ne '')
      if n(0) eq -1 then nlls = 0 else nlls = n_elements(n)
   ENDIF

;
;  SORT by wavelength request received
; 
   IF (value EQ 'Wavelength') THEN BEGIN
      n = sort(strmid(lls,10,20))
      lls = lls(n)
      widget_control,line_list_id,set_val=lls
   ENDIF

;
;  SORT by element request received
; 
   IF (value EQ 'Element') THEN BEGIN
      ion = strmid(lls,2,8)
      for i=0,n_elements(ion)-1 do begin
         temp = where(ions eq strtrim(ion(i),2))
         ion(i) = string(temp,form='(i2)') 
      endfor
      n = sort(strmid(lls,0,2)+ion+strmid(lls,10,8))
      lls = lls(n)
      nx = where(strmid(lls,0,2) eq '? ')
      if nx(0) ge 0 then begin
         nnx = where(strmid(lls,0,2) ne '? ')
         lls = [lls(nnx),lls(nx)]
      endif
      widget_control,line_list_id,set_val=lls
   ENDIF


ENDIF


;
;  or it was an INDEX input from the list itself
;               =====
;
if type eq 'WIDGET_LIST' then begin

   line = lls(ev.index)
   mline = n_elements(out_array)/5
   if nlls gt (mline-1) then begin
      bell
      widget_control, info_base, /show
      widget_control, info_line, /append,$
             set_val='Only '+string(mline,form='(i2)')+' lines allowed.'
   endif else begin
      out_array(0,nlls) = strtrim(strmid(line,0,10))
      out_array(1,nlls) = strtrim(strmid(line,10,20))
      out_array(2,nlls) = '1'
      if tp_obs.raster_p.detector eq 'N' then begin
         band = 'N'+string(which_nis_band(float(out_array(1,nlls))),form='(i1)')
      endif else begin
         band = 'G'+string(which_gis_band(float(out_array(1,nlls))),form='(i1)')
      endelse
      out_array(3,nlls) = wave2pix(band,out_array(1,nlls))
      out_array(4,nlls) = strmid(band,1,1)
      nlls = nlls + 1
   endelse
endif

END
