; save as postscript file
pro xsynspec_ps,event
  thisfile=dialog_pickfile(/write,file='synspec.ps')
  if thisfile eq '' then return
  widget_control,event.top,get_uvalue=info
;  keywords=pswindow()
  thisdevice=!d.name
  set_plot,'ps',/copy
  device,file=thisfile,_extra=keywords,/inches,bits_per_pixel=8,/color
  pseudoevent={widget_button,id:(*info).action, $
    top:event.top, handler:0l, select:1}
  widget_control,event.top,set_uvalue=info
  xsynspec_draw,pseudoevent
  device,/close_file
  set_plot,thisdevice
end

; save as jpeg file
pro xsynspec_jpeg,event
  thisfile=dialog_pickfile(/write,file='synspec.jpg')
  if thisfile eq '' then return
  widget_control,event.top,get_uvalue=info
  wset,(*info).wid
  snapshot=tvrd()
  tvlct,r,g,b,/get
  s=size(snapshot)
  image24=bytarr(3,s[1],s[2])
  image24(0,*,*)=r(snapshot)
  image24(1,*,*)=g(snapshot)
  image24(2,*,*)=b(snapshot)
  write_jpeg,thisfile,image24,true=1,quality=75
end

pro xsynspec_startslider, event
  widget_control, event.top,get_uvalue=info
  (*info).start=event.value
  pseudoevent={widget_button,id:(*info).action, $
    top:event.top, handler:0l, select:1}
  widget_control,event.top,set_uvalue=info
  xsynspec_draw,pseudoevent
end

pro xsynspec_stopslider, event
  widget_control, event.top,get_uvalue=info
  (*info).stop=event.value
  pseudoevent={widget_button,id:(*info).action, $
    top:event.top, handler:0l, select:1}
  widget_control,event.top,set_uvalue=info
  xsynspec_draw,pseudoevent
end

pro xsynspec_yminslider, event
  widget_control, event.top,get_uvalue=info
  (*info).ymin=event.value
  pseudoevent={widget_button,id:(*info).action, $
    top:event.top, handler:0l, select:1}
  widget_control,event.top,set_uvalue=info
  xsynspec_draw,pseudoevent
end

pro xsynspec_ymaxslider, event
  widget_control, event.top,get_uvalue=info
  (*info).ymax=event.value
  pseudoevent={widget_button,id:(*info).action, $
    top:event.top, handler:0l, select:1}
  widget_control,event.top,set_uvalue=info
  xsynspec_draw,pseudoevent
end

pro xsynspec_psym, event
  widget_control, event.top, get_uvalue = info
  (*info).psym=event.select
  pseudoevent={widget_button,id:(*info).action, $
    top:event.top, handler:0l, select:1}
  widget_control,event.top,set_uvalue=info
  xsynspec_draw,pseudoevent
end

; set automatic y-scale or not
pro xsynspec_yauto, event
  widget_control, event.top, get_uvalue = info
  (*info).yauto=event.select
  if (*info).yauto eq 1 then begin
    widget_control, (*info).yminslider, sensitive = 0
    widget_control, (*info).ymaxslider, sensitive = 0
  endif else begin
    widget_control, (*info).yminslider, sensitive = 1
    widget_control, (*info).ymaxslider, sensitive = 1
  endelse

  pseudoevent={widget_button,id:(*info).action, $
    top:event.top, handler:0l, select:1}
  widget_control,event.top,set_uvalue=info
  xsynspec_draw,pseudoevent
end

function xsynspec_drawcontrol, event
  widget_control, event.top, get_uvalue = info
  widget_control, (*info).drawbuttons, get_value = button_set
  (*info).drawcontrol = button_set

  pseudoevent={widget_button,id:(*info).action, $
    top:event.top, handler:0l, select:1}
  widget_control,event.top,set_uvalue=info
  xsynspec_draw,pseudoevent
  return,0
end
  
pro xsynspec_draw, event
  widget_control, event.top, get_uvalue = info
  xtitle = (*info).xtitle
  ytitle = (*info).ytitle
  xscale = (*info).xscale
  if (*info).psym eq 1 then psym = -2 else psym = 0
  if (*info).stop le (*info).start then begin
    message_text = $
      'Xrange: Stop value less than start. Setting Xstop to Xstart + 2'
    (*info).stop = (*info).start+2
    ok = dialog_message(message_text, dialog_parent = (*info).tlb)
    widget_control, (*info).stopslider, set_value = (*info).stop
  endif
  erase
  if (*info).yauto eq 1 then begin
    if(*info).drawcontrol[0] then begin
      plot, xscale, (*info).eis_spec, $
            xrange = [(*info).start, (*info).stop], $
            xtitle = xtitle, ytitle = ytitle, xstyle = 1, psym = psym, $
            title = (*info).title, /yn
      if (*info).drawcontrol[2] then oplot, (*info).syn_lam, (*info).syn_spec, linestyle = 2, psym = psym
    endif else begin
      if(*info).drawcontrol[2] then plot, xscale, (*info).syn_spec, $
            xrange = [(*info).start, (*info).stop], $
            xtitle = xtitle, ytitle = ytitle, xstyle = 1, psym = psym, $
            title = (*info).title, /yn
    endelse   
  endif else begin
    if (*info).drawcontrol[0] then begin
      plot, xscale, (*info).eis_spec, $
           xrange = [(*info).start, (*info).stop], $
           yrange = [(*info).ymin, (*info).ymax], $
           xtitle = xtitle, ytitle = ytitle, xstyle = 1, psym = psym, $
           title = (*info).title
    if (*info).drawcontrol[2] then oplot, (*info).syn_lam, (*info).syn_spec, linestyle = 2, psym = psym
    endif else begin
      if(*info).drawcontrol[2] then plot, xscale, (*info).syn_spec, $
        xrange = [(*info).start, (*info).stop], $
        xtitle = xtitle, ytitle = ytitle, xstyle = 1, psym = psym, $
        title = (*info).title
    endelse
  endelse

; now control Chianti Line ID:
  if (*info).drawcontrol[3] then begin
    id = *(*info).syn_lineid
    nlines = n_elements(id.peak)

; take out Line IDs of lines stronger than 10% ofthe strongest line:
  imax = max (id.peak)/10.
    for i=0,nlines-1 do begin 
      if id.peak[i] gt imax then begin
      if id.wvl[i] gt (*info).start and id.wvl[i] lt (*info).stop then $
        xyouts, id.wvl[i],(*info).ymax/1.2, id.snote[i]+' '+strtrim(string(id.wvl[i]),2),orientation=90
     endif
    endfor
  endif

end

;resize main window
pro xsynspec_resize, event
  widget_control, event.top ,get_uvalue = info
  (*info).d_xsz = event.x  > 0
  (*info).d_ysz = event.y - (*info).menu_ysz
  widget_control, (*info).drawid, draw_xsize = (*info).d_xsz, $
                   draw_ysize = (*info).d_ysz, xsize = (*info).d_xsz, $
                   ysize = (*info).d_ysz
  pseudoevent={widget_button,id:(*info).action, $
    top:event.top,handler:0l,select:1}
  widget_control,(*info).action,send_event=pseudoevent
;  widget_control, pseudoevent
end

pro xsynspec_destroy, event
    widget_control, event.top, /destroy
end

pro xsynspec_cleanup, tlb
  widget_control, tlb, get_uvalue = info
  ptr_free, info
end

pro xsynspec, data, det = det, emm = emm, xscale = xscale, $
               xtitle = xtitle, ytitle = ytitle, title = title, $
              groupl = groupl, $
              widget_xsz = widget_xsz, widget_ysz = widget_ysz
  if n_elements(xtitle) eq 0 then xtitle=string("305B)+'ngstr'+string("370B)+'m'
  if n_elements(ytitle) eq 0 then ytitle='intensity'
  if n_elements(title) eq 0 then title = 'EIS vs Chianti spectrum'

; create wavelength scale, EIS spectrum and synthetic spectrum
  lambda_struct = data->getlambda(lamtype = 'wav')
  nwin = data->getnwin()
  nexp = data->getnexp()
  nslit = (data->getyw())[0]
  if det eq 'A' then begin 
    eis_lam = lambda_struct.scale_a
    eis_spec = uintarr(n_elements(eis_lam))*0.
    for i= 0, nwin - 1 do begin
      data-> getwin, i, wd, pos
      exp=(intarr(pos[1])+1)#data->getexp()
      if pos[0] gt 2147 then begin
        mspec = total(wd, 2)
        mspec = total(mspec,2)/exp/nexp/nslit
        pos[0] = pos[0] - 2148 ; AG 30/4/09 Fixed 1 pixel shift error.
        eis_spec[pos[0]:pos[0]+pos[1]-1] = mspec
      endif
    endfor
    if emm eq 'QS' then synobj = obj_new('eis_synspec','a', 'qs')
    if emm eq 'AR' then synobj = obj_new('eis_synspec','a', 'ar')
    if emm eq 'FL' then synobj = obj_new('eis_synspec','a', 'fl')
  endif
  if det eq 'B' then begin
    eis_lam = lambda_struct.scale_b
    eis_spec = uintarr(n_elements(eis_lam))*0.
    for i= 0, nwin - 1 do begin
      data-> getwin, i, wd, pos
      exp=(intarr(pos[1])+1)#data->getexp()
      if pos[0] le 2147 then begin
        mspec = total(wd, 2)
        mspec = total(mspec,2)/exp/nexp/nslit
        eis_spec[pos[0]:pos[0]+pos[1]-1] = mspec
      endif
    endfor 
   if emm eq 'QS' then synobj = obj_new('eis_synspec','b', 'qs')
   if emm eq 'AR' then synobj = obj_new('eis_synspec','b', 'ar')
   if emm eq 'FL' then synobj = obj_new('eis_synspec','b', 'fl')
  endif
  ; read synthetic spectrum:
;  synobj-> getinfo, syn_lam, syn_spec, id = syn_lineid
  synobj-> getphotons,syn_lam,syn_phot,syn_spec,id=syn_lineid

  xscale = eis_lam
 
  if n_elements(widget_xsz) eq 0 then d_xsz = 600 else $
    d_xsz = widget_xsz
  if n_elements(widget_ysz) eq 0 then d_ysz = 500 else $
    d_ysz = widget_ysz

  tlb = widget_base(title = 'EIS vs Synthetic spectrum', mbar = menubar, $
                    tlb_size_events = 1, $
                          group_leader = groupl,/row)
  lcol = widget_base(tlb, /frame, /column)
  rcol = widget_base(tlb, /column)

  displaybase = widget_base(rcol, /row)

  xmin = min(eis_lam)
  xmax = max(eis_lam) > (xmin+1.)
  ymin = (min(eis_spec)) < fix(min(syn_spec))
 ; ymax = (max(eis_spec)) > fix(max(syn_spec))
  ymax = max(eis_spec)
  ymax2 = max (syn_spec)
  syn_spec = syn_spec*ymax/ymax2  ; normalize synthetic spectrum until we have 
                                  ; calbriated EIS data in physical  

  drawid=widget_draw(displaybase, retain = 2, xsize = d_xsz, ysize = d_ysz, $
                     /button_events, event_pro = 'xsynspec_draw')

  filemenu=widget_button(menubar, value='File',/menu, uvalue='file')
  savemenu=widget_button(filemenu, value='Save as', /menu)
  psmenu=widget_button(savemenu, value='Postscript', event_pro = 'xsynspec_ps')
  jpgmenu=widget_button(savemenu, value='JPG', event_pro = 'xsynspec_jpeg')

  exitmenu=widget_button(filemenu, value='Close', event_pro='xsynspec_destroy')

  starttitle = 'Start [Wavelength]'
  stoptitle = 'Stop [Wavelength]'
  ymintitle = 'Set Yaxis min'
  ymaxtitle = 'Set Yaxis max'

  startslider = widget_slider(lcol, xsize=120, $
                          minimum=xmin, maximum=xmax, $
                          title=starttitle, $
                          value=xmin, event_pro = 'xsynspec_startslider', /drag)
  stopslider = widget_slider(lcol, xsize=120, $
                          minimum=xmin, maximum=xmax, $
                          title=stoptitle, $
                          value=xmax, $
                          event_pro = 'xsynspec_stopslider', /drag)

  yminslider = widget_slider(lcol, xsize=120, $
                          minimum=ymin, maximum=ymax, $
                          title=ymintitle, $
                          value=ymin, /sensitive,$
                          event_pro = 'xsynspec_yminslider', /drag)

  ymaxslider = widget_slider(lcol, xsize=120, $
                          minimum=ymin, maximum=ymax, $
                          title=ymaxtitle, $
                          value=ymax, /sensitive, $
                          event_pro = 'xsynspec_ymaxslider', /drag)

  ; buttons for controlling plot and line_ids
  drawcontrol = widget_base(lcol, /column, /frame)
  bnames = ['EIS Spectrum', 'EIS Line ID', 'Chianti Spectrum', 'Chianti Line ID']
  drawbuttons = cw_bgroup(drawcontrol, bnames, row = 2, /nonexclusive, $
                          /return_index, event_func = 'xsynspec_drawcontrol')

  ; button for switching psym-plot on/off:
  psymbase = widget_base(lcol, /column, /nonexclusive)
  psymbutton = widget_button(psymbase, value='Mark each data point', $
                              event_pro = 'xsynspec_psym')
  yautobutton = widget_button(psymbase, value='Automatic y-scale', $
                              event_pro = 'xsynspec_yauto')

  closefield = widget_base(lcol,/column)
  closebutton = widget_button(closefield, value = 'Close', $
                              event_pro = 'xsynspec_destroy')

    ; realize main window:
  widget_control, tlb, /realize, tlb_get_size = tlb_sz

  ; get window id of display window
  widget_control, drawid, get_value = wid
  wset, wid

  ; set drawcontrol default:
  drawcontrol = [1, 0, 1, 0]
  ; set automatic y-scaling as default:
  widget_control, yautobutton, set_button=1
  tlb_xsz = tlb_sz[0]  ; xsize of whole widget in pixels
  tlb_ysz = tlb_sz[1]  ; ysize of whole widget in pixels
  menu_ysz = tlb_ysz - d_ysz

  ; define the info structure, used send information around
  info = {eis_spec:eis_spec, $
          eis_lam:eis_lam, $
          syn_spec:syn_spec, $
          syn_lam:syn_lam, $
          syn_lineid:ptr_new(syn_lineid), $
          drawcontrol:drawcontrol, $
          tlb:tlb, $
          drawid:drawid, $
          drawbuttons:drawbuttons, $
          d_xsz:d_xsz           ,$
          d_ysz:d_ysz           ,$
          tlb_xsz:tlb_xsz       ,$
          tlb_ysz:tlb_ysz       ,$
          menu_ysz:menu_ysz     ,$
          action:drawid, $
          wid:wid, $
          cpos:0, $
          start:xmin, $
          stop:xmax, $
          ymin:ymin, $
          ymax:ymax, $
          psym:0, $
          yauto:1, $
          stopslider:stopslider, $
          yminslider:yminslider, $
          ymaxslider:ymaxslider, $
          xscale:xscale, $
          xtitle:xtitle, $
          ytitle:ytitle, $
          title:title}
  info = ptr_new(info, /no_copy)

; set automatic y-scaling as default:
  widget_control, yautobutton, set_button=1
  widget_control, yminslider, sensitive=0
  widget_control, ymaxslider, sensitive=0
  ; set user value of tlb widget to be the info ptr
  widget_control, tlb, set_uvalue = info
  ; create pseudoevent and send this event to xdisplay_draw,
  ; in order to draw the image
  ; set drawcontrol default:
  widget_control, drawbuttons, set_value = drawcontrol
  pseudoevent={widget_button,id:(*info).action, $
               top:tlb, handler:0l, select:1}
  widget_control, (*info).action, send_event = pseudoevent

  xmanager, 'xsynspec', tlb, /no_block, group_leader = groupl, event_handler = 'xsynspec_resize', cleanup = 'xsynspec_cleanup'
end




