;+
; NAME
;		         EIS_DB_SAVE_GUI
;
; PURPOSE
;		         This object GUI is the eis_mk_linelist tool. It is called from
;           eis_mk_raster
;
; CATEGORY
;           EIS technical planning
;
; INPUTS
;		         parentClass - the eis_mk_raster object
;
; KEYWORDS
;           ll, ra or st - one of which must be supplied.
; WRITTEN
;           V0.0  John A Rainnie 2006
;-
;------------------------------------------------------------------------------;
FUNCTION eis_db_save_gui::Init , parentClass , ll = ll , ra = ra , st = st

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

categoryList = eis_read_study_lists( /CATEGORY)
PTR_FREE , Self.categoryList
Self.categoryList = PTR_NEW(categoryList)

targetList = eis_read_study_lists( /TARGET)
PTR_FREE , Self.targetList
Self.targetList = PTR_NEW(targetList)

; Get struct properties; ID, acronym & title
PTR_FREE , Self.eis_struct
;
; LineList
;
IF (KEYWORD_SET(ll) EQ 1) THEN BEGIN
    parentClass->getProperty , eis_ll_obj = eis_ll_obj
    ; Retrieve Line List
    eis_ll_obj->getProperty , ll = ll
    Self.eis_struct = PTR_NEW(ll)
    Self.eis_struct_type = 0
    widTitle = 'EIS Line List: Save to Database'
ENDIF
;
; Raster
;
IF (KEYWORD_SET(ra) EQ 1) THEN BEGIN
    parentClass->getProperty , eis_raster = eis_raster
    Self.eis_struct = PTR_NEW(eis_raster)
    Self.eis_struct_type = 1
    widTitle = 'EIS Raster: Save to Database'
ENDIF
;
; Study
;
IF (KEYWORD_SET(st) EQ 1) THEN BEGIN
    parentClass->getProperty , eis_study = eis_study
    Self.eis_struct = PTR_NEW(eis_study)
    Self.eis_struct_type = 2
    widTitle = 'EIS Study: Save to Database'
ENDIF

pt_version = eis_get_pt_version_number()
widTitle   = widTitle + pt_version
;-------------------create the main base---------------------------------------;
TLB_EVENT                   = {eis_db_save_gui_Event}
TLB_EVENT.eis_db_save_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_db_save_gui::createGUI

Event_Pro   = 'eis_db_save_gui_EV'

; ______________________________________________________________________
;
; topBase
;
; ______________________________________________________________________
topBase                     = WIDGET_BASE(Self.tlbID ,                      $
                                    COLUMN      = 1  ,                      $
                                    /FRAME)

; ______________________________________________________________________
;
; Title
;
; ______________________________________________________________________
IF (Self.eis_struct_type EQ 2) THEN BEGIN
    titleBaseID             = WIDGET_BASE(topBase ,                         $
                                    ROW         = 1)

    value = 'Title:'
    aLabel                  = WIDGET_LABEL(titleBaseID     ,                $
                                    value       = value ,                   $
                                    xSize       = 100 ,                     $
                                    /ALIGN_LEFT)

    TITLE_EVENT             = {eis_db_save_gui_Event}
    TITLE_EVENT.eis_db_save_gui = Self
    TITLE_EVENT.Type        = "TITLE"
    value = STRTRIM((*Self.eis_struct).title,2)
    Self.titleID            = WIDGET_TEXT(titleBaseID            ,          $
                                    value       = value                 ,   $
                                    Event_Pro   = Event_Pro         ,       $
                                    /ALIGN_LEFT                       ,     $
                                    uValue      = TITLE_EVENT,              $
                                    xSize       = 100            ,          $
                                    /EDITABLE   ,                           $
                                    /ALL_EVENTS)

    value = '  (100 chars max / no spaces)'
    aLabel                  = WIDGET_LABEL(titleBaseID ,                    $
                                    value       = value)



ENDIF
; ______________________________________________________________________
;
; Acronym Base
;
; ______________________________________________________________________
acronymBase                 = WIDGET_BASE(topBase ,                         $
                                    ROW         = 1)

value = 'Acronym:'
aLabel                      = WIDGET_LABEL(acronymBase ,                    $
                                    value       = value ,                   $
                                    xSize       = 100 ,                     $
                                    /ALIGN_LEFT )

DESC_EVENT                  = {eis_db_save_gui_Event}
DESC_EVENT.eis_db_save_gui  = Self
DESC_EVENT.Type             = "ACRONYM"
value = STRTRIM((*Self.eis_struct).acronym,2)
Self.acronymID              = WIDGET_TEXT(acronymBase        ,              $
                                    value       = value      ,              $
                                    Event_Pro   = Event_Pro,                $
                                    uValue      = DESC_EVENT ,              $
                                    xSize       = 30 ,                      $
                                    /EDITABLE   ,                           $
                                    /ALL_EVENTS)
value = '  (20 chars max / no spaces)'
aLabel                      = WIDGET_LABEL(acronymBase ,                    $
                                    value       = value)

; ______________________________________________________________________
;
; Author Base
;
; ______________________________________________________________________
authorBaseID                = WIDGET_BASE(topBase ,                         $
                                    ROW         = 1)

aLabel                      = WIDGET_LABEL(authorBaseID  ,                  $
                                    value       = 'Author:' ,               $
                                    xSize       = 100 ,                     $
                                    /ALIGN_LEFT)

Self.author_gui =   OBJ_NEW("eis_author_gui"                          ,     $
                             Self                                     ,     $
                             authorBaseID                             ,     $
                             'author')
; Update current author value into text box
Self.author_gui->set_selection , STRTRIM((*Self.eis_struct).author,2)

;
; Category
;
IF (Self.eis_struct_type EQ 2) THEN BEGIN
    categoryBaseID          = WIDGET_BASE(topBase ,                         $
                                    ROW         = 1)
    ;Self.categoryBaseID = categoryBaseID

    value = 'Category:'
    aLabel                  = WIDGET_LABEL(categoryBaseID  ,                $
                                    value       = value ,                   $
                                    xSize       = 100 ,                     $
                                    /ALIGN_LEFT)

    CATEGORY_EVENT          = {eis_db_save_gui_Event}
    CATEGORY_EVENT.eis_db_save_gui   = Self
    CATEGORY_EVENT.Type     = "CATEGORY"
    Self.categoryID         = WIDGET_DROPLIST(categoryBaseID     ,          $
                                    Event_Pro   = Event_Pro         ,       $
                                    value       = (*Self.categoryList)  ,   $
                                    /ALIGN_LEFT                       ,     $
                                    uValue      = CATEGORY_EVENT)

    ; Update Category droplist
    category = STRTRIM((*Self.eis_struct).category[0])
    WIDGET_CONTROL , Self.categoryID  , get_value = allCategory
    categoryIndex = WHERE(allCategory EQ category)
    IF (categoryIndex[0] EQ -1) THEN categoryIndex = 0
    WIDGET_CONTROL , Self.categoryID , set_droplist_select = categoryIndex[0]


ENDIF

;
; Target
;
IF (Self.eis_struct_type EQ 2) THEN BEGIN
    targetBaseID          = WIDGET_BASE(topBase ,                         $
                                    ROW         = 1)
    ;Self.categoryBaseID = categoryBaseID

    value = 'Target:'
    aLabel                  = WIDGET_LABEL(targetBaseID  ,                  $
                                    value       = value ,                   $
                                    xSize       = 100 ,                     $
                                    /ALIGN_LEFT)

    TARGET_EVENT            = {eis_db_save_gui_Event}
    TARGET_EVENT.eis_db_save_gui   = Self
    TARGET_EVENT.Type       = "TARGET"
    Self.targetID           = WIDGET_DROPLIST(targetBaseID     ,            $
                                    Event_Pro   = Event_Pro         ,       $
                                    value       = (*Self.targetList)  ,     $
                                    /ALIGN_LEFT                       ,     $
                                    uValue      = TARGET_EVENT)

    ; Update Target droplist
    target = STRTRIM((*Self.eis_struct).target)
    WIDGET_CONTROL , Self.targetID  , get_value = allTarget
    targetIndex = WHERE(allTarget EQ target)
    IF (targetIndex[0] EQ -1) THEN targetIndex = 0
    WIDGET_CONTROL , Self.targetID , set_droplist_select = targetIndex[0]


ENDIF

; ______________________________________________________________________
;
; Add New / Update Entry
;
; ______________________________________________________________________

newOrUpdateBase             = WIDGET_BASE(topBase ,                         $
                                    ROW         = 1 )

value = 'Entry:'
aLabel                      = WIDGET_LABEL(newOrUpdateBase  ,               $
                                    value       = value ,                   $
                                    xSize       = 100 ,                     $
                                    /ALIGN_LEFT)

excButtonBase               = WIDGET_BASE(newOrUpdateBase ,                 $
                                    COLUMN      = 1 , /EXCLUSIVE)

NEW_EVENT                   = {eis_db_save_gui_Event}
NEW_EVENT.eis_db_save_gui = Self
NEW_EVENT.Type              = "NEW"
Self.newEntry               = WIDGET_BUTTON(excButtonBase,                  $
                                    value       = 'Create new'          ,   $
                                    Event_Pro   = Event_Pro,                $
                                    /NO_RELEASE    ,                        $
                                    uValue      = NEW_EVENT)

WIDGET_CONTROL , Self.newEntry , set_button = 1

UPD_EVENT                   = {eis_db_save_gui_Event}
UPD_EVENT.eis_db_save_gui   = Self
UPD_EVENT.Type              = "UPD"
UPDbutton                   = WIDGET_BUTTON(excButtonBase,                  $
                                    value       = 'Update existing'       , $
                                    Event_Pro   = Event_Pro,                $
                                    /NO_RELEASE    ,                        $
                                    uValue      = UPD_EVENT)


; ______________________________________________________________________
;
; Bottom base
;
; ______________________________________________________________________
bottomBase                  = WIDGET_BASE(Self.tlbID ,                      $
                                    ROW         = 1  ,                      $
                                    FRAME       = 1  ,                      $
                                    /GRID_LAYOUT)
;
; Apply Button
;
SAVE_EVENT                  = {eis_db_save_gui_Event}
SAVE_EVENT.eis_db_save_gui = Self
SAVE_EVENT.Type             = "APPLY"
SAVEbutton                  = WIDGET_BUTTON(bottomBase,                     $
                                    value       = ' Save to database... ',  $
                                    Event_Pro   = Event_Pro,                $
                                    uValue      = SAVE_EVENT)
;
; Quit Button
;
QUIT_EVENT                  = {eis_db_save_gui_Event}
QUIT_EVENT.eis_db_save_gui = Self
QUIT_EVENT.Type             = "QUIT"
quitbutton                  = WIDGET_BUTTON(bottomBase,                     $
                                    value       = ' Dismiss ',              $
                                    Event_Pro   = Event_Pro,                $
                                    uValue      = QUIT_EVENT)


END

;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_db_save_gui_Cleanup , wid

WIDGET_CONTROL , wid , get_uvalue = eis_db_save_gui_Event
OBJ_DESTROY    , eis_db_save_gui_Event.eis_db_save_gui

END
;______________________________________________________________________________
; Cleanup
;______________________________________________________________________________
PRO eis_db_save_gui::CleanUp

OBJ_DESTROY , Self.author_gui
PTR_FREE    , Self.categoryList
PTR_FREE    , Self.targetList
PTR_FREE    , Self.eis_struct

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

IF (N_ELEMENTS(author_struct) GT 0) THEN BEGIN

    (*Self.eis_struct).author = author_struct.author

ENDIF

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

tlbID = Self.tlbID

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

    Return, Self.tlbID
End

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

Widget_Control, Self.tlbID, _Extra=Widget_Control_Keywords

End

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

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

End

;______________________________________________________________________________
; Realize wrapper
;______________________________________________________________________________
PRO eis_db_save_gui::Realize

Widget_Control, Self.tlbID, /Realize

End

;______________________________________________________________________________
; XManager wrapper
;______________________________________________________________________________
PRO eis_db_save_gui::XManager

XMANAGER , "eis_db_save_gui" ,   Self.tlbID ,                                 $
    Event_Handler  = "eis_db_save_gui_EV",                                    $
    cleanup        = "eis_db_save_gui_Cleanup",                               $
    GROUP_LEADER   = Self.group_leader ,                                   $
    /NO_BLOCK

END

;______________________________________________________________________________
;
;______________________________________________________________________________
PRO eis_db_save_gui_Event__Define

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

;Get event handler structure containing eis_db_save_gui type object
Widget_CONTROL,Event.ID,get_uvalue = eis_db_save_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_db_save_gui's class member procedure "Handler"
eis_db_save_gui_Event.eis_db_save_gui->Handler,Event

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

WIDGET_CONTROL, Event.ID, Get_UValue = eis_db_save_gui_Event
CASE eis_db_save_gui_Event.Type OF
    "QUIT"        : Self->Control, /Destroy
    "APPLY"       : Self->saveLLToDatabase
    "NEW"         : ;stop ;WIDGET_CONTROL , Self.authorID , sensitive = 1
    "UPD"         : ;stop ;WIDGET_CONTROL , Self.authorID , sensitive = 0
    "ACRONYM"     : Self->newAcronymValue
    "TITLE"       : Self->newTitleValue
    "TARGET"      : Self->update_target
    "CATEGORY"    : Self->update_category
    ELSE          : print,eis_db_save_gui_Event.Type
ENDCASE

END
;______________________________________________________________________________
; Update Category
;______________________________________________________________________________
PRO eis_db_save_gui::update_category

; Get list of categories
WIDGET_CONTROL , Self.categoryID , get_value = allCategories
; Get selected item
index = WIDGET_INFO(Self.categoryID , /DROPLIST_SELECT)
; Update value
(*Self.eis_struct).category = STRTRIM(allCategories[index],2)

END
;______________________________________________________________________________
; Update Target
;______________________________________________________________________________
PRO eis_db_save_gui::update_target

; Get list of targets
WIDGET_CONTROL , Self.targetID , get_value = allTargets
; Get selected item
index = WIDGET_INFO(Self.targetID , /DROPLIST_SELECT)
; Update value
(*Self.eis_struct).target = STRTRIM(allTargets[index],2)

END
;______________________________________________________________________________
; Check Title formatted
;______________________________________________________________________________
PRO eis_db_save_gui::newTitleValue

text_select = WIDGET_INFO(Self.titleID , /TEXT_SELECT)

; Read user-supplied acronym - and check it's OK.
WIDGET_CONTROL , Self.titleID , get_value = newTitle
title = newTitle[0]

;IF (STRPOS(title , ' ' ) NE -1) THEN BEGIN
;    title = REPCHAR(title , ' ' , '_')
;    WIDGET_CONTROL , Self.titleID , set_value       = title ,               $
;                                    set_text_select = text_select
;ENDIF

IF (STRLEN(title) GT 100) THEN BEGIN
    title = STRMID(title , 0 , 99)
    WIDGET_CONTROL , Self.titleID , set_value       = title ,        $
                                    set_text_select = text_select
ENDIF

END
;______________________________________________________________________________
; Check Acronym formatted
;______________________________________________________________________________
PRO eis_db_save_gui::newAcronymValue

text_select = WIDGET_INFO(Self.acronymID , /TEXT_SELECT)

; Read user-supplied acronym - and check it's OK.
WIDGET_CONTROL , Self.acronymID , get_value = newAcronym
acronym = STRTRIM(newAcronym[0],2)

IF (STRPOS(acronym , ' ' ) NE -1) THEN BEGIN
    acronym = REPCHAR(acronym , ' ' , '_')
    WIDGET_CONTROL , Self.acronymID , set_value       = acronym ,        $
                                         set_text_select = text_select
ENDIF

IF (STRLEN(acronym) GT 20) THEN BEGIN
    acronym = STRMID(acronym , 0 , 19)
    WIDGET_CONTROL , Self.acronymID , set_value       = acronym ,        $
                                         set_text_select = text_select
ENDIF

END
;______________________________________________________________________________
; Apply
;______________________________________________________________________________
PRO eis_db_save_gui::saveLLToDatabase

; Acronym/Description must be unique
; Read user-supplied acronym - and check it's OK.
WIDGET_CONTROL , Self.acronymID , get_value = newAcronym
; Update ACRONYM
(*Self.eis_struct).acronym = newAcronym[0]

CASE Self.eis_struct_type OF
    0:  BEGIN
            db     = db_read_linelist_all()
            tag    = 'Line List'
            title  = (*Self.eis_struct).title
            unique = eis_title_unique( title , newAcronym[0] , /LINELIST)
        END
    1:  BEGIN
            db     = db_read_raster_all()
            tag    = 'Raster'
            title  = (*Self.eis_struct).title
            unique = eis_title_unique( title , newAcronym[0] , /RASTER)
        END
    2:  BEGIN
            db     = db_read_study_all()
            tag    = 'Study'
            WIDGET_CONTROL , Self.titleID , get_value = newTitle
            (*Self.eis_struct).title = newTitle[0]
            unique = eis_title_unique( newTitle[0] , newAcronym[0] , /STUDY)
        END
ENDCASE

; Which is selected - NEW entry or UPDATE entry = 1/0
newEntry = WIDGET_INFO(Self.newEntry  , /BUTTON_SET )

;;
;; Don't overwrite first (default) entry(ies)
;;
;IF ((*Self.eis_struct).id LT 2) AND (newEntry EQ 0) THEN BEGIN
;    mText = "Can't modify this " + tag + ". Aborting."
;    BEEP
;    dummy = DIALOG_MESSAGE(mText , /ERROR , DIALOG_PARENT = Self.tlbID)
;    RETURN
;ENDIF


;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
; Check TITLE is unique - Bail out if NOT
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
IF (newEntry EQ 1) AND (unique.unique_title EQ 0) THEN BEGIN
    BEEP
    mText = "This title already exists (" + tag + " ID = " +        $
            unique.exists_title + "). Modify it."
    complain = DIALOG_MESSAGE( mText ,                                      $
                                 DIALOG_PARENT = Self.tlbID,                $
                                 /ERROR )
    RETURN
ENDIF
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
; Check ACRONYM is unique - bail out if NOT
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
IF (newEntry EQ 1) AND (unique.unique_acron EQ 0) THEN BEGIN
    BEEP
    mText = "The acronym already exists (" + tag +" ID = " +                  $
             unique.exists_acron + "). Modify it."
    complain = DIALOG_MESSAGE( mText ,                                      $
                                 DIALOG_PARENT = Self.tlbID,                $
                                 /ERROR )
    RETURN
ENDIF
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
; Check AUTHOR is sensible
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
author = (*Self.eis_struct).author
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
; If we're creating a new database entry, get new ID
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
IF (newEntry EQ 1) THEN BEGIN
    nEntries            = N_ELEMENTS(db[0,*])
    (*Self.eis_struct).id = nEntries + 1
ENDIF

;
; OK this is where we get down to business !!!!
;
mText = "Are you sure you want to add this " + tag + " to the Database?"
sure  = DIALOG_MESSAGE(mText , DIALOG_PARENT = Self.tlbID , /QUESTION)
IF (sure EQ 'No') THEN RETURN

; Get DATE
get_utc , utc
(*Self.eis_struct).date = utc2str( utc , /DATE_ONLY , /STIME)


CASE Self.eis_struct_type OF
    0:  BEGIN
            CASE newEntry OF
                1:  db_save_linelist_entry_create , *Self.eis_struct , tlb = Self.tlbID
                0:  db_save_linelist_entry_update , *Self.eis_struct , tlb = Self.tlbID
            ENDCASE
            Self.parentClass->loadLineList , (*Self.eis_struct).id
        END
    1:  BEGIN
            CASE newEntry OF
                1:  db_save_raster_entry_create , *Self.eis_struct , tlb = Self.tlbID
                0:  db_save_raster_entry_update , *Self.eis_struct , tlb = Self.tlbID
            ENDCASE
            Self.parentClass->loadRaster , (*Self.eis_struct).id
        END
    2:  BEGIN
            CASE newEntry OF
                1:  db_save_study_entry_create , *Self.eis_struct , tlb = Self.tlbID
                0:  db_save_study_entry_update , *Self.eis_struct , tlb = Self.tlbID
            ENDCASE
            Self.parentClass->loadStudy , (*Self.eis_struct).id
        END
ENDCASE

; Destroy widget
Self->Control, /Destroy


END
;______________________________________________________________________________
; Define Data members
;______________________________________________________________________________
PRO	eis_db_save_gui__Define

    struct =	{ eis_db_save_gui                              ,               $
                    tlbID                 : 0L              ,               $
                    group_leader          : 0L              ,               $
                    parentClass           : OBJ_NEW()       ,               $
                    author_gui            : OBJ_NEW()       ,               $
                    acronymID             : 0L              ,               $
                    eis_struct            : PTR_NEW()       ,               $
                    newEntry              : 0L              ,               $
                    titleID               : 0L              ,               $
                    categoryID            : 0L              ,               $
                    targetID              : 0L              ,               $
                    categoryList          : PTR_NEW()       ,               $
                    targetList            : PTR_NEW()       ,               $
                    eis_struct_type       : 0B                              $
              }

END
