pro mk_raster, setup_structure, modal=modal, group_leader=group_leader,$
               font=font,fix_desc=fix_desc


;
;  common block source
;
@tplan_com

;
;  define the structures to be used
;
tplan_struct

;
; results will be saved in the observation/raster definition structure
;
tp_obs = {tp_obs_rec}
tp_obs.line_w.x_pos = -1
;
;  initial checks
;
if (!d.flags and 65536) eq 0 then message,'Widgets are NOT available.'

;
;  check not already in use
;  (if not called by a "living" widget then do a reset via XKILL
;

if not xalive(group_leader) then xkill,/all else begin
 if xregistered('mk_raster') then begin
   print,'CDS mk_raster program is already registered.'
   return
 endif
endelse

;
;  set only possible graphics device and load LUT
;
set_plot,'X'
tp_coltable

;
;  the base widget is all-screen and column-orientated
;
if not keyword_set(font) then begin
;   font = get_dfont() & font = font(0)
   font = '-adobe-helvetica-bold-r-normal--0-120-75-75-p-0-iso8859-1'
endif
font=get_dfont(font) & font=font(0)

device, get_screen_size = sz
if (sz(0) ge 1280) and (sz(1) ge 1024) then sz(*) = 0
sz = sz < [1280,1024]
base = widget_base(title='CDS Technical Planning - raster definition',xoff=100,$
                   /column,/frame,x_scroll=sz(0),y_scroll=sz(1))

;
;  the TOP widget is where all the user/numerical/text input takes place
;
top = widget_base(base,/row,space=1)

;
;  the left hand side of the top contains...
;
top_left = widget_base(top,/column,space=5)

;
;  ...the instrument choice
;
inst_base = widget_base(top_left,/row,space=50)
inst_list = ['NIS','GIS']
instr_ids = lonarr(2)
xmenu,inst_list,inst_base,/row,/exclusive,title='Instrument',$
                     buttons=instr_ids,uvalue=['INST1','INST2'],/no_release, $
             font=font
previous_inst = ''

;
;  ... VDS default extraction switch or GIS default extraction
;
vds_bbase = widget_base(inst_base)
vds_backbase = lonarr(3)

;
;  blank for when no instrument is chosen
;
vds_backbase(0) = widget_base(vds_bbase,map=0)

;
;  
vds_backbase(1) = widget_base(vds_bbase,map=0)
ex_ids = lonarr(3)
xmenu,['NIS1','NIS2','Full CCD'],buttons=ex_ids,vds_backbase(1),/row,$
                   title='VDS default extraction.', /nonexclusive,$
                   uvalue=['NDEFEX_1','NDEFEX_2','NDEFEX_3'], font=font
for i=0,2 do widget_control,ex_ids(i),set_button=0
widget_control,ex_ids(1),set_button=1
nis_def_ext=[0,0,0]


;
;  Default GIS extraction mode (all or nothing)
;
vds_backbase(2) = widget_base(vds_bbase,map=0)
gbdefuv = ['GDEFEX_1','GDEFEX_2','GDEFEX_3','GDEFEX_4']
gb_list = ['1','2','3','4']
xmenu,gb_list,vds_backbase(2),buttons=gbdef_ids,title='GIS default extraction.',$
      uvalue=gbdefuv,/row,/nonexclusive,font=font
for i=0,3 do widget_control,gbdef_ids(i),set_button=1
gis_def_ext = [1,1,1,1]


;
;  ...the slit choices
;
sb = widget_base(top_left,/row)
sb1 = widget_base(sb,/column)
xpdmenu,find_with_def('slit_selection.pdm',!PATH),sb1,font=font
sb2 = widget_base(sb,/column)
slit_info = cw_field(sb2,title='Current slit:',value='    ',$
            /row,xsize=15)



;
;  choose the range for the exposure time slider
;
et = widget_base(top_left,/column)
eb1 = widget_base(et,/row)
xpdmenu,find_with_def('etime_selection.pdm',!PATH),eb1,font=font

;
;  put out the current value separately
;
eb2 = widget_base(eb1,/column)
et_info = cw_field(eb2,title='Exposure time:',value='50',$
             /row,xsize=8,/return,uvalue='ETRANGE')

;
;  ...the exposure time slider
;
et_slider_id = widget_slider(et,title='     Set exposure time in seconds.  ',$
                             value=500,min=10,max=1000,uvalue='ET_SLIDER',$
                             /drag,/suppress,font=font)

;
;  set up initial range and value
;
curr_et_max = 100.
curr_etime  = '50'
tp_obs.raster_v.exptime = 50.0

;
;  choose the range for the window width slider
;
wt = widget_base(top_left,/column)
ww1 = widget_base(wt,/row)
xpdmenu,find_with_def('wwidth_selection.pdm',!PATH),ww1,font=font

;
;  put out the current value separately
;
ww2 = widget_base(ww1,/column)
ww_info = cw_field(ww2,title='Window width:',value='11',$
             /row,xsize=5,/return,uvalue='WWRANGE')
widget_control,ww_info,all_text=0
;
;  ...the window width slider
;
ww_slider_id = widget_slider(wt,title='     Set window width in pixels.  ',$
                             value=110,min=3,max=1000,uvalue='WW_SLIDER',$
                             /drag,/suppress,font=font)

;
;  set up initial range and value
;
curr_ww_max = 100.
curr_lwidth  = '11'


;
; the top middle widget contains...
;
top_middle= widget_base(top,/column,space=10)

;
;  ...the scan step sizes
;
;ssrow = widget_base(top_middle,/row)
ssrow = widget_base(top_left,/row)
ss    = widget_base(ssrow,/column)
wlss  = widget_label(ss,value='M/S step size (arcsec).',font=font)
sss   = widget_base(ss,/row)
sssx  = widget_text(sss,/edit,xsize=10,ysize=1,uvalue='SSSX',value='0', $
    font=font)
sssy  = widget_text(sss,/edit,xsize=10,ysize=1,uvalue='SSSY',value='0', $
    font=font)

;
;  ...the number of steps
;
ns   = widget_base(ssrow,/column)
wlns = widget_label(ns,value='Number of M/S scan positions.',font=font)
nss  = widget_base(ns,/row)
nsx  = widget_text(nss,/edit,xsize=10,ysize=1,uvalue='NSX',value='1',font=font)
nsy  = widget_text(nss,/edit,xsize=10,ysize=1,uvalue='NSY',value='1',font=font)
     

;
;  information on  line list
;
wll = widget_base(top_middle,/column)

;
;  and inform of current choice
;
dummy  = widget_label(wll,value='Current descriptions and database IDs',font=font)

fiddle = '' & for i=0,64 do fiddle=fiddle+'a'
wrp_info   = widget_base(wll,/row)
wrp_info_1 = widget_label(wrp_info,value='Raster.....',font=font)
wrp_info_2 = widget_text(wrp_info,value=fiddle,font=font,/editable,/all,$
                         uvalue='FUND',xsize=50)
frid = widget_text(wrp_info,value=' ',font=font,xsize=3)
widget_control, frid,set_val=''
widget_control, wrp_info_2,set_val=''


wrv_info   = widget_base(wll,/row)
wrv_info_1 = widget_label(wrv_info,value='Variation',font=font)
wrv_info_2 = widget_text(wrv_info,value=fiddle,font=font,/editable,$
                         uvalue='VARI',xsize=50)
rvid = widget_text(wrv_info,value=' ',font=font,xsize=3)
widget_control, rvid,set_val=''
widget_control, wrv_info_2,set_val=''

wll_info   = widget_base(wll,/row)
wll_info_1 = widget_label(wll_info,value='Line list...',font=font)
wll_info_2 = widget_text(wll_info,value=fiddle,font=font,/editable,$
                         uvalue='LINE',xsize=50);,/all)
llid = widget_text(wll_info,value=' ',font=font,xsize=3)
widget_control, llid,set_val=''
widget_control, wll_info_2,set_val=''

wdw_info   = widget_base(wll,/row)
wdw_info_1 = widget_label(wdw_info,value='Windows',font=font)
wdw_info_2 = widget_text(wdw_info,value=fiddle,font=font,/editable,$
                         uvalue='DWIN',xsize=50)
dwid = widget_text(wdw_info,value=' ',font=font,xsize=3)
widget_control, dwid,set_val=''
widget_control, wdw_info_2,set_val=''

;
;  set up the line_window structure and clear it out
;  (necessary because values linger from one incarnation to next)
;

line_window = replicate({line_window_rec},max_num_lwindow)
line_window.x_pos = -1

;
;  information/selection of compression scheme
;
cs = widget_base(top_middle,/row)
;
;  ...compression scheme choice
;
xpdmenu,find_with_def('compression_scheme.pdm',!PATH),cs,font=font

;
;  and inform of current choice
;
ccs_info   = widget_base(cs,/column)
ccs_info_1 = widget_label(ccs_info,value='Current compression',font=font)
ccs_info_2 = widget_label(ccs_info,value=strpad(' ',30),/frame,font=font)


;
;  selection of telemetry rate
;
tmr = widget_base(cs,/row)
;
;  ...telemetry rate choice
;
xpdmenu,find_with_def('telemetry_rate.pdm',!PATH),tmr,font=font


;
;  and inform of current choice
;
tmr_info   = widget_base(cs,/column)
tmr_info_1 = widget_label(tmr_info,value='Current TM rate',font=font)
tmr_info_2 = widget_label(tmr_info,value=strpad(' ',30),/frame,font=font)


;
;  set up a layered base so VDS specific widgets can come and go
;  interleaved with GIS selections
;
parm = widget_base(top_middle)

;
;  set number of stacking levels
;
npb = 7
parmbase = lonarr(npb+1)

;
;  first layer is blank
;
parmbase(0) = widget_base(parm,map=0)


;
;  Set up VDS-specific parameters
;
;
;  ...parameter choice
;
parmbase(1) = widget_base(parm,/row,map=0)
xpdmenu,find_with_def('vds_parameters.pdm',!PATH),parmbase(1),font=font

;
;  ...the window height slider
;
wh_slider_id = widget_slider(parmbase(1),$
                             title='VDS window height (arcsec).',$
                             value=240,uvalue='WH_SLIDER',minimum=4,$
                             maximum=240,/drag,xsize=300,font=font)
curr_lheight = '240'

;
;  possible overlay for setting VDS voltage
;
parmbase(2) = widget_base(parm,/row,map=0,/frame)
vv_done = widget_button(parmbase(2),value='Done',uvalue='VDS_VDONE',/no_rel, $
    font=font)
vv_slider_id = widget_slider(parmbase(2),title='Set VDS voltage parameter.',$
                             value=100,uvalue='VV_SLIDER',minimum=0,$
                             maximum=255,/drag,xsize=450,font=font)


;
;  setup of GIS parameters
;
parmbase(3) = widget_base(parm,/row,map=0)
xpdmenu,find_with_def('gis_parameters.pdm',!PATH),parmbase(3),font=font


;
;  set GIS detector voltages
;
parmbase(4) = widget_base(parm,/row,map=0,/frame)
gv_done = widget_button(parmbase(4),value='Done',uvalue='GIS_VDONE',/no_rel, $
    font=font)
gv_slider_id = widget_slider(parmbase(4),title='Set GIS voltage parameter.',$
                             value=100,uvalue='GV_SLIDER',minimum=0,$
                             maximum=255,/drag,xsize=450,font=font)

;
;  parmbase(5) reserved for GIS LUTs when figure out how to handle them
;
parmbase(5) = widget_base(parm,map=0)


;
;  possible overlay for setting VDS 300A range offset
;
parmbase(6) = widget_base(parm,/row,map=0,/frame)
o3_done = widget_button(parmbase(6),value='Done',uvalue='VDS_VDON',/no_rel, $
    font=font)
o3_slider_id = widget_slider(parmbase(6),$
                             title='Set 300A range offset (pixels).',$
                             value=0,uvalue='O3_SLIDER',minimum=0,$
                             maximum=100,/drag,xsize=450,font=font)


;
;  possible overlay for setting VDS 300A range offset
;
parmbase(7) = widget_base(parm,/row,map=0,/frame)
o5_done = widget_button(parmbase(7),value='Done',uvalue='VDS_VDON',/no_rel, $
    font=font)
o5_slider_id = widget_slider(parmbase(7),$
                             title='Set 500A range offset (pixels).',$
                             value=0,uvalue='O5_SLIDER',minimum=0,$
                             maximum=100,/drag,xsize=450,font=font)


;
;  telemetry info space
;
tlm_info = widget_base(top_middle,/row,space=15)
dummy    = widget_label(tlm_info,value='Telemetry time (secs/exposure)', $
    font=font)
tlm_info_2 = widget_label(tlm_info,value=strpad('0',15),frame=5,    $
    font=font,xsize=50)
widget_control,tlm_info_2,set_val='  0.0 '


;
;  In depth analysis of raster duration
;
tlm_info_3 = widget_button(tlm_info,value='Analyse Raster Duration',$
                           uvalue='RAS_DUR',font=font,frame=2)



;
;  MIDDLE "command" line has the options...
;
middle = widget_base(base,/row,space=5,/frame)

;
;  ...Quit without any further ado
;
m4 = widget_base(middle,/column)
xpdmenu,find_with_def('exit_selection.pdm',!PATH),m4,font=font

;
;  ...get help on filling out the screen
;
m5 = widget_base(middle,/column)
cfont = "-adobe-helvetica-bold-r-normal--14-100-100-100-p-82-iso8859-1"
xpdmenu,find_with_def('help_selection.pdm',!PATH),m5,font=cfont


;
;  ...reset a selection of parameters to start again
;
m3 = widget_base(middle,/column)
xpdmenu,find_with_def('reset_selection.pdm',!PATH),m3,font=font


;
;  write output of line windows, flag windows or raster parameters
;
;
;  ...choose type of output
;
m6 = widget_base(middle,/column)
xpdmenu,find_with_def('db_access.pdm',!PATH),m6,font=font



m1 = widget_base(middle)
dum = lonarr(2)
dum(0) = widget_base(m1,map=1)
dum(1) = widget_button(m1,value='Action to the left',$
                             uvalue='',/no_rel,font=font)
widget_control,dum(1),map=0


;
;  ...calculate new data with current instrument settings
;
m2 = widget_base(middle,/column)
xpdmenu,find_with_def('mk_raster_ndata.pdm',!PATH),m2,font=font


;
;  ...allow switch between CDS and USER databases
;
db_original = which_zdbase()
db_in_use = db_original

;
;  check at least one database env. var. exists
;
z1 = getenv('ZDBASE_CDS')
z2 = getenv('ZDBASE_USER')
if z1 eq '' and z2 eq '' then begin
   bell
   print,'Must have a definition for one of ZDBASE_USER or ZDBASE_CDS'
   return
end

m8 = widget_base(middle,/column)
if db_original eq 'CDS' then $
   title = 'Using CDS databases' else $
   title = 'Using USER databases'

db_switch = widget_button(m8,value=title,uvalue='USER_CDS_DB',/no_rel,font=font)

m9 = widget_button(middle,value='Adjust LUT',uvalue='XLOADCT',font=font)



;
;  make message visible/invisible
;
see_mess=0
m10 = widget_button(middle,value='See messages',uvalue='MESS',$
                    font=cfont,frame=2)



;
;  allow editing/listing of current choice
;
m11   = widget_base(middle,/column)
wll_list_1 = widget_button(m11,value='Edit lines',$
                          uvalue='EDIT_LINE',/no_rel,font=font)
widget_control,wll_list_1,sensitive=0
num_windows = 0



;
;  BOTTOM display area
;   
bottom = widget_base(base,/frame,/column)

;
;  ...plotting area
;
image_area = widget_draw(bottom,xsize=1024,ysize=256,/button_events)
have_vert = 0
widget_control,image_area,sensitive=0


;
;  LOWER BOTTOM "command" line has the window manipulating options...
;
low_bottom = widget_base(base,/row,space=5)
window_state = 'N/A'

;
;  choose the window manipulation mode
;
wmode_list = ['Add','Del','Mov','Id','Flag','Prof']
wmode_uv =['LINE_ADD','LINE_DELETE','LINE_MOVE','LINE_IDENT','LINE_FLAG','LINE_PROF']
wmode_rv = widget_base(low_bottom,/column)
wmode_ids = lonarr(6)

xmenu,wmode_list,wmode_rv,buttons=wmode_ids,title='Window interaction mode.',$
      uvalue=wmode_uv,/row,/exclusive,font=font

;
;  choose the display mode
;
;dmode_list = ['All','Win','Flag']
;dmode_uv = ['DISP_ALL','DISP_WONLY','DISP_FONLY']
;dmode_rv = widget_base(low_bottom,/column)
;dmode_ids = lonarr(3)
;
;xmenu,dmode_list,dmode_rv,buttons=dmode_ids,title='Display mode.',$
;      uvalue=dmode_uv,/row,/exclusive,space=1,font=font
;widget_control,dmode_ids(0),set_button=1

dm = widget_base(low_bottom,/row)
dm1 = widget_base(dm,/column)
xpdmenu,find_with_def('display_mode.pdm',!PATH),dm1,font=font

fm = widget_base(low_bottom,/row)
fm1 = widget_base(fm,/column)
xpdmenu,find_with_def('flag_choice.pdm',!PATH),fm1,font=font


;
;  choose which GIS band to display
;
gis_b = widget_base(low_bottom,/row,space=5)
gb_list = ['1','2','3','4','All']
gbuv = ['GISB1','GISB2','GISB3','GISB4','GISB5']
gb_ids = lonarr(5)

;
;  make gb_rv base a stackable one
;
gis_dispbase = lonarr(4)
gb_rv = widget_base(gis_b)

;
;  first layer is blank
;
gis_dispbase(0) = widget_base(gb_rv,map=0)

;
;  put real buttons in next level
;
gis_dispbase(1) = widget_base(gb_rv,map=0)
xmenu,gb_list,gis_dispbase(1),buttons=gb_ids,title='Display GIS band.',$
      uvalue=gbuv,/row,/exclusive,font=font
widget_control,gb_ids(4),set_button=1
GIS_band = 5

;
;  ...adjust VDS display in next layer
;
gis_dispbase(2) = widget_base(gb_rv,map=0,/row)
dummyb = widget_base(gis_dispbase(2),/column)
euv = ['EXTE_YES','EXTE_NO','EXTE_RES']
xmenu,['On','Off','Set'],dummyb,buttons=vdsb_ids,title='VDS Background',$
      uvalue=euv,/row,/exclusive,font=font
widget_control,vdsb_ids(0), set_b=1
vds_extension = 1

;
;  image area for LUT
;
image_area2 = widget_draw(gis_dispbase(2),xsize=225,ysize=100)

;
;  Slider for VDS background window size
;
gis_dispbase(3) = widget_base(gb_rv,map=0,/row)
dummy = widget_button(gis_dispbase(3),value='Done',uvalue='VDS_BDONE',  $
    /no_rel,font=font)
vdsb_slider_id = widget_slider(gis_dispbase(3),xsize=300,$
                               title='VDS background window size',font=font,$
                               min=3,max=100,uvalue='VB_SLIDER',value=50,/drag)


;
;  INFO_LINE line has general user information.
;                   
info_base = widget_base(title='Messages',group_leader=base,yoff=1000,/column)
;                          xsize=800,ysize=300,y_scroll_size=300,$
;                          x_scroll_size=800,/scroll,/column)
info_line = widget_text(info_base,ysize=20,xsize=65,$
                        value='Watch this space for information....',$
                        font=tp_font,/scroll)

;
;  ensure plotting is as needed
;
!p.multi=0

;
;  make the whole thing happen
;
widget_control,base,/realize
widget_control,info_base,/realize
;widget_control, mess_ids(0),set_butt=1 

;
;  find out window id for plotting
;
widget_control,get_value=window,image_area
wset,window
tp_colbar

;
; set default mode of displaying all spectrum
;
window_mode = 'ALL'
display_state = 'ALL'

;
;  set default 'flags included' mode
;
flag_state = 1


;
;  create arrays for the vertical solid and dashed lines
;
vert_line = bytarr(1,128)+255
vert_dash = vert_line
for i=0,15,2 do vert_dash(0,i*8:i*8+7) = 0

;
;  load special LUT
;
tp_coltable
tp_colbar



;
;  load the current state database entry, the official db must be in the 
;  ZDBASE path
;

get_utc,utc
get_vds_state, utc, s
tp_obs.state.date      = s.date
tp_obs.state.vds_read  = fix(s.vds_read)
tp_obs.state.vds_pmcp  = fix(s.vds_pmcp)
tp_obs.state.vds_offset(0)  = 0       ;  s.vds_offset(0)
tp_obs.state.vds_offset(1)  = 0       ;  s.vds_offset(1)
help_mode = 0


;
;  save the current wavecal and load the linear one for GIS and the current NIS
;

n_wavecal = save_wavecal('n')
g_wavecal = save_wavecal('g')

if not load_wavecal('n') then begin
   bell
   widget_control, info_line, $
               set_val='Error loading NIS wavecal.'
endif

if not load_wavecal('g',gset=0) then begin
   bell
   widget_control, info_line, $
               set_val='Error loading GIS wavecal.'
endif


;
;  load input structure if appropriate 
;
if datatype(setup_structure) eq 'STC' then begin
   load_tp_struct, setup_structure 
   tp_colbar
   tp_recalc_dew,' '
   if total(tp_obs.vds_backwin.win_def) eq 0 then begin
      status = tp_load_vdsback(tp_obs)
      if not status then begin
         widget_control, info_line, $
               set_val='Error reading VDS background windows file.'
      endif
   endif
endif else begin
   status = tp_load_vdsback(tp_obs)
   if not status then begin
      widget_control, info_line, $
           set_val='Error reading VDS background windows file.'
   endif
endelse


;
;  help message
;
widget_control,info_line,set_val=' ',/append
widget_control,info_line,set_val=' ',/append
widget_control,info_line,set_val=' ',/append
bl = '                                                     '
widget_control, info_line, /append, $
       set_v='Hit the <Messages> button to hide this window'

;
;  undocumented feature
;
if keyword_set(fix_desc) then begin
   defsysv,'!desc_update',1 
endif else begin
   defsysv,'!desc_update',0 
endelse

;
; if MK_RASTER was called with a GROUP_LEADER, then store it's widget ID
; as a UVALUE of BASE. Later, when MK_RASTER is done, the latest
; TP_OBS stucture will be stored as a UVALUE of GROUP_LEADER and, hence,
; become available to caller (DMZ'99)
;

if xalive(group_leader) then widget_control,base,set_uvalue=group_leader

;
; make the boss do some work

xmanager,'mk_raster',base, modal=modal, group_leader=group_leader

;-- if MK_RASTER crashed for some reason, then the next MK_RASTER call will
;   fall thru the first XMANAGER. The next line will re-activate the event
;   handler.

if not xalive(group_leader) then xmanager

;
; load the final line setup into the input/output structure
;

tp_obs.line_w = line_window

;
;  on EXIT, as an internal indicator that flags were either separate or 
;  common, set the standard flag indicator to '2' if flags are separate.
;
if flag_state eq 0 then begin
   n = where(tp_obs.line_w.flag eq 1,count)
   if count gt 0 then tp_obs.line_w(n).flag = 2
endif

;
;  load the input/output variable with the defined structure
;
setup_structure = tp_obs

end