OSDN Git Service

Please enter the commit message for your changes. Lines starting
[eos/base.git] / util / src / TclTk / blt2.5 / demos / scripts / ps.tcl
diff --git a/util/src/TclTk/blt2.5/demos/scripts/ps.tcl b/util/src/TclTk/blt2.5/demos/scripts/ps.tcl
new file mode 100644 (file)
index 0000000..2c1263a
--- /dev/null
@@ -0,0 +1,767 @@
+#bltdebug 100
+
+array set cursors {
+    w left_side
+    e right_side
+    n top_side
+    s bottom_side
+    sw bottom_left_corner
+    ne top_right_corner
+    se bottom_right_corner
+    nw top_left_corner
+}
+
+
+array set pageInfo {
+    gripSize 8
+    scale 0.25
+    radioFont -*-helvetica-medium-r-*-*-11-120-*-*-*-*-*-*
+    labelFont -*-helvetica-bold-r-*-*-12-120-*-*-*-*-*-*
+    printCmd   "nlp -d2a211"
+    printFile   "out.ps"
+}
+
+
+proc SetUnits { units }  {
+    global pageInfo
+    switch -glob $units {
+       "i*"    { set pageInfo(uscale) [winfo fpixels . 1i]  }
+       "c*"    { set pageInfo(uscale) [winfo fpixels . 1c] }
+       default { error "unknown unit \"$units\"" }
+    }
+    set pageInfo(units) [string index $units 0]
+}
+
+
+proc ConvertUnits { value } {
+    global pageInfo
+    set value [expr double($value) / $pageInfo(uscale)]
+    return [format "%.1f%s" $value $pageInfo(units)]
+}
+
+
+proc SetPaperSize { unit } {
+    global pageInfo
+    SetUnits $unit
+    set pageInfo(-paperwidth) [lindex $pageInfo(paperSize) 0]
+    set pageInfo(-paperheight) [lindex $pageInfo(paperSize) 1]
+    ApplyPs
+}
+    
+proc SetCanvasSize { canvas width height } {
+    global pageInfo
+
+    set width [winfo pixels . $width]
+    set height [winfo pixels . $height]
+    $canvas configure -width $width -height $height
+}
+
+proc SetCanvasOrientation { canvas } {
+    global pageInfo
+    set width $pageInfo(paperWidth)
+    set height $pageInfo(paperHeight)
+    SetCanvasSize $canvas $width $height
+}
+
+
+proc GetPsOptions { graph } {
+    global pageInfo
+
+    foreach opt [$graph postscript configure] {
+       set pageInfo([lindex $opt 0]) [lindex $opt 4]
+    }
+}
+
+proc SetOutline { canvas } {
+    global pageInfo
+    foreach var { gripSize xMin yMin xMax yMax } {
+       set $var $pageInfo($var)
+    }
+    set xMid [expr ($xMax + $xMin - $gripSize) * 0.5]
+    set yMid [expr ($yMax + $yMin - $gripSize) * 0.5]
+    $canvas coords image $xMin $yMin 
+    $canvas itemconfigure image \
+       -width [expr $xMax - $xMin] -height [expr $yMax - $yMin]
+    $canvas coords nw \
+       $xMin $yMin [expr $xMin + $gripSize] [expr $yMin + $gripSize] 
+    $canvas coords se \
+       [expr $xMax - $gripSize] [expr $yMax - $gripSize] $xMax $yMax 
+    $canvas coords ne \
+       [expr $xMax - $gripSize] [expr $yMin + $gripSize] $xMax $yMin 
+    $canvas coords sw \
+       $xMin $yMax [expr $xMin + $gripSize] [expr $yMax - $gripSize] 
+    SetCanvasOrientation $canvas
+    $canvas coords n \
+       $xMid $yMin [expr $xMid + $gripSize] [expr $yMin + $gripSize] 
+    $canvas coords s \
+       $xMid [expr $yMax - $gripSize] [expr $xMid + $gripSize] $yMax
+     $canvas coords e \
+       [expr $xMax - $gripSize] $yMid $xMax [expr $yMid + $gripSize] 
+     $canvas coords w \
+       $xMin $yMid [expr $xMin + $gripSize] [expr $yMid + $gripSize] 
+}
+
+proc CreateOutline { canvas } {
+    global pageInfo
+    foreach var { gripSize xMin yMin xMax yMax } {
+       set $var $pageInfo($var)
+    }
+    if { ![bitmap exists pattern8] } {
+       bitmap define pattern8 { {8 8} {ff 00 ff 00 ff 00 ff 00 } }
+    }
+    $canvas create eps $xMin $yMin \
+       -tags "outline image" \
+       -width [expr $xMax - $xMin] \
+       -height [expr $yMax - $yMin]
+
+    $canvas bind image <ButtonPress-1>   "StartMove $canvas %x %y"
+    $canvas bind image <B1-Motion>       "MoveOutline $canvas %x %y"
+    $canvas bind image <ButtonRelease-1> "EndMove $canvas"
+
+    $canvas bind image <Shift-B1-Motion> "ConstrainMoveOutline $canvas %x %y"
+    $canvas bind image <Enter> "EnterImage $canvas"
+    $canvas bind image <Leave> "LeaveImage $canvas"
+    focus $canvas
+    $canvas create rectangle \
+       $xMin $yMin [expr $xMin + $gripSize] [expr $yMin + $gripSize] \
+       -tags "outline grip nw" 
+    $canvas create rectangle \
+       [expr $xMax - $gripSize] [expr $yMax - $gripSize] $xMax $yMax \
+       -tags "outline grip se" 
+    $canvas create rectangle \
+       [expr $xMax - $gripSize] [expr $yMin + $gripSize] $xMax $yMin \
+       -tags "outline grip ne" 
+    $canvas create rectangle \
+       $xMin $yMax [expr $xMin + $gripSize] [expr $yMax - $gripSize] \
+       -tags "outline grip sw" 
+
+    set xMid [expr ($xMax + $xMin - $gripSize) * 0.5]
+    set yMid [expr ($yMax + $yMin - $gripSize) * 0.5]
+    $canvas create rectangle \
+       $xMid $yMin [expr $xMid + $gripSize] [expr $yMin + $gripSize] \
+       -tags "outline grip n" 
+    $canvas create rectangle \
+       $xMid [expr $yMax - $gripSize] [expr $xMid + $gripSize] $yMax \
+       -tags "outline grip s" 
+     $canvas create rectangle \
+       [expr $xMax - $gripSize] $yMid $xMax [expr $yMid + $gripSize] \
+       -tags "outline grip e" 
+     $canvas create rectangle \
+       $xMin $yMid [expr $xMin + $gripSize] [expr $yMid + $gripSize] \
+       -tags "outline grip w" 
+    foreach grip { e w s n sw ne se nw } {
+       $canvas bind $grip <ButtonPress-1>   "StartResize %W $grip %x %y"
+       $canvas bind $grip <B1-Motion>       "ResizeOutline %W %x %y"
+       $canvas bind $grip <ButtonRelease-1> "EndResize %W $grip %x %y"
+       $canvas bind $grip <Enter>           "EnterGrip %W $grip %x %y"
+       $canvas bind $grip <Leave>           "LeaveGrip %W $grip"
+    }
+    $canvas raise grip
+    $canvas itemconfigure grip -fill red -outline black
+
+    set pageInfo(image) [image create photo]
+    $pageInfo(graph) snap $pageInfo(image)
+    $canvas itemconfigure image -image $pageInfo(image)
+}
+
+
+proc EnterImage  { canvas } {
+    global cursors
+    global pageInfo
+    bind $canvas <KeyPress-Left>  {
+       MoveOutline %W [expr $pageInfo(lastX) - 1]  $pageInfo(lastY)
+    }
+    bind $canvas <KeyPress-Right> {
+       MoveOutline %W [expr $pageInfo(lastX) + 1]  $pageInfo(lastY)
+    }
+    bind $canvas <KeyPress-Up>   {
+       MoveOutline %W $pageInfo(lastX) [expr $pageInfo(lastY) - 1]
+    }
+    bind $canvas <KeyPress-Down> {
+       MoveOutline %W $pageInfo(lastX) [expr $pageInfo(lastY) + 1]
+    }
+    focus $canvas
+    $canvas configure -cursor fleur
+    set pageInfo(lastX) 0
+    set pageInfo(lastY) 0
+}
+
+
+proc LeaveImage { canvas } {    
+    bind $canvas <KeyPress-Left> ""
+    bind $canvas <KeyPress-Right> ""
+    bind $canvas <KeyPress-Up> ""
+    bind $canvas <KeyPress-Down> ""
+    $canvas configure -cursor ""
+}
+
+proc EnterGrip  { canvas grip x y } {
+    global pageInfo
+    $canvas itemconfigure $grip -fill blue -outline black
+    set pageInfo(grip) $grip
+    global cursors
+    bind $canvas <KeyPress-Left>  {
+       ResizeOutline %W [expr $pageInfo(lastX) - 1] $pageInfo(lastY)
+    }
+    bind $canvas <KeyPress-Right> {
+       ResizeOutline %W [expr $pageInfo(lastX) + 1] $pageInfo(lastY)
+    }
+    bind $canvas <KeyPress-Up> {
+       ResizeOutline %W $pageInfo(lastX) [expr $pageInfo(lastY) - 1] 
+    }
+    bind $canvas <KeyPress-Down> {
+       ResizeOutline %W $pageInfo(lastX) [expr $pageInfo(lastY) + 1] 
+    }
+    focus $canvas
+    $canvas configure -cursor $cursors($grip)
+    set pageInfo(lastX) $x
+    set pageInfo(lastY) $y
+}
+
+proc LeaveGrip { canvas grip } {    
+    $canvas itemconfigure $grip -fill red -outline black
+    bind $canvas <KeyPress-Left> ""
+    bind $canvas <KeyPress-Right> ""
+    bind $canvas <KeyPress-Up> ""
+    bind $canvas <KeyPress-Down> ""
+    $canvas configure -cursor ""
+}
+
+proc StartMove { canvas x y } {
+    global pageInfo 
+    set pageInfo(lastX) $x
+    set pageInfo(lastY) $y
+    set pageInfo(direction) "undecided"
+    $canvas configure -cursor fleur
+}
+
+proc MoveOutline { canvas x y } {
+    global pageInfo
+    $canvas move outline [expr $x - $pageInfo(lastX)] [expr $y - $pageInfo(lastY)]
+    set pageInfo(lastX) $x
+    set pageInfo(lastY) $y
+}
+
+proc ConstrainMoveOutline { canvas x y } {
+    global pageInfo
+
+    set dx [expr $x - $pageInfo(lastX)]
+    set dy [expr $y - $pageInfo(lastY)]
+
+    if { $pageInfo(direction) == "undecided" } {
+       if { abs($dx) > abs($dy) } {
+           set pageInfo(direction) x
+           $canvas configure -cursor sb_h_double_arrow
+       } else {
+           set pageInfo(direction) y
+           $canvas configure -cursor sb_v_double_arrow
+       }
+    }
+    switch $pageInfo(direction) {
+       x { set dy 0 ; set pageInfo(lastX) $x } 
+       y { set dx 0 ; set pageInfo(lastY) $y }
+    }
+    $canvas move outline $dx $dy
+}
+
+proc EndMove { canvas } {
+    $canvas configure -cursor ""
+
+    set coords [$canvas coords image]
+    set x [lindex $coords 0]
+    set y [lindex $coords 1]
+    set w [$canvas itemcget image -width]
+    set h [$canvas itemcget image -height]
+
+    global pageInfo
+    set pageInfo(xMin) $x
+    set pageInfo(xMin) $y
+    set pageInfo(xMax) [expr $x + $w]
+    set pageInfo(yMax) [expr $y + $h]
+
+    global pageInfo
+    set pageInfo(-padx) [list $pageInfo(xMin) [expr $pageInfo(paperWidth) - $pageInfo(xMax)]]
+    set pageInfo(-pady) [list $pageInfo(yMin) [expr $pageInfo(paperHeight) - $pageInfo(yMax)]]
+}
+
+proc StartResize { canvas grip x y } {
+    global pageInfo
+    $canvas itemconfigure image -quick yes
+    set pageInfo(grip) $grip
+    $canvas itemconfigure $grip -fill red -outline black 
+    $canvas raise grip
+    global cursors
+    $canvas configure -cursor $cursors($grip)
+    set pageInfo(lastX) $x
+    set pageInfo(lastY) $y
+}
+
+proc EndResize { canvas grip x y } {
+    $canvas itemconfigure image -quick no
+    ResizeOutline $canvas $x $y
+    $canvas itemconfigure $grip -fill "" -outline "" 
+    $canvas configure -cursor ""
+}
+
+proc ResizeOutline { canvas x y } {
+    global pageInfo
+
+    foreach var { gripSize xMin yMin xMax yMax } {
+       set $var $pageInfo($var)
+    }
+    switch $pageInfo(grip) {
+       n {
+           set yMin $y
+       }
+       s {
+           set yMax $y
+       }
+       e {
+           set xMax $x
+       }
+       w {
+           set xMin $x
+       }
+       sw {
+           set xMin $x ; set yMax $y
+       }
+       ne {
+           set xMax $x ; set yMin $y
+       }
+       se {
+           set xMax $x ; set yMax $y
+       }
+       nw {
+           set xMin $x ; set yMin $y
+       }
+    }
+    set width [expr $xMax - $xMin]
+    set height [expr $yMax - $yMin]
+    if { ($width < 1) || ($height < 1) } {
+       return
+    }
+    SetOutline $canvas
+    foreach var { xMin yMin xMax yMax } {
+       set pageInfo($var) [set $var]
+    }
+}
+
+proc ComputePlotGeometry { graph } {
+    global pageInfo
+
+    GetPsOptions $graph
+    set width [winfo width $graph]
+    set height [winfo height $graph]
+    if { $pageInfo(-width) > 0 } {
+       set width $pageInfo(-width)
+    }
+    if { $pageInfo(-height) > 0 } {
+       set height $pageInfo(-height)
+    }
+
+    set left [lindex $pageInfo(-padx) 0]
+    set right [lindex $pageInfo(-padx) 1]
+    set top [lindex $pageInfo(-pady) 0]
+    set bottom [lindex $pageInfo(-pady) 1]
+    set padx [expr $left + $right]
+    set pady [expr $top + $bottom]
+
+    if { $pageInfo(-paperwidth) > 0 } {
+       set paperWidth $pageInfo(-paperwidth)
+    } else {
+       set paperWidth [expr $width + $padx]
+    }
+    if { $pageInfo(-paperheight) > 0 } {
+       set paperHeight $pageInfo(-paperheight)
+    } else {
+       set paperHeight [expr $height + $pady]
+    }
+    if { $pageInfo(-landscape) } {
+       set temp $paperWidth
+       set paperWidth $paperHeight
+       set paperHeight $temp
+    }
+
+    set scale 1.0
+    if { $pageInfo(-maxpect) } {
+       set xScale [expr ($paperWidth - $padx) / double($width)]
+       set yScale [expr ($paperHeight - $pady) / double($height)]
+       set scale [expr min($xScale,$yScale)]
+       set bboxWidth [expr round($width * $scale)]
+       set bboxHeight [expr round($height * $scale)]
+    } else {
+       if { ($width + $padx) > $paperWidth } {
+           set width [expr $paperWidth - $padx]
+       }
+       if { ($height + $pady) > $paperHeight } {
+           set height [expr $paperHeight - $pady]
+       }
+       set bboxWidth $width
+       set bboxHeight $height
+    }
+    set x $left
+    set y $top
+    if { $pageInfo(-center) } {
+       if { $paperWidth > $bboxWidth }  {
+           set x [expr ($paperWidth - $bboxWidth) / 2]
+       }
+       if { $paperHeight > $bboxHeight } {
+           set y [expr ($paperHeight - $bboxHeight) / 2]
+       }
+    }
+    set pageInfo(xMin) [expr $x * $pageInfo(scale)]
+    set pageInfo(yMin) [expr $y * $pageInfo(scale)]
+    set pageInfo(xMax) [expr ($x + $bboxWidth) * $pageInfo(scale)]
+    set pageInfo(yMax) [expr ($y + $bboxHeight) * $pageInfo(scale)]
+    set pageInfo(paperHeight) [expr $paperHeight * $pageInfo(scale)]
+    set pageInfo(paperWidth) [expr $paperWidth * $pageInfo(scale)]
+}
+
+proc PsDialog { graph } {
+    global pageInfo
+
+    set pageInfo(graph) $graph
+    set top $graph.top
+    toplevel $top
+    option add *graph.top*Radiobutton.font $pageInfo(radioFont)
+    GetPsOptions $graph
+    ComputePlotGeometry $graph
+    set canvas $top.layout
+    canvas $canvas -confine yes \
+       -width $pageInfo(paperWidth) -height $pageInfo(paperHeight) -bg gray \
+       -bd 2 -relief sunken 
+    CreateOutline $canvas
+    SetCanvasOrientation $canvas
+    label $top.titleLabel -text "PostScript Options"
+    table $top \
+       0,0 $top.titleLabel -cspan 7 \
+       1,0 $canvas -cspan 7
+
+    set row 2
+    set col 0
+    label $top.paperLabel -text "Paper"
+    radiobutton $top.letter -text "Letter 8 1/2 x 11 in." -value "8.5i 11i" \
+       -variable pageInfo(paperSize) \
+       -command "SetPaperSize i"
+    radiobutton $top.a3 -text "A3 29.7 x 42 cm." -value "28.7c 41c" \
+       -variable pageInfo(paperSize) \
+       -command "SetPaperSize c"
+    radiobutton $top.a4 -text "A4 21 x 29.7 cm." -value "21c 29.7c" \
+       -variable pageInfo(paperSize) \
+       -command "SetPaperSize c"
+    radiobutton $top.a5 -text "A5 14.85 x 21 cm." -value "14.85c 21c" \
+       -variable pageInfo(paperSize) \
+       -command "SetPaperSize c"
+    radiobutton $top.legal -text "Legal 8 1/2 x 14 in." -value "8.5i 14i" \
+       -variable pageInfo(paperSize) \
+       -command "SetPaperSize i"
+    radiobutton $top.large -text "Large 11 x 17 in." -value "11i 17i" \
+       -variable pageInfo(paperSize) \
+       -command "SetPaperSize i"
+    table configure $top r$row -pady { 4 0 }
+    table $top \
+       $row,$col     $top.paperLabel -anchor e \
+       $row+0,$col+1 $top.letter -anchor w \
+       $row+1,$col+1 $top.legal -anchor w \
+       $row+2,$col+1 $top.large -anchor w \
+       $row+0,$col+2 $top.a3 -anchor w \
+       $row+1,$col+2 $top.a4 -anchor w \
+       $row+2,$col+2 $top.a5 -anchor w 
+
+    incr row 3
+
+    label $top.orientLabel -text "Orientation"
+    radiobutton $top.portrait -text "Portrait" -value "0" \
+       -variable pageInfo(-landscape) -command "ApplyPs"
+    radiobutton $top.landscape -text "Landscape" -value "1" \
+       -variable pageInfo(-landscape) -command "ApplyPs"
+    table configure $top r$row -pady { 4 0 }
+    table $top \
+       $row,$col+0   $top.orientLabel -anchor e \
+       $row,$col+1 $top.portrait -anchor w \
+       $row,$col+2 $top.landscape -anchor w 
+
+    incr row 6
+
+    set col 0
+    label $top.plotLabel -text "Plot Options"
+    table $top \
+       $row,$col   $top.plotLabel -cspan 3 
+    incr row
+    label $top.sizeLabel -text "Size"
+    radiobutton $top.default -text "Default" -value "default" \
+       -variable pageInfo(plotSize) \
+       -command "SetPlotSize"
+    radiobutton $top.maxpect -text "Max Aspect" -value "maxpect" \
+       -variable pageInfo(plotSize) \
+       -command "SetPlotSize"
+    radiobutton $top.resize -text "Resize" -value "resize" \
+       -variable pageInfo(plotSize) \
+       -command "SizeDialog $graph {Adjust Plot Size}"
+    table configure $top r$row -pady { 4 0 }
+    table $top \
+       $row,$col   $top.sizeLabel -anchor e \
+       $row,$col+1 $top.default -anchor w \
+       $row+1,$col+1 $top.maxpect -anchor w \
+       $row+2,$col+1 $top.resize -anchor w 
+
+    #incr row 4
+    
+    set pageInfo(oldPadX) $pageInfo(-padx)
+    set pageInfo(oldPadY) $pageInfo(-pady)
+
+    label $top.posLabel -text "Position"
+    set pageInfo(position) $pageInfo(-center)
+    radiobutton $top.center -text "Center" -value "1" \
+       -variable pageInfo(position) -command {
+           set pageInfo(-center) 1
+           CenterPlot
+       }
+    radiobutton $top.origin -text "Origin" -value "0" \
+       -variable pageInfo(position) -command {
+           set pageInfo(-center) 0
+           ApplyPs
+       }
+    radiobutton $top.move -text "Move" -value "move" \
+       -variable pageInfo(position) -command {
+           set pageInfo(-center) 0
+           MoveDialog
+       }
+    table configure $top r$row -pady { 4 0 }
+    table $top \
+       $row,$col+2 $top.posLabel -anchor e \
+       $row,$col+3 $top.center -anchor w \
+       $row+1,$col+3 $top.origin -anchor w \
+       $row+2,$col+3 $top.move -anchor w 
+
+    incr row 4
+    label $top.printLabel -text "Print To"
+    radiobutton $top.toFile -text "File" -value "printFile" \
+       -variable pageInfo(printTo) -command "
+           $top.fileEntry configure -textvariable pageInfo(printFile)
+       "
+    radiobutton $top.toCmd -text "Command" -value "printCmd" \
+       -variable pageInfo(printTo) -command "
+           $top.fileEntry configure -textvariable pageInfo(printCmd)
+       "
+    entry $top.fileEntry 
+    table configure $top r$row -pady { 4 0 }
+    table configure $top r[expr $row+1] -pady { 4 0 }
+    table configure $top r[expr $row+2] -pady { 4 0 }
+    table $top \
+       $row,0   $top.printLabel -anchor e \
+       $row,1   $top.toFile -anchor w \
+       $row+1,1 $top.toCmd -anchor w \
+       $row+2,1 $top.fileEntry -anchor w -fill x -cspan 3 
+    $top.toFile invoke
+    incr row 3
+    #table configure $top c4 -width .125i
+    button $top.cancel -text "Cancel" -command "destroy $top"
+    button $top.print -text "Done" -command "PrintPs $graph"
+    button $top.advanced -text "Options" -command "MarginDialog $graph"
+    table $top \
+       $row,1 $top.print  -width 1i -pady 2  \
+       $row,2 $top.advanced  -width 1i -pady 2 \
+       $row,3 $top.cancel  -width 1i -pady 2 -anchor w 
+
+    SetUnits "inches"
+    foreach label [info commands $top.*Label] {
+       $label configure -font $pageInfo(labelFont) -padx 4
+    }
+}
+
+proc PrintPs { graph } {
+    $graph postscript output "out.ps"
+    puts stdout "wrote file \"out.ps\"."
+    flush stdout
+}
+
+proc ApplyPs { } {
+    global pageInfo
+
+    set graph $pageInfo(graph)
+    foreach option [$graph postscript configure] {
+       set var [lindex $option 0]
+       set old [lindex $option 4]
+       if { [catch {$graph postscript configure $var $pageInfo($var)}] != 0 } {
+           $graph postscript configure $var $old
+           set pageInfo($var) $old
+       }
+    }
+    ComputePlotGeometry $graph
+    foreach var { -paperheight -paperwidth -width -height } {
+       set pageInfo($var) [ConvertUnits $pageInfo($var)]
+    }
+    SetOutline $graph.top.layout
+}
+
+proc StartChange { w delta } {
+    ChangeSize $w $delta
+    global pageInfo
+    set pageInfo(afterId) [after 300 RepeatChange $w $delta]
+}
+
+proc RepeatChange { w delta } {
+    ChangeSize $w $delta
+    global pageInfo
+    set pageInfo(afterId) [after 100 RepeatChange $w $delta]
+}
+
+proc EndChange { w } {
+    global pageInfo
+    after cancel $pageInfo(afterId)
+}
+
+proc ChangeSize { w delta } {
+    set f [winfo parent $w]
+    set value [$f.entry get]
+    set value [expr $value + $delta]
+    if { $value < 0 } {
+       set value 1
+    }
+    $f.entry delete 0 end
+    $f.entry insert 0 $value
+}
+
+proc MakeSizeAdjustor { w label var } {
+    frame $w
+    label $w.label -text $label
+    button $w.plus -text "+" -padx 1 -pady 0 -font \*symbol\* 
+    entry $w.entry -width 6 -textvariable "pageInfo($var)"
+    button $w.minus -text "-" -padx 1 -pady 0 -font \*symbol\*
+    label $w.units -text "in"
+    bind $w.plus <ButtonPress-1>  { StartChange %W 0.1}
+    bind $w.plus <ButtonRelease-1> { EndChange %W }
+    bind $w.minus <ButtonPress-1>  { StartChange %W -0.1}
+    bind $w.minus <ButtonRelease-1> { EndChange %W }
+    table $w \
+       0,1 $w.label \
+       1,1 $w.entry -rspan 2 -fill y \
+       1,0 $w.minus -padx 2 -pady 2 \
+       2,0 $w.plus -padx 2 -pady { 0 2 } \
+       1,2 $w.units -rspan 2 -fill y 
+    
+}
+
+
+proc SizeDialog { graph title } {
+    global pageInfo
+    set top .plotSize
+    if { [winfo exists $top] } {
+       return
+    }
+    toplevel $top
+    label $top.title -text $title
+    button $top.cancel -text "Cancel" -command "destroy $top"
+    button $top.ok -text "Ok" -command "ApplyPs; destroy $top"
+    MakeSizeAdjustor $top.plotWidth "Width" -width
+    MakeSizeAdjustor $top.plotHeight "Height" -height
+    table $top \
+       0,0 $top.title -cspan 2 \
+       1,0 $top.plotWidth \
+       1,1 $top.plotHeight \
+       2,0 $top.cancel -pady 4 -padx 4 -width 1i \
+       2,1 $top.ok -pady 4 -padx 4 -width 1i
+    set width [winfo fpixels . $pageInfo(-width)]
+    set height [winfo fpixels . $pageInfo(-height)]
+    if { $width == 0 } {
+       set width [expr ($pageInfo(xMax) - $pageInfo(xMin)) / $pageInfo(scale)]
+       set pageInfo(-width) [ConvertUnits $width]
+    }
+    if { $height == 0 } {
+       set height [expr ($pageInfo(yMax) - $pageInfo(yMin)) / $pageInfo(scale)]
+       set pageInfo(-height) [ConvertUnits $height]
+    }
+    set pageInfo(-maxpect) 0
+}
+
+proc SetPlotSize { } {
+    global pageInfo
+    set graph $pageInfo(graph)
+    switch $pageInfo(plotSize) {
+       default { 
+           set pageInfo(-width) 0
+           set pageInfo(-height) 0 
+           set pageInfo(-maxpect) 0
+           set pageInfo(-padx) $pageInfo(oldPadX)
+           set pageInfo(-pady) $pageInfo(oldPadY)
+       } maxpect { 
+           set pageInfo(-width) 0
+           set pageInfo(-height) 0
+           set pageInfo(-maxpect) 1
+           set pageInfo(-padx) $pageInfo(oldPadX)
+           set pageInfo(-pady) $pageInfo(oldPadY)
+       } resize {
+           set pageInfo(-maxpect) 0
+       }
+    }
+    ApplyPs
+}
+
+
+proc PaperSizeDialog { title } {
+    set top .paperSize
+    if { [winfo exists $top] } {
+       return
+    }
+    toplevel $top
+    label $top.title -text $title
+    MakeSizeAdjustor $top.width "Width" -paperwidth
+    MakeSizeAdjustor $top.height "Height" -paperheight
+    button $top.cancel -text "Cancel" -command "destroy $top"
+    button $top.ok -text "Ok" -command "ApplyPs; destroy $top"
+    table $top \
+       0,0 $top.title -cspan 2 \
+       1,0 $top.width \
+       1,1 $top.height \
+       2,0 $top.cancel -pady 4 -padx 4 -width 1i \
+       2,1 $top.ok -pady 4 -padx 4 -width 1i
+}
+
+proc MarginDialog { graph } {
+    set top $graph.top.options
+    if { [winfo exists $top] } {
+       return
+    }
+    toplevel $top
+    set row 0
+    set col 0
+    label $top.modeLabel -text "Printer"
+    radiobutton $top.color -text "Color" -value "color" \
+       -variable pageInfo(-colormode) -command "ApplyPs"
+    radiobutton $top.greyscale -text "Greyscale" -value "greyscale" \
+       -variable pageInfo(-colormode) -command "ApplyPs"
+    table $top \
+       $row,$col   $top.modeLabel -anchor e \
+       $row,$col+1 $top.color -anchor w \
+       $row+1,$col+1 $top.greyscale -anchor w 
+
+    table configure $top r$row -pady { 4 0 }
+
+    label $top.previewLabel -text "Preview"
+    radiobutton $top.previewYes -text "Yes" -value "1" \
+       -variable pageInfo(-preview) -command "ApplyPs"
+    radiobutton $top.previewNo -text "No" -value "0" \
+       -variable pageInfo(-preview) -command "ApplyPs"
+    set col 2
+    table $top \
+       $row,$col   $top.previewLabel -anchor e \
+       $row,$col+1 $top.previewYes -anchor w \
+       $row+1,$col+1 $top.previewNo -anchor w 
+    incr row 2
+
+    button $top.cancel -text "Cancel" -command "destroy $top"
+    button $top.ok -text "Done" -command "PrintPs $graph"
+    table $top \
+       $row,0 $top.cancel -pady 4 -padx 4 -width 1i \
+       $row,1 $top.ok -pady 4 -padx 4 -width 1i
+       
+}    
+
+proc CenterPlot { } {
+    global pageInfo
+
+    set pageInfo(-padx) $pageInfo(oldPadX)
+    set pageInfo(-pady) $pageInfo(oldPadY)
+    ApplyPs
+}