# Copyright (c) 1993 by Sanjay Ghemawat
#############################################################################
# Printing dialog
#
# Commands
#
#	print_calendar <leader> <date>
#
#	Interact with user to print calendar contents.

# Hidden global variables
#
#	pr_done			Is pr interaction finished
#	pr_count		Specification of how many days to print
#	pr_type			Either "save", "print", or "preview"
#	pr_save			Argument for "save"
#	pr_print		Argument for "print"
#	pr_preview		Argument for "preview"

set pr_done 0

proc print_calendar {leader date} {
    pr_make
    pr_interact $leader $date
}

proc pr_make {} {
    set f .pr_dialog
    if [winfo exists $f] {return}

    global pr_done pr_count pr_type pr_save pr_print pr_preview
    set pr_count month
    set pr_type  print

    set pr_save    cal.ps
    set pr_print   "lpr"
    set pr_preview "ghostview -"
    catch {set pr_print   [cal option PrintCommand]}
    catch {set pr_preview [cal option PreviewCommand]}

    toplevel $f -class Dialog -geometry ""
    wm title $f Print
    wm protocol $f WM_DELETE_WINDOW {set pr_done 0}

    frame $f.top -relief raised -bd 1
    frame $f.mid -relief raised -bd 1

    frame $f.top.l -relief flat -bd 0
    frame $f.top.r -relief flat -bd 0

    radiobutton $f.top.l.one -text "One Day"\
	-anchor w\
	-relief flat\
	-variable pr_count\
	-value 1
    radiobutton $f.top.l.two -text "Two Days"\
	-anchor w\
	-relief flat\
	-variable pr_count\
	-value 2
    radiobutton $f.top.l.four -text "Four Days"\
	-anchor w\
	-relief flat\
	-variable pr_count\
	-value 4

    radiobutton $f.top.r.eight -text "Eight Days"\
	-anchor w\
	-relief flat\
	-variable pr_count\
	-value 8
    radiobutton $f.top.r.ten -text "Ten Days"\
	-anchor w\
	-relief flat\
	-variable pr_count\
	-value 10
    radiobutton $f.top.r.month -text "Month"\
	-anchor w\
	-relief flat\
	-variable pr_count\
	-value month

    frame $f.mid.save		-relief flat -bd 0
    frame $f.mid.preview	-relief flat -bd 0
    frame $f.mid.print		-relief flat -bd 0

    radiobutton $f.mid.save.button -text "Save To"\
	-anchor w\
	-width 9\
	-relief flat\
	-variable pr_type\
	-command pr_update_entries\
	-value save
    radiobutton $f.mid.preview.button -text Preview\
	-anchor w\
	-width 9\
	-relief flat\
	-variable pr_type\
	-command pr_update_entries\
	-value preview
    radiobutton $f.mid.print.button -text Print\
	-anchor w\
	-width 9\
	-relief flat\
	-variable pr_type\
	-command pr_update_entries\
	-value print

    entry $f.mid.entry\
	-relief sunken\
	-bd 1\
	-width 15

    make_buttons $f.bot 1 {
	{Cancel		{set pr_done 0}}
	{Okay		{set pr_done 1}}
    }

    pack $f.top.l.one	-side top -fill x -padx 5m
    pack $f.top.l.two	-side top -fill x -padx 5m
    pack $f.top.l.four	-side top -fill x -padx 5m
    pack $f.top.r.eight	-side top -fill x -padx 5m
    pack $f.top.r.ten	-side top -fill x -padx 5m
    pack $f.top.r.month	-side top -fill x -padx 5m

    pack $f.top.l	-side left
    pack $f.top.r	-side right

    pack $f.mid.save.button	-side left -padx 5m
    pack $f.mid.preview.button	-side left -padx 5m
    pack $f.mid.print.button	-side left -padx 5m

    pack $f.mid.save	-side top -expand 1 -fill x
    pack $f.mid.preview	-side top -expand 1 -fill x
    pack $f.mid.print	-side top -expand 1 -fill x

    pack $f.top -side top -expand 1 -fill both
    pack $f.mid -side top -fill both
    pack $f.bot -side bottom -fill both

    pr_update_entries

    bind $f.mid.entry	<Control-c> {set pr_done 0}
    bind $f.mid.entry	<Return>    {set pr_done 1}

    wm withdraw $f
    update
}

proc pr_update_entries {} {
    global pr_type

    set f .pr_dialog
    pack forget $f.mid.entry

    $f.mid.entry configure -textvariable pr_$pr_type
    pack $f.mid.entry -in $f.mid.$pr_type -side right -expand 1 -fill x
}

proc pr_interact {leader date} {
    global pr_done
    set f .pr_dialog

    # Run dialog
    set pr_done -1
    dialog_run $leader $f $f.mid.entry pr_done
    if !$pr_done {return}

    # Actually print (make sure outfile gets closed on error)
    set out [pr_outfile]
    if [catch {
	set outfile [open $out w]
	puts $outfile [pr_output $date]
	close $outfile
    } msg] {
	catch {close $outfile}
	error "Could not print to \"$out\"\n\n$msg"
    }

    catch {close $outfile}
}

# effects - Return output file name
proc pr_outfile {} {
    global pr_type pr_save pr_preview pr_print

    # Stash away printing commands
    if ![cal readonly] {
	cal option PrintCommand   $pr_print
	cal option PreviewCommand $pr_preview
    }

    switch -exact -- $pr_type {
	save {
	    set str $pr_save
	}
	preview {
	    set str "|$pr_preview"
	}
	print {
	    set str "|$pr_print"
	}
	default {
	    error "Unknown printing mode $pr_type"
	}
    }

    return $str
}

# effects - Return postscript string
proc pr_output {date} {
    global ical pr_count

    switch -exact -- $pr_count {
	1	{set str [psdays $date 1 1 0]}
	2	{set str [psdays $date 2 2 1]}
	4	{set str [psdays $date 4 2 0]}
	8	{set str [psdays $date 8 4 1]}
	10	{set str [psdays $date 10 5 1]}
	month	{set str [psmonth $date]}
	default {error "do not know how to print $pr_count days"}
    }

    return "$ical(psheader)\n%%Page: 1 1\n$str\n%%Trailer\n%%Pages: 1"
}
