Complex scrolling

ulis, 2003-10-08: A handy proc to scroll the title and the body.

ulis, updated 2003-10-09: If you want, the scrollbars can now disapear when not needed (see below).

http://perso.wanadoo.fr/maurice.ulis/tcl/complexscroll.gif


The proc

  proc complexscroll {w width height {theight 20}} \
  {
    frame $w
    canvas $w.c0 -height $theight -width $width \
      -xscrollcommand [list $w.hs set] -bg beige \
      -highlightthickness 0 -selectborderwidth 0 \
      -bd 1 -relief solid
    canvas $w.c1 -height $height -width $width \
      -yscrollcommand [list $w.vs set] -bg white \
      -highlightthickness 0 -selectborderwidth 0 \
      -bd 1 -relief solid
    scrollbar $w.hs -orient horizontal -command [list xview $w]
    scrollbar $w.vs -command [list $w.c1 yview]
    grid $w.c0 -row 0 -column 0 -sticky new
    grid $w.c1 -row 1 -column 0 -sticky nsew
    grid $w.hs -row 2 -column 0 -sticky new
    grid $w.vs -row 0 -column 1 -sticky nse -rowspan 2
    grid rowconfigure $w 1 -weight 1
    grid columnconfigure $w 0 -weight 1
    return $w
  }
  proc xview {w args} \
  {
    eval [linsert $args 0 $w.c0 xview]
    eval [linsert $args 0 $w.c1 xview]
  }

The demo

  wm title . "complex scroll"
  pack [complexscroll .cs 250 150] -fill both -expand 1
  set x 0
  foreach title {firstname lastname address birthday occupation} \
  {
    .cs.c0 create text $x 8 -anchor nw -text " $title "
    for {set y 8} {$y < 200} {incr y 24} \
    { .cs.c1 create text $x $y -anchor nw -text " $title " }
    incr x 80
  }
  .cs.c0 configure -scrollregion [.cs.c0 bbox all]
  .cs.c1 configure -scrollregion [.cs.c1 bbox all]

Another proc if you want the scrollbars disapear when uneeded

  proc complexscroll {w width height {theight 20}} \
  {
    frame $w
    canvas $w.c0 -height $theight -width $width \
      -xscrollcommand [list xset $w] -bg beige \
      -highlightthickness 0 -selectborderwidth 0 \
      -bd 1 -relief solid
    canvas $w.c1 -height $height -width $width \
      -yscrollcommand [list yset $w] -bg white \
      -highlightthickness 0 -selectborderwidth 0 \
      -bd 1 -relief solid
    scrollbar $w.hs -orient horizontal -command [list xview $w]
    scrollbar $w.vs -command [list yview $w]
    grid $w.c0 -row 0 -column 0 -sticky new
    grid $w.c1 -row 1 -column 0 -sticky nsew
    grid $w.hs -row 2 -column 0 -sticky new
    grid $w.vs -row 0 -column 1 -sticky nse -rowspan 2
    grid rowconfigure $w 1 -weight 1
    grid columnconfigure $w 0 -weight 1
    return $w
  }
  proc xview {w args} \
  {
    eval [linsert $args 0 $w.c0 xview]
    eval [linsert $args 0 $w.c1 xview]
  }
  proc xview {w args} \
  {
    eval [linsert $args 0 $w.c0 xview]
    eval [linsert $args 0 $w.c1 xview]
  }
  proc yview {w args} \
  {
    eval [linsert $args 0 $w.c1 yview]
  }
  proc xset {w args} \
  {
    if {$args == "0 1"} \
    { grid forget $w.hs } \
    else \
    {
      grid $w.hs -row 2 -column 0 -sticky wse
      eval [linsert $args 0 $w.hs set]
    }
  }
  proc yset {w args} \
  {
    if {$args == "0 1"} \
    { grid forget $w.vs } \
    else \
    {
      grid $w.vs -row 0 -column 1 -sticky nse -rowspan 2
      eval [linsert $args 0 $w.vs set]
    }
  }