;+
; NAME:
;	SMEI_SEQUENCE::DELETE_MENU
;
;
; PURPOSE:
;	To interactively delete images from and/or sort a SMEI sequence
;
;
; CATEGORY:
;	SMEI_SEQUENCE
;
;
; CALLING SEQUENCE:
;	status = seqref -> delete_menu(group=group)
;
;
; INPUTS:
;
;
;
; OPTIONAL INPUTS:
;
;
;
; KEYWORD PARAMETERS:
;	group	long	A possible group leader for the menu
;
;
; 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
;	Fix memory leak and add sort: 13/1/03; SJT
;	Allow multiple deletes: 25/7/03
;	Fix another memory leak: 2/9/05; SJT
;	Add image numbers: 15/4/10; SJT
;-

pro ss_delete_event, event

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

lflag = 0b
case mnu of

    'PICK': *state.current = widget_info(event.id, /list_select)

    'UP': begin
        im = state.original -> get_image(*state.current)
        imv = im -> move(-1)
        if imv ne 0 then (*state.dlist)[[*state.current-1, *state.current]] $
          =  (*state.dlist)[[*state.current, *state.current-1]]
        *state.current = *state.current-1
        lflag = 1b
    end
    'DOWN': begin
        im = state.original -> get_image(*state.current)
        imv = im -> move(1)
        if imv ne 0 then (*state.dlist)[[*state.current+1, *state.current]] $
          =  (*state.dlist)[[*state.current, *state.current+1]]
        *state.current = *state.current+1
        lflag = 1b
    end
    'DELETE': begin
        imlist = *state.current
        if imlist[0] ne -1 then begin
            imlist = reverse(imlist[sort(imlist)]) ; delete from last
                                ; to first to avoid resequencing
            for j = 0, n_elements(imlist) -1 do $
              state.original -> delete_image, imlist[j]
            *state.dlist = state.original -> get_summary(/nohead, /numbered)
            *state.current = -1
            lflag = 1b
        endif
    end
    "DELETE_ALL": begin
        if smei_query(["Do you really want to", $
                       "delete ALL the images", $
                       "in the sequence?"], dialog_parent = event.top) $
          then begin
            while obj_valid((img = state.original -> get_first())) do $
              state.original -> delete_image, img
            widget_control, event.top, /destroy
            ptr_free, state.dlist, state.current
            return
        endif
    end
            
    'SORT': begin
        state.original -> sort
        *state.dlist = state.original -> get_summary(/nohead, /numbered)
        *state.current = -1
        lflag = 1b
    end

    'QUIT': begin
        widget_control, event.top, /destroy
        ptr_free, state.dlist, state.current
        return
    end
endcase

if lflag then $
  widget_control, state.alist, set_value = *state.dlist, $
  set_list_select = *state.current

if n_elements(*state.current) gt 1 then begin
    widget_control, state.delid, sensitive = 1
    widget_control, state.upid, sensitive = 0
    widget_control, state.downid, sensitive = 0
endif else begin
    sel = (*state.current)[0]
    widget_control, state.delid, sensitive = sel ne -1
    widget_control, state.upid, sensitive = sel ge 1
    widget_control, state.downid, sensitive = sel ne -1 and $
                    sel ne n_elements(*state.dlist)-1
endelse

widget_control, sbase, set_uvalue = state

end

pro smei_sequence::delete_menu, group = group

if widget_info(/active) and not keyword_set(group) then begin
    smei_msg, /error, ["smei_sequence::delete_menu must have a group", $
                       "leader if widgets are already present"]
    return
endif
                       
dlist = self -> get_summary(/nohead, /numbered)
nim = self -> get_count()

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

label = widget_label(base, $
                     value = 'SMEI Sequence delete/sort images')


sbase = widget_base(base, $
                    /column)

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


alist = widget_list(sbase, $
                    value = dlist, $
                    /multiple, $
                    uvalue = 'PICK', $
                    ysize = 12 < nim)

jb = widget_base(base, $
                 /row)

junk = widget_button(jb, $
                     value = 'Sort', $
                     uvalue = 'SORT')

upid = widget_button(jb, $
                     value = 'Up', $
                     uvalue = 'UP', $
                     sensitive = 0)

downid = widget_button(jb, $
                       value = 'Down', $
                       uvalue = 'DOWN', $
                       sensitive = 0)

delid = widget_button(jb, $
                      value = 'Delete', $
                      uvalue = 'DELETE', $
                      sensitive = 0)

junk = widget_button(jb, $
                     value = "Delete All", $
                     uvalue = "DELETE_ALL")

junk = widget_button(base, $
                     value = 'Quit', $
                     uvalue = 'QUIT')

state = {ss_delete_state, $
         original: self, $
         dlist: ptr_new(dlist), $
         alist: alist, $
         upid: upid, $
         downid: downid, $
         delid: delid, $
         current: ptr_new(-1l)}

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

xmanager, "ss_delete", base

end

         
