home *** CD-ROM | disk | FTP | other *** search
/ PCNET 2006 September - Disc 1 / PCNET_CD_2006_09.iso / linux / puppy-barebones-2.01r2.iso / pup_201.sfs / usr / lib / bwidget / scrollw.tcl < prev    next >
Encoding:
Text File  |  2003-08-12  |  12.3 KB  |  334 lines

  1. # -----------------------------------------------------------------------------
  2. #  scrollw.tcl
  3. #  This file is part of Unifix BWidget Toolkit
  4. #  $Id: scrollw.tcl,v 1.4 2000/02/26 01:56:41 ericm Exp $
  5. # -----------------------------------------------------------------------------
  6. #  Index of commands:
  7. #     - ScrolledWindow::create
  8. #     - ScrolledWindow::getframe
  9. #     - ScrolledWindow::setwidget
  10. #     - ScrolledWindow::configure
  11. #     - ScrolledWindow::cget
  12. #     - ScrolledWindow::_set_hframe
  13. #     - ScrolledWindow::_set_vscroll
  14. #     - ScrolledWindow::_setData
  15. #     - ScrolledWindow::_setSBSize
  16. #     - ScrolledWindow::_realize
  17. # -----------------------------------------------------------------------------
  18.  
  19. namespace eval ScrolledWindow {
  20.     Widget::declare ScrolledWindow {
  21.         {-background  TkResource ""   0 button}
  22.         {-scrollbar   Enum       both 0 {none both vertical horizontal}}
  23.         {-auto        Enum       both 0 {none both vertical horizontal}}
  24.         {-sides       Enum       se   0 {ne en nw wn se es sw ws}}
  25.         {-size        Int        0    1 "%d >= 0"}
  26.         {-ipad        Int        1    1 "%d >= 0"}
  27.         {-managed     Boolean    1    1}
  28.         {-relief      TkResource flat 0 frame}
  29.         {-borderwidth TkResource 0    0 frame}
  30.         {-bg          Synonym    -background}
  31.         {-bd          Synonym    -borderwidth}
  32.     }
  33.  
  34.     Widget::addmap ScrolledWindow "" ._grid.f {-relief {} -borderwidth {}}
  35.  
  36.     proc ::ScrolledWindow {path args} {
  37.         return [eval ScrolledWindow::create $path $args]
  38.     }
  39.     proc use {} {}
  40. }
  41.  
  42.  
  43. # -----------------------------------------------------------------------------
  44. #  Command ScrolledWindow::create
  45. # -----------------------------------------------------------------------------
  46. proc ScrolledWindow::create { path args } {
  47.     upvar \#0 ScrolledWindow::$path data
  48.  
  49.     Widget::init ScrolledWindow $path $args
  50.  
  51.     set bg     [Widget::cget $path -background]
  52.     set sbsize [Widget::cget $path -size]
  53.     set ipad   [Widget::cget $path -ipad]
  54.     set sw     [frame $path -class ScrolledWindow \
  55.                     -relief flat -borderwidth 0 -background $bg \
  56.                     -highlightthickness 0 -takefocus 0]
  57.     set grid   [frame $path._grid \
  58.                     -relief flat -borderwidth 0 -background $bg \
  59.                     -highlightthickness 0 -takefocus 0]
  60.     set fv     [frame $grid.vframe \
  61.                     -relief flat -borderwidth 0 -background $bg \
  62.                     -highlightthickness 0 -takefocus 0]
  63.     set fh     [frame $grid.hframe \
  64.                     -relief flat -borderwidth 0 -background $bg \
  65.                     -highlightthickness 0 -takefocus 0]
  66.     eval frame $grid.f -background $bg -highlightthickness 0 \
  67.         [Widget::subcget $path ._grid.f]
  68.  
  69.     scrollbar $grid.hscroll \
  70.         -highlightthickness 0 -takefocus 0 \
  71.         -orient  horiz    \
  72.         -relief  sunken    \
  73.         -bg      $bg
  74.     scrollbar $grid.vscroll \
  75.         -highlightthickness 0 -takefocus 0 \
  76.         -orient  vert      \
  77.         -relief  sunken    \
  78.         -bg      $bg
  79.  
  80.     set data(realized) 0
  81.  
  82.     _setData $path \
  83.         [Widget::cget $path -scrollbar] \
  84.         [Widget::cget $path -auto] \
  85.         [Widget::cget $path -sides]
  86.  
  87.     if {[Widget::cget $path -managed]} {
  88.         set data(hsb,packed) $data(hsb,present)
  89.         set data(vsb,packed) $data(vsb,present)
  90.     } else {
  91.         set data(hsb,packed) 0
  92.         set data(vsb,packed) 0
  93.     }
  94.     if {$sbsize} {
  95.         $grid.vscroll configure -width $sbsize
  96.         $grid.hscroll configure -width $sbsize
  97.     } else {
  98.         set sbsize [$grid.vscroll cget -width]
  99.     }
  100.     set size [expr {$sbsize+$ipad}]
  101.  
  102.     $grid.vframe configure -width  $size
  103.     $grid.hframe configure -height $size
  104.     set vplaceopt [list -in $grid.vframe -x [expr {(1-$data(vsb,west))*$ipad}] -y 0 -width [expr {-$ipad}]]
  105.     set hplaceopt [list -in $grid.hframe -x 0 -y [expr {(1-$data(hsb,north))*$ipad}] -height [expr {-$ipad}]]
  106.     pack propagate $grid.vframe 0
  107.     pack propagate $grid.hframe 0
  108.     pack $grid.vscroll -in $grid.vframe
  109.     pack $grid.hscroll -in $grid.hframe
  110.  
  111.     bind $grid.hscroll <Configure> \
  112.         "ScrolledWindow::_setSBSize $grid.hscroll $size -relwidth 1.0 -relheight 1.0 $hplaceopt"
  113.     bind $grid.vscroll <Configure> \
  114.         "ScrolledWindow::_setSBSize $grid.vscroll $size -relwidth 1.0 -relheight 1.0 $vplaceopt"
  115.  
  116.     grid $grid.hframe \
  117.         -column     [expr {$data(vsb,west)*$data(vsb,packed)}] \
  118.         -row        [expr {1-$data(hsb,north)}]  \
  119.         -columnspan [expr {2-$data(vsb,packed)}] \
  120.         -sticky we
  121.     grid $grid.vframe \
  122.         -column  [expr {1-$data(vsb,west)}] \
  123.         -row     [expr {$data(hsb,north)*$data(hsb,packed)}] \
  124.         -rowspan [expr {2-$data(hsb,packed)}] \
  125.         -sticky ns
  126.  
  127.     grid $grid.f \
  128.         -column     [expr {$data(vsb,west)*$data(vsb,packed)}]  \
  129.         -row        [expr {$data(hsb,north)*$data(hsb,packed)}] \
  130.         -columnspan [expr {2-$data(vsb,packed)}] \
  131.         -rowspan    [expr {2-$data(hsb,packed)}] \
  132.         -sticky     nwse
  133.  
  134.     grid columnconfigure $grid $data(vsb,west)  -weight 1
  135.     grid rowconfigure    $grid $data(hsb,north) -weight 1
  136.     pack $grid -fill both -expand yes
  137.  
  138.     bind $grid <Configure> "ScrolledWindow::_realize $path"
  139.     bind $grid <Destroy>   "ScrolledWindow::_destroy $path"
  140.     raise $grid.f
  141.     rename $path ::$path:cmd
  142.     proc ::$path { cmd args } "return \[eval ScrolledWindow::\$cmd $path \$args\]"
  143.  
  144.     return $path
  145. }
  146.  
  147.  
  148. # -----------------------------------------------------------------------------
  149. #  Command ScrolledWindow::getframe
  150. # -----------------------------------------------------------------------------
  151. proc ScrolledWindow::getframe { path } {
  152.     return $path
  153. }
  154.  
  155.  
  156. # -----------------------------------------------------------------------------
  157. #  Command ScrolledWindow::setwidget
  158. # -----------------------------------------------------------------------------
  159. proc ScrolledWindow::setwidget { path widget } {
  160.     upvar \#0 ScrolledWindow::$path data
  161.  
  162.     set grid   $path._grid
  163.  
  164.     pack $widget -in $grid.f -fill both -expand yes
  165.  
  166.     $grid.hscroll configure -command "$widget xview"
  167.     $grid.vscroll configure -command "$widget yview"
  168.     $widget configure \
  169.         -xscrollcommand "ScrolledWindow::_set_hscroll $path" \
  170.         -yscrollcommand "ScrolledWindow::_set_vscroll $path"
  171. }
  172.  
  173.  
  174. # -----------------------------------------------------------------------------
  175. #  Command ScrolledWindow::configure
  176. # -----------------------------------------------------------------------------
  177. proc ScrolledWindow::configure { path args } {
  178.     upvar \#0 ScrolledWindow::$path data
  179.  
  180.     set grid $path._grid
  181.     set res [Widget::configure $path $args]
  182.     if { [Widget::hasChanged $path -background bg] } {
  183.         $path configure -background $bg
  184.         $grid configure -background $bg
  185.         $grid.f configure -background $bg
  186.         catch {$grid.hscroll configure -background $bg}
  187.         catch {$grid.vscroll configure -background $bg}
  188.     }
  189.  
  190.     if {[Widget::hasChanged $path -scrollbar scrollbar] |
  191.         [Widget::hasChanged $path -auto      auto]     |
  192.         [Widget::hasChanged $path -sides     sides]} {
  193.         _setData $path $scrollbar $auto $sides
  194.         set hscroll [$grid.hscroll get]
  195.         set vmin    [lindex $hscroll 0]
  196.         set vmax    [lindex $hscroll 1]
  197.         set data(hsb,packed) [expr {$data(hsb,present) &&
  198.                                     (!$data(hsb,auto) || ($vmin != 0 || $vmax != 1))}]
  199.         set vscroll [$grid.vscroll get]
  200.         set vmin    [lindex $vscroll 0]
  201.         set vmax    [lindex $vscroll 1]
  202.         set data(vsb,packed) [expr {$data(vsb,present) &&
  203.                                     (!$data(vsb,auto) || ($vmin != 0 || $vmax != 1))}]
  204.  
  205.         set ipad [Widget::cget $path -ipad]
  206.         place configure $grid.vscroll \
  207.             -x [expr {(1-$data(vsb,west))*$ipad}]
  208.         place configure $grid.hscroll \
  209.             -y [expr {(1-$data(hsb,north))*$ipad}]
  210.  
  211.         grid configure $grid.hframe \
  212.             -column     [expr {$data(vsb,west)*$data(vsb,packed)}] \
  213.             -row        [expr {1-$data(hsb,north)}]  \
  214.             -columnspan [expr {2-$data(vsb,packed)}]
  215.         grid configure $grid.vframe \
  216.             -column  [expr {1-$data(vsb,west)}] \
  217.             -row     [expr {$data(hsb,north)*$data(hsb,packed)}] \
  218.             -rowspan [expr {2-$data(hsb,packed)}]
  219.         grid configure $grid.f \
  220.             -column     [expr {$data(vsb,west)*$data(vsb,packed)}] \
  221.             -row        [expr {$data(hsb,north)*$data(hsb,packed)}] \
  222.             -columnspan [expr {2-$data(vsb,packed)}] \
  223.             -rowspan    [expr {2-$data(hsb,packed)}]
  224.         grid columnconfigure $grid $data(vsb,west)             -weight 1
  225.         grid columnconfigure $grid [expr {1-$data(vsb,west)}]  -weight 0
  226.         grid rowconfigure    $grid $data(hsb,north)            -weight 1
  227.         grid rowconfigure    $grid [expr {1-$data(hsb,north)}] -weight 0
  228.     }
  229.     return $res
  230. }
  231.  
  232.  
  233. # -----------------------------------------------------------------------------
  234. #  Command ScrolledWindow::cget
  235. # -----------------------------------------------------------------------------
  236. proc ScrolledWindow::cget { path option } {
  237.     return [Widget::cget $path $option]
  238. }
  239.  
  240.  
  241. # -----------------------------------------------------------------------------
  242. #  Command ScrolledWindow::_destroy
  243. # -----------------------------------------------------------------------------
  244. proc ScrolledWindow::_destroy { path } {
  245.     upvar \#0 ScrolledWindow::$path data
  246.  
  247.     unset data
  248.     Widget::destroy $path
  249.     rename $path {}
  250. }
  251.  
  252.  
  253. # -----------------------------------------------------------------------------
  254. #  Command ScrolledWindow::_set_hscroll
  255. # -----------------------------------------------------------------------------
  256. proc ScrolledWindow::_set_hscroll { path vmin vmax } {
  257.     upvar \#0 ScrolledWindow::$path data
  258.  
  259.     if {$data(realized) && $data(hsb,present)} {
  260.         set grid $path._grid
  261.         if {$data(hsb,auto)} {
  262.             if {$data(hsb,packed) && $vmin == 0 && $vmax == 1} {
  263.                 set data(hsb,packed) 0
  264.                 grid configure $grid.f $grid.vframe -row 0 -rowspan 2
  265.             } elseif {!$data(hsb,packed) && ($vmin != 0 || $vmax != 1)} {
  266.                 set data(hsb,packed) 1
  267.                 grid configure $grid.f $grid.vframe -row $data(hsb,north) -rowspan 1
  268.             }
  269.         }
  270.     update idletask
  271.         $grid.hscroll set $vmin $vmax
  272.     }
  273. }
  274.  
  275.  
  276. # -----------------------------------------------------------------------------
  277. #  Command ScrolledWindow::_set_vscroll
  278. # -----------------------------------------------------------------------------
  279. proc ScrolledWindow::_set_vscroll { path vmin vmax } {
  280.     upvar \#0 ScrolledWindow::$path data
  281.  
  282.     if {$data(realized) && $data(vsb,present)} {
  283.         set grid $path._grid
  284.         if {$data(vsb,auto)} {
  285.             if {$data(vsb,packed) && $vmin == 0 && $vmax == 1} {
  286.                 set data(vsb,packed) 0
  287.                 grid configure $grid.f $grid.hframe -column 0 -columnspan 2
  288.             } elseif {!$data(vsb,packed) && ($vmin != 0 || $vmax != 1) } {
  289.                 set data(vsb,packed) 1
  290.                 grid configure $grid.f $grid.hframe -column $data(vsb,west) -columnspan 1
  291.             }
  292.         }
  293.     update idletask
  294.         $grid.vscroll set $vmin $vmax
  295.     }
  296. }
  297.  
  298.  
  299. proc ScrolledWindow::_setData {path scrollbar auto sides} {
  300.     upvar \#0 ScrolledWindow::$path data
  301.  
  302.     set sb    [lsearch {none horizontal vertical both} $scrollbar]
  303.     set auto  [lsearch {none horizontal vertical both} $auto]
  304.     set north [string match *n* $sides]
  305.     set west  [string match *w* $sides]
  306.  
  307.     set data(hsb,present)  [expr {($sb & 1) != 0}]
  308.     set data(hsb,auto)     [expr {($auto & 1) != 0}]
  309.     set data(hsb,north)    $north
  310.  
  311.     set data(vsb,present)  [expr {($sb & 2) != 0}]
  312.     set data(vsb,auto)     [expr {($auto & 2) != 0}]
  313.     set data(vsb,west)     $west
  314. }
  315.  
  316.  
  317. proc ScrolledWindow::_setSBSize {sb size args} {
  318.     $sb configure -width $size
  319.     eval place $sb $args
  320. }
  321.  
  322.  
  323. # -----------------------------------------------------------------------------
  324. #  Command ScrolledWindow::_realize
  325. # -----------------------------------------------------------------------------
  326. proc ScrolledWindow::_realize { path } {
  327.     upvar \#0 ScrolledWindow::$path data
  328.  
  329.     set grid $path._grid
  330.     bind $grid <Configure> {}
  331.     set data(realized) 1
  332.     place $grid -anchor nw -x 0 -y 0 -relwidth 1.0 -relheight 1.0
  333. }
  334.