; $Id: browser.pro 7 2008-02-08 12:11:50Z Harald $
; Copyright (c) 2006, IWF/OAW. All rights reserved.
; Unauthorized reproduction prohibited.
;+
; NAME:
; MID_BROWSE
;
; PURPOSE:
; This software is used to browse and verify the ROSETTA/MIDAS
; archive data products.
;
; CATEGORY:
; Data Processing.
;
; CALLING SEQUENCE:
; Mid_Browse [, data_set_path]
;
; INPUT/OUTPUT:
; Settings are taken from and written to the [MIDAS DATA SET BROWSER]
; section in the idl_user.ini file which is located in the user's
; home directory.
;
; PROCEDURE:
; TBW
;
; REFERENCE:
; TBW
;
; MODIFICATION HISTORY:
; Written by: Harald Jeszenszky, IWF/OAW, Nov 2006.
;-
;-----------------------------------------------------------------------
; ROUTINE
; browser_data, name, data [, label, PATH=path]
;
; PURPOSE
; Extract data from the given PDS data file.
;-----------------------------------------------------------------------
PRO browser_data, name, data, label, PATH=path
; data = readpds(name, PATH=path, LABEL=label, /SILENT, /NOVERIFY)
mnem = STRMID(FILE_BASENAME(name), 0, 3)
; copy format files (if required)
CASE (mnem) OF
'CAH' : format = 'CAH_STRUCTURE.FMT'
'EVN' : format = 'EVN_STRUCTURE.FMT'
'FSC' : format = 'FSC_PREFIX.FMT'
'HK1' : format = 'HK1_STRUCTURE.FMT'
'HK2' : format = 'HK2_STRUCTURE.FMT'
'LIN' : format = 'LIN_STRUCTURE.FMT'
'SPA' : format = 'SPA_STRUCTURE.FMT'
'SPS' : format = 'SPS_PREFIX.FMT'
'TGH' : format = 'TGH_STRUCTURE.FMT'
; '???' : format = 'ROI_STRUCTURE.FMT'
ELSE : format = ''
ENDCASE
; IF (format NE '') THEN BEGIN
; src = FILEPATH(format, ROOT=path, SUB='LABEL')
; tgt = FILEPATH(format, ROOT=FILE_DIRNAME(name))
; IF (~FILE_TEST(tgt)) THEN $
; FILE_COPY, src, tgt $
; ELSE $
; format = ''
; ENDIF
data = readpds(name, HEADPDS=label, /SILENT)
; HELP, /FILES
; CLOSE, /ALL ; readpds does not free units !!!
; IF (format NE '') THEN $
; FILE_DELETE, tgt
; delete format files (if required)
; remove cr-lf and compress multiple empty lines
pos = STREGEX(label, '['+STRING(BYTE([10,13]))+']+$')
idx = WHERE(pos GE 0, cnt)
IF (cnt GT 0) THEN label[idx] = STRMID(label[idx], 0, TRANSPOSE(pos[idx]))
idx = WHERE(STRTRIM(label) NE '', cnt)
IF (cnt GT 0) THEN BEGIN
skip = (idx[cnt-1] EQ N_ELEMENTS(label)-1) ; skip last line?
next = idx[0:cnt-1-skip] + 1
idx2 = WHERE(STRTRIM(label[next]) EQ '', cnt2)
IF (cnt2 GT 0) THEN idx = [TEMPORARY(idx), next[idx2]]
label = label[idx[SORT(idx)]]
ENDIF ELSE $
label = ''
; get object name
CASE (mnem) OF
'CAH' : struct = { object:'CANTILEVER_HISTORY', label:label }
'EVN' : struct = { object:'MIDAS_EVENT_HISTORY', label:label }
'FSC' : struct = { object:'FREQUENCY_SCAN_DATA', label:label }
'HK1' : struct = { object:'HOUSEKEEPING_DATA', label:label }
'HK2' : struct = { object:'HOUSEKEEPING_DATA', label:label }
'LIN' : struct = { object:'LINE_SCAN_DATA', label:label }
'IMG' : struct = { object:'IMAGE_SCAN_DATA', label:label }
'TGH' : struct = { object:'TARGET_HISTORY', label:label }
'SPA' : struct = { object:'SPA_SCAN_DATA', label:label }
'SPS' : struct = { object:'SPS_SCAN_DATA', label:label }
ELSE : struct = { object:'UNKNOWN (' + mnem + ')', label:label }
ENDCASE
; prepare data
SWITCH (mnem) OF
'CAH' :
'EVN' :
'TGH' : BEGIN
n_recs = N_ELEMENTS(data.(1).(1))
text = STRARR(n_recs+1)
FOR i = 0, N_ELEMENTS(data.(1).names)-1 DO BEGIN
tname = SIZE(data.(1).(i+1), /TNAME)
CASE (tname) OF
'LONG' : value = ToStr(data.(1).(i+1), 'I0')
'STRING' : value = STRTRIM(data.(1).(i+1), 2)
'DOUBLE' : value = ToStr(data.(1).(i+1), 'F0.3')
ELSE : BEGIN
value = STRARR(n_recs)
MESSAGE, 'Data type not handled: ' + tname, /CONTINUE
END
ENDCASE
value = [data.(1).names[i], TEMPORARY(value)]
fcode = 'A' + (tname EQ 'STRING' ? '-' : '') + $
STRTRIM(MAX(STRLEN(value)), 1)
text += (i EQ 0 ? '' : ' ') + ToStr(value, fcode)
ENDFOR
struct = CREATE_STRUCT(struct, 'TEXT', text)
BREAK
END
'FSC' :
'HK1' :
'HK2' :
'LIN' :
'SPA' : BEGIN
FOR i = 0, N_ELEMENTS(data.(1).names)-1 DO BEGIN
IF (SIZE(data.(1).(i+1), /TNAME) EQ 'STRUCT') THEN BEGIN
FOR j = 1, N_TAGS(data.(1).(i+1)) DO BEGIN
struct = CREATE_STRUCT(TEMPORARY(struct), data.(1).names[i+j], data.(1).(i+1).(j-1))
ENDFOR
i = i + j
ENDIF ELSE $
struct = CREATE_STRUCT(TEMPORARY(struct), data.(1).names[i], data.(1).(i+1))
ENDFOR
IF (mnem EQ 'FSC') THEN $
struct = CREATE_STRUCT(TEMPORARY(struct), data.(2).(0), data.(2).(1))
BREAK
END
'IMG' : BEGIN
struct = CREATE_STRUCT(struct, 'BCR_IMAGE', data.(1))
BREAK
END
'SPS' : BEGIN
struct = CREATE_STRUCT(struct, 'TEXT', 'Data display not yet supported.')
END
ELSE : ; do nothing
ENDSWITCH
data = TEMPORARY(struct)
END ; browser_data
;-----------------------------------------------------------------------
; ROUTINE
; info = browser_info(data [, index])
;
; PURPOSE
; Extract textual information from the given data object.
;-----------------------------------------------------------------------
FUNCTION browser_info, data, index
IF (N_ELEMENTS(index) EQ 0) THEN index = 0
info = ''
CASE (data.object) OF
'FREQUENCY_SCAN_DATA' : BEGIN
info = ToStr(TAG_NAMES(data), 'A', MAX(STRLEN(TAG_NAMES(data))))
FOR i = 2, N_TAGS(data)-1 DO BEGIN
IF (i EQ 24 || i EQ 25) THEN CONTINUE
info[i] += ' = ' + STRTRIM(LONG(data.(i)[index]), 2)
ENDFOR
info[1] = ''
END
'LINE_SCAN_DATA' : BEGIN
info = ToStr(TAG_NAMES(data), 'A', MAX(STRLEN(TAG_NAMES(data))))
FOR i = 2, N_TAGS(data)-1 DO BEGIN
IF (i EQ 22 || i EQ 23) THEN CONTINUE
info[i] += ' = ' + STRTRIM(LONG(data.(i)[index]), 2)
ENDFOR
info[1] = ''
END
'SPA_SCAN_DATA' : BEGIN
info = ToStr(TAG_NAMES(data), 'A', MAX(STRLEN(TAG_NAMES(data))))
FOR i = 2, N_TAGS(data)-1 DO BEGIN
IF (i GE 23 && i LE 27) THEN CONTINUE
info[i] += ' = ' + STRTRIM(LONG(data.(i)[index]), 2)
ENDFOR
info[1] = ''
END
ELSE : ; do nothing
ENDCASE
info[0] = 'PRODUCT = ' + data.object
RETURN, info
END ; browser_info
;-----------------------------------------------------------------------
; ROUTINE
; browser_cleanup, id
;
; PURPOSE
; Save current settings, free data strutures and exit.
;-----------------------------------------------------------------------
PRO browser_cleanup, id
WIDGET_CONTROL, id, GET_UVALUE=ptr
ini_file, (*ptr).state, 'MIDAS DATA SET BROWSER', /SAVE
PTR_FREE, ptr
END ; browser_cleanup
;-----------------------------------------------------------------------
; ROUTINE
; browser_tree_event, ev
;
; PURPOSE
; Process tree widget event messages.
;-----------------------------------------------------------------------
PRO browser_tree_event, ev
CATCH, error
IF (error NE 0) THEN BEGIN
CATCH, /CANCEL
error_msg, /TRACEBACK, /ERROR
RETURN
ENDIF
WIDGET_CONTROL, ev.top, GET_UVALUE=ptr
WIDGET_CONTROL, ev.id, GET_UVALUE=file
name = FILE_BASENAME(file)
path = FILE_DIRNAME(file)
(*ptr).nodeVal = name
WIDGET_CONTROL, /HOURGLASS
CASE (1) OF
STREGEX(name, '(EVN|CAH|TGH|SPS)_.+\.$', /BOOL) : BEGIN
name = FILEPATH(name + 'LBL', ROOT_DIR=path)
browser_data, name, data, text, PATH=(*ptr).state.data_set_path
WIDGET_CONTROL, (*ptr).idInfo, SET_VALUE=browser_info(data)
WIDGET_CONTROL, (*ptr).idDraw, MAP=0
WIDGET_CONTROL, (*ptr).idTabl, MAP=1
WIDGET_CONTROL, (*ptr).idTabl, SET_VALUE=data.text
END
STRMATCH(name, 'HK?_*.', /FOLD_CASE) : BEGIN
name = FILEPATH(name + 'LBL', ROOT_DIR=path)
browser_data, name, data, text, PATH=(*ptr).state.data_set_path
WIDGET_CONTROL, (*ptr).idInfo, SET_VALUE=browser_info(data)
index = WIDGET_INFO((*ptr).idList, /DROPLIST_SELECT)
names = TAG_NAMES(data)
names = ['Select Plot Parameter...', names[2:*]]
IF (index LE 0) || (index GE N_ELEMENTS(names)) THEN index = 0
WIDGET_CONTROL, (*ptr).idList, SET_VALUE=names, $
SET_UVALUE=data, /NO_COPY, $
SET_DROPLIST_SELECT=index, $
SEND_EVENT={ID:0L, TOP:0L, HANDLER:0L, INDEX:index}
WIDGET_CONTROL, (*ptr).idTabl, MAP=0
WIDGET_CONTROL, (*ptr).idDraw, MAP=1
END
STRMATCH(name, 'FSC_*.') || STRMATCH(name, 'LIN_*.') : BEGIN
name = FILEPATH(name + 'LBL', ROOT_DIR=path)
browser_data, name, data, text, PATH=(*ptr).state.data_set_path
WIDGET_CONTROL, (*ptr).idInfo, SET_VALUE=browser_info(data)
index = WIDGET_INFO((*ptr).idList, /DROPLIST_SELECT)
count = N_ELEMENTS(data.(2))
names = 'DATA_RECORD_' + STRTRIM(INDGEN(count)+1, 2) + $
'_OF_' + STRTRIM(count, 2)
names = ['Select Plot Parameter...', TEMPORARY(names)]
IF (index LE 0) || (index GE N_ELEMENTS(names)) THEN index = 0
WIDGET_CONTROL, (*ptr).idList, SET_VALUE=names, $
SET_UVALUE=data, /NO_COPY, $
SET_DROPLIST_SELECT=index, $
SEND_EVENT={ID:0L, TOP:0L, HANDLER:0L, INDEX:index}
WIDGET_CONTROL, (*ptr).idTabl, MAP=0
WIDGET_CONTROL, (*ptr).idDraw, MAP=1
END
STRMATCH(name, 'IMG_*.') : BEGIN
name = FILEPATH(name + 'LBL', ROOT_DIR=path)
browser_data, name, data, text, PATH=(*ptr).state.data_set_path
WIDGET_CONTROL, (*ptr).idInfo, SET_VALUE=browser_info(data)
draw = WIDGET_INFO((*ptr).idDraw, /GEOMETRY)
dims = SIZE(data.(2), /DIMENSIONS)
fact = MAX(dims / [draw.xsize, draw.ysize])
dims = dims/fact
image = CONGRID(data.(2), dims[0], dims[1], /CENTER, /INTERP)
WSET, (*ptr).winNum
ERASE, 255
TV, BYTSCL(image), (draw.xsize-dims[0])/2, $
(draw.ysize-dims[1])/2, /DEVICE
WIDGET_CONTROL, (*ptr).idTabl, MAP=0
WIDGET_CONTROL, (*ptr).idDraw, MAP=1
END
STRMATCH(name, 'SPA_*.') : BEGIN
name = FILEPATH(name + 'LBL', ROOT_DIR=path)
browser_data, name, data, text, PATH=(*ptr).state.data_set_path
WIDGET_CONTROL, (*ptr).idInfo, SET_VALUE=browser_info(data)
index = WIDGET_INFO((*ptr).idList, /DROPLIST_SELECT)
count = N_ELEMENTS(data.(2))
names = 'DATA_RECORD_' + STRTRIM(INDGEN(count)+1, 2) + $
'_OF_' + STRTRIM(count, 2)
names = ['Select Plot Parameter...', TEMPORARY(names)]
IF (index LE 0) || (index GE N_ELEMENTS(names)) THEN index = 0
WIDGET_CONTROL, (*ptr).idList, SET_VALUE=names, $
SET_UVALUE=data, /NO_COPY, $
SET_DROPLIST_SELECT=index, $
SEND_EVENT={ID:0L, TOP:0L, HANDLER:0L, INDEX:index}
WIDGET_CONTROL, (*ptr).idTabl, MAP=0
WIDGET_CONTROL, (*ptr).idDraw, MAP=1
END
ELSE : BEGIN ; any other tree selection
WIDGET_CONTROL, (*ptr).idInfo, SET_VALUE=''
WIDGET_CONTROL, (*ptr).idList, SET_VALUE='No Plot Parameter Available'
WIDGET_CONTROL, (*ptr).idTabl, SET_VALUE=''
WSET, (*ptr).winNum
ERASE, 255
IF STRMATCH(name, '*.PDF') THEN BEGIN
ONLINE_HELP, BOOK=file, /FULL_PATH
text = 'File displayed in external browser.'
ENDIF ELSE IF STRMATCH(name, '*.PNG', /FOLD_CASE) THEN BEGIN
WIDGET_CONTROL, (*ptr).idTabl, MAP=0
WIDGET_CONTROL, (*ptr).idDraw, MAP=1
name = FILEPATH(name, ROOT_DIR=path)
ok = QUERY_PNG(name, info)
READ_PNG, name, image, r, g, b
draw = WIDGET_INFO((*ptr).idDraw, /GEOMETRY)
fact = MAX(info.dimensions / [draw.xsize, draw.ysize])
IF (fact GT 1.0) THEN BEGIN
info.dimensions = ROUND(info.dimensions/fact)
ENDIF
IF (~info.has_palette) THEN BEGIN
image = COLOR_QUAN(image, 1, r, g, b, COLORS=254)
ENDIF
image = CONGRID(image, info.dimensions[0], info.dimensions[1])
TVLCT, r, g, b, 1
TV, image + 1B, (draw.xsize-info.dimensions[0])/2, $
(draw.ysize-info.dimensions[1])/2, /DEVICE
text = ''
ENDIF ELSE IF FILE_TEST(file, /REGULAR) THEN BEGIN
blck = STRARR(1024)
ON_IOERROR, END_OF_DATA
OPENR, unit, file, /GET_LUN
WHILE NOT EOF(unit) DO BEGIN
READF, unit, blck
END_OF_DATA:
count = (FSTAT(unit)).TRANSFER_COUNT
IF (N_ELEMENTS(text) EQ 0) THEN $
text = blck[0:count-1] $
ELSE $
text = [TEMPORARY(text), blck[0:count-1]]
ENDWHILE
ON_IOERROR, NULL
FREE_LUN, unit
ENDIF ELSE BEGIN
text = ''
file = ''
ENDELSE
ENDELSE
ENDCASE
top = WIDGET_INFO((*ptr).idText, /TEXT_TOP_LINE)
WIDGET_CONTROL, (*ptr).idText, SET_VALUE=text, SET_TEXT_TOP=top
WIDGET_CONTROL, (*ptr).idFile, SET_VALUE=file
END ; browser_tree_event
;-----------------------------------------------------------------------
; ROUTINE
; browser_event, ev
;
; PURPOSE
; Process widget event messages.
;-----------------------------------------------------------------------
PRO browser_event, ev
ON_ERROR, 2
WIDGET_CONTROL, ev.top, GET_UVALUE=ptr
CASE (ev.id) OF
(*ptr).idExit : BEGIN
WIDGET_CONTROL, ev.top, /DESTROY
END
(*ptr).idList : BEGIN
WSET, (*ptr).winNum
LOADCT, 3, /SILENT
IF (ev.index EQ 0) THEN BEGIN
ERASE, 255
RETURN
ENDIF
ev.index = ev.index - 1
WIDGET_CONTROL, (*ptr).idList, GET_UVALUE=data, /NO_COPY
CASE (data.object) OF
'HOUSEKEEPING_DATA' : BEGIN
xdat = JULDAY(1, 1, 1958, 0) + (data.packet_obt_seconds+(data.packet_obt_fraction+32768D)/65536D)/86400D
sidx = (OBJPDS(data.label, 'COLUMN')).index[ev.index]
eidx = GET_INDEX(data.label, sidx)
offs = PDSPAR(data.label[sidx:eidx], 'OFFSET', COUNT=npar)
offs = (npar EQ 0) ? 0.0 : FLOAT(offs[0])
fact = PDSPAR(data.label[sidx:eidx], 'SCALING_FACTOR', COUNT=npar)
fact = (npar EQ 0) ? 1.0 : FLOAT(fact[0])
unit = PDSPAR(data.label[sidx:eidx], 'UNIT', COUNT=npar)
unit = (npar EQ 0 ? '' : ' [' + unit[0] + ']')
ydat = data.(ev.index+2)*fact + offs
ymin = MIN(ydat, MAX=ymax)
yrange = (ymin EQ ymax) ? [ymin-0.1,ymax+0.1] : [ymin,ymax]
PLOT, xdat, ydat, /YNOZERO, YRANGE=yrange, /NODATA, $
XTICKFORMAT='(C(CMOI02.2,"/",CDI02.2))', $
COLOR=0, BACKGROUND=255, YTICKFORMAT='(F0.1)', $
TITLE=(*ptr).nodeVal+'DAT', XTITLE='UTC', $
YTITLE=(TAG_NAMES(data))[ev.index+2]+unit
OPLOT, xdat, ydat, COLOR=192
END
'FREQUENCY_SCAN_DATA' : BEGIN
WIDGET_CONTROL, (*ptr).idInfo, $
SET_VALUE=browser_info(data, ev.index)
xdata = (FINDGEN(256)*data.frequency_step[ev.index] + $
data.start_frequency[ev.index])*6.984E-4
IF (SIZE(data.data_samples, /N_DIM) GT 1) THEN $
ydata = data.data_samples[*,ev.index]*3.0518E-4 $
ELSE $
ydata = data.data_samples*3.0518E-4
PLOT, xdata, ydata, XSTYLE=1, /YNOZERO, YRANGE=[0,10], /NODATA, $
TITLE=(*ptr).nodeVal+'DAT', XTICKFORMAT='(F0.1)', $
XTITLE='Frequency [Hz]', YTITLE='Amplitude [V]', $
COLOR=0, BACKGROUND=255
OPLOT, xdata, ydata, COLOR=192
PLOTS, data.frequency_at_max[ev.index]*6.984E-4, $
data.ac_maximum[ev.index]*3.0518E-4, $
PSYM=6, COLOR=128
END
'LINE_SCAN_DATA' : BEGIN
WIDGET_CONTROL, (*ptr).idInfo, $
SET_VALUE=browser_info(data, ev.index)
count = data.num_steps[ev.index]
xdata = LINDGEN(count)*data.step_size[ev.index] + $
data.x_origin[ev.index]
IF (SIZE(data.z_set_value, /N_DIM) GT 1) THEN $
ydata = data.z_set_value[0:count-1, ev.index] $
ELSE $
ydata = data.z_set_value[0:count-1]
yrange = FLOAT([MIN(ydata, MAX=max), max])
IF (yrange[0] EQ yrange[1]) THEN yrange += [-1,1]
PLOT, xdata, ydata, XSTYLE=1, /YNOZERO, /NODATA, $
COLOR=0, BACKGROUND=255, YTICKFORMAT='(I0)', $
XTICKFORMAT='(I0)', YRANGE=yrange, $
XTITLE='Position', YTITLE='Z SetValue', $
TITLE=(*ptr).nodeVal+'DAT'
OPLOT, xdata, ydata, COLOR=192
END
'SPA_SCAN_DATA' : BEGIN
WIDGET_CONTROL, (*ptr).idInfo, $
SET_VALUE=browser_info(data, ev.index)
plotwin = !P
ypltwin = !Y
!P.MULTI = [0,1,4]
!P.CHARSIZE = 2.0
!Y.MARGIN = [0,0]
!Y.OMARGIN=[4,2]
; xdata = data.z_pos_sample[*,ev.index]*1.0+32768
fact = [3.0518E-4, 3.0518E-4, 5.4932E-3, 1.0]
offs = [0.0, 0.0, 0.0, 32768.0]
yname = ['AC [V]', 'DC [V]', 'Phase [deg]', 'Z']
names = TAG_NAMES(data)
FOR i = 0, 3 DO BEGIN
ydata = data.(24+i)[*,ev.index]*fact[i] + offs[i]
PLOT, ydata, XSTYLE=1, /YNOZERO, $ ; YRANGE=[0,10], $
TITLE=(i eq 0 ? (*ptr).nodeVal+'DAT' : ''), $
XTICKFORMAT=(i EQ 3 ? '(F0.1)' : '(A1)'), $
YTITLE=yname[i], COLOR=0, BACKGROUND=255, /NODATA
OPLOT, ydata, COLOR=128
ENDFOR
!Y = ypltwin
!P = plotwin
END
ELSE : ; do nothing
ENDCASE
WIDGET_CONTROL, (*ptr).idList, SET_UVALUE=data, /NO_COPY
END
ELSE : BEGIN
HELP, /STRUC, ev
END
ENDCASE
END ; browser_event
;-----------------------------------------------------------------------
; ROUTINE
; mid_browse
;
; PURPOSE
; Main program of the MIDAS Data Set Browser software. Loads the
; default parameters, creates the GUI and starts the XMANAGER.
;-----------------------------------------------------------------------
PRO mid_browse, path, GROUP=group
CATCH, error
IF (error NE 0) THEN BEGIN
CATCH, /CANCEL
error_msg, /ERROR, /TRACEBACK
RETURN
ENDIF
;-------------------------------------------------------------------
; load state structure and default data set path
;-------------------------------------------------------------------
state = { $
data_set_path : '' $
}
ini_file, state, 'MIDAS DATA SET BROWSER', /LOAD
IF (N_ELEMENTS(path) EQ 0) THEN BEGIN
path = DIALOG_PICKFILE(PATH=state.data_set_path, /DIRECTORY, $
/MUST_EXIST)
IF (path EQ '') THEN $
MESSAGE, 'Data set path not specified.'
ENDIF ELSE BEGIN
IF (NOT FILE_TEST(path, /DIRECTORY)) THEN $
MESSAGE, 'Given data set path not found.'
ENDELSE
state.data_set_path = path
IF (N_ELEMENTS(group) EQ 0) THEN group = 0L
lsize = 150
ffont = 'Courier New*14'
LOADCT, 3, /SILENT
DEVICE, DECOMPOSED=0
tree = path
root = -1
index = 0
count = 1
regex = PATH_SEP() + '*DATA.*'
IF (!VERSION.OS_FAMILY EQ 'Windows') THEN regex = PATH_SEP() + regex
WHILE (index LT count) DO BEGIN
IF (FILE_TEST(tree[index], /DIRECTORY)) THEN BEGIN
isData = STREGEX(STRMID(tree[index], STRLEN(path)), regex, /BOOL)
search = FILEPATH('*', ROOT_DIR=tree[index])
lst = FILE_SEARCH(search, /TEST_DIRECTORY, COUNT=cnt)
IF (cnt GT 0) THEN BEGIN
tree = [TEMPORARY(tree), lst]
root = [TEMPORARY(root), REPLICATE(index, cnt)]
count += cnt
ENDIF
IF (isData) THEN BEGIN
lst = FILE_SEARCH(search+'.LBL', /TEST_REGULAR, COUNT=cnt)
IF (cnt GT 0) THEN $
lst = STRMID(lst, 0, TRANSPOSE(STRLEN(lst)-3))
ENDIF ELSE $
lst = FILE_SEARCH(search, /TEST_REGULAR, COUNT=cnt)
IF (cnt GT 0) THEN BEGIN
tree = [TEMPORARY(tree), lst]
root = [TEMPORARY(root), REPLICATE(index, cnt)]
count += cnt
ENDIF
ENDIF
++index
ENDWHILE
;-------------------------------------------------------------------
; get S/W revision and show information in main window title
;-------------------------------------------------------------------
@RELEASE
txt = program + ' - Revision '
ids = STRSPLIT(revision, /EXTRACT, COUNT=cnt)
IF (cnt NE 5) THEN $
txt = txt + '???' $
ELSE $
txt = txt + ids[1] + ' ' + ids[3]
;-------------------------------------------------------------------
; create widget hierarchy
;-------------------------------------------------------------------
idMain = WIDGET_BASE(TITLE=txt, /COLUMN, GROUP=group, TLB_FRAME=1)
idRow = WIDGET_BASE(idMain, /ROW)
idBase = WIDGET_BASE(idRow, /COLUMN, /FRAME)
idTree = WIDGET_TREE(idBase, XSIZE=280, YSIZE=280)
idJunk = WIDGET_LABEL(idBase, VALUE='Data File Attributes')
idInfo = WIDGET_TEXT(idBase, YSIZE=25, FONT=ffont)
idJunk = WIDGET_LABEL(idBase, VALUE='Plot Parameter Selection')
idList = WIDGET_DROPLIST(idBase, VALUE='No Plot Parameter Available', $
XSIZE=280)
idNode = LONARR(N_ELEMENTS(tree))
idNode[0] = WIDGET_TREE(idTree, VALUE=FILE_BASENAME(path), /FOLDER, $
/EXPANDED, UVALUE=tree[0], $
EVENT_PRO='browser_tree_event')
FOR i = 1, N_ELEMENTS(tree) - 1 DO BEGIN
dir = FILE_TEST(tree[i], /DIRECTORY)
idNode[i] = WIDGET_TREE(idNode[root[i]], VALUE=FILE_BASENAME(tree[i]), $
FOLDER=dir, UVALUE=tree[i], $
EVENT_PRO='browser_tree_event')
ENDFOR
idBase = WIDGET_BASE(idRow, /COLUMN, /FRAME)
idFile = WIDGET_LABEL(idBase, VALUE=' ', /DYNAMIC, /SUNKEN_FRAME)
idText = WIDGET_TEXT(idBase, XSIZE=80, YSIZE=25, FONT=ffont, /SCROLL)
idBase = WIDGET_BASE(idBase) ; , XPAD=0, YPAD=0, SPACE=0)
idBmap = WIDGET_BASE(idBase, MAP=1)
idDraw = WIDGET_DRAW(idBmap, YSIZE=300, /FRAME)
idBmap = WIDGET_BASE(idBase, MAP=0)
idTabl = WIDGET_TEXT(idBmap, XSIZE=80, YSIZE=20, FONT=ffont, /SCROLL)
idBase = WIDGET_BASE(idMain, /ROW)
idExit = WIDGET_BUTTON(idMain, VALUE='Exit Data Set Browser')
;-------------------------------------------------------------------
; create state structure and realize widgets
;-------------------------------------------------------------------
ptr = PTR_NEW({ $
idMain : idMain, $
idTree : idTree, $
idFile : idFile, $
idText : idText, $
idList : idList, $
idDraw : idDraw, $
idTabl : idTabl, $
idInfo : idInfo, $
idExit : idExit, $
fldFont : ffont, $
winNum : 0L, $
nodeVal : '', $
state : state $
})
WIDGET_CONTROL, idMain, /REALIZE, SET_UVALUE=ptr
geometry = WIDGET_INFO(idText, /GEOMETRY)
xsize = geometry.scr_xsize - geometry.xoffset
WIDGET_CONTROL, idFile, XSIZE=xsize
WIDGET_CONTROL, idDraw, XSIZE=xsize, GET_VALUE=wnum
(*ptr).winNum = wnum
ERASE, 255
;-------------------------------------------------------------------
; update widgets and start XMANAGER
;-------------------------------------------------------------------
XMANAGER, 'browser', idMain, CLEANUP='browser_cleanup', /NO_BLOCK
END ; mid_browse
; $MAIN$
; mid_browse, 'D:\Daten\Midas\Archiving\RO-C-MIDAS-3-ESC4-SAMPLES-V1.0'
; mid_browse, 'D:\Daten\Midas\Archiving\RO-X-MIDAS-3-EAR3-PC10-V1.0'
; END ; $MAIN$