;+
; NAME:
;	SMEI_SEQUENCE::PRINT_MENU
;
;
; PURPOSE:
;	GUI to control printing of a SMEI sequence.
;
;
; CATEGORY:
;	SMEI_SEQUENCE
;
;
; CALLING SEQUENCE:
;	seqref -> print_menu
;
;
; KEYWORD PARAMETERS:
;	group	long	Widget ID of a group leader
;	/block		If set, then block any other widget events.
;
;
; SIDE EFFECTS:
;	A print file may be generated.
;
;
; MODIFICATION HISTORY:
;	Original: 11/12/02; SJT
;	Add log scaling: 10/1/03; SJT
;	Add plane selection & extend grids: 20/6/03; SJT
;	Add no-data index: 11/7/03; SJT
;	Add off_sky colour: 18/7/03; SJT
;	Use print_options: 22/7/03; SJT
;	Add kill range support: 29/3/04; SJT
;	Add 3-state date settings: 3/6/05; SJT
;	Add spooling options: 6/6/05; SJT
;	Add cmyk options: 3/6/10; SJT
;-

pro ss_print_event, event

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

case mnu of
    'QUIT': begin
        if event.value eq 'DO' or event.value eq 'SAVE' then begin
            if state.iflag[0] then $
              state.original -> set_null_index, state.index[0], /print
            if state.iflag[1] then $
              state.original -> set_null_index, state.index[1], $
              /print, $
              /off_sky
            state.original -> set_print_opts, type = state.orient, $
              columns = state.geometry[0], rows = state.geometry[1], $
              file = state.file, xsize = state.xsize, ysize = $
              state.ysize, order = state.in_rows, print = state.lpc, $
              preview = state.pvc, cmyk = state.cmyk

            if event.value eq 'DO' then $
              state.original -> print, grid = state.grid, date = $
              state.date, colour_table = state.table, range = $
              state.range, file = state.ifile, add_range = $
              state.irange, logarithmic = state.log, plane = $ 
              state.plane, kill = state.kill, print = state.lpc, $
              preview = state.pvc, id = event.top
        endif else if event.value eq 'PRINT' then begin
            land = state.orient eq 0
            port = state.orient eq 1
            encap = state.orient eq 2
            state.original -> print, grid = state.grid, date = $
              state.date, colour_table = state.table, range = $
              state.range, file = state.ifile, add_range = $
              state.irange, logarithmic = state.log, plane = $ 
              state.plane,  landscape = land, portrait = $
              port, encapsulated = encap, xsize = state.xsize, ysize = $
              state.ysize, plot_file = $
              state.file, in_rows = state.in_rows,  ncolumn = $
              state.geometry[0], nrow = state.geometry[1], kill = $ $
              state.kill, print = state.lpc, preview = state.pvc, id = $
              event.top, cmyk = state.cmyk
        endif
        widget_control, event.top, /destroy
    end

    'GRID': state.grid = event.index
    'DATE': state.date = event.index
    'IFILE': state.ifile = event.index
    'IRANGE': state.irange = event.index
    'PLANE': state.plane = event.index

    'ORIENT': begin
        oo = state.orient
        state.orient = event.index
        if (state.orient eq 1 and oo eq 0) or $
          (state.orient eq 0 and oo eq 1 ) then begin
            tmp = state.xsize
            state.xsize = state.ysize
            state.ysize = tmp
            widget_control, state.xsid, set_value = state.xsize
            widget_control, state.ysid, set_value = state.ysize
        endif
    end
    'DIRECT': state.in_rows = event.index
    'CMYK': state.cmyk = event.index

    'NCOL': state.geometry[0] = event.value
    'NROW': state.geometry[1] = event.value
    'MIN': state.range[0] = event.value
    'MAX': state.range[1] = event.value
    'KMIN': state.kill[0] = event.value
    'KMAX': state.kill[1] = event.value
    'LOG': state.log = event.index
    'XSIZE': state.xsize = event.value
    'YSIZE': state.ysize = event.value
    'COLOUR': state.table = event.value
    'FILE': state.file = event.value
    'LP': state.lpc = event.value
    'GV': state.pvc = event.value

    'INDEXM': begin
        state.index[0] = event.value
        state.iflag[0] = 1b
    end
    'INDEXO': begin
        state.index[1] = event.value
        state.iflag[1] = 1b
    end
endcase

if widget_info(/valid, sbase) then $
  widget_control, sbase, set_uvalue = state

end

pro smei_sequence::print_menu, group = group, block = block

grid = self -> get_annotations(/grid)
date = self -> get_annotations(/date)
range = self -> get_data_range()
kill = self -> get_data_range(/kill)
irange = self -> get_annotations(/range)
ifile = self -> get_annotations(/file)
log =  self -> get_data_range(/logarithmic)
nplane = self -> get_n_planes()
index = [self -> get_null_index(/print), self ->  $
         get_null_index(/print, /off_sky)]

xsize = self -> get_print_opts(/xsize)
ysize = self -> get_print_opts(/ysize)
orient = self -> get_print_opts(/type)
file = self -> get_print_opts(/file)
in_rows = self -> get_print_opts(/order)
ncols = self -> get_print_opts(/columns)
nrows = self -> get_print_opts(/rows)
lpc = self -> get_print_opts(/print)
pvc = self -> get_print_opts(/preview)
cmyk = self -> get_print_opts(/cmyk)

base = widget_base(title = 'SMEI Sequence print', $
                   /column, $
                   group = group)

label = widget_label(base, $
                     value = 'Print SMEI sequence')

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

jb = widget_base(jbo, $
                 row = 4, $
                 /grid, $
                 /base_align_right)

junk = cw_ffield(jb, $
                 label = 'Number of columns:', $
                 value = ncols, $
                 uvalue = 'NCOL', $
                 /int, $
                 xsize = 6)
junk = cw_ffield(jb, $
                 label = 'Number of rows:', $
                 value = nrows, $
                 uvalue = 'NROW', $
                 /int, $
                 xsize = 12)

xsid = cw_ffield(jb, $
                 label = 'X size (cm):', $
                 value = xsize, $
                 uvalue = 'XSIZE', $
                 /float, $
                 xsize = 8, $
                 format = '(F8.2)')
ysid = cw_ffield(jb, $
                 label = 'Y size (cm):', $
                 value = ysize, $
                 uvalue = 'YSIZE', $
                 /float, $
                 xsize = 8, $
                 format = '(F8.2)')

junk = widget_droplist(jb, $
                       title = 'Direction', $
                       value = ['Columns', 'Rows'], $
                       uvalue = 'DIRECT')
widget_control, junk, set_droplist_select = in_rows

junk = widget_droplist(jb, $
                       title = 'Orientation', $
                       value = ['Landscape', $
                                'Portrait', $
                                'Encapsulated'], $
                       uvalue = 'ORIENT')
widget_control, junk, set_droplist_select = orient

junk = widget_droplist(jb, $
                       title = "Colour model", $
                       value = ['RGB', 'CMYK'], $
                       uvalue = 'CMYK')
widget_control, junk, set_droplist_select = cmyk


junk = cw_ffield(jbo, $
                 label = 'Filename:', $
                 value = file, $
                 uvalue = 'FILE', $
                 /text, $
                 xsize = 30)

jb = widget_base(jbo, $
                 /row)

junk = cw_ffield(jb, $
                 label = "Print command:", $
                 value = lpc, $
                 uvalue = "LP", $
                 /text, $
                 xsize = 10)

junk = cw_ffield(jb, $
                 label = "Preview command:", $
                 value = pvc, $
                 uvalue = "GV", $
                 /text, $
                 xsize = 10)
;------------------------------------------------------------------

jb = widget_base(base, $
                 /grid, $
                 row = 7, $
                 /frame)

junk = cw_ffield(jb, $
                 label = 'Minimum (Black):', $
                 value = range[0], $
                 uvalue = 'MIN', $
                 /float, $
                 xsize = 12, $
                 format = '(G12.2)')
junk = cw_ffield(jb, $
                 label = 'Maximum (White):', $
                 value = range[1], $
                 uvalue = 'MAX', $
                 /float, $
                 xsize = 12, $
                 format = '(G12.2)')

junk = cw_ffield(jb, $
                 label = 'Minimum cut off:', $
                 value = kill[0], $
                 uvalue = 'KMIN', $
                 /float, $
                 xsize = 12, $
                 format = '(G12.2)')
junk = cw_ffield(jb, $
                 label = 'Maximum cut off:', $
                 value = kill[1], $
                 uvalue = 'KMAX', $
                 /float, $
                 xsize = 12, $
                 format = '(G12.2)')

junk = cw_ffield(jb, $
                 /int, $
                 value = index[0], $
                 label = 'Index for missing data', $
                 xsize = 4, $
                 format = '(I3)', $
                 uvalue = 'INDEXM')

junk = cw_ffield(jb, $
                 /int, $
                 value = index[1], $
                 label = 'Index for off sky', $
                 xsize = 4, $
                 format = '(I3)', $
                 uvalue = 'INDEXO')

junk = cw_ffield(jb, $
                 label = 'Colour table:', $
                 value = -1, $
                 uvalue = 'COLOUR', $
                 /int, $
                 xsize = 3)

junk = widget_droplist(jb, $
                       value = ['Linear', 'Logarithmic'], $
                       title = 'Mapping:', $
                       uvalue = 'LOG')
widget_control, junk, set_droplist_select = log

if nplane eq 0 then begin
    junk = widget_base(jb)
    iplane = 0
endif else begin
    plist = ['Processed', string(indgen(nplane)+1, $
                                  format = "('Raw #',I2)")]
    junk = widget_droplist(jb, $
                       value = plist, $
                       title = 'Plane?', $
                       uvalue = 'PLANE', $
                       /align_right)
    iplane = self -> get_plane()
    widget_control, junk, set_droplist_select = iplane, $
                    sensitive = nplane gt 0
endelse

;junk = widget_base(jb)
 
junk = widget_droplist(jb, $
                       title = 'Add grid?', $
                       value = ['None', 'Lat & Long',  'Elong & PA', $
                               'L & L (Labelled)', 'E & P (Labelled)'], $
                       uvalue = 'GRID')
widget_control, junk, set_droplist_select = grid

junk = widget_droplist(jb, $
                       title = 'Date format?', $
                       value = ['None', 'Year-Day', 'Y-M-D'], $
                       uvalue = 'DATE')
widget_control, junk, set_droplist_select = date

junk = widget_droplist(jb, $
                       title = 'Add range?', $
                       value = ['No', 'Yes'], $
                       uvalue = 'IRANGE')
widget_control, junk, set_droplist_select = irange
junk = widget_droplist(jb, $
                       title = 'Add filename?', $
                       value = ['No', 'Yes'], $
                       uvalue = 'IFILE')
widget_control, junk, set_droplist_select = ifile

junk = cw_bgroup(base, $
                 ['Print and Save opts', 'Print', 'Save Opts', 'Cancel'], $
                 uvalue = 'QUIT', $
                 button_uvalue = ['DO', 'PRINT', 'SAVE', 'DONT'], $
                 /row)

state = {ss_print_state, $
         original: self, $
         grid:  grid, $
         date:  date, $
         irange: irange, $
         ifile: ifile, $
         plane: iplane, $
         geometry: [ncols, nrows], $
         range: range, $
         kill: kill, $
         log: log, $
         table: -1, $
         index: index, $
         iflag: bytarr(2), $
         xsize: xsize, $
         ysize: ysize, $
         in_rows: in_rows, $
         orient:orient, $
         cmyk: cmyk, $
         file:  file, $
         lpc: lpc, $
         pvc: pvc, $
         xsid: xsid, $
         ysid: ysid}

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

xmanager, 'ss_print', base, no_block = keyword_set(block) eq 0

end
