;+
; PROJECT
;           SOLARB EIS
;
; NAME
;          eis_dvol_tl_gui__DEFINE
;
; PURPOSE
;          eis_dvol_tl_gui class definition
;
; NOTES
;          The
;
; CATEGORY
;          EIS timeline planning
;
; WRITTEN
;          John A Rainne RAL 19-Jan-2009
;
; HISTORY
;          v0.1 JAR 14-Jun-2009
;               Updated to handle larger numbers (specifically the total
;               data volume (Mb))
;
;
;______________________________________________________________________________
FUNCTION eis_dvol_tl_gui::Init , parentClass

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


;-------------------create the main base---------------------------------------;
pt_version = eis_get_pt_version_number()
widTitle = "EIS Data Volume for Multiple Timeline Entries" + pt_version
TLB_EVENT                   = {eis_dvol_tl_gui_Event}
TLB_EVENT.eis_dvol_tl_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_dvol_tl_gui::createGUI

Event_Pro   = 'eis_dvol_tl_gui_EV'

; Get tStart and tStop
Self.parentClass->getProperty , tl_graphics = tl_graphics
; Ok, get display start time (TAI) in UTC
tStart_tai   = tl_graphics.axes.x_axis_day_tai

startTime    = anytim2utc(tl_graphics.axes.x_axis_day_tai)
; Convert hours (cursor position, event.x) into UTC
tLength      = sec2utc(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)

;---------------------------------------------------------------------------
;
; Time START
;
;---------------------------------------------------------------------------
startBase                   = WIDGET_BASE(Self.tlbID ,                        $
                                    ROW         = 1                 ,       $
                                    FRAME       = 1)

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

START_EVENT                 = {eis_dvol_tl_gui_Event}
START_EVENT.eis_dvol_tl_gui = Self
START_EVENT.Type            = "START"
value = tStart_string
Self.copyStartTimeLabelID   = WIDGET_TEXT(startBase ,                      $
                                    value       = value    ,   $
                                    Event_Pro   = 'eis_dvol_tl_gui_EV',         $
                                    /ALIGN_LEFT ,                           $
                                    /EDITABLE                  ,            $
                                    xSize       = 22             ,         $
                                    uValue      = START_EVENT)

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

STOP_EVENT                  = {eis_dvol_tl_gui_Event}
STOP_EVENT.eis_dvol_tl_gui  = Self
STOP_EVENT.Type             = "STOP"
value = tStop_string
Self.copyStopTimeLabelID    = WIDGET_TEXT(startBase ,                      $
                                    value       = value    ,   $
                                    Event_Pro   = 'eis_dvol_tl_gui_EV',         $
                                    /ALIGN_LEFT ,                           $
                                    /EDITABLE                  ,            $
                                    xSize       = 22             ,         $
                                    uValue      = STOP_EVENT)
; ______________________________________________________________________
;
; Middle base
;
; ______________________________________________________________________
midBase                    = WIDGET_BASE(Self.tlbID                  ,     $
                                   COLUMN      = 1                   ,     $
                                   FRAME       = 1)

value = "TL_ID    Start Time            Duration    b             Kb       Mb"
aLabel                     = WIDGET_LABEL(midBase                    ,     $
                                   value       = value               ,     $
                                   /ALIGN_LEFT)

Self.textID                = WIDGET_TEXT(midBase                     ,     $
                                   ySize       = 10                  ,     $
                                   xSize       = 90                  ,     $
                                   /SCROLL)

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

APPLY_EVENT                 = {eis_dvol_tl_gui_Event}
APPLY_EVENT.eis_dvol_tl_gui = Self
APPLY_EVENT.Type            = "APPLY"
value = " Calculate Total Data Volume "
APPLYbutton                 = WIDGET_BUTTON(bottomBase,                     $
                                    value       = value,           $
                                    Event_Pro   = 'eis_dvol_tl_gui_EV',         $
                                    uValue      = APPLY_EVENT)

QUIT_EVENT                  = {eis_dvol_tl_gui_Event}
QUIT_EVENT.eis_dvol_tl_gui      = Self
QUIT_EVENT.Type             = "QUIT"
quitbutton                  = WIDGET_BUTTON(bottomBase,                     $
                                    value       = ' Quit '    ,              $
                                    Event_Pro   = 'eis_dvol_tl_gui_EV',         $
                                    uValue      = QUIT_EVENT)


END

;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_dvol_tl_gui_Cleanup , wid

WIDGET_CONTROL , wid , get_uvalue = eis_dvol_tl_gui_Event
OBJ_DESTROY    , eis_dvol_tl_gui_Event.eis_dvol_tl_gui

END
;______________________________________________________________________________
; Cleanup
;______________________________________________________________________________
PRO eis_dvol_tl_gui::CleanUp


END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_dvol_tl_gui::setProperty, tStartID      = tStartID            ,     $
                                  tStopID       = tStopID

IF (N_ELEMENTS(tStartID) GT 0) THEN BEGIN

   new_value = anytim2utc(tStartID , /STIME , /TRUNCATE)
   WIDGET_CONTROL , Self.copyStartTimeLabelID , set_value = new_value

ENDIF
IF (N_ELEMENTS(tStopID) GT 0) THEN BEGIN

   new_value = anytim2utc(tStopID , /STIME , /TRUNCATE)
   WIDGET_CONTROL , Self.copyStopTimeLabelID , set_value = new_value

ENDIF

END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_dvol_tl_gui::GetProperty, tlbID      = tlbID ,          $
                                  start_time = start_time    ,    $
                                  stop_time  = stop_time

WIDGET_CONTROL , Self.copyStartTimeLabelID , get_value = tStart
WIDGET_CONTROL , Self.copyStopTimeLabelID  , get_value = tStop

tlbID      = Self.tlbID
start_time = anytim2tai(tStart)
stop_time  = anytim2tai(tStop)

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

RETURN , Self.tlbID

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

WIDGET_CONTROL , Self.tlbID, _Extra=Widget_Control_Keywords

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

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

END
;______________________________________________________________________________
; Realize wrapper
;______________________________________________________________________________
PRO eis_dvol_tl_gui::Realize

WIDGET_CONTROL , Self.tlbID, /Realize

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

XMANAGER , "eis_dvol_tl_gui" ,   Self.tlbID ,                                 $
    Event_Handler  = "eis_dvol_tl_gui_EV",                                    $
    cleanup        = "eis_dvol_tl_gui_Cleanup",                               $
    GROUP_LEADER   = Self.group_leader ,                                    $
    /NO_BLOCK

END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_dvol_tl_gui_Event__Define

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

;Get event handler structure containing eis_dvol_tl_gui type object
Widget_CONTROL,Event.ID,get_uvalue = eis_dvol_tl_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_dvol_tl_gui's class member procedure "Handler"
eis_dvol_tl_gui_Event.eis_dvol_tl_gui->Handler,Event

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

WIDGET_CONTROL, Event.ID, Get_UValue = eis_dvol_tl_gui_Event
CASE eis_dvol_tl_gui_Event.Type OF
    "QUIT"            : Self->Control, /Destroy
    "APPLY"           : Self->apply
    "START"           :
    "STOP"            :
    ELSE              : print,eis_dvol_tl_gui_Event.Type
ENDCASE
END
;______________________________________________________________________________
; Apply
;______________________________________________________________________________
FUNCTION eis_dvol_tl_gui::check_times_are_valid

valid = {valid:1B , mText:""}
WIDGET_CONTROL , Self.copyStartTimeLabelID , get_value = tStart
WIDGET_CONTROL , Self.copyStopTimeLabelID  , get_value = tStop

IF (valid_time(tStart[0]) NE 1) THEN BEGIN
    valid.valid = 0B
    valid.mText = "Start Time is invalid. Aborting!"
END
IF (valid_time(tStop[0])  NE 1) THEN BEGIN
    valid.valid = 0B
    valid.mText = "Stop Time is invalid. Aborting!"
END

; Check stop_time > start_time
IF (anytim2tai(tStop[0]) LE anytim2tai(tStart[0])) THEN BEGIN
    valid.valid = 0B
    valid.mText = "Invalid time range. Aborting!"
END

RETURN , valid

END
;______________________________________________________________________________
; Apply
;______________________________________________________________________________
PRO eis_dvol_tl_gui::apply

WIDGET_CONTROL , Self.textID , set_value = ''

valid = Self->check_times_are_valid()
IF (valid.valid NE 1) THEN BEGIN
    BEEP
    complain = DIALOG_MESSAGE( valid.mText                          ,       $
                     DIALOG_PARENT = Self.tlbID,                            $
                     /ERROR )
    RETURN
ENDIF

WIDGET_CONTROL , /HOURGLASS

WIDGET_CONTROL , Self.copyStartTimeLabelID , get_value = start_time
WIDGET_CONTROL , Self.copyStopTimeLabelID  , get_value = stop_time


; Get list of indicies of selected entries
Self.parentClass->getProperty , eis_timeline_container = tlc
i_list = tlc->count_tl_entries_in_time_range(anytim2tai(start_time)  ,     $
                                             anytim2tai(stop_time))
IF (i_list.counter EQ 0) THEN BEGIN
    BEEP
    mText = "There are no entries in this time range. Aborting!"
    d = DIALOG_MESSAGE(mText , /ERROR , DIALOG_PARENT = Self.tlbID)
    RETURN
ENDIF

dvol_total = ULONG64(0)

FOR i = 0 , i_list.counter - 1 DO BEGIN

   tlc_index = (*i_list.tl_list)[i]
   temp      = tlc->get( position = tlc_index)
   tl        = temp->get()
    IF (tl.time_component.read_all NE 1) THEN BEGIN
        temp->get_all_info
        tl = temp->get()
    ENDIF

    idValue = STRING(format='(I06)',tl.time_component.sequence_id)
    startT  = ANYTIM2UTC(tl.time_component.start_time,/STIME,/TRUNCATE)
    dur     = SEC2DHMS(tl.science_component.duration  /1000.)
    prep    = STRING(format=('(A-6,A-2,A-20,A-2,A-12)'),idValue,'',startT,'',dur)


    dvol  = tl.science_component.volume
    nbits = STRING(format=('(I-14)'),dvol)
    kbits = STRING(format=('(I-9)'),dvol/1024.)
    mbits = STRING(format=('(I-9)'),dvol/(1024.^2))
    bits  = STRJOIN([nbits,kbits,mbits],/SINGLE)

    line  = STRJOIN([prep,bits],/SINGLE)
    WIDGET_CONTROL , Self.textID , set_value = line , APPEND = i

    ; Increment total counter
    dvol_total = dvol_total + dvol

ENDFOR

; Report Total Data Volume
value = "--------------------------------------------------------------------"
WIDGET_CONTROL , Self.textID , set_value = value , /APPEND

nbits = STRING(format=('(I-14)') , dvol_total)
kbits = STRING(format=('(I-9)')  , dvol_total/1024.)
mbits = STRING(format=('(I-9)')  , dvol_total/(1024.^2))
bits  = STRJOIN([nbits,kbits,mbits],/SINGLE)
value = STRING(format=('(A-5,A-37,A-32)'),'TOTAL','',bits)
WIDGET_CONTROL , Self.textID , set_value = value , /APPEND


END
;______________________________________________________________________________
; Define Data members
;______________________________________________________________________________
PRO eis_dvol_tl_gui__define

struct  = { eis_dvol_tl_gui                                          ,     $
                    tlbID                 : 0L                       ,     $
                    group_leader          : 0L                       ,     $
                    parentClass           : OBJ_NEW()                ,     $
                    textID                : 0L                       ,     $
                    copyStopTimeLabelID   : 0L                       ,     $
                    copyStartTimeLabelID  : 0L                             $
          }


END
