;------------------------------------------------------------------------------;
;+
; NAME:
;		     eis_eng_gui
; PURPOSE:
;		     This object
; INPUTS:
;		     GROUP -
;-
;------------------------------------------------------------------------------;
FUNCTION eis_eng_gui::Init

;-------------------create the main base---------------------------------------;
pt_version = eis_get_pt_version_number()
widTitle   = "EIS Engineering Tool" + pt_version
TLB_EVENT                   = {eis_eng_gui_Event}
TLB_EVENT.eis_eng_gui       = Self
TLB_EVENT.Type              = "TLB"
Self.tlbID                  = WIDGET_BASE(                                  $
                                    TITLE       = widTitle,                 $
                                    COLUMN      = 1,                        $
                                    UValue      = TLB_EVENT)

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

RETURN, 1

END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_eng_gui::createGUI

; ______________________________________________________________________
;
; Info base
;
; ______________________________________________________________________
infoBase                    = WIDGET_BASE(Self.tlbID ,                      $
                                    COLUMN      = 1  ,                      $
                                    FRAME       = 1 )

user_path = STRJOIN(['Database:',GETENV('ZDBASE_USER')],'  ',/SINGLE)



aLabel                      = WIDGET_LABEL(infoBase ,                       $
                                    value       = user_path ,               $
                                    /ALIGN_LEFT)


; ______________________________________________________________________
;
; Properties base
;
; ______________________________________________________________________
propsBase                   = WIDGET_BASE(Self.tlbID ,                      $
                                    COLUMN      = 1  ,                      $
                                    FRAME       = 1 )

; ______________________________________________________________________
;
; Study ID base
;
; ______________________________________________________________________
st_idBase                   = WIDGET_BASE(propsBase ,                       $
                                    ROW         = 1 )

value = 'Study ID (existing):'
aLabel                      = WIDGET_LABEL(st_idBase ,                      $
                                    value       = value ,                   $
                                    xSize       = 150 ,                     $
                                    /ALIGN_LEFT)

ST_ID_EVENT                 = {eis_eng_gui_Event}
ST_ID_EVENT.eis_eng_gui     = Self
ST_ID_EVENT.Type            = "ST_ID"
Self.st_idID                = WIDGET_TEXT(st_idBase,                        $
                                    value       = 'None',                   $
                                    Event_Pro   = 'eis_eng_gui_EV',         $
                                    uValue      = ST_ID_EVENT  ,            $
                                    /EDITABLE ,                             $
                                    xSize       = 7             ,           $
                                    SENSITIVE   = 0)

DESC_EVENT                  = {eis_eng_gui_Event}
DESC_EVENT.eis_eng_gui      = Self
DESC_EVENT.Type             = "DESC"
value = ' View/Edit Description File '
DESCbutton                  = WIDGET_BUTTON(st_idBase ,                     $
                                    value       = value ,                   $
                                    Event_Pro   = 'eis_eng_gui_EV',         $
                                    uValue      = DESC_EVENT)

; ______________________________________________________________________
;
; Acronym base
;
; ______________________________________________________________________
acronymBase                 = WIDGET_BASE(propsBase ,                       $
                                    ROW         = 1 )

value = 'Acronym (20 chars max):'
aLabel                      = WIDGET_LABEL(acronymBase ,                    $
                                    value       = value ,                   $
                                    xSize       = 150 ,                     $
                                    /ALIGN_LEFT)

ACRON_EVENT                 = {eis_eng_gui_Event}
ACRON_EVENT.eis_eng_gui     = Self
ACRON_EVENT.Type            = "ACRONYM"
Self.acronymID              = WIDGET_TEXT(acronymBase,                      $
                                    value       = 'None',                   $
                                    Event_Pro   = 'eis_eng_gui_EV',         $
                                    uValue      = ACRON_EVENT  ,            $
                                    /EDITABLE ,                             $
                                    xSize       = 22)

; ______________________________________________________________________
;
; Title base
;
; ______________________________________________________________________
titleBase                   = WIDGET_BASE(propsBase ,                       $
                                    ROW         = 1 )

value = 'Title (100 chars max):'
aLabel                      = WIDGET_LABEL(titleBase ,                      $
                                    value       = value ,                   $
                                    xSize       = 150 ,                      $
                                    /ALIGN_LEFT)

TITLE_EVENT                 = {eis_eng_gui_Event}
TITLE_EVENT.eis_eng_gui     = Self
TITLE_EVENT.Type            = "TITLE"
Self.titleID                = WIDGET_TEXT(titleBase,                        $
                                    value       = 'None',                   $
                                    Event_Pro   = 'eis_eng_gui_EV',         $
                                    uValue      = TITLE_EVENT  ,            $
                                    /EDITABLE ,                             $
                                    xSize       = 50)

;---------------------------------------------------------------------------
;
; Create Author Text Box
;
;---------------------------------------------------------------------------
authorBase                  = WIDGET_BASE(propsBase ,                       $
                                    ROW         = 1 )

value = 'Author:'
aLabel                      = WIDGET_LABEL(authorBase ,                     $
                                    value       = value ,                   $
                                    xSize       = 150 ,                     $
                                    /ALIGN_LEFT)

Self.author_gui = OBJ_NEW("eis_author_gui", Self , authorBase , 'author')

; ______________________________________________________________________
;
; Duration base
;
; ______________________________________________________________________
durationBase                = WIDGET_BASE(propsBase ,                       $
                                    ROW         = 1 )

value = 'Duration (ms):'
aLabel                      = WIDGET_LABEL(durationBase ,                   $
                                    value       = value ,                   $
                                    xSize       = 150 ,                      $
                                    /ALIGN_LEFT)

DURAT_EVENT                 = {eis_eng_gui_Event}
DURAT_EVENT.eis_eng_gui     = Self
DURAT_EVENT.Type            = "DURATION"
Self.durationID             = WIDGET_TEXT(durationBase,                     $
                                    value       = 'None',                   $
                                    Event_Pro   = 'eis_eng_gui_EV',         $
                                    uValue      = DURAT_EVENT  ,            $
                                    /EDITABLE ,                             $
                                    xSize       = 12)

value = '0h0m0s'
Self.durationLabelID        = WIDGET_LABEL(durationBase ,                   $
                                    value       = value ,                   $
                                    xSize       = 150 ,                     $
                                    /ALIGN_LEFT)
; ______________________________________________________________________
;
; Volume base
;
; ______________________________________________________________________
volumeBase                  = WIDGET_BASE(propsBase ,                       $
                                    ROW         = 1 )

value = 'Volume (bits):'
aLabel                      = WIDGET_LABEL(volumeBase ,                     $
                                    value       = value ,                   $
                                    xSize       = 150 ,                     $
                                    /ALIGN_LEFT)

VOLUM_EVENT                 = {eis_eng_gui_Event}
VOLUM_EVENT.eis_eng_gui     = Self
VOLUM_EVENT.Type            = "VOLUME"
Self.volumeID               = WIDGET_TEXT(volumeBase,                       $
                                    value       = 'None',                   $
                                    Event_Pro   = 'eis_eng_gui_EV',         $
                                    uValue      = VOLUM_EVENT  ,            $
                                    /EDITABLE ,                             $
                                    xSize       = 12)

; ______________________________________________________________________
;
; Entry base
;
; ______________________________________________________________________
entryBase                   = WIDGET_BASE(Self.tlbID ,                      $
                                    COLUMN      = 1  ,                      $
                                    FRAME       = 1 ,/EXCLUSIVE)

SAVE_EVENT                  = {eis_eng_gui_Event}
SAVE_EVENT.eis_eng_gui      = Self
SAVE_EVENT.Type             = "NEW_ENTRY"
Self.newEntryID             = WIDGET_BUTTON(entryBase,                     $
                                    value       = 'Create a New Entry',    $
                                    Event_Pro   = 'eis_eng_gui_EV',        $
                                    uValue      = SAVE_EVENT)
WIDGET_CONTROL , Self.newEntryID , set_button = 1


QUIT_EVENT                  = {eis_eng_gui_Event}
QUIT_EVENT.eis_eng_gui      = Self
QUIT_EVENT.Type             = "UPDATE_ENTRY"
quitbutton                  = WIDGET_BUTTON(entryBase,                     $
                                    value       = 'Update Existing Entry', $
                                    Event_Pro   = 'eis_eng_gui_EV',        $
                                    uValue      = QUIT_EVENT)


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


SAVE_EVENT                  = {eis_eng_gui_Event}
SAVE_EVENT.eis_eng_gui      = Self
SAVE_EVENT.Type             = "SAVE"
SAVEbutton                  = WIDGET_BUTTON(bottomBase,                     $
                                    value       = 'Save',                   $
                                    Event_Pro   = 'eis_eng_gui_EV',         $
                                    uValue      = SAVE_EVENT)

STOP_EVENT                  = {eis_eng_gui_Event}
STOP_EVENT.eis_eng_gui      = Self
STOP_EVENT.Type             = "STOP"
STOPbutton                  = WIDGET_BUTTON(bottomBase,                     $
                                    value       = 'Stop',                   $
                                    Event_Pro   = 'eis_eng_gui_EV',         $
                                    uValue      = STOP_EVENT)

QUIT_EVENT                  = {eis_eng_gui_Event}
QUIT_EVENT.eis_eng_gui      = Self
QUIT_EVENT.Type             = "QUIT"
quitbutton                  = WIDGET_BUTTON(bottomBase,                     $
                                    value       = 'Quit'                 ,  $
                                    Event_Pro   = 'eis_eng_gui_EV',         $
                                    uValue      = QUIT_EVENT)


END

;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_eng_gui_Cleanup , wid

WIDGET_CONTROL , wid , get_uvalue = eis_eng_gui_Event
OBJ_DESTROY    , eis_eng_gui_Event.eis_eng_gui

END
;______________________________________________________________________________
; Cleanup
;______________________________________________________________________________
PRO eis_eng_gui::CleanUp


END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_eng_gui::setProperty, author_struct  = author_struct

IF (N_ELEMENTS(author_struct) GT 0) THEN BEGIN
    Self.eis_study.author = author_struct.author
ENDIF

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

tlbID = Self.tlbID

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

    Return, Self.tlbID
End

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

Widget_Control, Self.tlbID, _Extra=Widget_Control_Keywords

End

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

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

End

;______________________________________________________________________________
; Realize wrapper
;______________________________________________________________________________
PRO eis_eng_gui::Realize

Widget_Control, Self.tlbID, /Realize

End

;______________________________________________________________________________
; XManager wrapper
;______________________________________________________________________________
PRO eis_eng_gui::XManager;,group=group

XMANAGER , "eis_eng_gui" ,   Self.tlbID ,                                 $
    Event_Handler  = "eis_eng_gui_EV",                                    $
    cleanup        = "eis_eng_gui_Cleanup",                               $
    GROUP_LEADER   = Self.group_leader ,                                    $
    /NO_BLOCK

end

;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_eng_gui_Event__Define

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

;Get event handler structure containing eis_eng_gui type object
Widget_CONTROL,Event.ID,get_uvalue = eis_eng_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_eng_gui's class member procedure "Handler"
eis_eng_gui_Event.eis_eng_gui->Handler,Event

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

WIDGET_CONTROL, Event.ID, Get_UValue = eis_eng_gui_Event

CASE eis_eng_gui_Event.Type OF
    "QUIT"         : Self->Control, /Destroy
    "STOP"         : stop
    "UPDATE_ENTRY" : Self->update_entry
    "NEW_ENTRY"    : Self->new_entry
    "ST_ID"        : Self->select_study
    "SAVE"         : Self->save
    "DURATION"     : Self->duration
    "VOLUME"       : Self->volume
    "TITLE"        : Self->update_title
    "ACRONYM"      : Self->acronym
    "DESC"         : Self->view_description_file
    ELSE           : print,eis_eng_gui_Event.Type
ENDCASE
END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_eng_gui::view_description_file

IF (Self.eis_study.id EQ 0) THEN RETURN
eis_view_study_descriptions , Self.eis_study.id , tlbID = Self.tlbID

END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_eng_gui::acronym

WIDGET_CONTROL , Self.acronymID , get_value = widValue
IF (STRLEN(STRTRIM(widValue[0],2)) EQ 0) THEN BEGIN
    BEEP
    mText = 'No acronym supplied. Aborting'
    complain = DIALOG_MESSAGE( mText       ,                        $
                         DIALOG_PARENT = Self.tlbID,                $
                         /ERROR )
    RETURN
ENDIF

Self.eis_study.acronym = widValue[0]

END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_eng_gui::update_title

WIDGET_CONTROL , Self.titleID , get_value = widValue
IF (STRLEN(STRTRIM(widValue[0],2)) EQ 0) THEN BEGIN
    BEEP
    mText = 'No title supplied. Aborting'
    complain = DIALOG_MESSAGE( mText       ,                        $
                         DIALOG_PARENT = Self.tlbID,                $
                         /ERROR )
    RETURN
ENDIF

Self.eis_study.title = widValue[0]

END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_eng_gui::volume

WIDGET_CONTROL , Self.volumeID , get_value = widValue
; Check this is a number
valid = is_number(widValue)
IF (valid NE 1) THEN BEGIN
    BEEP
    mText = 'This is NOT a valid number. Aborting'
    complain = DIALOG_MESSAGE( mText       ,                        $
                         DIALOG_PARENT = Self.tlbID,                $
                         /ERROR )
    widValue = Self.eis_study.volume

ENDIF

Self.eis_study.volume = widValue[0]
Self->update_widgets

END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_eng_gui::duration

WIDGET_CONTROL , Self.durationID , get_value = widValue
; Check this is a number
valid = is_number(widValue)
IF (valid NE 1) THEN BEGIN
    BEEP
    mText = 'This is NOT a valid number. Aborting'
    complain = DIALOG_MESSAGE( mText       ,                        $
                         DIALOG_PARENT = Self.tlbID,                $
                         /ERROR )
    widValue = Self.eis_study.duration

ENDIF

Self.eis_study.duration = widValue[0]
Self->update_widgets

END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_eng_gui::save

; Open database for writing the new Line List entry
st = Self.eis_study

; If creating a NEW db entry then call
new_entry = WIDGET_INFO(Self.newEntryID , /BUTTON_SET)
IF (new_entry EQ 1) THEN BEGIN
    db_save_eng_study_entry_create , st , Self.tlbID
    RETURN
ENDIF

status = eis_open_db(/STUDY,/UPDATE)

; dbput is a SSW procedure for updating  a database field
dbput, 'ACRONYM'     , st.acronym             , st.id
dbput, 'TITLE'       , st.title               , st.id
dbput, 'AUTHOR'      , st.author              , st.id
dbput, 'DURATION'    , st.duration            , st.id
dbput, 'DATA_VOLUME' , st.volume              , st.id

dbclose

END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_eng_gui::select_study

WIDGET_CONTROL , Self.st_idID , get_value = widValue
; Check this is a number
valid = is_number(widValue)
IF (valid NE 1) THEN BEGIN
    BEEP
    mText = 'This is NOT a valid number. Aborting'
    complain = DIALOG_MESSAGE( mText       ,                        $
                         DIALOG_PARENT = Self.tlbID,                $
                         /ERROR )
    RETURN
ENDIF


; Check Study ID exists
st = Self.eis_study
status = eis_open_db(/STUDY)

spar = STRJOIN(['ID = ',STRCOMPRESS(widValue[0])],/SINGLE)
exists = DBFIND(spar , /SILENT , count = count)
; Check Study ID exists
IF (count NE 1) THEN BEGIN
    BEEP
    mText = 'This is NOT a valid study ID. Aborting'
    complain = DIALOG_MESSAGE( mText       ,                        $
                         DIALOG_PARENT = Self.tlbID,                $
                         /ERROR )
    RETURN

ENDIF

; OK, the study entry exists in the study DB - now read it!
Self.eis_study = db_read_study_entry(LONG(widValue[0]))

; Check study is ENGINEERING type
IF (Self.eis_study.type NE 1) THEN BEGIN
    BEEP
    mText = 'This is NOT an engineering study. Aborting'
    complain = DIALOG_MESSAGE( mText       ,                        $
                         DIALOG_PARENT = Self.tlbID,                $
                         /ERROR )
    RETURN

ENDIF

Self->update_widgets

END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_eng_gui::update_widgets

st = Self.eis_study

WIDGET_CONTROL , Self.acronymID  , set_value = st.acronym
WIDGET_CONTROL , Self.titleID    , set_value = st.title
WIDGET_CONTROL , Self.durationID , set_value = STRCOMPRESS(st.duration,/REMOVE)
WIDGET_CONTROL , Self.volumeID   , set_value = STRCOMPRESS(st.volume,/REMOVE)

Self.author_gui->setProperty , author = Self.eis_study.author

; Also print duration nicely
CASE (st.duration LT 1000.) OF
    1    : dur_string = '<1s'
    ELSE : dur_string = sec2dhms(st.duration/1000.)
ENDCASE
WIDGET_CONTROL , Self.durationLabelID , set_value = dur_string


END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_eng_gui::update_entry

WIDGET_CONTROL , Self.st_idID , sensitive = 1
Self.eis_study = {eis_study}
Self->update_widgets

END
;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_eng_gui::new_entry

WIDGET_CONTROL , Self.st_idID , sensitive = 0
Self.eis_study = {eis_study}
Self->update_widgets

END
;______________________________________________________________________________
; Define Data members
;______________________________________________________________________________
PRO eis_eng_gui__Define

    struct          =	{ eis_eng_gui                                   ,     $
                                    tlbID           : 0L              ,     $
                                    group_leader    : 0L              ,     $
                                    parentClass     : OBJ_NEW()       ,     $
                                    st_idID         : 0L              ,     $
                                    acronymID       : 0L              ,     $
                                    titleID         : 0L              ,     $
                                    durationID      : 0L              ,     $
                                    volumeID        : 0L              ,     $
                                    durationLabelID : 0L              ,     $
                                    newEntryID      : 0L              ,     $
                                    author_gui      : OBJ_NEW()       ,     $
                                    eis_study       : {eis_study}           $
                      }


END
