;+
; NAME:
;	SMEI_SEQUENCE::ADD_MENU
;
;
; PURPOSE:
;	To interactively add images to a SMEI sequence (old IDL)
;
;
; CATEGORY:
;	SMEI_SEQUENCE
;
;
; CALLING SEQUENCE:
;	status = seqref -> add_menu(group=group)
;
;
; INPUTS:
;
;
;
; OPTIONAL INPUTS:
;
;
;
; KEYWORD PARAMETERS:
;	group	long	A possible group leader for the menu
;	/no_progress	If set, then disable the progress bars (useful
;			if slow network means the progress bars are
;			slowing operation).
;	/noverify	If set, then trust the image header lists.		
;
;
; OUTPUTS:
;	status	1 or 0 for success or failure
;
;
; RESTRICTIONS:
;	If any managed widgets are present then the GROUP keyword MUST
;	be present.
;
;
; MODIFICATION HISTORY:
;	Original: 16/12/02; SJT
;	Hourglass TLM during read: 9/1/03; SJT
;	Show progress: 10/1/03; SJT
;	Support applying calc progs on load: 29/7/03; SJT
;	Update properly on picking directory: 3/10/03; SJT
;	Add projection handling: 16/2/04; SJT
;	Add copy start & end buttons and increment/decrement buttons:
;	26/7/05; SJT
;	Add no_progress keyword: 25/8/05; SJT
;	Update times on directory update: 2/2/10; SJT
;	Add noverify keyword: 11/12/12; SJT
;-

pro ss_change_dir, state, event, sipath = sipath, update = update

widget_control, event.top, sensitive = 0

if n_elements(sipath) eq 0 then sipath = event.value $
else widget_control, (*state).pathid, set_value = sipath

fdescs = ff_summary('*.fit*', path = sipath, filelist = files, $
                    startlist = starts, count = nfound, projections = $
                    projections, update = update, callid = event.top)

if nfound eq 0 then begin
    sipath = (*state).dir
    widget_control, event.top, sensitive = 1
    return
endif

idx = sort(starts)
fdescs = fdescs[idx]
files = files[*, idx]
starts = starts[idx]
projections = projections[idx]

mxfl = max(strlen(files[1, *]))
fmt = "(A"+string(mxfl, format = "(I0)")+")"
fnames = string(files[1, *], format = fmt)
islist = replicate(1b, nfound)

st = jd2doy(starts[0])
et = jd2doy(starts[nfound-1])

(*state).dir = sipath
*(*state).fnames = fnames
*(*state).fdescs = fdescs
*(*state).starts = starts
*(*state).islist = islist
*(*state).files = files
(*state).st = st[0:1]
(*state).et = et[0:1]
(*state).stop = (*state).et
(*state).start = (*state).st
*(*state).projections = projections

widget_control, (*state).syid, set_value = st[0]
widget_control, (*state).sdid, set_value = st[1]
widget_control, (*state).eyid, set_value = et[0]
widget_control, (*state).edid, set_value = et[1]

widget_control, event.top, sensitive = 1

end

pro ss_add_event, event

sbase = widget_info(event.top, /child)
widget_control, sbase, get_uvalue = state
widget_control, event.id, get_uvalue = mnu

tflag = 0b

case mnu of
    'DIR': begin
        ss_change_dir, state, event
        tflag = 1b
    end
    'PICK': begin
        sipath = dialog_pickfile(dialog_parent = event.top, $
                                 /directory, $
                                 file = (*state).dir, $
                                 /must_exist, $
                                 title = 'Source directory')
        if sipath ne '' then begin
            ss_change_dir, state, event, sipath = $
                           sipath
            tflag = 1b
        endif
    end
    'UPDATE': begin
        ss_change_dir, state, event, sipath = (*state).dir, /update
        tflag = 1b
    end

    'SYEAR': begin
        (*state).start[0] = event.value
        tflag = 1b
    end
    'SDAY': begin
        (*state).start[1] = event.value
        tflag = 1b
    end
    'SUP': begin
        jd = doy2jd((*state).start)+1
        doy = jd2doy(jd)
        (*state).start = doy[0:1]
        widget_control, (*state).syid, set_value = (*state).start[0]
        widget_control, (*state).sdid, set_value = (*state).start[1]
        tflag = 1d
    end
    'SDOWN': begin
        jd = doy2jd((*state).start)-1
        doy = jd2doy(jd)
        (*state).start = doy[0:1]
        widget_control, (*state).syid, set_value = (*state).start[0]
        widget_control, (*state).sdid, set_value = (*state).start[1]
        tflag = 1d
    end

    'ECOPY': begin
        (*state).start[0] = (*state).stop[0]
        (*state).start[1] = (*state).stop[1]
        widget_control, (*state).syid, set_value = (*state).start[0]
        widget_control, (*state).sdid, set_value = (*state).start[1]
        tflag = 1b
    end

    'EYEAR': begin
        (*state).stop[0] = event.value
        tflag = 1b
    end
    'EDAY': begin
        (*state).stop[1] = event.value
        tflag = 1b
    end
    'EUP': begin
        jd = doy2jd((*state).stop)+1
        doy = jd2doy(jd)
        (*state).stop = doy[0:1]
        widget_control, (*state).eyid, set_value = (*state).stop[0]
        widget_control, (*state).edid, set_value = (*state).stop[1]
        tflag = 1d
    end
    'EDOWN': begin
        jd = doy2jd((*state).stop)-1
        doy = jd2doy(jd)
        (*state).stop = doy[0:1]
        widget_control, (*state).eyid, set_value = (*state).stop[0]
        widget_control, (*state).edid, set_value = (*state).stop[1]
        tflag = 1d
    end

    'SCOPY': begin
        (*state).stop[0] = (*state).start[0]
        (*state).stop[1] = (*state).start[1]
        widget_control, (*state).eyid, set_value = (*state).stop[0]
        widget_control, (*state).edid, set_value = (*state).stop[1]
        tflag = 1b
    end

    'FULL': begin
        (*state).stop = (*state).et
        (*state).start = (*state).st
        tflag = 1b
    end

    'PROJECT': begin
        (*state).iproj = event.index-1
        tflag = 1b
    end
        
    'NEW': if ptr_valid((*state).chosen) then $
      *(*state).chosen = widget_info(event.id, /list_select) $
    else (*state).chosen = ptr_new(widget_info(event.id, $
                                               /list_select))

    'ALL': begin
        n = widget_info((*state).alist, /list_number)
        isel = lindgen(n)
        widget_control, (*state).alist, set_list_select = isel
        if ptr_valid((*state).chosen) then $
          *(*state).chosen = isel $
        else (*state).chosen = ptr_new(isel)
    end

    'COMP': (*state).icomp = (*state).icomp

    'QUIT': begin
        dflag = 1b
        if event.value eq 'DO' then (*state).state = 1 $
        else if event.value eq 'OP' then begin
            (*state).sop = smei_choose_sop(group = event.top)
            if (*state).sop eq '' then dflag = 0b $
            else (*state).state = 2
        endif else (*state).state = -1
        if (*state).state ge 1 then (*state).original ->  $
          set_sourcedir, (*state).dir
        if dflag then begin
            widget_control, event.top, /destroy
            return
        endif
    end
endcase

if tflag then begin
    *(*state).islist = *(*state).starts ge doy2jd((*state).start) and $
      *(*state).starts lt doy2jd((*state).stop)+1
    case (*state).iproj of
        0: locs = where(strpos(*(*state).projections, 'Aitoff') eq $
                        -1, nna)
        1: locs = where(strpos(*(*state).projections, 'Fisheye') eq $
                        -1, nna)
        2: locs = where(strpos(*(*state).projections, 'Rectang') eq $
                        -1, nna)
        else: nna = 0
    end
    if nna ne 0 then (*(*state).islist)[locs] = 0b

    locs = where(*(*state).islist, nin)
    if nin ne 0 then $
      widget_control, (*state).alist, set_value = (*(*state).fnames)[locs]+ $ $
      ' '+(*(*state).fdescs)[locs], set_list_select = -1, /sensitive $
    else  widget_control, (*state).alist, set_value = '', set_list_select $
      = -1, sensitive = 0

    ptr_free, (*state).chosen

    if mnu eq 'FULL' or mnu eq 'PICK' then begin
        sdoy = (*state).start
        edoy = (*state).stop
        widget_control, (*state).syid, set_value = sdoy[0]
        widget_control, (*state).sdid, set_value = sdoy[1]
        widget_control, (*state).eyid, set_value = edoy[0]
        widget_control, (*state).edid, set_value = edoy[1]
    endif
endif

issel = ptr_valid((*state).chosen) && (*(*state).chosen)[0] ge 0
for j = 0, 1 do widget_control, (*state).doids[j], sensitive = issel

end

pro smei_sequence::add_menu, group = group, no_progress = no_progress, $
                             noverify = noverify

if widget_info(/active) and not keyword_set(group) then begin
    smei_msg, /error, ["smei_sequence::add_menu must have a group", $
                       "leader if widgets are already present"]
    return
endif

sipath = self -> get_sourcedir()
if sipath eq '' then sipath = getenv('SMEI_IMAGES')
if sipath eq '' then sipath = getenv('PWD')

retry:


fdescs = ff_summary('*.fit*', path = sipath, filelist = files, $
                    startlist = starts, count = nfound, projections = $
                    projections, no_progress = no_progress, callid = $
                    group, noverify = noverify)

if nfound eq 0 then begin
    sipath = dialog_pickfile(dialog_parent = group, $
                             /directory, $
                             /must_exist, $
                             title = 'Select Aitoff directory')
    if sipath eq '' then return
    goto, retry
endif

; Create up & down arrow bitmaps
down =  bytarr(11, 6)
down[5, 0] = 255b
down[4:6, 1] = 255b
down[3:7, 2] = 255b
down[2:8, 3] = 255b
down[1:9, 4] = 255b
down[*, 5] = 255b
up = reverse(down, 2)
bdown = cvttobm(down)
bup = cvttobm(up)
xextra = 5

idx = sort(starts)
fdescs = fdescs[idx]
files = files[*, idx]
starts = starts[idx]
projections = projections[idx]
mxfl = max(strlen(files[1, *]))
fmt = "(A"+string(mxfl, format = "(I0)")+")"
fnames = string(files[1, *], format = fmt)
islist = replicate(1b, nfound)

icomp = 0

st = jd2doy(starts[0])
et = jd2doy(starts[nfound-1])


base = widget_base(/column, $
                   title = 'SMEI Sequence add images', $
                   group = group, $
                   modal = keyword_set(group))

label = widget_label(base, $
                     value = 'SMEI Sequence add images')

jb = widget_base(base, $
                 /row)

pathid = cw_ffield(jb, $
                   /text, $
                   xsize = 30, $
                   label = "Source directory:", $
                   value = sipath, $
                   uvalue = 'DIR')

junk = widget_button(jb, $
                     value = 'Pick...', $
                     uvalue = 'PICK')
junk = widget_button(jb, $
                     value = 'Update list', $
                     uvalue = 'UPDATE')

tbase = widget_base(base, $
                    /row)

jb0 = widget_base(tbase, $
                  /column)

jb = widget_base(jb0, $
                 /row)

syid = cw_ffield(jb, $
                 label = 'Start date (Y,D)', $
                 value = st[0], $
                 /int, $
                 xsize = 5, $
                 uvalue = 'SYEAR')

sdid = cw_ffield(jb, $
                 label = ',', $
                 value = st[1], $
                 /int, $
                 xsize = 4, $
                 uvalue = 'SDAY')
jbb = widget_base(jb, $
                  /column, $
                  xpad = 0, $
                  ypad = 0, $
                  space = 0)
junk = widget_button(jbb, $
                     value = bup, $
                     uvalue = 'SUP', $
                     x_bitmap_extra = xextra)
junk = widget_button(jbb, $
                     value = bdown, $
                     uvalue = 'SDOWN', $
                     x_bitmap_extra = xextra)

junk = widget_button(jb0, $
                     value = 'Copy end time here', $
                     uvalue = 'ECOPY')

jb0 = widget_base(tbase, $
                  /column)

jb = widget_base(jb0, $
                 /row)

eyid = cw_ffield(jb, $
                 label = 'End date (Y,D)', $
                 value = et[0], $
                 /int, $
                 xsize = 5, $
                 uvalue = 'EYEAR')

edid = cw_ffield(jb, $
                 label = ',', $
                 value = et[1], $
                 /int, $
                 xsize = 4, $
                 uvalue = 'EDAY')
jbb = widget_base(jb, $
                  /column, $
                  xpad = 0, $
                  ypad = 0, $
                  space = 0)
junk = widget_button(jbb, $
                     value = bup, $
                     uvalue = 'EUP', $
                     x_bitmap_extra = xextra)
junk = widget_button(jbb, $
                     value = bdown, $
                     uvalue = 'EDOWN', $
                     x_bitmap_extra = xextra)

junk = widget_button(jb0, $
                     value = 'Copy start time here', $
                     uvalue = 'SCOPY')

junk = widget_button(base, $
                     value = 'Use Full Data Range', $
                     uvalue = 'FULL')

junk = widget_droplist(base, $
                       title = 'Select projections to use:', $
                       value = ['All', 'Aitoff', 'Fisheye', $
                                'Rectangular'], $
                       uvalue = 'PROJECT')

sbase = widget_base(base, $
                    /column, $
                    /frame)

junk = widget_label(sbase, $
                    value = 'Available images')


alist = widget_list(sbase, $
                    value = fnames+'  '+fdescs, $
                    /multiple, $
                    uvalue = 'NEW', $
                    ysize = 12 < nfound)
junk = widget_button(sbase, $
                     value = 'Select all', $
                     uvalue = 'ALL')

junk = widget_droplist(base, $
                       value = ['No', 'Yes'], $
                       title = 'Compact images on loading?', $
                       uvalue = 'COMP')
widget_control, junk, set_droplist_select = icomp


junk = cw_bgroup(base, $
                 ['Load images', 'Load and Operate', 'Cancel'], $
                 /row, $
                 button_uvalue = ['DO', 'OP', 'DONT'], $
                 uvalue = 'QUIT', $
                 ids = doids)
for j = 0, 1 do widget_control, doids[j], sensitive = 0

state = ptr_new({ss_add_state, $
                 original: self, $
                 icomp: icomp, $
                 dir: sipath, $
                 start: st[0:1], $
                 stop: et[0:1], $
                 st: st[0:1], $
                 et: et[0:1], $
                 iproj: -1, $
                 fnames: ptr_new(fnames), $
                 fdescs: ptr_new(fdescs), $
                 starts: ptr_new(starts), $
                 projections: ptr_new(projections), $
                 islist: ptr_new(islist), $
                 files: ptr_new(files), $
                 chosen: ptr_new(), $
                 pathid: pathid, $
                 alist: alist, $
                 syid: syid, $
                 sdid: sdid, $
                 eyid: eyid, $
                 edid: edid, $
                 doids: doids, $
                 state: 0, $
                 sop: ''})

widget_control, label, set_uvalue = state
widget_control, base, /real

xmanager, "ss_add", base

if (*state).state eq 1 then begin
    files = *(*state).files
    locs = where(*(*state).islist)
    afiles = files[0, locs]+files[1, locs]
    if ptr_valid((*state).chosen) then begin
        use = *(*state).chosen
        if use[0] ne -1 then begin
            afiles = afiles[use]
            if not keyword_set(no_progress) then $
              pm = cw_progress(/column, $
                               title = 'Reading images', $
                               xsize = 200, $
                               ysize = 20, $
                               value = 0., $
                               max = n_elements(use))
            for j = 0, n_elements(use)-1 do begin
                imref = self -> add_image(afiles[j], compact = $
                                          (*state).icomp, /silent)
                if not keyword_set(no_progress) then $
                  widget_control, pm, set_value = $
                                  float(j+1)
            endfor
            if not keyword_set(no_progress) then $
              widget_control, pm, /destroy
        endif
    endif
    isgood = 1
 
endif else if (*state).state eq 2 then begin
    files = *(*state).files
    locs = where(*(*state).islist)
    afiles = files[0, locs]+files[1, locs]
    if ptr_valid((*state).chosen) then begin
        use = *(*state).chosen
        if use[0] ne -1 then begin
            afiles = afiles[use]
            ss = obj_new('SMEI_SEQUENCE', afiles, /noexpand)

            smei_calculate, ss1, file = (*state).sop, ss = ss ; Need the ss=ss
                                ; as smei_calculate only looks at the
                                ; $MAIN$ level.

            self -> concatenate, ss1
            obj_destroy, ss1
            obj_destroy, ss
        endif
    endif
endif

if widget_info(/valid, group) then widget_control, group, hourglass $
  = 0

ptr_free, (*state).fnames, (*state).fdescs, (*state).starts, $
          (*state).islist, (*state).files, (*state).chosen, $
          (*state).projections
ptr_free, state

end

         
