;+ 
;NAME:
;  fast_ui_load_data
;
;PURPOSE:
;  Generates the tab that loads fast data for the gui.
;
;
;HISTORY:
;$LastChangedBy: jimmpc1 $
;$LastChangedDate: 2017-10-16 13:14:00 -0700 (Mon, 16 Oct 2017) $
;$LastChangedRevision: 24170 $
;$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_1/projects/fast/spedas_plugin/fast_ui_load_data.pro $
;
;--------------------------------------------------------------------------------

pro fast_ui_load_data_event,event

  compile_opt hidden,idl2

  common fast_ui_load_saved, pa, energy

  err_xxx = 0
  Catch, err_xxx
  IF (err_xxx NE 0) THEN BEGIN
    Catch, /Cancel
    Help, /Last_Message, Output = err_msg
    Print, 'Error--See history'
    ok=error_message('An unknown error occured and the window must be restarted. See console for details.',$
      /noname, /center, title='Error in Load Data')
    if is_struct(state) then begin
      ;send error message
      FOR j = 0, N_Elements(err_msg)-1 DO state.historywin->update,err_msg[j]
      if widget_valid(state.baseID) && obj_valid(state.historyWin) then begin 
        spd_gui_error,state.baseid,state.historyWin
      endif
      ;update central tree, if possible
      if obj_valid(state.loadTree) then begin
        *state.treeCopyPtr = state.loadTree->getCopy()
      endif  
      ;restore state
      Widget_Control, event.TOP, Set_UValue=state, /No_Copy
    endif
    widget_control, event.top,/destroy
    RETURN
  ENDIF

  widget_control, event.handler, Get_UValue=state, /no_copy
  ;Options
  widget_control, event.id, get_uvalue = uval
  ;not all widgets are assigned uvalues
  if is_string(uval) then begin
    case uval of
      'INSTRUMENT': begin
        typelist = widget_info(event.handler,find_by_uname='typelist')
        widget_control,typelist,set_value=*state.typeArray[event.index],set_list_select=0
        paramList = widget_info(event.handler,find_by_uname='paramlist')
        widget_control,paramList,set_value=*(*state.paramArray[event.index])[0]
      end
      'TYPELIST': begin
        instrument = widget_info(event.handler,find_by_uname='instrument')
        text = widget_info(instrument,/combobox_gettext)
        idx = (where(text eq state.instrumentArray))[0]
        parameter = widget_info(event.handler,find_by_uname='paramlist')
        widget_control,parameter,set_value=*(*state.paramArray[idx])[event.index]
      end
      'CLEARPARAM': begin
        paramlist = widget_info(event.handler,find_by_uname='paramlist')
        widget_control,paramlist,set_list_select=-1
      end
      'CLEARDATA': begin
        ok = dialog_message("This will delete all currently loaded data.  Are you sure you wish to continue?",/question,/default_no,/center)
        if strlowcase(ok) eq 'yes' then begin
          datanames = state.loadedData->getAll(/parent)
          if is_string(datanames) then begin
            for i = 0,n_elements(dataNames)-1 do begin
              result = state.loadedData->remove(datanames[i])
              if ~result then begin
                state.statusBar->update,'Unexpected error while removing data.'
                state.historyWin->update,'Unexpected error while removing data.'
              endif
            endfor
          endif
          state.loadTree->update
          state.callSequence->clearCalls
        endif
      end   
      'DEL': begin
        dataNames = state.loadTree->getValue()
        if ptr_valid(datanames[0]) then begin
          for i = 0,n_elements(dataNames)-1 do begin
            result = state.loadedData->remove((*datanames[i]).groupname)
            if ~result then begin
              state.statusBar->update,'Unexpected error while removing data.'
              state.historyWin->update,'Unexpected error while removing data.'
            endif else begin
              ; store deletion in the call sequence object
              state.callSequence->adddeletecall,(*datanames[i]).groupname
            endelse
          endfor
        endif
        state.loadTree->update   
      end
      'ADD': begin
        instrument = widget_info(event.handler,find_by_uname='instrument')
        instrumentText = widget_info(instrument,/combobox_gettext)
        instrumentSelect = (where(instrumentText eq state.instrumentArray))[0]   
        type = widget_info(event.handler,find_by_uname='typelist')
        typeSelect = widget_info(type,/list_select)
        if typeSelect[0] eq -1 then begin
          state.statusBar->update,'You must select one type'
          state.historyWin->update,'FAST add attempted without selecting type'
          break
        endif
        typeText = (*state.typeArray[instrumentSelect])[typeSelect]
        parameter = widget_info(event.handler,find_by_uname='paramlist')
        paramSelect = widget_info(parameter,/list_select)
        if paramSelect[0] eq -1 then begin
          state.statusBar->update,'You must select at least one parameter'
          state.historyWin->update,'FAST add attempted without selecting parameter'
          break
        endif
        ;handle '*' type, if present, introduce all
        if in_set(0,paramSelect) then begin
          paramText = (*(*state.paramArray[instrumentSelect])[typeSelect])
        endif else begin
          paramText = (*(*state.paramArray[instrumentSelect])[typeSelect])[paramSelect]
        endelse
        ;CHeck time range
        timeRangeObj = state.timeRangeObj      
        timeRangeObj->getProperty,startTime=startTimeObj,endTime=endTimeObj
        startTimeObj->getProperty,tdouble=startTimeDouble,tstring=startTimeString
        endTimeObj->getProperty,tdouble=endTimeDouble,tstring=endTimeString
        if startTimeDouble ge endTimeDouble then begin
          state.statusBar->update,'Cannot add data unless end time is greater than start time.'
          state.historyWin->update,'FAST add attempted with start time greater than end time.'
          break
        endif
        ;Check pitch angle range
        If(state.pa[0] Lt 0.0) Then Begin
           state.statusBar->update,'Pitch angle minimum reset to 0 from negative value'
           state.historyWin->update, 'FAST ESA Pitch angle minimum reset to 0 from negative value'
           pa[0] = 0.0 & state.pa = pa
           widget_control, state.pa_min, set_value=0.0
        Endif
        If(state.pa[1] gt 360.0) Then Begin
           state.statusBar->update,'Pitch angle maximum reset to 360 from higher value'
           state.historyWin->update, 'FAST ESA Pitch angle maximum reset to 360 from higher value'
           pa[1] = 360.0 & state.pa = pa
           widget_control, state.pa_max, set_value=360.0
        Endif
        If(state.pa[1] Le state.pa[0]) Then Begin
           state.statusBar->update,'Pitch angle maximum Lt minimum, swapping'
           state.historyWin->update, 'FAST ESA Pitch angle maximum Lt minimum, swapping'
           pa = rotate(pa, 2) & state.pa = pa
           widget_control, state.pa_min, set_value=pa[0]
           widget_control, state.pa_max, set_value=pa[1]
        Endif
        ;Check energy range
        If(state.energy[0] Lt 0.0) Then Begin
           state.statusBar->update,'energy minimum reset to 0 from negative value'
           state.historyWin->update, 'FAST ESA energy minimum reset to 0 from negative value'
           energy[0] = 0.0 & state.energy = energy
           widget_control, state.energy_min, set_value=0.0
        Endif
        If(state.energy[1] gt 50000.0) Then Begin
           state.statusBar->update,'energy maximum reset to 50000 from higher value'
           state.historyWin->update, 'FAST ESA energy maximum reset to 50000 from higher value'
           energy[1] = 50000.0 & state.energy = energy
           widget_control, state.energy_max, set_value=50000.0
        Endif
        If(state.energy[1] Le state.energy[0]) Then Begin
           state.statusBar->update,'energy maximum Lt minimum, swapping'
           state.historyWin->update, 'FAST ESA energy maximum Lt minimum, swapping'
           energy = rotate(energy, 2) & state.energy = energy
           widget_control, state.energy_min, set_value=energy[0]
           widget_control, state.energy_max, set_value=energy[1]
        Endif

        widget_control, /hourglass
        loadStruc = { instrument:instrumentText  , $
                      datatype:typeText  , $
                      parameters:paramText, $
                      timeRange:[startTimeString, endTimeString],$
                      paRange:pa, energyRange:energy}   
        fast_ui_import_data, $
                                  loadStruc, $
                                  state.loadedData,$
                                  state.statusBar,$
                                  state.historyWin,$
                                  state.baseid,$
                                  overwrite_selections=overwrite_selections
        state.loadTree->update
        callSeqStruc = { type:'loadapidata', $
                         subtype:'fast_ui_import_data', $
                         loadStruc:loadStruc, $
                         overwrite_selections:overwrite_selections }
        state.callSequence->addSt, callSeqStruc
     end
;for ranges
      'PAMIN':Begin
         pa[0] = event.value
         state.pa = pa
      End
      'PAMAX':Begin
         pa[1] = event.value
         state.pa = pa
      End
      'EMIN':Begin
         energy[0] = event.value
         state.energy = energy
      End
      'EMAX':Begin
         energy[1] = event.value
         state.energy = energy
      End
      else:
    endcase
  endif
  Widget_Control, event.handler, Set_UValue=state, /No_Copy

  return
end

pro fast_ui_load_data,tabid,loadedData,historyWin,statusBar,treeCopyPtr,timeRangeObj,callSequence,loadTree=loadTree,timeWidget=timeWidget
  compile_opt idl2,hidden

  common fast_ui_load_saved, pa, energy

  ;load bitmap resources
  getresourcepath,rpath
  rightArrow = read_bmp(rpath + 'arrow_000_medium.bmp', /rgb)
  trashcan = read_bmp(rpath + 'trashcan.bmp', /rgb)
  
  spd_ui_match_background, tabid, rightArrow 
  spd_ui_match_background, tabid, trashcan
  
  topBase = Widget_Base(tabid, /Row, /Align_Top, /Align_Left, YPad=1,event_pro='fast_ui_load_data_event') 
  
  leftBase = widget_base(topBase,/col)
  middleBase = widget_base(topBase,/col,/align_center)
  rightBase = widget_base(topBase,/col)
  
  leftLabel = widget_label(leftBase,value='FAST Data Selection:',/align_left)
  rightLabel = widget_label(rightBase,value='Data Loaded:',/align_left)
  
  selectionBase = widget_base(leftBase,/col,/frame)
  
  treeBase = widget_base(rightBase,/col,/frame)
  
  addButton = Widget_Button(middleBase, Value=rightArrow, /Bitmap,  UValue='ADD', $
              ToolTip='Load data selection')
  minusButton = Widget_Button(middleBase, Value=trashcan, /Bitmap, $
                Uvalue='DEL', $
                ToolTip='Delete data selected in the list of loaded data')
  
  loadTree = Obj_New('spd_ui_widget_tree', treeBase, 'LOADTREE', loadedData, $
                     XSize=400, YSize=425, mode=0, /multi,/showdatetime)
                     
  loadTree->update,from_copy=*treeCopyPtr
  
  clearDataBase = widget_base(rightBase,/row,/align_center)
  
  clearDataButton = widget_button(clearDataBase,value='Delete All Data',uvalue='CLEARDATA',/align_center,ToolTip='Deletes all loaded data')
  
;data availability labels
  timeLabel = widget_label(selectionBase,value='FAST HR DCB data available from 1996-09-28 to 1998-10-09')
  timeLabel1 = widget_label(selectionBase,value='FAST ESA L2 data available from 1996-08-30 to 2009-09-30')
  
  timeWidget = spd_ui_time_widget(selectionBase,$
                                  statusBar,$
                                  historyWin,$
                                  timeRangeObj=timeRangeObj,$
                                  uvalue='TIME_WIDGET',$
                                  uname='time_widget',$
                                  startyear=1995)

  instrumentBase = widget_base(selectionBase,/row) 
  
  instrumentLabel = widget_label(instrumentBase,value='Instrument Type: ')
  
  instrumentArray = ['MAG', 'ESA']
  ninstruments = n_elements(instrumentArray)
  
  instrumentCombo = widget_combobox(instrumentBase,$
                                       value=instrumentArray,$
                                       uvalue='INSTRUMENT',$
                                       uname='instrument')
                                              
  typeArray = ptrarr(ninstruments)
  
  typeArray[0] = ptr_new(['HR_DCB'])
  typeArray[1] = ptr_new(['ESA_L2'])
                                     
  dataBase = widget_base(selectionBase,/row)
  typeBase = widget_base(dataBase,/col)
  typeLabel = widget_label(typeBase,value='Data Type: ')
  typeList = widget_list(typeBase,$
                          value=*typeArray[0],$
                          uname='typelist',$
                          uvalue='TYPELIST',$
                          xsize=16,$
                          ysize=15)
  
  widget_control,typeList,set_list_select=0
  
  mag_datatypes = ['DeltaB_DSC','DeltaB_GEI','DeltaB_SM','DeltaB_FAC','DeltaB_FAC_V','DeltaB_FAC_SP','B_GEI','DEL_MAG_FLAG','Torquer','Tweaker','MAG_QUAL_FLAG','B_DSC','B_SSC','Bharmonic_DSC','Spin_Freq','Spin_Phase','Orbit','pos_gei','vel_gei','B_model_gei','alt','lat','lng','ilat','ilng','mlt','flat','flng','B_foot_gei','sun_dir_gei','dip_orient_gei','Orbit_Value','Coupling_Matrix','Offsets','Spin_Axis','Spin_Phase_Delta']
  esa_datatypes = ['Ion_eflux_survey', 'Electron_eflux_survey', 'Ion_pad_survey', 'Electron_pad_survey', $
                   'Ion_eflux_burst', 'Electron_eflux_burst', 'Ion_pad_burst', 'Electron_pad_burst']
  paramArray = ptrarr(ninstruments)
  paramArray[0] = ptr_new(ptrarr(1))
  paramArray[1] = ptr_new(ptrarr(1))
  (*paramArray[0])[0] = ptr_new(['*',mag_datatypes])
  (*paramArray[1])[0] = ptr_new(['*',esa_datatypes])
                                                                
  paramBase = widget_base(dataBase,/col)
  paramLabel = widget_label(paramBase,value='Parameter(s):')
  paramList = widget_list(paramBase,$
                         value=*((*paramArray[0])[0]),$
                         /multiple,$
                         uname='paramlist',$
                         xsize=24,$
                         ysize=15)
                         

  clearTypeButton = widget_button(paramBase,value='Clear Parameter',uvalue='CLEARPARAM',ToolTip='Deselect all parameters types')
                                                           
  
;------------------------------------------------------------------------------
; Angle Range Limits, hacked from thm_ui_part_getspec_options
;------------------------------------------------------------------------------
  If(n_elements(pa) Ne 2) Then pa = [0,360]
        
  angle_range_label_base = widget_base(selectionBase, /row, /align_left)
  angle_range_base = widget_base(selectionBase, /col, /frame, ypad=8, xpad=5)

  angle_range_label = widget_label(angle_range_label_base, value='ESA Eflux Pitch Angle Range (min/max):')
  pa_range_base = widget_base(angle_range_base, /row, uname='pa_base')
  pa_min = spd_ui_spinner(pa_range_base, label='', value=pa[0], uvalue = 'PAMIN', $
                          tooltip = 'Minimum pitch angle used for energy distribution spectrograms.')
  pa_max = spd_ui_spinner(pa_range_base, label='', value=pa[1], uvalue = 'PAMAX',$
                          tooltip = 'Maximum pitch angle used for energy distribution spectrograms.')

;------------------------------------------------------------------------------
; Energy Range Limits
;------------------------------------------------------------------------------
  If(n_elements(energy) Ne 2) Then energy = [0,5.0e4]
  
  energy_range_label_base = widget_base(selectionBase, /row, xpad=0, ypad=0)
  energy_range_base = widget_base(selectionBase, /col, /frame, ypad=8, xpad=5 )
  energy_range_label = widget_label(energy_range_label_base, value='ESA PADist Energy Range (min/max):')
  energy_range_base2 = widget_base(energy_range_base, /row, uname='er_base2')
  energy_min = spd_ui_spinner(energy_range_base2, label='', value=energy[0], uvalue='EMIN', $
                              tooltip = 'Minimum energy used for ESA L2 Pitch Angle Distributions.', inc=100)
  energy_max = spd_ui_spinner(energy_range_base2, label='', value=energy[1], uvalue='EMAX', $
                              tooltip = 'Maximum energy used for ESA L2 Pitch Angle Distributions.', inc=100)

  state = {baseid:topBase,$
           loadTree:loadTree,$
           treeCopyPtr:treeCopyPtr,$
           timeRangeObj:timeRangeObj,$
           statusBar:statusBar,$
           historyWin:historyWin,$
           loadedData:loadedData,$
           callSequence:callSequence,$
           instrumentArray:instrumentArray,$
           typeArray:typeArray,$
           paramArray:paramArray,$
           pa:pa, energy:energy, $
           pa_min:pa_min, pa_max:pa_max, $
           energy_min:energy_min, energy_max:energy_max}
           
           
  widget_control,topBase,set_uvalue=state
                                  
  return

end