@opsdb
pro xset_chains_event, event
common xset_chains_blk3, info
;
qdebug = 1
if (qdebug) then print, event_name(event)
widget_control,event.top,get_uvalue=all
;
case (strtrim(event_name(event),2)) of
   ;----------------- Pulldown Button Event (?) ------------------------
   "": begin
	ss = where(all.id_pd eq event.id)
	id = all.id_text(ss/2)
	str = strmid(event.value, strpos(event.value, '.')+1, 99)
	if (qdebug) then print, id, str
	widget_control, id, set_value=str
	all.out(ss/2) = str
	;
	ss2 = where(info.label eq str)
	cam_file = concat_dir('/mdisw/cfl/flight/dep', info(ss2).forv)
	cam = strtrim(rd_tfile(cam_file, nocomment='#'),2)
	cam = cam(where(cam ne ''))
	cam = strupcase(cam(6:*))
	cam = cam(where(strpos(cam, 'NEST') eq -1))
	;;mat = str2cols(cam, ncols=4)
	cam = strcompress(cam)
	n = n_elements(cam)
	varr = strarr(n)
	for i=0,n-1 do varr(i) = (str2arr(cam(i), delim=' '))(3)
	if (n eq 1) then str = varr(0) else str = arr2str(varr(uniq(varr, sort(varr))))
	widget_control, all.id_text2(ss/2), set_value=str
   end
   ;----------------- Button Events ------------------------
   "BUTTON":begin                               ; option selection
      case strupcase(get_wvalue(event.id)) of
	 ;------ Main buttons
         "QUIT": begin
		widget_control, event.top,/destroy
	    end
	 "RESET SELECTIONS": begin
		all.out(*) = ''
		all.offset_text(*) = ''
		for i=0,7 do widget_control, all.id_text(i), set_value=''
		for i=0,7 do widget_control, all.id_text2(i), set_value=''
		for i=0,19 do widget_control, all.id_offset(i), set_value=''
	    end
	 "WRITE OUT FILE": begin
		out = ['program "%Z% MODULE: %M% RELEASE: %R%.%L% CREATED: %G% %U%"', $
			'#=======================================================', $
			'source "' + all.outfil + '"', $
			'descr "set_chains - Sets the chain addresses"', $
			'#', $
			'# File created: ' + ut_time() + ' UT  by ' + get_user(), $
			'#']
		for i=0,7 do begin
		    if (all.out(i) eq '') then begin
			addr = 'ffff'x
			name = 'None'
		    end else begin
			name = all.out(i)
			ss = where(info.label eq name)
			addr = info(ss).index
		    end
		    fmt = '(i5, 2x, "0x", z4.4, "      ## ", i5, 3x, a)'
		    if (i eq 0) then out = [out, 'tcb mbsqreg' + string(73, addr, addr, name, format=fmt)]
		    out = [out, 'tcb mbsqreg' + string(151+i, addr, addr, name, format=fmt)]
		end
		out = [out, ' ']
		for i=0,19 do if (all.offset_text(i) ne '') then begin
		    v = all.offset_text(i)
		    arr = str2arr(v)
		    if (n_elements(arr) ne 2) then begin
			print, 'Offset must be two elements: ' + v
		    end else begin
			addr = '4098'x + i * 4
			offset = arr(1)*1024L + arr(0)
			low = offset mod 2L^16
			high = offset / (2L^16)            
			fmt = '("tcblock mbdpml ", 4(" 0x", Z4.4), "  ##", i2, 2x, a)'
			out0 = string('1000'x, addr, low, high, i, v, format=fmt)
			out = [out, out0]
		    end
		end
		prstr, out
		prstr, out, file=all.outfil
		all.qwritten = 1
	    end
	 "FREEZE AND CERTIFY": begin
		qok = 1
		if (not all.qwritten) then begin
		    tbeep, 4
		    print, 'You must write the file out before freezing/certifying'
		    qok = 0
		end
		host = get_host(/short)
		if (host ne 'mdisas') and (host ne 'mdicmd') then begin
		    tbeep, 4
		    print, 'You must be on mdisas or mdicmd to freeze/certify
		    qok = 0
		end
		if (get_user() eq 'mdi') then begin
		    tbeep, 4
		    print, 'You cannot be user MDI to certify'
		    qok = 0
		end
		if (qok) then begin
		    break_file, all.outfil, dsk_log, dir, filnam, ext
		    spawn, 'freeze ' + all.outfil
		    spawn, ['latest', filnam+ext], /noshell, result
		    spawn, 'certify ' + result(0)
		end
	    end
          else: message,/info,"UNKNOWN BUTTON:   " + strupcase(get_wvalue(event.id))
       endcase
   endcase 
   ;----------------- Text Events ------------------------
   "TEXT_CH": begin
            newv = get_wvalue(event.id)
	    ss = where(all.id_offset eq event.id)
	    all.offset_text(ss) = newv
	end
   ;----------------- List Events ------------------------
   "LIST": begin
	case event.id of
	    all.id_filelist: begin
		    mapx, event.top,/map,/show,sensitive=0
		    filnam = files(event.index)
		    filnam = strmid(filnam, 0, 13)	;strip _01 and .tfr
		    infil = concat_dir(dir, filnam)
		    widget_control, all.id_file, set_value=infil
		    if (max(file_exist(infil+'*')) eq 1) then begin
			str_info = 'No data in ' + infil
			list_tfi, infil, info, str_info, /quiet
			widget_control, all.id_images, set_value=str_info + '  '
		    end else begin
			tbeep, 3
			print, 'XDISP_TFR: Input file does not exist: ', infil
		    end
		    mapx, event.top,/map,/show,sensitive=1
	       end
	    all.id_images: begin
		    mapx, event.top,/map,/show,sensitive=0
		    read_mdi, infil, event.index, img, head
		    if (n_elements(img(0,*)) eq 1) then begin
			img0 = temporary(img)
			img = mk_dpc_image(all.disp_size, img0, head=head, missing=min(img0))
			if (n_elements(img) eq 1) then img = bytarr(2,2)
		    end
		    if (n_elements(img(*,0)) ne all.disp_size) then img = congrid(img, all.disp_size, all.disp_size)
		    tvscl, img
		    wshow
		    print, 'Displayed image ', event.index, ' of file ', infil
		    mapx, event.top,/map,/show,sensitive=1
	       end
	endcase
   endcase
endcase

all2 = all
widget_control,event.top, set_uvalue=all, bad_id=destroyed	;update structure holding all of the info

return
end

;-------------------------------------------------------------
pro xset_chains, outfil=outfil, charsize=charsize
;
;+
;NAME:
;	xset_chain
;PURPOSE:
;	To allow a user to build a "set_chain.src" file for MDI observing
;SAMPLE CALLING SEQUENCE:
;	xset_chains
;	xset_chains, charsize=8
;HISTORY:
;	Created 23-Aug-96 by M.Morrison
;	26-Aug-96 (MDM) - Corrected the missing "0x" for the .src file
;	28-Aug-96 (MDM) - Added offset setting option
;			- Modified output filename to have the year/month
;			- Showed the list of offset entries used 
;	 2-Dec-96 (MDM) - Changed default font size from 12 to 6
;	 4-Dec-96 (CED) - Split the chains menus in half; changed default
;			  font size to 9.
;-
;
common xset_chains_blk3, info
;
fid = strmid(ex2fid( anytim2ex( ut_time() ) ), 0, 4)
if (n_elements(outfil) eq 0) then outfil = concat_dir(getenv('HOME'), 'set_chains' + fid + '.src')
;
setenv, 'MDI_OPSDB_TYPE=PREP'
opsdb_print, info, /active, /cam, /sort_id
n1 = (n_elements(info)+1)/2
n2 = (n_elements(info))/2
print,"n1=",n1,"; n2=",n2
cam_desc1 = replicate({flags: 0, name: ''}, n1+1)
cam_desc1.name = ['Cam-', ((info.label)(0:n1-1))]
cam_desc1.flags = [1, intarr(n1)]

cam_desc2 = replicate({flags: 0, name: ''}, n2+1)
cam_desc2.name = ['-paigns', ((info.label)(n1:n1+n2-1))]
cam_desc2.flags = [1,intarr(n2)]

;cam_desc = replicate({flags: 0, name: ''}, n)
;cam_desc.name = [info.label]
;cam_desc.flags = [intarr(n)+1]
;
n = 8
all = { out:  strarr(n), $
        id_text: lonarr(n), $
        id_text2: lonarr(n), $
	id_pd: lonarr(n*2), $
        base: 0L, $
	info: info, $
	outfil: outfil, $
	offset_text: strarr(20), $
	id_offset: lonarr(20), $
	qwritten: 0}
;
if (n_elements(charsize) eq 0) then charsize = 9
font = get_xfont(closest=charsize,/only_one,/fixed)
if (getenv('MDI_DEF_FONT') ne "") then font = getenv('MDI_DEF_FONT')
widget_control, default_font=font
device, font=font

base00=widget_base(/column,title='XSET_CHAINS', xoff=0, yoff=0)
xmenu, ['QUIT', 'Reset Selections', 'Write out file', 'Freeze and Certify'], $
	base00, $
	buttons=main_buts, /row

base0=widget_base(base00, /column)

for i=0,7 do begin
    oneline  = widget_base(base0, /row)
    str = 'Chain Campaign #' + strtrim(i+1,2)
    xx = widget_label(oneline, value = str)
    id_pd1= cw_pdmenu(oneline, cam_desc1, /RETURN_FULL_NAME, yoffset=(-4-2*i)*100)
    id_pd2 = cw_pdmenu(oneline, cam_desc2, /RETURN_FULL_NAME, xoffset = 30, yoffset=(-4-2*i)*100)
    id_tx = widget_text(oneline, xsize=25, ysize=1)
    xx = widget_label(oneline, value = ' Offsets Used:')
    id_tx2 = widget_text(oneline, xsize=8, ysize=1)
    all.id_text(i) = id_tx
    all.id_text2(i) = id_tx2
    all.id_pd(i*2) = id_pd1
    all.id_pd(i*2+1)=id_pd2
end

for i=0,19 do begin
    if ((i mod 4) eq 0) then oneline  = widget_base(base0, /row)
    str = 'Offset #' + string(i,format='(i2.2)')
    xx = widget_label(oneline, value = str)
    id_tx = widget_text(oneline, /editable, xsize=10, ysize=1)
    all.id_offset(i) = id_tx
end
    

widget_control,set_uvalue=all, base00
widget_control,base0,/realize
widget_control,set_uvalue=all, base00
xmanager, 'xset_chains', base00

;
return
end
