; save as postscript file
pro xpixplot_ps,event
  thisfile=dialog_pickfile(/write,file='pixelplot.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
  xpixplot_draw,pseudoevent
  device,/close_file
  set_plot,thisdevice
end

; save as jpeg file
pro xpixplot_jpeg,event
  thisfile=dialog_pickfile(/write,file='pixelplot.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 xpixplot_colslider, event
  widget_control, event.top,get_uvalue=info
  (*info).cpos=event.value
  pseudoevent={widget_button,id:(*info).action, $
    top:event.top, handler:0l, select:1}
  widget_control,event.top,set_uvalue=info
  xpixplot_draw,pseudoevent
end

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

pro xpixplot_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
  xpixplot_draw,pseudoevent
end

pro xpixplot_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
  xpixplot_draw,pseudoevent
end

pro xpixplot_movie, event
  widget_control, event.top, get_uvalue = info
  dt=0.1
  xtitle = (*info).xtitle
  ytitle = (*info).ytitle
  xscale = (*info).xscale
  bg = 0
  fg = !d.n_colors-1
  if (*info).mode  eq 1 then begin
    yp=reform((*info).data[(*info).cpos,*,*])
    sz=size(yp)
    yrange=[min(yp),max(yp)]
    plot, xscale, yp[*,0], $
          xrange = [xscale[(*info).start], xscale[(*info).stop-1]], $
          yrange=yrange, $ 
          xtitle = xtitle, ytitle = ytitle, xstyle = 1, $
          background=bg,color=fg
    for i=1,sz[2]-1 do begin
      wait,dt
      oplot,xscale,yp[*,i-1],color = bg
      oplot,xscale,yp[*,i],color = fg
    endfor
  endif
  if (*info).mode eq 2 then begin
    yp=reform((*info).data[*,(*info).cpos,*])
    sz=size(yp)
    yrange=[min(yp),max(yp)]
    plot, xscale,yp[*,0], $
          xrange = [xscale[(*info).start], xscale[(*info).stop-1]], $
          yrange=yrange, $ 
          xtitle = xtitle, ytitle = ytitle, xstyle = 1, $
          background=bg,color=fg
    for i=1,sz[2]-1 do begin
      wait,dt
      oplot,xscale,yp[*,i-1],color = bg
      oplot,xscale,yp[*,i],color = fg
    endfor
  endif
end

pro xpixplot_draw, event
  widget_control, event.top, get_uvalue = info
  xtitle = (*info).xtitle
  ytitle = (*info).ytitle
  xscale = (*info).xscale
  if (*info).mode  eq 1 then $
    plot, xscale, (*info).data[(*info).cpos,*,(*info).tpos], $
         xrange = [xscale[(*info).start], xscale[(*info).stop-1]], $ 
         xtitle = xtitle, ytitle = ytitle, xstyle = 1, /yn  
  if (*info).mode eq 2 then $
    plot, xscale, (*info).data[*,(*info).cpos,(*info).tpos], $
         xrange = [xscale[(*info).start], xscale[(*info).stop-1]], $ 
         xtitle = xtitle, ytitle = ytitle, xstyle = 1, /yn
end

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

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

pro xpixplot, data, mode, xscale = xscale, xtitle=xtitle, ytitle=ytitle, groupl = groupl
  sz = size(data)
  if mode eq 1 then begin
    crmax = sz[1]-1
    startmax = sz[2]-1
    stopmax = startmax
  endif else begin
    crmax = sz[2]-1
    startmax = sz[1]-1
    stopmax = startmax
  endelse
  if stopmax eq 0 then begin
    message,'Only one column(/row) in data',/cont
    return
  endif
  if n_elements(xtitle) eq 0 then xtitle='Position along the slit (pixel)'
  if n_elements(ytitle) eq 0 then ytitle='Pixel value'
  if n_elements(xscale) eq 0 then begin 
    if mode eq 0 then xscale=findgen(sz[1]) else xscale=findgen(sz[2])
  endif
  tlb = widget_base(title = 'Pixel data plot', mbar = menubar, $
                          group_leader = groupl,/row)
  lcol = widget_base(tlb, /frame, /column)      ;left column.
  rcol = widget_base(tlb, /column)      ;medium column.

  displaybase = widget_base(rcol, /row) 
  drawid=widget_draw(displaybase, retain = 2, xsize = 600, ysize = 500, $
                     /button_events, event_pro = 'xpixplot_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 = 'xpixplot_ps')
  jpgmenu=widget_button(savemenu, value='JPG', event_pro = 'xpixplot_jpeg')

  exitmenu=widget_button(filemenu, value='Close', event_pro='xpixplot_destroy')
  
  
  trmax=0
  timeslider=-1
  if sz[0] eq 3 then begin 
    trmax=sz[3]-1
    ttitle='Raster/Time step nr.'
    timeslider = widget_slider(lcol, xsize=120, $
                          minimum=0, maximum=trmax, $
                          title=ttitle, $
                          value=0, event_pro = 'xpixplot_timeslider', /drag)
  endif


  ctitle = ['Column nr. [X]', 'Row no [Y]']
  colslider = -1
  if crmax gt 0 then begin        
    colslider = widget_slider(lcol, xsize=120, $
                          minimum=0, maximum=crmax, $
                          title=ctitle[mode-1], $
                          value=0, event_pro = 'xpixplot_colslider', /drag)
  endif

  if mode eq 1 then begin
    starttitle = 'Start pos [Y]'
    stoptitle  = 'Stop pos [Y]'
  endif

  if mode eq 2 then begin
    starttitle = 'Start pos [X]'
    stoptitle  = 'Stop pos [X]'
  endif

  startslider = widget_slider(lcol, xsize=120, $
                          minimum=0, maximum=startmax, $
                          title=starttitle, $
                          value=0, event_pro = 'xpixplot_startslider', /drag)

  stoplider = widget_slider(lcol, xsize=120, $
                          minimum=0, maximum=stopmax, $
                          title=stoptitle, $
                          value=stopmax, $ 
                          event_pro = 'xpixplot_stopslider', /drag)
                          
  moviebutton = widget_button(lcol, value = 'Movie', $
                              event_pro = 'xpixplot_movie')

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

    ; realize main window:
  widget_control, tlb, /realize

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

  stop = 0
  if mode eq 1 then stop = sz[2]
  if mode eq 2 then stop = sz[1]
  ; define the info structure, used send information around
  info = {data:data, $
          tlb:tlb, $
          mode:mode, $
          action:drawid, $
          wid:wid, $
          cpos:0, $
          tpos:0, $
          start:0, $
          stop:stop, $
          xscale:xscale, $
          xtitle:xtitle, ytitle:ytitle}
  info = ptr_new(info, /no_copy)

  ; 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
  pseudoevent={widget_button,id:(*info).action, $
               top:tlb, handler:0l, select:1}
  widget_control, (*info).action, send_event = pseudoevent

  xmanager, 'Pixel data plot', tlb, /no_block, group_leader = groupl, $
            cleanup = 'xpixplot_cleanup'
end
