;Function thm_ui_temp_call_ctime, otp, err_msg = err_msg
;This only exists to catch errors gracefully, in case ctime bombs
;  otp = -1
;  err_msg = ''
;  err_xxx = 0
;  catch, err_xxx
;  If(err_xxx Ne 0) Then Begin
;    catch, /cancel
;    help, /last_message, output = err_msg
;    For j = 0, n_elements(err_msg)-1 Do print, err_msg[j]
;    Return, -1
;  Endif
;  ctime, trange_new, npoints = 2
;  Return, trange_new
;End

 ;+
;NAME:
; thm_ui_set_tlimits
;PURPOSE:
; A widget interface for setting time ranges for the thm_gui widget
;CALLING SEQUENCE:
; thm_ui_set_tlimits, master_widget_id
;INPUT:
; master_widget_id = the id number of the widget that calls this
;OUTPUT:
; none, the start and end time are set
;HISTORY:
; 9-may-2007, jmm, jimm@ssl.berkeley.edu
; 12-jul-2007, jmm, Removed ability to type in time values....
; 19-jul-2007, jmm, typed time values are back..
; 29-jul-2007, jmm, added cancel button
;$LastChangedBy:$
;$LastChangedDate:$
;$LastChangedRevision:$
;$URL:$
;
;-
Pro thm_ui_set_tlimits_event, event

  Common tlimits_saved, t0_sav, t1_sav, t0_init, t1_init
  Common saved_time_sel, time_selected
;start here
  widget_control, event.id, get_uval = uval
  If(uval Eq 'CANCEL') Then Begin
    widget_control, event.top, get_uval = state, /no_copy
    gui_id = state.gui_id & messw = state.messw
    widget_control, event.top, set_uval = state, /no_copy
    thm_ui_update_progress, gui_id, 'No Time limits chosen'
    widget_control, messw, set_val = 'No Time limits chosen'
    widget_control, event.top, /destroy
  Endif Else If(uval Eq 'EXIT') Then Begin
    widget_control, event.top, get_uval = state, /no_copy      
    thm_ui_update_progress, state.gui_id, 'End Choosing time limits'
    h = 'tlimit, '+''''+time_string(t0_sav)+''''+', '+ $
      ''''+time_string(t1_sav)+''''
    thm_ui_update_history, state.gui_id, h
    widget_control, event.top, set_uval = state, /no_copy      
    widget_control, event.top, /destroy
    tlimit, t0_sav, t1_sav
  Endif Else If(uval Eq 'STTIME_DISPLAY') Then Begin
    widget_control, event.top, get_uval = state, /no_copy
    widget_control, event.id, get_val = temp_string
    t0 = thm_ui_timefix(temp_string)
    If(event.type Le 2) Then Begin
      If(is_string(t0)) Then Begin
        t0_sav = time_double(t0)
        If(t1_sav Le t0_sav) Then Begin
          widget_control, state.messw, set_val = 'End Time is LE Start Time'
          thm_ui_update_progress, state.gui_id, 'End Time is LE Start Time'
        Endif Else Begin
          thm_ui_update_progress, state.gui_id, 'Valid Start Time selected'
        Endelse
      Endif Else Begin
        thm_ui_update_progress, state.gui_id, $
          'Bad time selection, No action taken'
      Endelse
    Endif
    widget_control, event.top, set_uval = state, /no_copy
  Endif Else If(uval Eq 'ENTIME_DISPLAY') Then Begin
    widget_control, event.top, get_uval = state, /no_copy
    widget_control, event.id, get_val = temp_string
    t1 = thm_ui_timefix(temp_string)
    If(event.type Le 2) Then Begin
      If(is_string(t1)) Then Begin
        t1_sav = time_double(t1)
        If(t1_sav Le t0_sav) Then Begin
          widget_control, state.messw, set_val = 'End Time is LE Start Time'
          thm_ui_update_progress, state.gui_id, 'End Time is LE Start Time'
        Endif Else Begin
          thm_ui_update_progress, state.gui_id, 'Valid End Time selected'
        Endelse
      Endif Else Begin
        thm_ui_update_progress, state.gui_id, $
          'Bad time selection, No action taken'
      Endelse
    Endif
    widget_control, event.top, set_uval = state, /no_copy
  Endif Else Begin
    widget_control, event.top, get_uval = state, /no_copy
    For j = 0, n_elements(state.button_arr)-1 Do $
      widget_control, state.button_arr[j], sensitive = 0
    Case uval Of
      'STTIME':Begin
        thm_ui_tselect, init_time = t0_sav
        t0 = time_selected
        If(is_struct(t0)) Then Begin
          t0_sav = time_double(t0)
;Set time in display
          widget_control, state.sttime_display, set_val = time_string(t0_sav)
;erorr check
          If(t1_sav Le t0_sav) Then Begin
            widget_control, state.messw, set_val = 'End Time is LE Start Time'
            thm_ui_update_progress, state.gui_id, 'End Time is LE Start Time'
          Endif Else Begin
            thm_ui_update_progress, state.gui_id, 'Valid Start Time selected'
          Endelse
        Endif Else Begin
          thm_ui_update_progress, state.gui_id, $
            'Bad time selection, No action taken'
        Endelse
      End
      'ENTIME':Begin
        thm_ui_tselect, init_time = t1_sav
        t1 = time_selected
        If(is_struct(t1)) Then Begin
          t1_sav = time_double(t1)
          widget_control, state.entime_display, set_val = time_string(t1_sav)
          If(t1_sav Le t0_sav) Then Begin
            widget_control, state.messw, set_val = 'End Time is LE Start Time'
            thm_ui_update_progress, state.gui_id, 'End Time is LE Start Time'
          Endif Else Begin
            thm_ui_update_progress, state.gui_id, 'Valid End Time selected'
          Endelse
        Endif Else Begin
          thm_ui_update_progress, state.gui_id, $
            'Bad time selection, No action taken'
        Endelse
      End
      'TLIMIT':Begin
;        trange_new = thm_ui_temp_call_ctime(trange_new, err_msg =
;        err_msg)
        widget_control, state.gui_id, get_uval = wstate, /no_copy
        If(ptr_valid(wstate.active_vnames)) Then Begin
          tvn = *wstate.active_vnames
        Endif Else tvn = ''
        widget_control, state.gui_id, set_uval = wstate, /no_copy
        If(is_string(tvn)) Then Begin
          tplot, tvn
          ctime, trange_new, npoints = 2
          If(trange_new[0] Ne -1) Then Begin
            t0_sav = trange_new[0] & t1_sav = trange_new[1]
            widget_control, state.sttime_display, set_val = time_string(t0_sav)
            widget_control, state.entime_display, set_val = time_string(t1_sav)
          Endif Else Begin
            thm_ui_update_progress, state.gui_id, 'Bad time Selection '
            widget_control, state.messw, set_val = 'Bad time Selection '
          Endelse
        Endif Else Begin
          thm_ui_update_progress, state.gui_id, 'No Active Dataset, No time selection '
          widget_control, state.messw, set_val = 'No Active Dataset, No time selection '
        Endelse
      End
      'RESET_TLIMIT':Begin
        t0_sav = t0_init & t1_sav = t1_init
        widget_control, state.sttime_display, set_val = time_string(t0_init)
        widget_control, state.entime_display, set_val = time_string(t1_init)
      End
    Endcase
    For j = 0, n_elements(state.button_arr)-1 Do $
      widget_control, state.button_arr[j], sensitive = 1
    widget_control, event.top, set_uval = state, /no_copy
  Endelse
End

Pro thm_ui_set_tlimits, proc_id

  Common tlimits_saved, t0_sav, t1_sav, t0_init, t1_init

;time selection widget
  timesel = widget_base(/col, /align_center, $
                        title = 'Time Selection Widget')
  timebase = widget_base(timesel, /row, /align_left, $
                        title = 'Time Selection Widget')
  timeselbase = widget_base(timebase, /column, /align_left, frame = 5)

; sttime button
  sttime_button = widget_base(timeselbase, /col, /align_left)
  sttimebut = widget_button(sttime_button, val = ' Choose Start time ', $
                            uval = 'STTIME', /align_left)
; entime button
  entime_button = widget_base(timeselbase, /col, /align_left)
  entimebut = widget_button(entime_button, val = ' Choose End time ', $
                            uval = 'ENTIME', /align_left)
;time display widget
  timedisplaybase = widget_base(timebase, /column, /align_left, frame = 5)
;set init values, if they don't exist
  widget_control, proc_id, get_uval = pstate, /no_copy
  widget_control, pstate.cw, get_uval = wstate, /no_copy
  gui_id = pstate.cw
  messw = pstate.messw
  If(n_elements(t0_sav) Eq 0 Or n_elements(t1_sav) Eq 0) Then Begin
     t0_sav = wstate.st_time & t1_sav = wstate.en_time
  Endif
  If(n_elements(t0_init) Eq 0 Or n_elements(t1_init) Eq 0) Then Begin
     t0_init = wstate.st_time & t1_init = wstate.en_time
  Endif
  widget_control, pstate.cw, set_uval = wstate, /no_copy
  widget_control, proc_id, set_uval = pstate, /no_copy

; sttime text
  sttime_display = widget_text(timedisplaybase, /edit, $
                               uval = 'STTIME_DISPLAY', $
                               val = time_string(t0_sav), $
                               xsize = 30, /all_events)
; entime text
  entime_display = widget_text(timedisplaybase, /edit, $
                               uval = 'ENTIME_DISPLAY', $
                               val = time_string(t1_sav), $
                               xsize = 30, /all_events)

;widget for tlimit and tlimit reset
  xbutton0 = widget_base(timebase, /col, /align_center)
;tlimit button
  tlimitbut = widget_button(xbutton0, val = ' Tlimits from Cursor ', $
                            uval = 'TLIMIT', /align_center)
;tlimit reset button
  tlimitresetbut = widget_button(xbutton0, val = ' Reset to Init value ', $
                            uval = 'RESET_TLIMIT', /align_center)
;widget for cancel and exit buttons
  xbutton = widget_base(timesel, /row, /align_center)
;cancel button
  cancelbut = widget_button(xbutton, val = ' Cancel ', $
                            uval = 'CANCEL', /align_center)
;exit button
  exitbut = widget_button(xbutton, val = ' Accept and Close ', $
                          uval = 'EXIT', /align_center)

  button_arr = [sttimebut, entimebut, tlimitbut, tlimitresetbut, exitbut, $
                cancelbut, sttime_display, entime_display]
  state = {proc_id:proc_id, $
           gui_id:gui_id, $
           messw:messw, $
           sttime_display:sttime_display, $
           entime_display:entime_display, $
           button_arr:button_arr}

  widget_control, timesel, set_uval = state, /no_copy
  widget_control, timesel, /realize
  xmanager, 'thm_ui_set_tlimits', timesel, /no_block

  Return
End