Index: branches/blt4/gui/scripts/filexfer.tcl
===================================================================
--- branches/blt4/gui/scripts/filexfer.tcl	(revision 1923)
+++ branches/blt4/gui/scripts/filexfer.tcl	(revision 1932)
@@ -91,4 +91,11 @@
             }
         }
+        uploadWord {
+            if {[Rappture::filexfer::enabled]} {
+                return "Upload"
+            } else {
+                return "Browse"
+            }
+        }
         download {
             if {[Rappture::filexfer::enabled]} {
@@ -106,5 +113,5 @@
         }
         default {
-            error "bad option \"$operation\": should be upload, download, or downloadWord"
+            error "bad option \"$operation\": should be upload, uploadWord, download, or downloadWord"
         }
     }
Index: branches/blt4/gui/scripts/imageentry.tcl
===================================================================
--- branches/blt4/gui/scripts/imageentry.tcl	(revision 1923)
+++ branches/blt4/gui/scripts/imageentry.tcl	(revision 1932)
@@ -151,5 +151,5 @@
         set newval [lindex $args 0]
         if {[string length $newval] > 0} {
-            set imh [image create photo -data $newval]
+            set imh [image create picture -data $newval]
         } else {
             set imh ""
@@ -176,7 +176,21 @@
     set fmt [$_owner xml get $_path.convert]
     if {"" != $fmt && "" != $_imh} {
-        if {"pgm" == $fmt} { set fmt "ppm -grayscale" }
-        set bytes [eval $_imh data -format $fmt]
-        set bytes [Rappture::encoding::decode -as b64 $bytes]
+	switch -- $fmt {
+	    "pgm" - "ppm" {
+		$_imh export pbm -data bytes
+	    }
+	    "jpeg" {
+		$_imh export jpg -data bytes
+	    }
+	    "tiff" {
+		$_imh export tif -data bytes
+	    }
+	    "bmp" - "png" - "xbm" - "xpm" {
+		$_imh export $fmt -data bytes
+	    }
+	    default {
+		error "unknown image format \"$fmt\""
+	    }
+	}
     }
     return $bytes
Index: branches/blt4/gui/scripts/videodial.tcl
===================================================================
--- branches/blt4/gui/scripts/videodial.tcl	(revision 1932)
+++ branches/blt4/gui/scripts/videodial.tcl	(revision 1932)
@@ -0,0 +1,1271 @@
+# ----------------------------------------------------------------------
+#  COMPONENT: Videodial - selector, like the dial on a flow
+#
+#  This widget looks like the dial on an old-fashioned car flow.
+#  It draws a series of values along an axis, and allows a selector
+#  to move back and forth to select the values.
+# ======================================================================
+#  AUTHOR:  Michael McLennan, Purdue University
+#  Copyright (c) 2004-2005  Purdue Research Foundation
+#
+#  See the file "license.terms" for information on usage and
+#  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+# ======================================================================
+package require Itk
+package require BLT
+
+option add *Videodial.dialProgressColor #6666cc widgetDefault
+option add *Videodial.thickness 10 widgetDefault
+option add *Videodial.length 2i widgetDefault
+option add *Videodial.knobImage knob widgetDefault
+option add *Videodial.knobPosition n@middle widgetDefault
+option add *Videodial.dialOutlineColor black widgetDefault
+option add *Videodial.dialFillColor white widgetDefault
+option add *Videodial.lineColor gray widgetDefault
+option add *Videodial.activeLineColor black widgetDefault
+option add *Videodial.padding 0 widgetDefault
+option add *Videodial.valueWidth 10 widgetDefault
+option add *Videodial.valuePadding 0.1 widgetDefault
+option add *Videodial.foreground black widgetDefault
+option add *Videodial.font \
+    -*-helvetica-medium-r-normal-*-12-* widgetDefault
+
+itcl::class Rappture::Videodial {
+    inherit itk::Widget
+
+    itk_option define -min min Min 0
+    itk_option define -max max Max 1
+    itk_option define -minortick minortick Minortick 1
+    itk_option define -majortick majortick Majortick 5
+    itk_option define -variable variable Variable ""
+    itk_option define -offset offset Offset 1
+
+    itk_option define -thickness thickness Thickness 0
+    itk_option define -length length Length 0
+    itk_option define -padding padding Padding 0
+
+    itk_option define -foreground foreground Foreground "black"
+    itk_option define -dialoutlinecolor dialOutlineColor Color "black"
+    itk_option define -dialfillcolor dialFillColor Color "white"
+    itk_option define -dialprogresscolor dialProgressColor Color ""
+    itk_option define -linecolor lineColor Color "black"
+    itk_option define -activelinecolor activeLineColor Color "black"
+    itk_option define -knobimage knobImage KnobImage ""
+    itk_option define -knobposition knobPosition KnobPosition ""
+
+    itk_option define -font font Font ""
+    itk_option define -valuewidth valueWidth ValueWidth 0
+    itk_option define -valuepadding valuePadding ValuePadding 0
+
+
+    constructor {args} { # defined below }
+    destructor { # defined below }
+
+    public method current {value}
+    public method clear {}
+    public method color {value}
+    public method mark {type args}
+    public method bball {}
+
+    protected method _bindings {type args}
+    protected method _redraw {}
+    protected method _marker {tag action x y}
+    protected method _move {action x y}
+    protected method _knob {x y}
+    protected method _navigate {offset}
+    protected method _fixSize {}
+    protected method _fixMinorSize {}
+    protected method _fixValue {args}
+    protected method _fixOffsets {}
+
+    private method _current {value}
+    private method _see {item}
+    private method _draw_major_timeline {}
+    private method _draw_minor_timeline {}
+    private method _offsetx {x}
+    private method ms2rel {value}
+    private method rel2ms {value}
+    private common _click             ;# x,y point where user clicked
+    private common _marks             ;# list of marks
+    private variable _values ""       ;# list of all values on the dial
+    private variable _val2label       ;# maps value => string label(s)
+    private variable _current 0       ;# current value (where pointer is)
+    private variable _variable ""     ;# variable associated with -variable
+    private variable _knob ""         ;# image for knob
+    private variable _spectrum ""     ;# width allocated for values
+    private variable _activecolor ""  ;# width allocated for values
+    private variable _vwidth 0        ;# width allocated for values
+    private variable _offset_pos 1    ;#
+    private variable _offset_neg -1   ;#
+    private variable _imspace 10      ;# pixels between intermediate marks
+    private variable _pmcnt 0         ;# particle marker count
+    private variable _min 0
+    private variable _max 1
+    private variable _minortick 1
+    private variable _majortick 5
+}
+
+itk::usual Videodial {
+    keep -foreground -cursor -font
+}
+
+# ----------------------------------------------------------------------
+# CONSTRUCTOR
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::constructor {args} {
+
+    # ----------------------------------------------------------------------
+    # controls for the major timeline.
+    # ----------------------------------------------------------------------
+    itk_component add majordial {
+        canvas $itk_interior.majordial
+    }
+
+    bind $itk_component(majordial) <Configure> [itcl::code $this _draw_major_timeline]
+
+    bind $itk_component(majordial) <ButtonPress-1> [itcl::code $this _knob %x %y]
+    bind $itk_component(majordial) <B1-Motion> [itcl::code $this _knob %x %y]
+    bind $itk_component(majordial) <ButtonRelease-1> [itcl::code $this _knob %x %y]
+
+    #bind $itk_component(hull) <KeyPress-Left> [itcl::code $this _navigate $_offset_neg]
+    #bind $itk_component(hull) <KeyPress-Right> [itcl::code $this _navigate $_offset_pos]
+
+    $itk_component(majordial) bind  "knob" <Enter> \
+        [list $itk_component(majordial) configure -cursor sb_h_double_arrow]
+    $itk_component(majordial) bind  "knob" <Leave> \
+        [list $itk_component(majordial) configure -cursor ""]
+
+    # ----------------------------------------------------------------------
+    # controls for the major timeline.
+    # ----------------------------------------------------------------------
+    itk_component add minordial {
+        canvas $itk_interior.minordial -background blue
+    }
+
+
+    bind $itk_component(minordial) <Configure> [itcl::code $this _draw_minor_timeline]
+
+    bind $itk_component(minordial) <ButtonPress-1> [itcl::code $this _move click %x %y]
+    bind $itk_component(minordial) <B1-Motion> [itcl::code $this _move drag %x %y]
+    bind $itk_component(minordial) <ButtonRelease-1> [itcl::code $this _move release %x %y]
+
+    # ----------------------------------------------------------------------
+    # place controls in widget.
+    # ----------------------------------------------------------------------
+
+    blt::table $itk_interior \
+        0,0 $itk_component(majordial) -fill x \
+        1,0 $itk_component(minordial) -fill x
+
+    blt::table configure $itk_interior c* -resize both
+    blt::table configure $itk_interior r0 -resize none
+    blt::table configure $itk_interior r1 -resize none
+
+
+    eval itk_initialize $args
+
+#    $itk_component(majordial) configure -background green
+#    $itk_component(minordial) configure -background cyan
+
+    _fixSize
+    _fixOffsets
+}
+
+# ----------------------------------------------------------------------
+# DESTRUCTOR
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::destructor {} {
+    configure -variable ""  ;# remove variable trace
+    after cancel [itcl::code $this _redraw]
+}
+
+# ----------------------------------------------------------------------
+# USAGE: current ?<value>?
+#
+# Clients use this to set a new value for the dial.  Values are always
+# sorted in order along the dial.  If the value is not specified,
+# then it is created automatically based on the number of elements
+# on the dial.
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::current {value} {
+    if {"" == $value} {
+        return
+    }
+    _current [ms2rel $value]
+    set framenum [expr int($value)]
+    _see "frame$framenum"
+    mark current $framenum
+    event generate $itk_component(hull) <<Value>>
+}
+
+# ----------------------------------------------------------------------
+# USAGE: _current ?<value>?
+#
+# Clients use this to set a new value for the dial.  Values are always
+# sorted in order along the dial.  If the value is not specified,
+# then it is created automatically based on the number of elements
+# on the dial.
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::_current {relval} {
+    if { $relval < 0.0 } {
+        set relval 0.0
+    }
+    if { $relval > 1.0 } {
+        set relval 1.0
+    }
+    set _current $relval
+    after cancel [itcl::code $this _draw_major_timeline]
+    after idle [itcl::code $this _draw_major_timeline]
+    if { $_variable != "" } {
+        upvar #0 $_variable var
+        set var [rel2ms $_current]
+        puts stderr "var = $var"
+    }
+}
+
+# ----------------------------------------------------------------------
+# USAGE: color <value>
+#
+# Clients use this to query the color associated with a <value>
+# along the dial.
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::color {value} {
+    if {"" != $_spectrum} {
+        set frac [expr {double($value-${_min})/(${_max}-${_min})}]
+        set color [$_spectrum get $frac]
+    } else {
+        if {$value == $_current} {
+            set color $_activecolor
+        } else {
+            set color $itk_option(-linecolor)
+        }
+    }
+    return $color
+}
+
+# ----------------------------------------------------------------------
+# USAGE: _bindings <type> ?args?
+#
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::_bindings {type args} {
+    switch -- $type {
+        "marker" {
+            set tag [lindex $args 0]
+            bind $itk_component(minordial) <ButtonPress-1> [itcl::code $this _marker $tag click %x %y]
+            bind $itk_component(minordial) <B1-Motion> [itcl::code $this _marker $tag drag %x %y]
+            bind $itk_component(minordial) <ButtonRelease-1> [itcl::code $this _marker $tag release %x %y]
+        }
+        "timeline" {
+            bind $itk_component(minordial) <ButtonPress-1> [itcl::code $this _move click %x %y]
+            bind $itk_component(minordial) <B1-Motion> [itcl::code $this _move drag %x %y]
+            bind $itk_component(minordial) <ButtonRelease-1> [itcl::code $this _move release %x %y]
+        }
+    }
+}
+
+# ----------------------------------------------------------------------
+# USAGE: mark <type> ?[-xcoord|-tag]? <where>
+#
+# Clients use this to add a mark to the timeline
+#   type can be any one of start, end
+#   where is interpreted based on the preceeding flag if available.
+#       in the default case, <where> is interpreted as a frame number
+#       or "current". if the -xcoord flag is provided, where is
+#       interpreted as the x coordinate of where to center the marker.
+#       -xcoord should only be used for temporary placement of a
+#       marker. when -xcoord is used, the marker is placed exactly at
+#       the provided x coordinate, and is not associated with any
+#       frame. It's purpose is mainly for <B1-Motion> events.
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::mark {type args} {
+
+    set c $itk_component(minordial)
+
+    set cx0 0
+    set cy0 0
+    set cx1 0
+    set cy1 0
+    foreach {cx0 cy0 cx1 cy1} [$c bbox "imbox"] break
+
+    # get coords of where to place the marker
+    set frx0 0
+    set fry0 0
+    set frx1 0
+    set fry1 0
+
+    set where ""
+    set largs [llength $args]
+    if {$largs == 1} {
+        set where [lindex $args 0]
+        if {[string compare "current" $where] == 0} {
+            set where [expr int([rel2ms ${_current}])]
+        } elseif {[string is integer $where] == 0} {
+            error "bad value \"$where\": while trying to place marker \"$type\": <where> should be an integer value"
+        }
+        set coords [$c coords "frame$where"]
+        if {![llength $coords]} {
+            # frame marker does not exist
+            # estimate where to put the marker
+            # use frame0 marker as a x=0 point
+            foreach {frx0 fry0 frx1 fry1} [$c coords "frame0"] break
+            set frx0 [expr {$frx0 + ((1.0*$where/${_minortick})*${_imspace})}]
+        } else {
+            foreach {frx0 fry0 frx1 fry1} $coords break
+        }
+        # where already contains the frame number
+    } elseif {$largs == 2} {
+        set flag [lindex $args 0]
+        switch -- $flag {
+            "-xcoord" {
+                set frx0 [lindex $args 1]
+                # where is not set for the -xcoord flag
+            }
+            "-tag" {
+                set id [lindex $args 1]
+                foreach {frx0 fry0 frx1 fry1} [$c coords $id] break
+                # find the frame# tag to associate with the marker with
+                if {[regexp {frame([0-9]+)} $id] == 0} {
+                    foreach tags [$c gettags $id] {
+                        if {"" != [set tmp [lsearch -inline -regexp $tags {frame[0-9]+}]]} {
+                            set where $tmp
+                            break
+                        }
+                    }
+                } else {
+                    set where $id
+                }
+                # store the frame number in where
+                regexp {frame([0-9]+)} $where match where
+            }
+            default {
+                error "bad value \"$flag\": should be -xcoord or -tag"
+            }
+        }
+        if {[string is double $frx0] == 0} {
+            error "bad value \"$frx0\": <where> should be a double value"
+        }
+    } else {
+        error "wrong # args: should be \"mark <type> ?-xcoord? <where>\""
+    }
+
+    # place the marker
+
+    switch -glob -- $type {
+        "start" {
+            # add start marker
+
+            set smx0 $frx0                              ;# start marker x0
+            set smy0 $cy0                               ;# start marker y0
+
+            # polygon's outline adds a border to only one
+            # side of the object? so we have weird +1 in
+            # the triangle base in start marker
+
+            # marker stem is 3 pixels thick
+            set smx1 [expr {$smx0+1}]                   ;# triangle top x
+            set smy1 [expr {$smy0-10}]                  ;# triangle top y
+            set smx2 $smx1                              ;# stem bottom right x
+            set smy2 $cy1                               ;# stem bottom right y
+            set smx3 [expr {$smx0-1}]                   ;# stem bottom left x
+            set smy3 $smy2                              ;# stem bottom left y
+            set smx4 $smx3                              ;# stem middle left x
+            set smy4 $smy0                              ;# stem middle left y
+            set smx5 [expr {$smx0-10+1}]                ;# triangle bottom left x
+            set smy5 $smy0                              ;# triangle bottom left y
+
+            set tag $type
+            $c delete $tag
+            $c create polygon \
+                $smx1 $smy1 \
+                $smx2 $smy2 \
+                $smx3 $smy3 \
+                $smx4 $smy4 \
+                $smx5 $smy5 \
+                -outline black -fill black -tags $tag
+
+            $c bind $tag <Enter> [itcl::code $this _bindings marker $tag]
+            $c bind $tag <Leave> [itcl::code $this _bindings timeline]
+
+            if {[string compare "" $where] != 0} {
+                set _marks($type) $where
+            }
+
+            _fixMinorSize
+        }
+        "end" {
+            # add end marker
+
+            set emx0 $frx0                              ;# end marker x0
+            set emy0 $cy0                               ;# end marker y0
+
+            set emx1 [expr {$emx0-1}]                   ;# triangle top x
+            set emy1 [expr {$emy0-10}]                  ;# triangle top y
+            set emx2 $emx1                              ;# stem bottom left x
+            set emy2 $cy1                               ;# stem bottom left y
+            set emx3 [expr {$emx0+1}]                   ;# stem bottom right x
+            set emy3 $emy2                              ;# stem bottom right y
+            set emx4 $emx3                              ;# stem middle right x
+            set emy4 $emy0                              ;# stem middle right  y
+            set emx5 [expr {$emx0+10-1}]                ;# triangle bottom right x
+            set emy5 $emy0                              ;# triangle bottom right y
+
+            set tag $type
+            $c delete $tag
+            $c create polygon \
+                $emx1 $emy1 \
+                $emx2 $emy2 \
+                $emx3 $emy3 \
+                $emx4 $emy4 \
+                $emx5 $emy5 \
+                -outline black -fill black -tags $tag
+
+            $c bind $tag <Enter> [itcl::code $this _bindings marker $tag]
+            $c bind $tag <Leave> [itcl::code $this _bindings timeline]
+
+            if {[string compare "" $where] != 0} {
+                set _marks($type) $where
+            }
+
+            _fixMinorSize
+        }
+        "particle*" {
+            set radius 3
+            set pmx0 $frx0
+            set pmy0 [expr {$cy1+5}]
+            set coords [list [expr $pmx0-$radius] [expr $pmy0-$radius] \
+                             [expr $pmx0+$radius] [expr $pmy0+$radius]]
+
+            set tag $type
+            $c create oval $coords \
+                -fill green \
+                -outline black \
+                -width 1 \
+                -tags $tag
+
+            #$c bind $tag <Enter> [itcl::code $this _bindings marker $tag]
+            #$c bind $tag <Leave> [itcl::code $this _bindings timeline]
+
+            if {[string compare "" $where] != 0} {
+                set _marks($type) $where
+            }
+
+            _fixMinorSize
+
+        }
+        "arrow" {
+            set radius 3
+            set amx0 $frx0
+            set amy0 [expr {$cy1+15}]
+            set coords [list [expr $amx0-$radius] [expr $amy0-$radius] \
+                             [expr $amx0+$radius] [expr $amy0+$radius]]
+
+            set tag $type
+            $c create line $coords \
+                -fill red \
+                -width 3  \
+                -tags $tag
+
+            #$c bind $tag <Enter> [itcl::code $this _bindings marker $tag]
+            #$c bind $tag <Leave> [itcl::code $this _bindings timeline]
+
+            if {[string compare "" $where] != 0} {
+                set _marks($type) $where
+            }
+
+            _fixMinorSize
+        }
+        "current" {
+
+            set cmx0 $frx0                              ;# current marker x0
+            set cmy0 $cy0                               ;# current marker y0
+
+            set cmx1 [expr {$cmx0+5}]                   ;# lower right diagonal edge x
+            set cmy1 [expr {$cmy0-5}]                   ;# lower right diagonal edge y
+            set cmx2 $cmx1                              ;# right top x
+            set cmy2 [expr {$cmy1-5}]                    ;# right top y
+            set cmx3 [expr {$cmx0-5}]                   ;# left top x
+            set cmy3 $cmy2                              ;# left top y
+            set cmx4 $cmx3                              ;# lower left diagonal edge x
+            set cmy4 $cmy1                              ;# lower left diagonal edge y
+
+            set tag $type
+            $c delete $tag
+            $c create polygon \
+                $cmx0 $cmy0 \
+                $cmx1 $cmy1 \
+                $cmx2 $cmy2 \
+                $cmx3 $cmy3 \
+                $cmx4 $cmy4 \
+                -outline black -fill red -tags $tag
+            $c create line $cmx0 $cmy0 $cmx0 $cy1 -fill red -tags $tag
+
+            if {[string compare "" $where] != 0} {
+                set _marks($type) $where
+            }
+
+        }
+        default {
+            error "bad value \"$type\": should be \"start\" or \"end\""
+        }
+    }
+    return
+}
+
+# ----------------------------------------------------------------------
+# USAGE: _draw_major_timeline
+#
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::_draw_major_timeline {} {
+    set c $itk_component(majordial)
+    $c delete all
+
+    set fg $itk_option(-foreground)
+
+    set w [winfo width $c]
+    set h [winfo height $c]
+    set p [winfo pixels $c $itk_option(-padding)]
+    set t [expr {$itk_option(-thickness)+1}]
+    set ay1 [expr {$h-3}]
+
+    if {"" != $_knob} {
+        set kw [image width $_knob]
+        set kh [image height $_knob]
+
+        # anchor refers to where on knob
+        # top/middle/bottom refers to where on the dial
+        # leave room for the bottom of the knob if needed
+        switch -- $itk_option(-knobposition) {
+            n@top - nw@top - ne@top {
+                set extra [expr {$t-$kh}]
+                if {$extra < 0} {set extra 0}
+                set ay1 [expr {$ay1-$extra}]
+            }
+            n@middle - nw@middle - ne@middle {
+                set extra [expr {int(ceil($kh-0.5*$t))}]
+                if {$extra < 0} {set extra 0}
+                set ay1 [expr {$ay1-$extra}]
+            }
+            n@bottom - nw@bottom - ne@bottom {
+               set ay1 [expr {$ay1-$kh}]
+            }
+
+            e@top - w@top - center@top -
+            e@bottom - w@bottom - center@bottom {
+                set extra [expr {int(ceil(0.5*$kh))}]
+                set ay1 [expr {$ay1-$extra}]
+            }
+            e@middle - w@middle - center@middle {
+                set extra [expr {int(ceil(0.5*($kh-$t)))}]
+                if {$extra < 0} {set extra 0}
+                set ay1 [expr {$ay1-$extra}]
+            }
+
+            s@top - sw@top - se@top -
+            s@middle - sw@middle - se@middle -
+            s@bottom - sw@bottom - se@bottom {
+                set ay1 [expr {$ay1-1}]
+            }
+        }
+    }
+    set ay0 [expr {$ay1-$t}]
+    set ax0 [expr {$p+1}]
+    set ax1 [expr {$w-$_vwidth-$p-4}]
+
+
+    # draw the background rectangle for the major time line
+    $c create rectangle $ax0 $ay0 $ax1 $ay1 \
+        -outline $itk_option(-dialoutlinecolor) \
+        -fill $itk_option(-dialfillcolor)
+
+    # draw the optional progress bar for the major time line,
+    # from start to current
+    if {"" != $itk_option(-dialprogresscolor) } {
+        set xx1 [expr {$_current*($ax1-$ax0) + $ax0}]
+        $c create rectangle [expr {$ax0+1}] [expr {$ay0+3}] $xx1 [expr {$ay1-2}] \
+            -outline "" -fill $itk_option(-dialprogresscolor)
+    }
+
+    regexp {([nsew]+|center)@} $itk_option(-knobposition) match anchor
+    switch -glob -- $itk_option(-knobposition) {
+        *@top    { set kpos $ay0 }
+        *@middle { set kpos [expr {int(ceil(0.5*($ay1+$ay0)))}] }
+        *@bottom { set kpos $ay1 }
+    }
+
+    set x [expr {$_current*($ax1-$ax0) + $ax0}]
+
+    set color $_activecolor
+    set thick 3
+    if {"" != $color} {
+        $c create line $x [expr {$ay0+1}] $x $ay1 -fill $color -width $thick
+    }
+
+    $c create image $x $kpos -anchor $anchor -image $_knob -tags "knob"
+}
+
+# ----------------------------------------------------------------------
+# USAGE: bball
+#   debug function to print out the bounding box information for
+#   minor dial
+#
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::bball {} {
+    set c $itk_component(minordial)
+    foreach item [$c find all] {
+        foreach {x0 y0 x1 y1} [$c bbox $item] break
+        if {! [info exists y1]} continue
+         puts stderr "$item : [expr $y1-$y0]: $y0 $y1"
+        lappend q $y0 $y1
+    }
+    set q [lsort -real $q]
+    puts stderr "q [lindex $q 0] [lindex $q end]"
+    puts stderr "height [winfo height $c]"
+    puts stderr "bbox all [$c bbox all]"
+    puts stderr "parent height [winfo height [winfo parent $c]]"
+}
+
+# ----------------------------------------------------------------------
+# USAGE: _draw_minor_timeline
+#
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::_draw_minor_timeline {} {
+    set c $itk_component(minordial)
+    $c delete all
+
+    set fg $itk_option(-foreground)
+
+    set w [winfo width $c]
+    set h [winfo height $c]
+    set p [winfo pixels $c $itk_option(-padding)]
+    set t [expr {$itk_option(-thickness)+1}]
+    set cy1 [expr {$h-1}]
+    set cy0 [expr {$cy1-$t}]
+    set cx0 [expr {$p+1}]
+    set cx1 [expr {$w-$_vwidth-$p-4}]
+
+
+    # draw the background rectangle for the minor time line
+    $c create rectangle $cx0 $cy0 $cx1 $cy1 \
+        -outline $itk_option(-dialoutlinecolor) \
+        -fill $itk_option(-dialfillcolor) \
+        -tags "imbox"
+
+    # add intermediate marks between markers
+    set imw 1.0                                 ;# intermediate mark width
+
+    set imsh [expr {$t/3.0}]                    ;# intermediate mark short height
+    set imsy0 [expr {$cy0+(($t-$imsh)/2.0)}]    ;# precalc'd imark short y0 coord
+    set imsy1 [expr {$imsy0+$imsh}]             ;# precalc'd imark short y1 coord
+
+    set imlh [expr {$t*2.0/3.0}]                ;# intermediate mark long height
+    set imly0 [expr {$cy0+(($t-$imlh)/2.0)}]    ;# precalc'd imark long y0 coord
+    set imly1 [expr {$imly0+$imlh}]             ;# precalc'd imark long y1 coord
+
+    set imty [expr {$cy0-5}]                    ;# height of marker value
+
+#    set _imspace 10                             ;# space between imarks
+
+    set imx $cx0
+    for {set i [expr {int(${_min})}]} {$i <= ${_max}} {incr i} {
+        if {($i%${_majortick}) == 0} {
+            # draw major tick
+            $c create line $imx $imly0 $imx $imly1 \
+                -fill red \
+                -width $imw \
+                -tags [list longmark-c imark-c "frame$i"]
+
+            $c create text $imx $imty -anchor center -text $i \
+                -font $itk_option(-font) -tags "frame$i"
+
+            set imx [expr $imx+${_imspace}]
+        } elseif {($i%${_minortick}) == 0 } {
+            # draw minor tick
+            $c create line $imx $imsy0 $imx $imsy1 \
+                -fill blue \
+                -width $imw \
+                -tags [list shortmark-c imark-c "frame$i"]
+
+            set imx [expr $imx+${_imspace}]
+        }
+    }
+
+
+    # calculate the height of the intermediate tick marks
+    # and frame numbers on our canvas, resize the imbox
+    # to include both of them.
+    set box [$c bbox "all"]
+    if {![llength $box]} {
+        set box [list 0 0 0 0]
+    }
+    foreach {cx0 cy0 cx1 cy1} $box break
+    $c coords "imbox" $box
+
+    # add any marks that the user previously specified
+    foreach n [array names _marks] {
+        # mark $n -tag $_marks($n)
+        mark $n $_marks($n)
+    }
+
+    _fixMinorSize
+}
+
+
+# ----------------------------------------------------------------------
+# USAGE: _fixMinorSize
+#
+# Used internally to compute the height of the minor dial based
+# on the items placed on the canvas
+#
+# FIXME: instead of calling this in the mark command, figure out how to
+#   make the canvas the correct size to start with
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::_fixMinorSize {} {
+    # resize the height of the minor timeline canvas
+    # to include everything we know about
+
+    set c $itk_component(minordial)
+
+    set box [$c bbox "all"]
+    if {![llength $box]} {
+        set box [list 0 0 0 0]
+    }
+
+    foreach {x0 y0 x1 y1} $box break
+    set h [expr $y1-$y0+1]                        ;# add a 1 pixel buffer
+
+    $c configure -height $h -scrollregion $box -xscrollincrement 1p
+}
+
+
+# ----------------------------------------------------------------------
+# USAGE: _redraw
+#
+# Called automatically whenever the widget changes size to redraw
+# all elements within it.
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::_redraw {} {
+#    _draw_major_timeline
+#    _draw_minor_timeline
+}
+
+# ----------------------------------------------------------------------
+# USAGE: _knob <x> <y>
+#
+# Called automatically whenever the user clicks or drags on the widget
+# to select a value.  Moves the current value to the one nearest the
+# click point.  If the value actually changes, it generates a <<Value>>
+# event to notify clients.
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::_knob {x y} {
+    set c $itk_component(majordial)
+    set w [winfo width $c]
+    set h [winfo height $c]
+    set x0 1
+    set x1 [expr {$w-$_vwidth-4}]
+    focus $itk_component(hull)
+    if {$x >= $x0 && $x <= $x1} {
+        current [rel2ms [expr double($x - $x0) / double($x1 - $x0)]]
+    }
+}
+
+# ----------------------------------------------------------------------
+# USAGE: _offsetx <x>
+#
+# Calculate an x coordinate that has been offsetted by a scrolled canvas
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::_offsetx {x} {
+    set c $itk_component(minordial)
+    set w [lindex [$c cget -scrollregion] 2]
+    set x0 [lindex [$c xview] 0]
+    set offset [expr {$w*$x0}]
+    set x [expr {$x+$offset}]
+    return $x
+}
+
+# ----------------------------------------------------------------------
+# USAGE: _marker <tag> click <x> <y>
+#        _marker <tag> drag <x> <y>
+#        _marker <tag> release <x> <y>
+#
+# Called automatically whenever the user clicks or drags on a marker
+# widget.  Moves the selected marker to the next nearest tick mark.
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::_marker {tag action x y} {
+    set c $itk_component(minordial)
+    set x [_offsetx $x]
+    switch $action {
+        "click" {
+        }
+        "drag" {
+            mark $tag -xcoord $x
+            # if we are too close to the edge, scroll the canvas.
+            # $c xview scroll $dist "unit"
+        }
+        "release" {
+            # on release, snap to the closest imark
+            foreach {junk y0 junk y1} [$c bbox "imark-c"] break
+            set id ""
+            foreach item [$c find enclosed [expr {$x-((${_imspace}+1)/2.0)}] $y0 \
+                                           [expr {$x+((${_imspace}+1)/2.0)}] $y1] {
+                set itemtags [$c gettags $item]
+                if {[lsearch -exact $itemtags "imark-c"] != -1} {
+                    set id [lsearch -inline -regexp $itemtags {frame[0-9]}]
+                    break
+                }
+            }
+            if {[string compare "" $id] == 0} {
+                # something went wrong
+                # we should have found an imark with
+                # an associated "frame#" tag to snap to
+                # bailout
+                error "could not find an intermediate mark to snap marker to"
+            }
+
+            mark $tag -tag $id
+
+            # take care of cases where the mouse leaves the marker's boundries
+            # before the button-1 has been released. we check if the last
+            # coord was within the bounds of the marker. if not, we manually
+            # generate the "Leave" event.
+            set leave 1
+            foreach item [$c find overlapping $x $y $x $y] {
+                if {[lsearch -exact [$c gettags $item] $tag] != -1} {
+                    set leave 0
+                }
+            }
+            if {$leave == 1} {
+                # FIXME:
+                # i want to generate the event rather than
+                # calling the function myself...
+                # event generate $c <Leave>
+                _bindings timeline
+            }
+        }
+    }
+}
+
+# ----------------------------------------------------------------------
+# USAGE: _move click <x> <y>
+#        _move drag <x> <y>
+#        _move release <x> <y>
+#
+# Called automatically whenever the user clicks or drags on the widget
+# to select a value.  Moves the current value to the one nearest the
+# click point.  If the value actually changes, it generates a <<Value>>
+# event to notify clients.
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::_move {action x y} {
+    switch $action {
+        "click" {
+            set _click(x) $x
+            set _click(y) $y
+        }
+        "drag" {
+            set c $itk_component(minordial)
+            set dist [expr ${_click(x)}-$x]
+            $c xview scroll $dist "units"
+            set _click(x) $x
+            set _click(y) $y
+        }
+        "release" {
+            _move drag $x $y
+            catch {unset _click}
+        }
+    }
+}
+
+## from http://tcl.sourceforge.net/faqs/tk/#canvas/see
+## "see" method alternative for canvas
+## Aligns the named item as best it can in the middle of the screen
+##
+## item - a canvas tagOrId
+itcl::body Rappture::Videodial::_see {item} {
+    set c $itk_component(minordial)
+    set box [$c bbox $item]
+    if {![llength $box]} return
+    ## always properly set -scrollregion
+    foreach {x y x1 y1}     $box \
+            {top btm}       [$c yview] \
+            {left right}    [$c xview] \
+            {p q xmax ymax} [$c cget -scrollregion] {
+        set xpos [expr {(($x1+$x)/2.0)/$xmax - ($right-$left)/2.0}]
+        #set ypos [expr {(($y1+$y)/2.0)/$ymax - ($btm-$top)/2.0}]
+    }
+    $c xview moveto $xpos
+    #$c yview moveto $ypos
+}
+
+
+# ----------------------------------------------------------------------
+# USAGE: _navigate <offset>
+#
+# Called automatically whenever the user presses left/right keys
+# to nudge the current value left or right by some <offset>.  If the
+# value actually changes, it generates a <<Value>> event to notify
+# clients.
+# ----------------------------------------------------------------------
+#itcl::body Rappture::Videodial::_navigate {offset} {
+#    set index [lsearch -exact $_values $_current]
+#    if {$index >= 0} {
+#        incr index $offset
+#        if {$index >= [llength $_values]} {
+#            set index [expr {[llength $_values]-1}]
+#        } elseif {$index < 0} {
+#            set index 0
+#        }
+#
+#        set newval [lindex $_values $index]
+#        if {$newval != $_current} {
+#            current $newval
+#            _redraw
+#
+#            event generate $itk_component(hull) <<Value>>
+#        }
+#    }
+#}
+
+
+# ----------------------------------------------------------------------
+# USAGE: _navigate <offset>
+#
+# Called automatically whenever the user presses left/right keys
+# to nudge the current value left or right by some <offset>.  If the
+# value actually changes, it generates a <<Value>> event to notify
+# clients.
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::_navigate {offset} {
+    _current [ms2rel [expr $_current + $offset]]
+    event generate $itk_component(hull) <<Value>>
+}
+
+
+# ----------------------------------------------------------------------
+# USAGE: _fixSize
+#
+# Used internally to compute the overall size of the widget based
+# on the -thickness and -length options.
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::_fixSize {} {
+    set h [winfo pixels $itk_component(hull) $itk_option(-thickness)]
+
+    if {"" != $_knob} {
+        set kh [image height $_knob]
+
+        switch -- $itk_option(-knobposition) {
+            n@top - nw@top - ne@top -
+            s@bottom - sw@bottom - se@bottom {
+                if {$kh > $h} { set h $kh }
+            }
+            n@middle - nw@middle - ne@middle -
+            s@middle - sw@middle - se@middle {
+                set h [expr {int(ceil(0.5*$h + $kh))}]
+            }
+            n@bottom - nw@bottom - ne@bottom -
+            s@top - sw@top - se@top {
+                set h [expr {$h + $kh}]
+            }
+            e@middle - w@middle - center@middle {
+                set h [expr {(($h > $kh) ? $h : $kh) + 1}]
+            }
+            n@middle - ne@middle - nw@middle -
+            s@middle - se@middle - sw@middle {
+                set extra [expr {int(ceil($kh-0.5*$h))}]
+                if {$extra < 0} { set extra 0 }
+                set h [expr {$h+$extra}]
+            }
+        }
+    }
+    incr h 5
+
+    set w [winfo pixels $itk_component(hull) $itk_option(-length)]
+
+    # if the -valuewidth is > 0, then make room for the value
+    if {$itk_option(-valuewidth) > 0} {
+        set charw [font measure $itk_option(-font) "n"]
+        set _vwidth [expr {$itk_option(-valuewidth)*$charw}]
+        set w [expr {$w+$_vwidth+4}]
+    } else {
+        set _vwidth 0
+    }
+
+    $itk_component(majordial) configure -width $w -height $h
+
+#    # resize the height of the minor canvas to include everything we know about
+#    set box [$itk_component(minordial) bbox "all"]
+#    if {![llength $box]} {
+#        set box [list 0 0 0 0]
+#    }
+#    foreach {cx0 cy0 cx1 cy1} $box break
+#    set h [expr $cy1-$cy0+1]
+#    $itk_component(minordial) configure -height $h
+}
+
+# ----------------------------------------------------------------------
+# USAGE: _fixValue ?<name1> <name2> <op>?
+#
+# Invoked automatically whenever the -variable associated with this
+# widget is modified.  Copies the value to the current settings for
+# the widget.
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::_fixValue {args} {
+    if {"" == $itk_option(-variable)} {
+        return
+    }
+    upvar #0 $itk_option(-variable) var
+    _current [ms2rel $var]
+}
+
+# ----------------------------------------------------------------------
+# USAGE: _fixOffsets
+#
+# ----------------------------------------------------------------------
+itcl::body Rappture::Videodial::_fixOffsets {} {
+    if {0 == $itk_option(-offset)} {
+        return
+    }
+    set _offset_pos $itk_option(-offset)
+    set _offset_neg [expr -1*$_offset_pos]
+    bind $itk_component(hull) <KeyPress-Left> [itcl::code $this _navigate $_offset_neg]
+    bind $itk_component(hull) <KeyPress-Right> [itcl::code $this _navigate $_offset_pos]
+}
+
+itcl::body Rappture::Videodial::ms2rel { value } {
+    if { ${_max} > ${_min} } {
+        return [expr {1.0 * ($value - ${_min}) / (${_max} - ${_min})}]
+    }
+    return 0
+}
+
+itcl::body Rappture::Videodial::rel2ms { value } {
+    return [expr $value * (${_max} - ${_min}) + ${_min}]
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -thickness
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::thickness {
+    _fixSize
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -length
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::length {
+    _fixSize
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -font
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::font {
+    _fixSize
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -valuewidth
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::valuewidth {
+    if {![string is integer $itk_option(-valuewidth)]} {
+        error "bad value \"$itk_option(-valuewidth)\": should be integer"
+    }
+    _fixSize
+    after cancel [itcl::code $this _redraw]
+    after idle [itcl::code $this _redraw]
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -foreground
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::foreground {
+    after cancel [itcl::code $this _redraw]
+    after idle [itcl::code $this _redraw]
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -dialoutlinecolor
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::dialoutlinecolor {
+    after cancel [itcl::code $this _redraw]
+    after idle [itcl::code $this _redraw]
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -dialfillcolor
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::dialfillcolor {
+    after cancel [itcl::code $this _redraw]
+    after idle [itcl::code $this _redraw]
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -dialprogresscolor
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::dialprogresscolor {
+    after cancel [itcl::code $this _redraw]
+    after idle [itcl::code $this _redraw]
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -linecolor
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::linecolor {
+    after cancel [itcl::code $this _redraw]
+    after idle [itcl::code $this _redraw]
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -activelinecolor
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::activelinecolor {
+    set val $itk_option(-activelinecolor)
+    if {[catch {$val isa ::Rappture::Spectrum} valid] == 0 && $valid} {
+        set _spectrum $val
+        set _activecolor ""
+    } elseif {[catch {winfo rgb $itk_component(hull) $val}] == 0} {
+        set _spectrum ""
+        set _activecolor $val
+    } elseif {"" != $val} {
+        error "bad value \"$val\": should be Spectrum object or color"
+    }
+    after cancel [itcl::code $this _redraw]
+    after idle [itcl::code $this _redraw]
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -knobimage
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::knobimage {
+    if {[regexp {^image[0-9]+$} $itk_option(-knobimage)]} {
+        set _knob $itk_option(-knobimage)
+    } elseif {"" != $itk_option(-knobimage)} {
+        set _knob [Rappture::icon $itk_option(-knobimage)]
+    } else {
+        set _knob ""
+    }
+    _fixSize
+
+    after cancel [itcl::code $this _redraw]
+    after idle [itcl::code $this _redraw]
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -knobposition
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::knobposition {
+    if {![regexp {^([nsew]+|center)@(top|middle|bottom)$} $itk_option(-knobposition)]} {
+        error "bad value \"$itk_option(-knobposition)\": should be anchor@top|middle|bottom"
+    }
+    _fixSize
+
+    after cancel [itcl::code $this _redraw]
+    after idle [itcl::code $this _redraw]
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -padding
+# This adds padding on left/right side of dial background.
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::padding {
+    if {[catch {winfo pixels $itk_component(hull) $itk_option(-padding)}]} {
+        error "bad value \"$itk_option(-padding)\": should be size in pixels"
+    }
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -valuepadding
+# This shifts min/max limits in by a fraction of the overall size.
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::valuepadding {
+    if {![string is double $itk_option(-valuepadding)]
+          || $itk_option(-valuepadding) < 0} {
+        error "bad value \"$itk_option(-valuepadding)\": should be >= 0.0"
+    }
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -variable
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::variable {
+    if {"" != $_variable} {
+        upvar #0 $_variable var
+        trace remove variable var write [itcl::code $this _fixValue]
+    }
+
+    set _variable $itk_option(-variable)
+
+    if {"" != $_variable} {
+        upvar #0 $_variable var
+        trace add variable var write [itcl::code $this _fixValue]
+
+        # sync to the current value of this variable
+        if {[info exists var]} {
+            _fixValue
+        }
+    }
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -offset
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::offset {
+    if {![string is double $itk_option(-offset)]} {
+        error "bad value \"$itk_option(-offset)\": should be >= 0.0"
+    }
+    _fixOffsets
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -min
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::min {
+    if {![string is integer $itk_option(-min)]} {
+        error "bad value \"$itk_option(-min)\": should be an integer"
+    }
+    if {$itk_option(-min) < 0} {
+        error "bad value \"$itk_option(-min)\": should be >= 0"
+    }
+    set _min $itk_option(-min)
+    _draw_minor_timeline
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -max
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::max {
+    if {![string is integer $itk_option(-max)]} {
+        error "bad value \"$itk_option(-max)\": should be an integer"
+    }
+    if {$itk_option(-max) < 0} {
+        error "bad value \"$itk_option(-max)\": should be >= 0"
+    }
+    set _max $itk_option(-max)
+    _draw_minor_timeline
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -minortick
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::minortick {
+    if {![string is integer $itk_option(-minortick)]} {
+        error "bad value \"$itk_option(-minortick)\": should be an integer"
+    }
+    if {$itk_option(-minortick) <= 0} {
+        error "bad value \"$itk_option(-minortick)\": should be > 0"
+    }
+    set _minortick $itk_option(-minortick)
+    _draw_minor_timeline
+}
+
+# ----------------------------------------------------------------------
+# CONFIGURE: -majortick
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::Videodial::majortick {
+    if {![string is integer $itk_option(-majortick)]} {
+        error "bad value \"$itk_option(-majortick)\": should be an integer"
+    }
+    if {$itk_option(-majortick) <= 0} {
+        error "bad value \"$itk_option(-majortick)\": should be > 0"
+    }
+    set _majortick $itk_option(-majortick)
+    _draw_minor_timeline
+}
Index: branches/blt4/gui/scripts/videoscreen.tcl
===================================================================
--- branches/blt4/gui/scripts/videoscreen.tcl	(revision 1932)
+++ branches/blt4/gui/scripts/videoscreen.tcl	(revision 1932)
@@ -0,0 +1,519 @@
+# ----------------------------------------------------------------------
+#  COMPONENT: video - viewing movies
+#
+# ======================================================================
+#  AUTHOR:  Michael McLennan, Purdue University
+#  Copyright (c) 2004-2005  Purdue Research Foundation
+#
+# See the file "license.terms" for information on usage and redistribution of
+# this file, and for a DISCLAIMER OF ALL WARRANTIES.
+# ======================================================================
+
+package require Itk
+package require BLT
+package require Img
+package require Rappture
+package require RapptureGUI
+
+option add *Video.width 300 widgetDefault
+option add *Video*cursor crosshair widgetDefault
+option add *Video.height 300 widgetDefault
+option add *Video.foreground black widgetDefault
+option add *Video.controlBackground gray widgetDefault
+option add *Video.controlDarkBackground #999999 widgetDefault
+option add *Video.plotBackground black widgetDefault
+option add *Video.plotForeground white widgetDefault
+option add *Video.plotOutline gray widgetDefault
+option add *Video.font \
+    -*-helvetica-medium-r-normal-*-12-* widgetDefault
+
+itcl::class Rappture::VideoScreen {
+    inherit itk::Widget
+
+    itk_option define -plotforeground plotForeground Foreground ""
+    itk_option define -plotbackground plotBackground Background ""
+    itk_option define -plotoutline plotOutline PlotOutline ""
+    itk_option define -width width Width -1
+    itk_option define -height height Height -1
+
+    constructor { args } {
+        # defined below
+    }
+    destructor {
+        # defined below
+    }
+
+    public method load {type data}
+    public method loadcb {args}
+    public method video {args}
+    public method query {type}
+
+    protected method Play {}
+    protected method Seek {n}
+    protected method fixSize {}
+    protected method Upload {args}
+
+
+    private common   _settings
+
+    private variable _width -1      ;# start x for rubberbanding
+    private variable _height -1     ;# start x for rubberbanding
+    private variable _movie ""      ;# movie we grab images from
+    private variable _lastFrame 0   ;# last frame in the movie
+    private variable _imh ""        ;# current image being displayed
+    private variable _id ""         ;# id of the next play command from after
+    private variable _framerate 30  ;# video frame rate
+    private variable _mspf  7       ;# milliseconds per frame wait time
+    private variable _waiting 0     ;# number of frames behind we are
+}
+
+itk::usual VideoScreen {
+    keep -background -foreground -cursor -font
+    keep -plotbackground -plotforeground
+}
+
+# ----------------------------------------------------------------------
+# CONSTRUCTOR
+# ----------------------------------------------------------------------
+itcl::body Rappture::VideoScreen::constructor {args} {
+
+    array set _settings [subst {
+        $this-currenttime       0
+        $this-framenum          0
+        $this-loop              0
+        $this-play              0
+        $this-speed             1
+    }]
+
+    # Create flow controls...
+
+    itk_component add main {
+        canvas $itk_interior.main \
+            -background black
+    } {
+        usual
+        rename -background -controlbackground controlBackground Background
+    }
+
+    # pack $itk_component(main) -side top -expand yes -fill both
+    bind $itk_component(main) <Configure> [itcl::code $this fixSize]
+
+    # setup movie controls
+    itk_component add moviecontrols {
+        frame $itk_interior.moviecontrols
+    } {
+        usual
+        rename -background -controlbackground controlBackground Background
+    }
+
+    # Rewind
+    itk_component add rewind {
+        button $itk_component(moviecontrols).rewind \
+            -borderwidth 1 -padx 1 -pady 1 \
+            -image [Rappture::icon video-rewind] \
+            -command [itcl::code $this video seek 0]
+    } {
+        usual
+        ignore -borderwidth
+        rename -highlightbackground -controlbackground controlBackground \
+            Background
+    }
+    Rappture::Tooltip::for $itk_component(rewind) \
+        "Rewind movie"
+
+    # Seek back
+    itk_component add seekback {
+        button $itk_component(moviecontrols).seekback \
+            -borderwidth 1 -padx 1 -pady 1 \
+            -image [Rappture::icon flow-rewind] \
+            -command [itcl::code $this video seek -1]
+    } {
+        usual
+        ignore -borderwidth
+        rename -highlightbackground -controlbackground controlBackground \
+            Background
+    }
+    Rappture::Tooltip::for $itk_component(rewind) \
+        "Seek backwards 1 frame"
+
+    # Play
+    itk_component add play {
+        Rappture::PushButton $itk_component(moviecontrols).play \
+            -onimage [Rappture::icon flow-pause] \
+            -offimage [Rappture::icon flow-play] \
+            -variable [itcl::scope _settings($this-play)] \
+            -command [itcl::code $this video play]
+    }
+    set fg [option get $itk_component(hull) font Font]
+    Rappture::Tooltip::for $itk_component(play) \
+        "Play/Pause movie"
+
+    # Seek forward
+    itk_component add seekforward {
+        button $itk_component(moviecontrols).seekforward \
+            -borderwidth 1 -padx 1 -pady 1 \
+            -image [Rappture::icon flow-forward] \
+            -command [itcl::code $this video seek +1]
+    } {
+        usual
+        ignore -borderwidth
+        rename -highlightbackground -controlbackground controlBackground \
+            Background
+    }
+    Rappture::Tooltip::for $itk_component(seekforward) \
+        "Seek forward 1 frame"
+
+    # Loop
+    itk_component add loop {
+        Rappture::PushButton $itk_component(moviecontrols).loop \
+            -onimage [Rappture::icon flow-loop] \
+            -offimage [Rappture::icon flow-loop] \
+            -variable [itcl::scope _settings($this-loop)]
+    }
+    Rappture::Tooltip::for $itk_component(loop) \
+        "Play continuously between marked sections"
+
+    itk_component add dial {
+        Rappture::Videodial $itk_component(moviecontrols).dial \
+            -length 10 -valuewidth 0 -valuepadding 0 -padding 6 \
+            -linecolor "" -activelinecolor "" \
+            -min 0 -max 1 \
+            -minortick 1 -majortick 5 \
+            -variable [itcl::scope _settings($this-currenttime)] \
+            -knobimage [Rappture::icon knob2] -knobposition center@middle
+    } {
+        usual
+        ignore -dialprogresscolor
+        rename -background -controlbackground controlBackground Background
+    }
+    $itk_component(dial) current 0
+    bind $itk_component(dial) <<Value>> \
+        [itcl::code $this video seek [expr round($_settings($this-currenttime))]]
+
+    itk_component add framenumlabel {
+        label $itk_component(moviecontrols).framenuml -text "Frame:" -font $fg \
+            -highlightthickness 0
+    } {
+        usual
+        ignore -highlightthickness
+        rename -background -controlbackground controlBackground Background
+    }
+
+    # Current Frame Number
+    #set ffont "arial 9"
+    #set fwidth [calcLabelWidth $ffont]
+    itk_component add framenum {
+        label $itk_component(moviecontrols).framenum \
+            -background white -font "arial 9" \
+            -textvariable [itcl::scope _settings($this-framenum)]
+    } {
+        usual
+        ignore -highlightthickness
+        rename -background -controlbackground controlBackground Background
+    }
+    #$itk_component(framenum) value 1
+    #bind $itk_component(framenum) <<Value>> \
+    #    [itcl::code $this video seek -framenum]
+    Rappture::Tooltip::for $itk_component(framenum) \
+        "Current frame number"
+
+    itk_component add speedlabel {
+        label $itk_component(moviecontrols).speedl -text "Speed:" -font $fg \
+            -highlightthickness 0
+    } {
+        usual
+        ignore -highlightthickness
+        rename -background -controlbackground controlBackground Background
+    }
+
+    # Speed
+    itk_component add speed {
+        Rappture::Flowspeed $itk_component(moviecontrols).speed \
+            -min 1 -max 10 -width 3 -font "arial 9"
+    } {
+        usual
+        ignore -highlightthickness
+        rename -background -controlbackground controlBackground Background
+    }
+    Rappture::Tooltip::for $itk_component(speed) \
+        "Change speed of movie"
+
+    $itk_component(speed) value 1
+    bind $itk_component(speed) <<Value>> [itcl::code $this video speed]
+
+
+    blt::table $itk_component(moviecontrols) \
+        0,0 $itk_component(rewind) -padx {3 0} \
+        0,1 $itk_component(seekback) -padx {2 0} \
+        0,2 $itk_component(play) -padx {2 0} \
+        0,3 $itk_component(seekforward) -padx { 2 0} \
+        0,4 $itk_component(loop) -padx {2 0} \
+        0,5 $itk_component(dial) -fill x -padx {2 0 } \
+        0,6 $itk_component(framenumlabel) -padx {2 0} \
+        0,7 $itk_component(framenum) -padx { 0 0} \
+        0,8 $itk_component(speed) -padx {2 3}
+
+    blt::table configure $itk_component(moviecontrols) c* -resize none
+    blt::table configure $itk_component(moviecontrols) c5 -resize both
+    blt::table configure $itk_component(moviecontrols) r0 -pady 1
+
+
+    blt::table $itk_interior \
+        0,0 $itk_component(main) -fill both \
+        1,0 $itk_component(moviecontrols) -fill x
+    blt::table configure $itk_interior c* -resize both
+    blt::table configure $itk_interior r0 -resize both
+    blt::table configure $itk_interior r1 -resize none
+
+    eval itk_initialize $args
+}
+
+# ----------------------------------------------------------------------
+# DESTRUCTOR
+# ----------------------------------------------------------------------
+itcl::body Rappture::VideoScreen::destructor {} {
+    array unset _settings $this-*
+}
+
+# ----------------------------------------------------------------------
+# load - load a video file
+#   type - type of data, "data" or "file"
+#   data - what to load.
+#       if type == "data", data is treated like binary data
+#       if type == "file", data is treated like the name of a file
+#           and is opened and then loaded.
+# ----------------------------------------------------------------------
+itcl::body Rappture::VideoScreen::load {type data} {
+
+    # open the file
+
+    set fname ""
+    switch $type {
+        "data" {
+            set fname "/tmp/tmpVV[pid].video"
+            set fid [open $fname "w"]
+            fconfigure $fid -translation binary -encoding binary
+            puts $fid $data
+            close $fid
+            set type "file"
+            set data $fname
+        }
+        "file" {
+            # do nothing
+        }
+        default {
+            error "bad value: \"$type\": should be \"load \[data|file\] <data>\""
+        }
+    }
+
+    set _movie [Rappture::Video $type $data]
+    file delete $fname
+    set _framerate [${_movie} get framerate]
+    set _mspf [expr round(((1.0/${_framerate})*1000)/pow(2,$_settings($this-speed)-1))]
+    puts "framerate = ${_framerate}"
+    puts "mspf = ${_mspf}"
+
+    ${_movie} seek 0
+
+    # setup the image display
+
+    set _imh [image create photo]
+    foreach {w h} [query dimensions] break
+    if {${_width} == -1} {
+        set _width $w
+    }
+    if {${_height} == -1} {
+        set _height $h
+    }
+    $itk_component(main) create image 0 0 -anchor nw -image $_imh
+
+    set _lastFrame [$_movie get position end]
+
+    # update the dial with video information
+    $itk_component(dial) configure -min 0 -max ${_lastFrame}
+
+    fixSize
+}
+
+# ----------------------------------------------------------------------
+# loadcb - load callback
+# ----------------------------------------------------------------------
+itcl::body Rappture::VideoScreen::loadcb {args} {
+
+    Rappture::filexfer::upload {piv tool} {id label desc} [itcl::code $this Upload]
+
+    #uplevel 1 [list $args]
+}
+
+# ----------------------------------------------------------------------
+# Upload -
+# ----------------------------------------------------------------------
+itcl::body Rappture::VideoScreen::Upload {args} {
+    array set data $args
+
+    if {[info exists data(error)]} {
+        Rappture::Tooltip::cue $itk::component(main) $data(error)
+        puts $data(error)
+    }
+
+    if {[info exists data(path)] && [info exists data(data)]} {
+        Rappture::Tooltip::cue hide  ;# take down note about the popup window
+
+        # load data
+        load "data" $data(data)
+    }
+
+}
+
+
+# ----------------------------------------------------------------------
+# fixSize
+# ----------------------------------------------------------------------
+itcl::body Rappture::VideoScreen::fixSize {} {
+
+    if {[string compare "" ${_movie}] == 0} {
+        return
+    }
+
+    set _width [winfo width $itk_component(main)]
+    set _height [winfo height $itk_component(main)]
+
+    # get an image with the new size
+    ${_imh} put [${_movie} get image ${_width} ${_height}]
+
+    # fix the dimesions of the canvas
+    #$itk_component(main) configure -width ${_width} -height ${_height}
+
+    $itk_component(main) configure -scrollregion [$itk_component(main) bbox all]
+}
+
+# ----------------------------------------------------------------------
+# video - play, stop, rewind, fastforward the video
+# ----------------------------------------------------------------------
+itcl::body Rappture::VideoScreen::video { args } {
+    set option [lindex $args 0]
+    switch -- $option {
+        "play" {
+            if {$_settings($this-play) == 1} {
+                # disable seek while playing
+                bind $itk_component(dial) <<Value>> ""
+                Play
+            } else {
+                # pause/stop
+                after cancel $_id
+                set _settings($this-play) 0
+                # enable seek while paused
+                bind $itk_component(dial) <<Value>> \
+                    [itcl::code $this video seek [expr round($_settings($this-currenttime))]]
+            }
+        }
+        "seek" {
+            Seek [lreplace $args 0 0]
+        }
+        "stop" {
+            after cancel $_id
+            set _settings($this-play) 0
+        }
+        "speed" {
+            set _mspf [expr round(((1.0/${_framerate})*1000)/pow(2,$_settings($this-speed)-1))]
+            puts "_mspf = ${_mspf}"
+        }
+        default {
+            error "bad option \"$option\": should be play, stop, toggle, position, or reset."
+        }
+    }
+}
+
+# ----------------------------------------------------------------------
+# query - query things about the video
+#
+#   dimensions  - returns width and height as a list
+#   frames      - number of frames in video (last frame + 1)
+#   framenum    - current position
+# ----------------------------------------------------------------------
+itcl::body Rappture::VideoScreen::query { type } {
+    set ret ""
+    switch -- $type {
+        "dimensions" {
+            set ret [${_movie} size]
+        }
+        "frames" {
+            set ret [expr [${_movie} get position end] + 1]
+        }
+        "framenum" {
+            set ret [${_movie} get position cur]
+        }
+        default {
+            error "bad type \"$type\": should be dimensions, frames, framenum."
+        }
+    }
+    return $ret
+}
+
+# ----------------------------------------------------------------------
+# Play - get the next video frame
+# ----------------------------------------------------------------------
+itcl::body Rappture::VideoScreen::Play {} {
+
+
+    # display the next frame
+    $_movie next
+    $_imh put [$_movie get image ${_width} ${_height}]
+    set cur [$_movie get position cur]
+
+    event generate $itk_component(hull) <<Frame>>
+
+    # update the dial and framenum widgets
+    $itk_component(dial) current $cur
+    set _settings($this-framenum) $cur
+
+    if {[expr $cur%100] == 0} {
+        puts "after: [after info]"
+        puts "id = ${_id}"
+    }
+
+    # schedule the next frame to be displayed
+    if {$cur < ${_lastFrame}} {
+        set _id [after ${_mspf} [itcl::code $this Play]]
+    }
+}
+
+
+# ----------------------------------------------------------------------
+# Seek - go to a frame in the video frame
+#   Seek +5
+#   Seek -5
+#   Seek 35
+# ----------------------------------------------------------------------
+itcl::body Rappture::VideoScreen::Seek {args} {
+    set val [lindex $args 0]
+    if {"" == $val} {
+        error "bad value: \"$val\": should be \"seek value\""
+    }
+    ${_movie} seek $val
+    ${_imh} put [${_movie} get image ${_width} ${_height}]
+}
+
+# ----------------------------------------------------------------------
+# OPTION: -width
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::VideoScreen::width {
+    # $_dispatcher event -idle !fixsize
+    if {[string is integer $itk_option(-width)] == 0} {
+        error "bad value: \"$itk_option(-width)\": width should be an integer"
+    }
+    set ${_width} $itk_option(-width)
+    after idle [itcl::code $this fixSize]
+}
+
+# ----------------------------------------------------------------------
+# OPTION: -height
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::VideoScreen::height {
+    # $_dispatcher event -idle !fixsize
+    if {[string is integer $itk_option(-height)] == 0} {
+        error "bad value: \"$itk_option(-height)\": height should be an integer"
+    }
+    set ${_height} $itk_option(-height)
+    after idle [itcl::code $this fixSize]
+}
Index: branches/blt4/gui/scripts/videoviewer.tcl
===================================================================
--- branches/blt4/gui/scripts/videoviewer.tcl	(revision 1923)
+++ branches/blt4/gui/scripts/videoviewer.tcl	(revision 1932)
@@ -16,7 +16,7 @@
 package require RapptureGUI
 
-option add *VideoViewer.width 5i widgetDefault
+#option add *VideoViewer.width 5i widgetDefault
 option add *VideoViewer*cursor crosshair widgetDefault
-option add *VideoViewer.height 4i widgetDefault
+#option add *VideoViewer.height 4i widgetDefault
 option add *VideoViewer.foreground black widgetDefault
 option add *VideoViewer.controlBackground gray widgetDefault
@@ -34,4 +34,7 @@
     itk_option define -plotbackground plotBackground Background ""
     itk_option define -plotoutline plotOutline PlotOutline ""
+    itk_option define -width width Width -1
+    itk_option define -height height Height -1
+    itk_option define -controls controls Controls "show"
 
     constructor { args } {
@@ -44,4 +47,5 @@
     public method load {filename}
     public method video {args}
+    public method query {type}
 
     protected method togglePtrBind {pbvar}
@@ -58,9 +62,13 @@
     protected method updateMeasurements {}
     protected method calculateTrajectory {args}
+    protected method fixSize {}
+
+
 
     private common   _settings
 
-    private variable _width 0
-    private variable _height 0
+    private variable _width -1
+    private variable _height -1
+    private variable _controls ""
     private variable _x0 0          ;# start x for rubberbanding
     private variable _y0 0          ;# start y for rubberbanding
@@ -399,14 +407,29 @@
 # ----------------------------------------------------------------------
 itcl::body Rappture::VideoViewer::load {filename} {
-    set _movie [Rappture::Video $filename]
+
+    # open the file
+
+    set _movie [Rappture::Video "file" $filename]
     set _framerate [${_movie} get framerate]
     set _mspf [expr round(((1.0/${_framerate})*1000)/pow(2,[$itk_component(speed) value]-1))]
-    # set _mspf 7
     puts "framerate = ${_framerate}"
     puts "mspf = ${_mspf}"
 
+    ${_movie} seek 0
+
+    # setup the image display
+
     set _imh [image create photo]
-    $_imh put [$_movie next]
+    foreach {w h} [query dimensions] break
+    if {${_width} == -1} {
+        set _width $w
+    }
+    if {${_height} == -1} {
+        set _height $h
+    }
+#    ${_imh} put [$_movie get image ${_width} ${_height}]
     $itk_component(main) create image 0 0 -anchor nw -image $_imh
+
+    # setup timings for playing video
 
     set _lastFrame [$_movie get position end]
@@ -424,15 +447,28 @@
     $itk_component(framenum) configure -max ${_lastFrame} -width $cnt
 
-    set pch [$itk_component(pointercontrols) cget -height]
-    set mch [$itk_component(moviecontrols) cget -height]
-    set pch 30
-    set mch 30
+    fixSize
+}
+
+# ----------------------------------------------------------------------
+# fixSize
+# ----------------------------------------------------------------------
+itcl::body Rappture::VideoViewer::fixSize {} {
+
+    if {[string compare "" ${_movie}] == 0} {
+        return
+    }
+
+    # get an image with the new size
+    ${_imh} put [${_movie} get image ${_width} ${_height}]
+
+    # fix the dimesions of the canvas
+    $itk_component(main) configure -width ${_width} -height ${_height}
+
     $itk_component(main) configure -scrollregion [$itk_component(main) bbox all]
-    foreach { x0 y0 x1 y1 } [$itk_component(main) bbox all] break
-    set w [expr abs($x1-$x0)]
-    set h [expr abs($y1-$y0+$pch+$mch)]
-    # $itk_component(main) configure -width $w -height $h
-    .main configure -width $w -height $h
-
+    #foreach { x0 y0 x1 y1 } [$itk_component(main) bbox all] break
+    #set w [expr abs($x1-$x0)]
+    #set h [expr abs($y1-$y0)]
+    #$itk_component(main) configure -width $w -height $h
+    # component hull configure -width $w -height $h
 }
 
@@ -483,4 +519,20 @@
 
 # ----------------------------------------------------------------------
+# query - query things about the video
+# ----------------------------------------------------------------------
+itcl::body Rappture::VideoViewer::query { type } {
+    set ret ""
+    switch -- $type {
+        "dimensions" {
+            set ret [${_movie} size]
+        }
+        default {
+            error "bad type \"$type\": should be dimensions."
+        }
+    }
+    return $ret
+}
+
+# ----------------------------------------------------------------------
 # togglePtrCtrl - choose pointer mode:
 #                 rectangle, distance, measure, particlemark
@@ -617,5 +669,6 @@
 
     # display the next frame
-    $_imh put [$_movie next]
+    $_movie next
+    $_imh put [$_movie get image ${_width} ${_height}]
 
     # update the dial and framenum widgets
@@ -670,6 +723,7 @@
         error "bad value: \"$val\": should be \"seek \[-percent\] value\""
     }
-    $_imh put [$_movie seek $val]
-    set cur [$_movie get position cur]
+    ${_movie} seek $val
+    ${_imh} put [${_movie} get image ${_width} ${_height}]
+    set cur [${_movie} get position cur]
     set _settings($this-currenttime) [expr double($cur) / double(${_lastFrame})]
 }
@@ -1006,2 +1060,43 @@
 }
 
+# ----------------------------------------------------------------------
+# OPTION: -width
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::VideoViewer::width {
+    # $_dispatcher event -idle !fixsize
+    if {[string is integer $itk_option(-width)] == 0} {
+        error "bad value: \"$itk_option(-width)\": width should be an integer"
+    }
+    set _width $itk_option(-width)
+    after idle [itcl::code $this fixSize]
+}
+
+# ----------------------------------------------------------------------
+# OPTION: -height
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::VideoViewer::height {
+    # $_dispatcher event -idle !fixsize
+    if {[string is integer $itk_option(-height)] == 0} {
+        error "bad value: \"$itk_option(-height)\": height should be an integer"
+    }
+    set _height $itk_option(-height)
+    after idle [itcl::code $this fixSize]
+}
+
+# ----------------------------------------------------------------------
+# OPTION: -controls
+# ----------------------------------------------------------------------
+itcl::configbody Rappture::VideoViewer::controls {
+    switch $itk_option(-controls) {
+        show {
+        }
+        hide {
+        }
+        default {
+            error "bad value: \"$itk_option(-height)\": height should be an integer"
+        }
+    }
+    set _height $itk_option(-height)
+    after idle [itcl::code $this fixSize]
+}
+
Index: branches/blt4/gui/scripts/xyprint.tcl
===================================================================
--- branches/blt4/gui/scripts/xyprint.tcl	(revision 1923)
+++ branches/blt4/gui/scripts/xyprint.tcl	(revision 1932)
@@ -219,5 +219,5 @@
         return [list .gif $bytes]
     }
-    
+
     # Handle encapsulated postscript or portable document format.
 
@@ -1224,5 +1224,4 @@
 
     blt::table configure $page  c0 c7 c8 -resize none
-    
 }
 
Index: branches/blt4/gui/scripts/xyresult.tcl
===================================================================
--- branches/blt4/gui/scripts/xyresult.tcl	(revision 1923)
+++ branches/blt4/gui/scripts/xyresult.tcl	(revision 1932)
@@ -25,42 +25,36 @@
 
 set autocolors {
-    #0000ff #ff0000 #00cc00
-    #cc00cc #ff9900 #cccc00
-    #000080 #800000 #006600
-    #660066 #996600 #666600
-}
-set autocolors {
-#0000cd
-#cd0000
-#00cd00
-#3a5fcd
-#cdcd00
-#cd1076
-#009acd
-#00c5cd
-#a2b5cd
-#7ac5cd
-#66cdaa
-#a2cd5a
-#cd9b9b
-#cdba96
-#cd3333
-#cd6600
-#cd8c95
-#cd00cd
-#9a32cd
-#6ca6cd
-#9ac0cd
-#9bcd9b
-#00cd66
-#cdc673
-#cdad00
-#cd5555
-#cd853f
-#cd7054
-#cd5b45
-#cd6889
-#cd69c9
-#551a8b
+    #0000cd
+    #cd0000
+    #00cd00
+    #3a5fcd
+    #cdcd00
+    #cd1076
+    #009acd
+    #00c5cd
+    #a2b5cd
+    #7ac5cd
+    #66cdaa
+    #a2cd5a
+    #cd9b9b
+    #cdba96
+    #cd3333
+    #cd6600
+    #cd8c95
+    #cd00cd
+    #9a32cd
+    #6ca6cd
+    #9ac0cd
+    #9bcd9b
+    #00cd66
+    #cdc673
+    #cdad00
+    #cd5555
+    #cd853f
+    #cd7054
+    #cd5b45
+    #cd6889
+    #cd69c9
+    #551a8b
 }
 
@@ -1505,11 +1499,11 @@
 itcl::body Rappture::XyResult::_getTextMarkerOptions {style} {
     array set textOptions {
-        "-color"  "-outline"
-        "-textcolor"  "-outline"
-        "-font"   "-font"
-        "-xoffset" "-xoffset"
-        "-yoffset" "-yoffset"
-        "-anchor" "-anchor"
-        "-rotate" "-rotate"
+        "-color"	"-outline"
+        "-textcolor"	"-outline"
+        "-font"		"-font"
+        "-xoffset"	"-xoffset"
+        "-yoffset"	"-yoffset"
+        "-anchor"	"-anchor"
+        "-rotate"	"-rotate"
     }
     set options {}
