Viewing contents of file '../idllib/contrib/tappin/graffer/gr_hardopts.pro'
;+
; GR_HARDOPTS
;	Set hardcopy options
;
; Usage
;	gr_hardopts, h	; Not intended for direct user usage
;
; Arguments:
;	h	struct	in/out	The hardcopy options.
;	leader	long	input	Group leader of the widget
;	tname	string	input	Name of the file without extension
;	use_timer byte	input	Whether to use the timer events to
;				keep it on top
;	
; History:
;	Original: 3/8/95; SJT
;	Add timer event to push to front if obscured: 23/8/95; SJT
;	Renamed as GR_HARDOPTS (was hardopts): 18/9/96; SJT
;	Add font selection options: 10/10/96; SJT
;-


function Hopts_event, event

widget_control, event.id, get_uvalue = but
widget_control, event.handler, get_uvalue = settings, /no_copy

iexit = 0

track_flag = strpos(tag_names(event, /struct), 'TRACK') ne -1

if (track_flag) then begin
    if (event.enter eq 0) then begin
        graff_msg, settings.action, ''
        goto, miss_case
    endif
endif

case but of
    'COL': if (track_flag) then $
      graff_msg, settings.action, 'Toggle use of colour PostScript' $
    else settings.opts.colour = event.value
    
    'EPS': if (track_flag) then $
      graff_msg, settings.action, 'Toggle use of Encapsulated PostScript' $
    else settings.opts.eps = event.value
    
    'ORI': if (track_flag) then $
      graff_msg, settings.action, 'Toggle landscape/portrait orientation' $
    else begin
        settings.opts.orient = event.value
        settings.psize = gr_get_page(settings.opts.psize, $
                                     settings.opts.orient)
        
                                ; Swap over the X & Y sizes of the
                                ; draw page if it overlaps the edge of
                                ; the paper but not otherwise.
        
        if ((event.value eq 1 and $
             settings.opts.size(0) gt settings.psize(0)) or $
            (event.value eq 0 and $
             settings.opts.size(1) gt settings.psize(1))) then begin
            temp = settings.opts.size(0)
            settings.opts.size(0) = settings.opts.size(1)
            settings.opts.size(1) = temp
            widget_control, settings.xsid, set_value = settings.opts.size(0)
            widget_control, settings.ysid, set_value = settings.opts.size(1)
        endif
        
                                ; re-centre
        
        xs = (settings.psize(0)-settings.opts.size(0))/2.
        settings.opts.off(0) = xs
        ys = (settings.psize(1)-settings.opts.size(1))/2.
        settings.opts.off(1) = ys
        
        widget_control, settings.xoffid, set_value = xs
        widget_control, settings.xleftid, set_value = xs
        widget_control, settings.yoffid, set_value = ys
        widget_control, settings.yleftid, set_value = ys
    end
    
    'PSIZE': if (track_flag) then $
      graff_msg, settings.action, 'Toggle A4/Letter sized paper' $
    else begin
        settings.opts.psize = event.value
        settings.psize = gr_get_page(settings.opts.psize, $
                                      settings.opts.orient)
        xlft = settings.psize(0)-settings.opts.off(0)- $
          settings.opts.size(0)
        widget_control, settings.xleftid, set_value = xlft
        ylft = settings.psize(1)-settings.opts.off(1)- $
          settings.opts.size(1)
        widget_control, settings.yleftid, set_value = ylft
    end
    
    'CENTRE': if (track_flag) then $
      graff_msg, settings.action, 'Centre the plot on the page' $
    else begin
        xs = (settings.psize(0)-settings.opts.size(0))/2.
        settings.opts.off(0) = xs
        widget_control, settings.xleftid, set_value = xs
        widget_control, settings.xoffid, set_value = xs
        
        ys = (settings.psize(1)-settings.opts.size(1))/2.
        settings.opts.off(1) = ys
        widget_control, settings.yleftid, set_value = ys
        widget_control, settings.yoffid, set_value = ys
    end
    
    'XSI': if (track_flag) then $
      graff_msg, settings.action, 'Set the X size of the plot (in cm)' $
    else begin
        widget_control, event.id, get_value = sx
        settings.opts.size(0) = sx
        xlft = settings.psize(0)-sx-settings.opts.off(0)
        widget_control, settings.xleftid, set_value = xlft
    end
    'YSI': if (track_flag) then $
      graff_msg, settings.action, 'Set the Y size of the plot (in cm)' $
    else begin
        widget_control, event.id, get_value = sy
        settings.opts.size(1) = sy
        ylft = settings.psize(1)-sy-settings.opts.off(1)
        widget_control, settings.yleftid, set_value = ylft
    end
    'XOFF': if (track_flag) then $
      graff_msg, settings.action, 'Set the X offset of the plot (in cm)' $
    else begin
        widget_control, event.id, get_value = sx
        settings.opts.off(0) = sx
        xlft = settings.psize(0)-sx-settings.opts.size(0)
        widget_control, settings.xleftid, set_value = xlft
    end
    'YOFF': if (track_flag) then $
      graff_msg, settings.action, 'Set the Y offset of the plot (in cm)' $
    else begin
        widget_control, event.id, get_value = sy
        settings.opts.off(1) = sy
        ylft = settings.psize(1)-sy-settings.opts.size(1)
        widget_control, settings.yleftid, set_value = ylft
    end
    
    'FFAMILY': if (track_flag) then $
      graff_msg, settings.action, 'Select the font family for plot ' + $
      'annotation' $
    else begin
        settings.opts.font.family = event.value
        widget_control, settings.wsid, sensitive = event.value le 9
        for j = 1, 3, 2 do widget_control, settings.wsids(j), sensitive = $
          event.value le 5
    end
    'FWS': if (track_flag) then $
      graff_msg, settings.action, 'Select the weight & slant for plot ' + $
      'annotation' $
    else settings.opts.font.wg_sl = event.value
    
    'TIMEST': if (track_flag) then $
      graff_msg, settings.action, 'Toggle printing of a timestamp on ' + $
      'the plot' $
    else settings.opts.timestamp = event.value
    
    'POP': begin
        widget_control, event.top, /show
        widget_control, event.id, timer = 2.
    end
    
    'DO': if (track_flag) then $
      graff_msg, settings.action, 'Save the settings & make the hardcopy' $
    else begin
        iexit = 1
        for j = 0, 1 do begin
            widget_control, settings.cmid(j), get_value = cmd
            settings.opts.action(j) = cmd(0)
        endfor
    end
    'CANCEL': if (track_flag) then $
      graff_msg, settings.action, "Forget new settings &" + $
      " don't make a hardcopy" $
    else iexit = -1
    
    'CMD':if (track_flag) then $
      graff_msg, settings.action, 'Enter the command for spooling the ' + $
      'plot up the the file'
    'SFX':if (track_flag) then $
      graff_msg, settings.action, 'Enter the command for spooling the ' + $
      'plot after the file'
      
    
    Else:     graff_msg, settings.action, "Whaat??????"       
endcase

widget_control, settings.spbase, sensitive = (settings.opts.eps ne 1)
widget_control, settings.xoffid, sensitive = (settings.opts.eps ne 1)
widget_control, settings.yoffid, sensitive = (settings.opts.eps ne 1)

Miss_case:

widget_control, event.handler, set_uvalue = settings, /no_copy

return, {id:event.id, top:event.top, handler:event.handler, exited:iexit}

end

function Gr_hardopts, h, leader, tname, use_timer

uvs = { $
        Opts:h, $
        Cmid:lonarr(2), $
        Wsid:0l, $
        Wsids:lonarr(4), $
        Spbase:0l, $
        Xsid:0l, $
        Xoffid:0l, $
        Xleftid:0l, $
        Ysid:0l, $
        Yoffid:0l, $
        Yleftid:0l, $
        Action:0l, $
        Psize:fltarr(2) $
      }

uvs.psize = gr_get_page(h.psize, h.orient)

widget_control, leader, sensitive = 0

tlb = widget_base(title = 'Graffer Hard Copy', group_leader = leader, $
                  resource = 'Graffer')
base = widget_base(tlb, /column)

                                ; Basic toggle settings

jb = widget_base(base, /row)

junk = cw_bbselector(jb, ['Monochrome', 'Colour'], uvalue = $
                     'COL', set_value = h.colour, /track)
junk = cw_bbselector(jb, ['Normal', 'Encapsulated'], uvalue = $
                     'EPS', set_value = h.eps, /track)
junk = cw_bbselector(jb, ['Landscape', 'Portrait'], uvalue = $
                     'ORI', set_value = h.orient, /track)

                                ; Page size
cl = widget_base(base, /row, uvalue = 'POP', xpad = 1, ypad = 1, space = 1)

jb = widget_base(cl, /column)
junk = cw_bbselector(jb, ['A4', 'Letter'], label_left = 'Paper size:', $
                     uvalue = 'PSIZE', set_value = h.psize, /track)
junk = widget_button(jb, value = 'Centre on page', uvalue = 'CENTRE', /track)
junk = cw_bbselector(jb, ['Off', 'On'], label_left = "Plot " + $
                    "timestamp", set_value = h.timestamp, uvalue = $
                    'TIMEST', /track)

jb = widget_base(cl, /column)
uvs.xsid = graff_enter(jb, /float, /all, label = 'X Size (cm):', value = $
                   h.size(0), uvalue = 'XSI', format = "(F5.2)", xsize $
                   = 5, /track, /capture)
uvs.xoffid = graff_enter(jb, /float, /all, label = 'X offset:',  $
                         value = h.off(0), uvalue = 'XOFF', format = $
                         "(F5.2)", xsize = 5, /track, /capture)
uvs.xleftid = graff_enter(jb, /float, /display, label = 'X remain:', $
                          value = uvs.psize(0)-h.size(0)-h.off(0), format = $
                          "(F5.2)", xsize = 5)

jb = widget_base(cl, /column)
uvs.ysid = graff_enter(jb, /float, /all, label = 'Y Size (cm):', value = $
                   h.size(1), uvalue = 'YSI', format = "(F5.2)", xsize $
                   = 5, /track, /capture)
uvs.yoffid = graff_enter(jb, /float, /all, label = 'Y offset:',  $
                         value = h.off(1), uvalue = 'YOFF', format = $
                         "(F5.2)", xsize = 5, /track, /capture)
uvs.yleftid = graff_enter(jb, /float, /display, label = 'Y remain:', $
                          value = uvs.psize(1)-h.size(1)-h.off(1), format = $
                          "(F5.2)", xsize = 5)

jb = widget_base(base, /row)
junk = cw_bbselector(jb, ['Courier',  $
                          'Helvetica',  $
                          'Helvetica Narrow',  $
                          'NC Schoolbook',  $
                          'Palatino',  $
                          'Times', $
                          'Avant Garde Book',  $
                          'Avant Garde Demi',  $
                          'Bookman Demi',  $
                          'Bookman Light',  $
                          'Zapf Chancery',  $
                          'Zapf Dingbats', $
                          'Symbol'], $
                     label_left = 'Font: Family:', set_value = $
                     h.font.family, uvalue = 'FFAMILY', /track)
uvs.wsid = cw_bbselector(jb, ['Normal',  $
                              'Bold', $
                              'Italic', $
                              'Bold Italic'], $
                         label_left = 'Weight/slope', set_value = $
                         h.font.wg_sl, uvalue = 'FWS', ids = bids, /track)
uvs.wsids = bids
widget_control, uvs.wsid, sensitive = h.font.family le 9
for j = 1, 3, 2 do widget_control, uvs.wsids(j), sensitive = $
  h.font.family le 5

                                ; Spool command

uvs.spbase = widget_base(base, /column)

jb = widget_base(uvs.spbase, /row)
uvs.cmid(0) = graff_enter(jb, label = 'Spool Command:', value = $
                          h.action(0), uvalue = 'CMD', xsize = 12, $
                          /track, /capture)

uvs.cmid(1) = graff_enter(jb, value = h.action(1), uvalue = $
                          'SFX', xsize = 8, label = tname+'.ps', $
                          /track, /capture)



widget_control, uvs.spbase, sensitive = (h.eps ne 1)

uvs.action = graff_enter(base, /text, /display, value = '', xsize = $
                         65, label = 'Action:')

                                ; Quit button
jb = widget_base(base, /row)
junk = widget_button(jb, value = '   Cancel   ', uvalue = 'CANCEL', $
                     /track)
junk = widget_button(jb, value = '    Do it    ', uvalue = 'DO', $
                     /track)

widget_control, base, set_uvalue = uvs, /no_copy

widget_control, tlb, /real

;	RYO widget management to allow us to get the values back from
;	the event handler without using a common block, even after the
;	hierarchy has been destroyed.

widget_control, base, event_func = 'hopts_event'
if (use_timer) then widget_control, cl, timer = 2.

repeat begin
    ev = widget_event(base)
endrep until (ev.exited ne 0)

widget_control, base, get_uvalue = uvs, /no_copy
h = uvs.opts

widget_control, tlb, /destroy

widget_control, leader, /sensitive

return, ev.exited

end