;+
; PROJECT
;           SOLARB EIS
;
; NAME
;          eis_op_gui__DEFINE
;
; PURPOSE
;          eis_op_gui class definition
;
; NOTES
;          The
;
; CATEGORY
;          EIS timeline planning
;
; WRITTEN
;          John A Rainne RAL 16-Jun-2009
;
; HISTORY
;          v0.1 JAR 11-Aug-2009
;               Added custom time widgets
;
;
;______________________________________________________________________________
FUNCTION eis_op_gui::Init , parentClass

Self.parentClass  = parentClass
Self.group_leader = parentClass->tlbID()

Self.parentClass->getProperty , tl_graphics = tl_graphics
Self.tl_graphics = tl_graphics

;-------------------create the main base---------------------------------------;
pt_version = eis_get_pt_version_number()
widTitle = "EIS OP Period" + pt_version
TLB_EVENT                   = {eis_op_gui_Event}
TLB_EVENT.eis_op_gui       = Self
TLB_EVENT.Type              = "TLB"
Self.tlbID                  = WIDGET_BASE(                                  $
                                    TITLE       = widTitle,                 $
                                    COLUMN      = 1,                        $
                                    /FLOATING      ,                        $
                                    ;/MODAL         ,                        $
                                    GROUP_LEADER = Self.group_leader ,      $
                                    UValue      = TLB_EVENT)

;-------------------create the GUI------------------------------;
Self->createGUI

RETURN, 1

END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_op_gui::createGUI

Event_Pro   = 'eis_op_gui_EV'


; ______________________________________________________________________
;
; Custome Time base
;
; ______________________________________________________________________

; Ok, get display start time (TAI) in UTC
tStart_tai   = Self.tl_graphics.axes.x_axis_day_tai

startTime    = anytim2utc(Self.tl_graphics.axes.x_axis_day_tai)
; Convert hours (cursor position, event.x) into UTC
tLength      = sec2utc(Self.tl_graphics.axes.x_axis_length * 60. * 60.)

tStop        = startTime
tStop.mjd    = startTime.mjd  + tLength.mjd
tStop.time   = startTime.time + tLength.time
tStop_tai    = utc2tai(tStop)

tStart_string  = ANYTIM2UTC(tStart_tai  , /STIME , /TRUNCATE)
tStop_string   = ANYTIM2UTC(tStop_tai   , /STIME , /TRUNCATE)

startBase                  = WIDGET_BASE(Self.tlbID                  ,     $
                                   ROW         = 1                   ,     $
                                   FRAME       = 1)

aLabel                     = WIDGET_LABEL(startBase ,                      $
                                   value       = 'Start Time: '      ,     $
                                   /ALIGN_LEFT                       ,     $
                                   /DYNAMIC_RESIZE)

START_EVENT                = {eis_op_gui_Event}
START_EVENT.eis_op_gui     = Self
START_EVENT.Type           = "START_T"
Self.startTimeTextID       = WIDGET_TEXT(startBase                   ,     $
                                   value       = tStart_string       ,     $
                                   Event_Pro   = Event_Pro           ,     $
                                   /ALIGN_LEFT                       ,     $
                                   /EDITABLE                         ,     $
                                   xSize       = 22                  ,     $
                                   uValue      = START_EVENT)

aLabel                     = WIDGET_LABEL(startBase                  ,     $
                                   value       = '   Stop Time: '    ,     $
                                   /ALIGN_LEFT                       ,     $
                                   /DYNAMIC_RESIZE)

STOP_EVENT                 = {eis_op_gui_Event}
STOP_EVENT.eis_op_gui      = Self
STOP_EVENT.Type            = "STOP_T"
Self.stopTimeTextID        = WIDGET_TEXT(startBase                   ,     $
                                   value       = tStop_string        ,     $
                                   Event_Pro   = Event_Pro           ,     $
                                   /ALIGN_LEFT                       ,     $
                                   /EDITABLE                         ,     $
                                   xSize       = 22                  ,     $
                                   uValue      = STOP_EVENT)

; ______________________________________________________________________
;
; OP Period Base
;
; ______________________________________________________________________

Self.parentClass->getProperty , opev = opev
IF (N_TAGS((*opev)[0]) NE 0) THEN BEGIN

    opBase                  = WIDGET_BASE(Self.tlbID   ,                    $
                                    ROW         = 1    ,                    $
                                    /FRAME)

    IF (N_ELEMENTS(*opev) GT 0) THEN BEGIN
        value = Self->create_droplist_value(opev)
    ENDIF
    OP_EVENT                = {eis_op_gui_Event}
    OP_EVENT.eis_op_gui     = Self
    OP_EVENT.Type           = "OP"
    Self.opDropListID       = WIDGET_DROPLIST(opBase       ,                $
                                    value       = value        ,            $
                                    title       = 'OP Period:  '  ,         $
                                    Event_Pro   = 'eis_op_gui_EV',         $
                                    uValue      = OP_EVENT)

ENDIF

; ______________________________________________________________________
;
; Report base
;
; ______________________________________________________________________
reportBase                 = WIDGET_BASE(Self.tlbID                  ,     $
                                   COLUMN      = 1                   ,     $
                                   FRAME       = 1)
value = 'Number of Studies;'
aLabel                     = WIDGET_LABEL(reportBase                 ,     $
                                   xSize       = 200                 ,     $
                                   /ALIGN_LEFT                       ,     $
                                   value       = value)

;
; Total
;
totalBase                  = WIDGET_BASE(reportBase                  ,     $
                                   ROW         = 1                   ,     $
                                   yPad        = 0)

aLabel                     = WIDGET_LABEL(totalBase                  ,     $
                                   xSize       = 55                  ,     $
                                   value       = '')
aLabel                     = WIDGET_LABEL(totalBase                  ,     $
                                   xSize       = 100                 ,     $
                                   /ALIGN_LEFT                       ,     $
                                   value       = 'Total')
aLabel                     = WIDGET_LABEL(totalBase                  ,     $
                                   xSize       = 10                  ,     $
                                   value       = ':')
Self.n_st_totalID          = WIDGET_LABEL(totalBase                  ,     $
                                   xSize       = 30                  ,     $
                                   value       = '0')

;
; Time-Tagged
;
ttaggedBase                = WIDGET_BASE(reportBase                  ,     $
                                   ROW         = 1                   ,     $
                                   yPad        = 0)

aLabel                     = WIDGET_LABEL(ttaggedBase                ,     $
                                   xSize       = 55                  ,     $
                                   value       = '')
aLabel                     = WIDGET_LABEL(ttaggedBase                ,     $
                                   xSize       = 100                 ,     $
                                   /ALIGN_LEFT                       ,     $
                                   value       = 'Time-Tagged')
aLabel                     = WIDGET_LABEL(ttaggedBase                ,     $
                                   xSize       = 10                  ,     $
                                   value       = ':')
Self.n_st_ttID             = WIDGET_LABEL(ttaggedBase                ,     $
                                   xSize       = 30                  ,     $
                                   value       = '0')

;
; Appened
;
appendedBase               = WIDGET_BASE(reportBase                  ,     $
                                   ROW         = 1                   ,     $
                                   yPad        = 0)

aLabel                     = WIDGET_LABEL(appendedBase               ,     $
                                   xSize       = 55                  ,     $
                                   value       = '')
aLabel                     = WIDGET_LABEL(appendedBase               ,     $
                                   xSize       = 100                 ,     $
                                   /ALIGN_LEFT                       ,     $
                                   value       = 'Appended')
aLabel                     = WIDGET_LABEL(appendedBase               ,     $
                                   xSize       = 10                  ,     $
                                   value       = ':')
Self.n_st_appID            = WIDGET_LABEL(appendedBase               ,     $
                                   xSize       = 30                  ,     $
                                   value       = '0')

;
; Science
;
scienceBase                = WIDGET_BASE(reportBase                  ,     $
                                   ROW         = 1                   ,     $
                                   yPad        = 0)

aLabel                     = WIDGET_LABEL(scienceBase                ,     $
                                   xSize       = 55                  ,     $
                                   value       = '')
aLabel                     = WIDGET_LABEL(scienceBase                ,     $
                                   xSize       = 100                 ,     $
                                   /ALIGN_LEFT                       ,     $
                                   value       = 'Science')
aLabel                     = WIDGET_LABEL(scienceBase                ,     $
                                   xSize       = 10                  ,     $
                                   value       = ':')
Self.n_st_sciID            = WIDGET_LABEL(scienceBase                ,     $
                                   xSize       = 30                  ,     $
                                   value       = '0')

;
; Engineering
;
engBase                    = WIDGET_BASE(reportBase                  ,     $
                                   ROW         = 1                   ,     $
                                   yPad        = 0)

aLabel                     = WIDGET_LABEL(engBase                    ,     $
                                   xSize       = 55                  ,     $
                                   value       = '')
aLabel                     = WIDGET_LABEL(engBase                    ,     $
                                   xSize       = 100                 ,     $
                                   /ALIGN_LEFT                       ,     $
                                   value       = 'Engineering')
aLabel                     = WIDGET_LABEL(engBase                    ,     $
                                   xSize       = 10                  ,     $
                                   value       = ':')
Self.n_st_engID            = WIDGET_LABEL(engBase                    ,     $
                                   xSize       = 30                  ,     $
                                   value       = '0')

;
; Recursive
;
recBase                    = WIDGET_BASE(reportBase                  ,     $
                                   ROW         = 1                   ,     $
                                   yPad        = 0)

aLabel                     = WIDGET_LABEL(recBase                    ,     $
                                   xSize       = 55                  ,     $
                                   value       = '')
aLabel                     = WIDGET_LABEL(recBase                    ,     $
                                   xSize       = 100                 ,     $
                                   /ALIGN_LEFT                       ,     $
                                   value       = 'Recursive')
aLabel                     = WIDGET_LABEL(recBase                    ,     $
                                   xSize       = 10                  ,     $
                                   value       = ':')
Self.n_st_recID            = WIDGET_LABEL(recBase                    ,     $
                                   xSize       = 30                  ,     $
                                   value       = '0')

; ______________________________________________________________________
;
; Bottom base
;
; ______________________________________________________________________
bottomBase                  = WIDGET_BASE(Self.tlbID ,                      $
                                    ROW         = 1  ,                      $
                                    /GRID_LAYOUT,/frame)

APPLY_EVENT                 = {eis_op_gui_Event}
APPLY_EVENT.eis_op_gui = Self
APPLY_EVENT.Type            = "APPLY"
value = " Refresh "
APPLYbutton                 = WIDGET_BUTTON(bottomBase,                     $
                                    value       = value,           $
                                    Event_Pro   = 'eis_op_gui_EV',         $
                                    uValue      = APPLY_EVENT)

QUIT_EVENT                  = {eis_op_gui_Event}
QUIT_EVENT.eis_op_gui      = Self
QUIT_EVENT.Type             = "QUIT"
quitbutton                  = WIDGET_BUTTON(bottomBase,                     $
                                    value       = ' Quit '    ,              $
                                    Event_Pro   = 'eis_op_gui_EV',         $
                                    uValue      = QUIT_EVENT)


END

;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_op_gui_Cleanup , wid

WIDGET_CONTROL , wid , get_uvalue = eis_op_gui_Event
OBJ_DESTROY    , eis_op_gui_Event.eis_op_gui

END
;______________________________________________________________________________
; Cleanup
;______________________________________________________________________________
PRO eis_op_gui::CleanUp

OBJ_DESTROY , Self.tlc
PTR_FREE    , Self.op_struct

END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_op_gui::setProperty, blah = blah

IF (N_ELEMENTS(blah) GT 0) THEN stop

END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_op_gui::GetProperty, tlbID       = tlbID                     ,     $
                             tl_graphics = tl_graphics

tlbID       = Self.tlbID
tl_graphics = Self.tl_graphics

END
;______________________________________________________________________________
; Return widget id
;______________________________________________________________________________
FUNCTION eis_op_gui::tlbID

RETURN , Self.tlbID

END
;______________________________________________________________________________
; Widget_Control wrapper
;______________________________________________________________________________
PRO eis_op_gui::Control, _Ref_Extra=Widget_Control_Keywords

WIDGET_CONTROL , Self.tlbID, _Extra=Widget_Control_Keywords

END
;______________________________________________________________________________
; Widget_Info wrapper
;______________________________________________________________________________
FUNCTION eis_op_gui::Info, _Ref_Extra=Widget_Info_Keywords

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

END
;______________________________________________________________________________
; Realize wrapper
;______________________________________________________________________________
PRO eis_op_gui::Realize

WIDGET_CONTROL , Self.tlbID, /Realize

END
;______________________________________________________________________________
; XManager wrapper
;______________________________________________________________________________
PRO eis_op_gui::XManager;,group=group

XMANAGER , "eis_op_gui" ,   Self.tlbID ,                                 $
    Event_Handler  = "eis_op_gui_EV",                                    $
    cleanup        = "eis_op_gui_Cleanup",                               $
    GROUP_LEADER   = Self.group_leader ,                                    $
    /NO_BLOCK

END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_op_gui_Event__Define

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

;Get event handler structure containing eis_op_gui type object
Widget_CONTROL,Event.ID,get_uvalue = eis_op_gui_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_op_gui's class member procedure "Handler"
eis_op_gui_Event.eis_op_gui->Handler,Event

END
;______________________________________________________________________________
;
; * THIS is the routine for putting in event handling NOT eis_op_gui_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_op_gui::Handler, Event

WIDGET_CONTROL, Event.ID, Get_UValue = eis_op_gui_Event
CASE eis_op_gui_Event.Type OF
    "QUIT"            : Self->Control, /Destroy
    "APPLY"           : Self->apply
    "OP"              : Self->apply
    "START_T"         : Self->apply , /CUSTOM_TIME
    "STOP_T"          : Self->apply , /CUSTOM_TIME
    ELSE              : print,eis_op_gui_Event.Type
ENDCASE
END
;______________________________________________________________________________
; Apply
;______________________________________________________________________________
PRO eis_op_gui::zero_widgets , zero = zero

IF (KEYWORD_SET(zero) EQ 1) THEN value = '0' ELSE value = 'N/A'
WIDGET_CONTROL , Self.n_st_totalID , set_value = value
WIDGET_CONTROL , Self.n_st_ttID    , set_value = value
WIDGET_CONTROL , Self.n_st_appID   , set_value = value
WIDGET_CONTROL , Self.n_st_sciID   , set_value = value
WIDGET_CONTROL , Self.n_st_engID   , set_value = value
WIDGET_CONTROL , Self.n_st_recID   , set_value = value

END
;______________________________________________________________________________
; Apply
;______________________________________________________________________________
PRO eis_op_gui::do_analysis

num_st_total = STRCOMPRESS(Self.tlc->count(),/REMOVE_ALL)
tlc_info = Self.tlc->get_tlc_info()
num_st_tt    = WHERE(tlc_info.tt_list EQ 1, tt_count                 ,     $
                                            complement  = appended   ,     $
                                            ncomplement = num_st_app       $
                                            )

value = STRCOMPRESS(num_st_total,/REMOVE_ALL)
WIDGET_CONTROL , Self.n_st_totalID , set_value = value

value = STRCOMPRESS(tt_count,/REMOVE_ALL)
WIDGET_CONTROL , Self.n_st_ttID , set_value = value

value = STRCOMPRESS(num_st_app,/REMOVE_ALL)
WIDGET_CONTROL , Self.n_st_appID , set_value = value

num_st_sci    = WHERE(tlc_info.entry_type_list EQ 'S', sci_count)
value = STRCOMPRESS(sci_count,/REMOVE_ALL)
WIDGET_CONTROL , Self.n_st_sciID , set_value = value

num_st_eng    = WHERE(tlc_info.entry_type_list EQ 'E', eng_count)
value = STRCOMPRESS(eng_count,/REMOVE_ALL)
WIDGET_CONTROL , Self.n_st_engID , set_value = value

num_st_rec    = WHERE(tlc_info.recursive_list EQ 1, rec_count)
value = STRCOMPRESS(rec_count,/REMOVE_ALL)
WIDGET_CONTROL , Self.n_st_recID , set_value = value

END
;______________________________________________________________________________
; Apply
;______________________________________________________________________________
PRO eis_op_gui::apply , custom_time = custom_time

valid = WIDGET_INFO(Self.opDropListID , /VALID_ID)
IF (valid NE 1) THEN BEGIN
   Self->zero_widgets
   RETURN
ENDIF
index = WIDGET_INFO(Self.opDropListID , /DROPLIST_SELECT)
IF (index LT 0) THEN BEGIN
   Self->zero_widgets
   RETURN
ENDIF

WIDGET_CONTROL , /HOURGLASS

;
; Get start_time and stop_time
;
IF (KEYWORD_SET(custom_time) EQ 1) THEN BEGIN
   custom_time = Self->get_custom_time()
   IF (N_ELEMENTS(custom_time) NE 2) THEN BEGIN
       Self->zero_widgets
       RETURN
   ENDIF
ENDIF ELSE BEGIN
   custom_time = [(*Self.op_struct)[index].start_time                ,     $
                  (*Self.op_struct)[index].stop_time]
ENDELSE
; Read database
Self->readPlanFromDatabase , custom_time

IF (OBJ_VALID(Self.tlc) EQ 1) THEN Self->do_analysis

END
;______________________________________________________________________________
; Read Custom start and stop times
;______________________________________________________________________________
FUNCTION eis_op_gui::get_custom_time

WIDGET_CONTROL , Self.startTimeTextID , get_value = tStart
WIDGET_CONTROL , Self.stopTimeTextID  , get_value = tStop

IF (VALID_TIME(tStart[0])                  NE 1) THEN RETURN, -1
IF (VALID_TIME(tStop[0])                   NE 1) THEN RETURN, -1
IF (anytim2tai(tStart[0]) GE anytim2tai(tStop[0])) THEN RETURN, -1

RETURN , [tStart[0],tStop[0]]

END
;______________________________________________________________________________
; Read Plan from Database
;______________________________________________________________________________
PRO eis_op_gui::readPlanFromDatabase , custom_time

print,"Reading Timeline Database for period:"
line = STRJOIN(['     '                                              ,     $
                anytim2utc(custom_time[0],/STIME,/TRUNCATE)          ,     $
                ' to '                                               ,     $
                anytim2utc(custom_time[1],/STIME,/TRUNCATE)],/SINGLE)
print,line
IF (OBJ_VALID(Self.tlc) EQ 1) THEN OBJ_DESTROY , Self.tlc
IF (custom_time[0] EQ 0) OR (custom_time[1] EQ 0) THEN RETURN
; Read database
timeline = eis_get_timeline_entries(ANYTIM2TAI(custom_time[0])       ,     $
                                    ANYTIM2TAI(custom_time[1]), /ALL)
;
; Remove entries that don't have an entry_type = 'S' or 'E'
;
IF (N_TAGS(timeline[0]) NE 0) THEN BEGIN

    entry_type = timeline[*].entry_type
    valid_tl   = WHERE(entry_type EQ 'S' OR entry_type EQ 'E' , valid_count)
    IF (valid_count NE 0) THEN timeline   = timeline[valid_tl]

ENDIF
;
; IF no entries are found then tlc->clear_all, zero widgets and bail out
;
IF (N_TAGS(timeline[0]) EQ 0) THEN BEGIN

   Self->zero_widgets , /ZERO
   RETURN

ENDIF ELSE BEGIN

   ; Create the tlc object
   Self.tlc = OBJ_NEW("eis_timeline_container" , Self)
   Self.tlc->read_database, timeline

ENDELSE

END
;______________________________________________________________________________
; Create values for op droplist widget
;______________________________________________________________________________
FUNCTION eis_op_gui::create_droplist_value , opev

PTR_FREE , Self.op_struct
op = (*opev)[WHERE((*opev).name EQ 'op' , count)]
IF (count EQ 0) THEN stop
value = STRARR(count)

FOR i = 0, count -1 DO BEGIN

    start_time = anytim2utc(op[i].start_time , /STIME , /TRUNCATE)
    stop_time  = anytim2utc(op[i].stop_time  , /STIME , /TRUNCATE)
    value[i]   = STRJOIN([start_time,'  to  ',stop_time],/SINGLE)

ENDFOR

Self.op_struct = PTR_NEW(op)

RETURN , value

END
;______________________________________________________________________________
; Define Data members
;______________________________________________________________________________
PRO eis_op_gui__define

struct  = { eis_op_gui                                               ,     $
                    tlbID                 : 0L                       ,     $
                    group_leader          : 0L                       ,     $
                    parentClass           : OBJ_NEW()                ,     $
                    tlc                   : OBJ_NEW()                ,     $
                    op_struct             : PTR_NEW()                ,     $
                    tl_graphics           : {eis_timeline_graphics}  ,     $
                    n_st_totalID          : 0L                       ,     $
                    n_st_ttID             : 0L                       ,     $
                    n_st_appID            : 0L                       ,     $
                    n_st_sciID            : 0L                       ,     $
                    n_st_engID            : 0L                       ,     $
                    n_st_recID            : 0L                       ,     $
                    startTimeTextID       : 0L                       ,     $
                    stopTimeTextID        : 0L                       ,     $
                    opDropListID          : 0L                             $
          }


END
