;------------------------------------------------------------------------------;
;+
; NAME:
;		     eis_plot_spectrum
; PURPOSE:
;		     This object
; INPUTS:
;		     GROUP -
;-
;------------------------------------------------------------------------------;
FUNCTION eis_plot_spectrum::Init , parentClass

Self.parentClass  = parentClass
Self.group_leader = parentClass->tlbID()
; Get the colour tables
Self.parentClass->getProperty , o_def_ct = o_def_ct
Self.o_def_ct = o_def_ct

;-------------------create the main base---------------------------------------;
pt_version = eis_get_pt_version_number()
widTitle   = 'EIS Spectrum' + pt_version
TLB_EVENT                   = {eis_plot_spectrum_Event}
TLB_EVENT.eis_plot_spectrum      = Self
TLB_EVENT.Type              = "TLB"
Self.tlbID                  = WIDGET_BASE(                                  $
                                    TITLE       = widTitle,                 $
                                    /TLB_SIZE_EVENTS ,                      $
                                    mbar        = bar,                      $
                                    COLUMN      = 1,                        $
                                    /FLOATING      ,                        $
                                    GROUP_LEADER = Self.group_leader ,      $
                                    UValue      = TLB_EVENT)

;-------------------create the GUI------------------------------;
;--------file menu list--------------------------------------------------------;
plot_menu	            = WIDGET_BUTTON(bar, VALUE='Plot', /MENU)



;
; CCD-1/CCD-2 button
;
SWAVE_EVENT                 = {eis_plot_spectrum_Event}
SWAVE_EVENT.eis_plot_spectrum    = Self
SWAVE_EVENT.Type            = "PLOTSW"
value = 'Shortwave (170-210 ' + STRING("305B) + ')'
Self.ccd1ID                 = WIDGET_BUTTON(plot_menu  ,                    $
                                    value       = value   ,                 $
                                    Event_Pro   = 'eis_plot_spectrum_EV',   $
                                    /CHECKED_MENU          ,                $
                                    uValue      = SWAVE_EVENT)
WIDGET_CONTROL , Self.ccd1ID , set_button = 1

LWAVE_EVENT                 = {eis_plot_spectrum_Event}
LWAVE_EVENT.eis_plot_spectrum    = Self
LWAVE_EVENT.Type            = "PLOTLW"
value = 'Longwave  (250-290 ' + STRING("305B) + ')'
Self.ccd2ID                 = WIDGET_BUTTON(plot_menu  ,                    $
                                    value       = value ,                   $
                                    Event_Pro   = 'eis_plot_spectrum_EV',   $
                                    /CHECKED_MENU          ,                $
                                    uValue      = LWAVE_EVENT)

;
; LOG/LIN button
;
logLinBase                  = WIDGET_BUTTON(plot_menu ,                     $
                                    value       = 'Y Range'     ,           $
                                    /MENU)

LIN_EVENT                   = {eis_plot_spectrum_Event}
LIN_EVENT.eis_plot_spectrum = Self
LIN_EVENT.Type              = "LINPLOT"
Self.linID                  = WIDGET_BUTTON(logLinBase    ,                 $
                                    value       = 'Linear',                 $
                                    Event_Pro   = 'eis_plot_spectrum_EV',   $
                                    /CHECKED_MENU          ,                $
                                    uValue      = LIN_EVENT)
WIDGET_CONTROL , Self.linID , set_button = 1

LOG_EVENT                   = {eis_plot_spectrum_Event}
LOG_EVENT.eis_plot_spectrum      = Self
LOG_EVENT.Type              = "LOGPLOT"
Self.logID                  = WIDGET_BUTTON(logLinBase    ,                 $
                                    value       = 'Logarithmic',            $
                                    Event_Pro   = 'eis_plot_spectrum_EV',   $
                                    /CHECKED_MENU          ,                $
                                    uValue      = LOG_EVENT)



;
; Draw Area
;
Draw_Event                  = {eis_plot_spectrum_Event}
Draw_Event.eis_plot_spectrum     = Self
Draw_Event.Type             = "DRAW"
Self.drawID                 = WIDGET_DRAW(Self.tlbID  ,                     $
                                XSize       = 600,                          $
                                YSize       = 600,                          $
                                FRAME       = 2,                            $
                                /BUTTON_EVENTS,                             $
                                ;/TRACKING_EVENTS,                           $
                                ;/MOTION_EVENTS     ,                        $
                                uvalue      = DRAW_EVENT )

Self.xySize = [600L,600]

WINDOW , /FREE , /PIXMAP , xSize = 600 , ySize = 600
Self.pixID = !D.window

;
; QUIT
;
QUIT_EVENT                  = {eis_plot_spectrum_Event}
QUIT_EVENT.eis_plot_spectrum = Self
QUIT_EVENT.Type             = "QUIT"
quitbutton                  = WIDGET_BUTTON(plot_menu ,                     $
                                    value       = 'Quit',                   $
                                    Event_Pro   = 'eis_plot_spectrum_EV',   $
                                    uValue      = QUIT_EVENT ,              $
                                    /SEPARATOR)


;
; QUIT
;
bottomBase                  = WIDGET_BASE(Self.tlbID ,                      $
                                    ROW         = 1  ,                      $
                                    /FRAME)


QUIT_EVENT                  = {eis_plot_spectrum_Event}
QUIT_EVENT.eis_plot_spectrum = Self
QUIT_EVENT.Type             = "QUIT"
quitbutton                  = WIDGET_BUTTON(bottomBase ,                    $
                                    value       = ' Quit ',                 $
                                    Event_Pro   = 'eis_plot_spectrum_EV',   $
                                    uValue      = QUIT_EVENT ,              $
                                    /SEPARATOR)

Self->readSpectrumFile

RETURN, 1

END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_plot_spectrum_Cleanup , wid

WIDGET_CONTROL , wid , get_uvalue = eis_plot_spectrum_Event
OBJ_DESTROY    , eis_plot_spectrum_Event.eis_plot_spectrum

END
;______________________________________________________________________________
; Cleanup
;______________________________________________________________________________
PRO eis_plot_spectrum::CleanUp

WDELETE  , Self.pixId
PTR_FREE , Self.longPixelIndex
PTR_FREE , Self.shortPixelIndex
PTR_FREE , Self.shortSpectrum
PTR_FREE , Self.longSpectrum
PTR_FREE , Self.xData
PTR_FREE , Self.yData

END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_plot_spectrum::setProperty, autoScaleStr  = autoScaleStr

IF (N_ELEMENTS(autoScaleStr) GT 0) THEN BEGIN
    stop
ENDIF

End
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_plot_spectrum::GetProperty, tlbID   = tlbID

tlbID = Self.tlbID

End
;______________________________________________________________________________
; Return widget id
;______________________________________________________________________________
Function eis_plot_spectrum::tlbID

    Return, Self.tlbID
End

;______________________________________________________________________________
; Widget_Control wrapper
;______________________________________________________________________________
PRO eis_plot_spectrum::Control, _Ref_Extra=Widget_Control_Keywords

Widget_Control, Self.tlbID, _Extra=Widget_Control_Keywords

End

;______________________________________________________________________________
; Widget_Info wrapper
;______________________________________________________________________________
Function eis_plot_spectrum::Info, _Ref_Extra=Widget_Info_Keywords

Return, Widget_Info(Self.tlbID, _Extra=Widget_Info_Keywords)

End

;______________________________________________________________________________
; Realize wrapper
;______________________________________________________________________________
PRO eis_plot_spectrum::Realize

Widget_Control, Self.tlbID, /Realize

End

;______________________________________________________________________________
; XManager wrapper
;______________________________________________________________________________
PRO eis_plot_spectrum::XManager

XMANAGER , "eis_plot_spectrum" ,   Self.tlbID ,                             $
    Event_Handler  = "eis_plot_spectrum_EV",                                $
    cleanup        = "eis_plot_spectrum_Cleanup",                           $
    GROUP_LEADER   = Self.group_leader ,                                    $
    /NO_BLOCK

END

;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_plot_spectrum_Event__Define

    struct = {  eis_plot_spectrum_Event,                                    $
                Type            : "",        $ ;Unique identifier for event
                eis_plot_spectrum   : OBJ_NEW(),  $ ;Reference to object passed
                extra           : 0          $ ;to - often object associated
             }
END
;______________________________________________________________________________
; Event Handler wrapper
;______________________________________________________________________________
PRO eis_plot_spectrum_EV , Event

;Get event handler structure containing eis_plot_spectrum type object
Widget_CONTROL,Event.ID,get_uvalue = eis_plot_spectrum_Event
;If a WIDGET_TAB event , just quit
IF (TAG_NAMES(event, /STRUCTURE_NAME) EQ 'WIDGET_TAB') THEN BEGIN
    ;print,'tab event'
    RETURN
ENDIF

;Call eis_plot_spectrum's class member procedure "Handler"
eis_plot_spectrum_Event.eis_plot_spectrum->Handler,Event

END
;______________________________________________________________________________
;
; * THIS is the routine for putting in event handling NOT eis_plot_spectrum_Ev above.
;
; Event Handler - handle events.  Derived classes must
; contain their own implementation in order to handle events or else pass in an
; procedure name/function name using the Event_Pro/Event_Func keywords to
; CWidget::Init()
;______________________________________________________________________________
PRO eis_plot_spectrum::Handler, Event

WIDGET_CONTROL, Event.ID, Get_UValue = eis_plot_spectrum_Event
CASE eis_plot_spectrum_Event.Type OF
    "QUIT"      : Self->Control, /Destroy
    "TLB"       : Self->tlbResize , event.x , event.y
    "DRAW"      : Self->drawEvents , event
    "PLOTSW"    : Self->plotShortwaveSpectrum
    "PLOTLW"    : Self->plotLongwaveSpectrum
    "LINPLOT"   : Self->plotLinPlot
    "LOGPLOT"   : Self->plotLogPlot
    ELSE        : print,eis_plot_spectrum_Event.Type
ENDCASE

END
;______________________________________________________________________________
; Select Short Wave Spectrum
;______________________________________________________________________________
PRO eis_plot_spectrum::drawEvents , event

WIDGET_CONTROL , Self.drawID , get_value = drawID
WSET , drawID
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;constrain coords to within the ROI draw area
event.x = 0 > event.x < (Self.xySize[0] - 1)
event.y = 0 > event.y < (Self.xySize[1] - 1)
DEVICE , Copy = [0,0,Self.xySize[0],Self.xySize[1],0,0,Self.pixID]
;convert from DEVICE coords to DATA coords
coords = CONVERT_COORD(event.x , event.y , /DEVICE , /TO_DATA)
xPos = !x.crange[0] > coords[0] < !x.crange[1]
yPos = !y.crange[0] > coords[1] < !y.crange[1]


;stop

possibleEventTypes = ['DOWN','UP','MOTION','SCROLL']
thisEvent   = possibleEventTypes[event.type]


IF (thisevent eq 'DOWN') AND (event.press EQ 1) THEN BEGIN

    Self.xys = [xPos,yPos]
    Self.xyd = [xPos,yPos]
    WIDGET_CONTROL , Self.drawID , draw_motion_events = 1
    Self->copyToPixmap

ENDIF

IF (thisevent eq 'MOTION') THEN BEGIN

    Self.xyd = [xPos,yPos]
    Self->copyToPixmap

ENDIF

IF (thisevent eq 'UP') AND (event.release EQ 1)  THEN BEGIN

    Self.xyd = [xPos,yPos]
    WIDGET_CONTROL , Self.drawID , draw_motion_events = 0
    Self->copyToPixmap

    delX = !x.crange[1] - !x.crange[0]
    IF (ABS(Self.xys[0]-Self.xyd[0]) LT (.01 * delX)) THEN BEGIN
        print,'Resetting scale';,ABS(Self.xys[0]-Self.xyd[0])
        Self->resetScale
        ;RETURN
    ENDIF
    Self->plotSpectrum

ENDIF

IF (thisevent eq 'DOWN') AND (event.press EQ 4) THEN BEGIN
    ;Right-click - CONTEXT-SENSITIVE menu
    print,'context-sensitive'
ENDIF

END
;______________________________________________________________________________
; Copy to Pixmap
;______________________________________________________________________________
PRO eis_plot_spectrum::resetScale

Self.xys = [MIN(*Self.xData),MIN(*Self.yData)]
Self.xyd = [MAX(*Self.xData),MAX(*Self.yData)]

END
;______________________________________________________________________________
; Copy to Pixmap
;______________________________________________________________________________
PRO eis_plot_spectrum::copyToPixmap

; Retrieve default colour table properties
Self.parentClass->getProperty , o_def_ct = o_def_ct
o_def_ct->getProperty , plotsCT = plotsCT , imageCT = imageCT

TVLCT , plotsCT[*,0] , plotsCT[*,1] , plotsCT[*,2]     ;PLOT ct
Device,Copy=[0,0,Self.xySize[0],Self.xySize[1],0,0,Self.pixID]

xPlot = [Self.xys[0],Self.xys[0],Self.xyd[0],Self.xyd[0],Self.xys[0]]
yPlot = [Self.xys[1],Self.xyd[1],Self.xyd[1],Self.xys[1],Self.xys[1]]
OPLOT , xPlot , yPlot , color = 1 , thick = 1

TVLCT , imageCT[*,0] , imageCT[*,1] , imageCT[*,2] ;IMAGE ct

END
;______________________________________________________________________________
; Select Short Wave Spectrum
;______________________________________________________________________________
PRO eis_plot_spectrum::plotLogPlot

Self.logPlot = 1
WIDGET_CONTROL , Self.logID , set_button = 1
WIDGET_CONTROL , Self.linID , set_button = 0
; Plot spectrum
Self->plotSpectrum

END
;______________________________________________________________________________
; Select Short Wave Spectrum
;______________________________________________________________________________
PRO eis_plot_spectrum::plotLinPlot

Self.logPlot = 0
WIDGET_CONTROL , Self.linID , set_button = 1
WIDGET_CONTROL , Self.logID , set_button = 0
; Plot spectrum
Self->plotSpectrum

END
;______________________________________________________________________________
; Select Short Wave Spectrum
;______________________________________________________________________________
PRO eis_plot_spectrum::plotShortwaveSpectrum

Self.spectrumType = 0
WIDGET_CONTROL , Self.ccd1ID , set_button = 1
WIDGET_CONTROL , Self.ccd2ID , set_button = 0

PTR_FREE , Self.xData
PTR_FREE , Self.yData
Self.xData = PTR_NEW(*Self.shortPixelIndex)
Self.yData = PTR_NEW(*Self.shortSpectrum  )
Self->resetScale
Self->plotSpectrum

END
;______________________________________________________________________________
; Select Long Wave Spectrum
;______________________________________________________________________________
PRO eis_plot_spectrum::plotLongwaveSpectrum

Self.spectrumType = 1
WIDGET_CONTROL , Self.ccd1ID , set_button = 0
WIDGET_CONTROL , Self.ccd2ID , set_button = 1

PTR_FREE , Self.xData
PTR_FREE , Self.yData
Self.xData = PTR_NEW(*Self.longPixelIndex)
Self.yData = PTR_NEW(*Self.longSpectrum  )
Self->resetScale
Self->plotSpectrum

END
;______________________________________________________________________________
; Select Full Spectrum
;______________________________________________________________________________
PRO eis_plot_spectrum::readSpectrumFile

fileName = CONCAT_DIR(GETENV('ancillary') , 'measured_spectrum.lis')

; Read spectrum file "measured_spectrum.lis"
spectrum = READ_ASCII(fileName , data_start = 3)

pixelIndex    = REFORM(spectrum.field1[0,*])
shortSpectrum = REFORM(spectrum.field1[1,*])
longSpectrum  = REFORM(spectrum.field1[2,*])

shortPixelIndex = FLTARR(1024*8)
longPixelIndex  = FLTARR(1024*8)


FOR i = 0, (1024*8-1) DO shortPixelIndex[i] = 170. + (i-0)*(40./(8*1024.))
FOR i = 0, (1024*8-1) DO longPixelIndex[i]  = 250. + (i-0)*(40./(8*1024.))

PTR_FREE , Self.shortPixelIndex
PTR_FREE , Self.longPixelIndex
PTR_FREE , Self.shortSpectrum
PTR_FREE , Self.longSpectrum
Self.shortPixelIndex = PTR_NEW(shortPixelIndex)
Self.longPixelIndex  = PTR_NEW(longPixelIndex )
Self.shortSpectrum   = PTR_NEW(shortSpectrum  )
Self.longSpectrum    = PTR_NEW(longSpectrum   )

PTR_FREE , Self.xData
PTR_FREE , Self.yData
Self.xData = PTR_NEW(shortPixelIndex)
Self.yData = PTR_NEW(shortSpectrum  )

Self->resetScale

END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_plot_spectrum::tlbResize , xc , yc

geoTLB       = WIDGET_INFO(Self.tlbID , /GEOMETRY)
currentXSize = geoTLB.xSize
currentYSize = geoTLB.ySize

dx = xc - currentXSize
dy = yc - currentYSize

geoDrawID  = WIDGET_INFO(Self.drawID , /GEOMETRY)

WDELETE , Self.pixID
WINDOW , /FREE , /PIXMAP , xSize = geoDrawID.xSize + dx ,                   $
                           ySize = geoDrawID.ySize + dy
Self.pixID = !D.window
Self.xySize = [geoDrawID.xSize + dx , geoDrawID.ySize + dy]

; Resize the draw widget
WIDGET_CONTROL , Self.drawID , xsize = geoDrawID.xSize + dx ,               $
                               ysize = geoDrawID.ySize + dy


Self->plotSpectrum

END
;______________________________________________________________________________
; Select Full Spectrum
;______________________________________________________________________________
PRO eis_plot_spectrum::plotSpectrum

yData = (*Self.yData)
IF (Self.logPlot EQ 1) THEN yData = FLOAT(yData)  > 1.

angstrom = STRING("305B)
xtitle   = 'Wavelength  ' + angstrom
yTitle   = 'Intensity'

WIDGET_CONTROL , Self.drawID , get_value = drawID
WSET , drawID
drawArea = [drawID , Self.pixID]

; Retrieve default colour table properties
Self.parentClass->getProperty , o_def_ct = o_def_ct
o_def_ct->getProperty , plotsCT = plotsCT , imageCT = imageCT

TVLCT , plotsCT[*,0] , plotsCT[*,1] , plotsCT[*,2] ;PLOT ct


xRange = [Self.xys[0] , Self.xyd[0]]
yRange = [Self.xys[1] , Self.xyd[1]]
xRange = xRange(SORT(xRange))
yRange = yRange(SORT(yRange))
; If it's a Log plot, then
IF (Self.logPlot EQ 1) THEN yRange[0] = yRange[0] > 1.

FOR i = 0,1 DO BEGIN


    WSET , drawArea[i]

    PLOT , (*Self.xData) , yData  ,                                         $
            color      = 0             ,                                    $
            background = 230           ,                                    $
            ticklen    = -0.02         ,                                    $
            xRange     = xRange        ,                                    $
            yRange     = yRange        ,                                    $
            yMargin    = [5,12]        ,                                    $
            xMargin    = [12,4]         ,                                   $
            yLog       = Self.logPlot  ,                                    $
            xTitle     = xTitle        ,                                    $
            yTitle     = yTitle        ,                                    $
            charSize   = 1.5           ,                                    $
            /NODATA


    Self->plotLines , drawArea[i]

    IF (Self.logPlot EQ 1) THEN BEGIN
        !Y.CRANGE[0]=10^!Y.CRANGE[0] > 1.
        !Y.CRANGE[1]=10^!Y.CRANGE[1] > 1.
    ENDIF

    OPLOT , (*Self.xData) , yData , color = 0

    ; Plot title (use Dave Fanning's STR_SIZE function)
    CASE Self.spectrumType OF
        0:      plotTitle = 'EIS Spectral Lines: CCD1'
        1:      plotTitle = 'EIS Spectral Lines: CCD2'
        ELSE:   stop
    ENDCASE

    thisCharSize = str_size(plotTitle , 0.5)

    XYOUTS , 0.5 , 0.90 ,  plotTitle       , /NORMAL ,                      $
                           align    = 0.5 ,                                 $
                           charSize = thisCharSize ,                        $
                           color    = 0

ENDFOR


TVLCT , imageCT[*,0] , imageCT[*,1] , imageCT[*,2] ;IMAGE ct


;stop
;im = rebin(*Self.yData,2048)
;n  = fltarr(2048,200)
;for i= 0,199 DO n[*,i] = (*Self.yData) + 1


;; 2-D image spectrum
;window,0,xs=700,ys=200
;n=fltarr(8192,200)
;for i= 0,199 DO n[*,i] = (*Self.yData) + 1
;loadct,3
;;plots,[0,600],[40,40],/device
;tvscl,bytscl(congrid(alog(n),700,200),max=256,min=0);,50,25
;stop

END
;______________________________________________________________________________
; Select Full Spectrum
;______________________________________________________________________________
PRO eis_plot_spectrum::plotLines , drawArea

ySizeDelta = !Y.CRange[1] - !Y.CRange[0]
yMax       = [!Y.CRange[1]]
yMin       = [!Y.CRange[0]]
IF (Self.logPlot EQ 1) THEN yMin = ALOG(yMin)>1

Self.parentClass->getProperty , eis_raster  = eis_raster   ,                $
                                eis_ll_obj  = eis_ll_obj
nWindows = eis_raster.nWindows
eis_ll_obj->getProperty , ll = ll
; Convert wavelengths to pixels
pixels = eis_get_ccd_translation()
disp = pixels[1].a1


FOR i = 0,1 DO BEGIN

    WSET , drawArea

    ; Now plot line widths
    FOR i = 0, nWindows - 1 DO BEGIN

        dataWindow = eis_raster.dataWindows[i]
        line = ll.lines[i]
        wave = STRING(format='(F6.2)',line.wavelength/100.)
        name = STRTRIM(line.name,2)

        b    = (dataWindow / 2) * disp         ;pixels.disp

        xPoints = [wave-b , wave-b , wave+b , wave+b , wave-b]
        yPoints = [yMin   , yMax   , yMax   , yMin   , yMin]
        ;OPLOT , xPoints , yPoints , color = 0

        POLYFILL, xPoints, yPoints, COLOR = 9 ,noclip = 0
        lineName = STRCOMPRESS(i+1,/REMOVE_ALL) + ': ' + wave + ' ' + name

        XYOUTS , wave , !Y.CRange[1]+(0.02*ySizeDelta) , lineName ,         $
                                                         color       = 0  , $
                                                         orientation = 90
    ENDFOR


ENDFOR

END
;______________________________________________________________________________
; Define Data members
;______________________________________________________________________________
PRO	eis_plot_spectrum__Define

    struct          =	{ eis_plot_spectrum                           ,     $
                                    tlbID           : 0L              ,     $
                                    group_leader    : 0L              ,     $
                                    drawId          : 0L              ,     $
                                    pixId           : 0L              ,     $
                                    spectrumType    : 0B              ,     $
                                    logID           : 0B              ,     $
                                    linID           : 0B              ,     $
                                    ccd1ID          : 0B              ,     $
                                    ccd2ID          : 0B              ,     $
                                    logPlot         : 0B              ,     $
                                    xySize          : LONARR(2)       ,     $
                                    xData           : PTR_NEW()       ,     $
                                    yData           : PTR_NEW()       ,     $
                                    shortPixelIndex : PTR_NEW()       ,     $
                                    longPixelIndex  : PTR_NEW()       ,     $
                                    shortSpectrum   : PTR_NEW()       ,     $
                                    longSpectrum    : PTR_NEW()       ,     $
                                    parentClass     : OBJ_NEW()       ,     $
                                    o_def_ct        : OBJ_NEW()       ,     $
                                    xys             : FLTARR(2)       ,     $
                                    xyd             : FLTARR(2)             $
                      }

END
