home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 November / CPNL0711.ISO / beeld / teken / scribus-1.3.3.9-win32-install.exe / tcl / tix8.1 / CObjView.tcl < prev    next >
Text File  |  2001-12-08  |  8KB  |  361 lines

  1. # -*- mode: TCL; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
  2. #
  3. #    $Id: CObjView.tcl,v 1.2.2.2 2001/12/09 02:54:02 idiscovery Exp $
  4. #
  5. # CObjView.tcl --
  6. #
  7. #    This file implements the Canvas Object View widget. This is a base
  8. #    class of IconView. It implements:
  9.  
  10. #    (1) Automatic placement/adjustment of the scrollbars according
  11. #    to the canvas objects inside the canvas subwidget. The
  12. #    scrollbars are adjusted so that the canvas is just large
  13. #    enough to see all the objects.
  14. #
  15. #    (2) D+D bindings of the objects (%% not implemented)
  16. #
  17. #    (3) Keyboard traversal of the objects (%% not implemented). By the
  18. #    virtual method :SelectObject.
  19. #
  20. #
  21. # Copyright (c) 1993-1999 Ioi Kim Lam.
  22. # Copyright (c) 2000-2001 Tix Project Group.
  23. #
  24. # See the file "license.terms" for information on usage and redistribution
  25. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  26. #
  27.  
  28. tixWidgetClass tixCObjView {
  29.     -classname TixCObjView
  30.     -superclass tixScrolledWidget
  31.     -method {
  32.     adjustscrollregion
  33.     }
  34.     -flag {
  35.     -xscrollincrement -yscrollincrement
  36.     }
  37.     -static {
  38.     }
  39.     -configspec {
  40.     {-xscrollincrement xScrollIncrement ScrollIncrement 10}
  41.     {-yscrollincrement yScrollIncrement ScrollIncrement 10}
  42.     }
  43.     -default {
  44.     {.scrollbar            auto}
  45.     {*borderWidth            1}
  46.     {*canvas.background        #c3c3c3}
  47.     {*canvas.highlightBackground    #d9d9d9}
  48.     {*canvas.relief            sunken}
  49.     {*canvas.takeFocus        1}
  50.     {*Scrollbar.takeFocus        0}
  51.     }
  52.     -forcecall {
  53.     -scrollbar
  54.     }
  55. }
  56.  
  57. proc tixCObjView:ConstructWidget {w} {
  58.     upvar #0 $w data
  59.  
  60.     tixChainMethod $w ConstructWidget
  61.  
  62.     set data(w:canvas) \
  63.     [canvas $w.canvas]
  64.     set data(w:hsb) \
  65.     [scrollbar $w.hsb -orient horizontal]
  66.     set data(w:vsb) \
  67.     [scrollbar $w.vsb -orient vertical]
  68.  
  69.     set data(pw:client) $data(w:canvas)
  70.  
  71.     set data(xorig) 0
  72.     set data(yorig) 0
  73.  
  74.     set data(sx1) 0
  75.     set data(sy1) 0
  76.     set data(sx2) 0
  77.     set data(sy2) 0
  78. }
  79.  
  80. proc tixCObjView:SetBindings {w} {
  81.     upvar #0 $w data
  82.  
  83.     tixChainMethod $w SetBindings
  84.  
  85. # %% scan/drag of canvas??
  86. #
  87. #    $data(w:canvas) config \
  88. #    -xscrollcommand "tixCObjView:XScroll $w"\
  89. #    -yscrollcommand "tixCObjView:YScroll $w"
  90.  
  91.     $data(w:hsb) config -command "tixCObjView:UserScroll $w x"
  92.     $data(w:vsb) config -command "tixCObjView:UserScroll $w y"
  93. }
  94.  
  95. #----------------------------------------------------------------------
  96. #
  97. #        option configs
  98. #----------------------------------------------------------------------
  99. proc tixCObjView:config-takefocus {w value} {
  100.     upvar #0 $w data
  101.   
  102.     $data(w:canvas) config -takefocus $value
  103. }    
  104.  
  105. #----------------------------------------------------------------------
  106. #
  107. #        Widget commands
  108. #----------------------------------------------------------------------
  109. proc tixCObjView:adjustscrollregion {w} {
  110.     upvar #0 $w data
  111.  
  112.     set cW [tixWinWidth  $data(w:canvas)]
  113.     set cH [tixWinHeight $data(w:canvas)]
  114.  
  115.     tixCObjView:GetScrollRegion $w $cW $cH 1 1
  116. }
  117.  
  118. #----------------------------------------------------------------------
  119. #
  120. #        Private Methods
  121. #----------------------------------------------------------------------
  122.  
  123. proc tixCObjView:GeometryInfo {w cW cH} {
  124.     upvar #0 $w data
  125.  
  126.     set bd \
  127.     [expr [$data(w:canvas) cget -bd] + [$data(w:canvas) cget -highlightthickness]]
  128.  
  129.     incr cW -[expr {2*$bd}]
  130.     incr cH -[expr {2*$bd}]
  131.  
  132.     return [tixCObjView:GetScrollRegion $w $cW $cH 0 0]
  133. }
  134.  
  135. proc tixCObjView:PlaceWindow {w} {
  136.     upvar #0 $w data
  137.  
  138.     set cW [tixWinWidth  $data(w:canvas)]
  139.     set cH [tixWinHeight $data(w:canvas)]
  140.  
  141.     tixCObjView:GetScrollRegion $w $cW $cH 1 0
  142.  
  143.     tixChainMethod $w PlaceWindow
  144. }
  145.  
  146. proc tixCObjView:GetScrollRegion {w cW cH setReg callConfig} {
  147.     upvar #0 $w data
  148.  
  149.     set x1max $data(xorig)
  150.     set y1max $data(yorig)
  151.  
  152.     set x2min [expr {$x1max + $cW - 1}]
  153.     set y2min [expr {$y1max + $cH - 1}]
  154.  
  155.     set bbox [$data(w:canvas) bbox all]
  156.  
  157.     if {$bbox == ""} {
  158.     set bbox {0 0 1 1}
  159.     }
  160.  
  161.     set x1 [lindex $bbox 0]
  162.     set y1 [lindex $bbox 1]
  163.     set x2 [lindex $bbox 2]
  164.     set y2 [lindex $bbox 3]
  165.  
  166.     set bd \
  167.     [expr [$data(w:canvas) cget -bd] + [$data(w:canvas) cget -highlightthickness]]
  168.  
  169.     incr x1 -$bd
  170.     incr y1 -$bd
  171.     incr x2 -$bd
  172.     incr y2 -$bd
  173.  
  174.     if {$x1 > $x1max} {
  175.     set x1 $x1max
  176.     }
  177.     if {$y1 > $y1max} {
  178.     set y1 $y1max
  179.     }
  180.     if {$x2 < $x2min} {
  181.     set x2 $x2min
  182.     }
  183.     if {$y2 < $y2min} {
  184.     set y2 $y2min
  185.     }
  186.  
  187.     set data(sx1) $x1
  188.     set data(sy1) $y1
  189.     set data(sx2) $x2
  190.     set data(sy2) $y2
  191.  
  192.     set sW [expr {$x2 - $x1 + 1}]
  193.     set sH [expr {$y2 - $y1 + 1}]
  194.  
  195. #    puts "sregion = {$x1 $y1 $x2 $y2}; sW=$sW; cW=$cW"
  196.  
  197.     if {$sW > $cW} {
  198.     set hsbSpec {0.5 1}
  199.     } else {
  200.     set hsbSpec {0 1}
  201.     }
  202.     if {$sH > $cH} {
  203.     set vsbSpec {0.5 1}
  204.     } else {
  205.     set vsbSpec {0 1}
  206.     }
  207.  
  208.     if $setReg {
  209.     tixCObjView:SetScrollBars $w $cW $cH $sW $sH
  210.     }
  211.     if $callConfig {
  212.     tixWidgetDoWhenIdle tixScrolledWidget:Configure $w
  213.     }
  214.  
  215.     return [list $hsbSpec $vsbSpec]
  216. }
  217.  
  218. #xF = xFirst
  219. #
  220. proc tixCObjView:SetScrollBars {w cW cH sW sH} {
  221.     upvar #0 $w data
  222.  
  223. #    puts "$data(xorig) <--> $data(sx1)"
  224.  
  225.     set xF [expr ($data(xorig).0-$data(sx1).0)/$sW.0]
  226.     set xL [expr $cW.0/$sW.0 + $xF]
  227.  
  228.     set yF [expr ($data(yorig).0-$data(sy1).0)/$sH.0]
  229.     set yL [expr $cH.0/$sH.0 + $yF]
  230.  
  231. #    puts "$xF $xL : $yF $yL"
  232.     $data(w:hsb) set $xF $xL    
  233.     $data(w:vsb) set $yF $yL    
  234. }
  235.  
  236. proc tixCObjView:UserScroll {w dir type args} {
  237.     upvar #0 $w data
  238.  
  239.     $data(w:canvas) config -xscrollincrement 1 -yscrollincrement 1
  240.  
  241.     case $dir {
  242.     x {
  243.         set n $data(xorig)
  244.         set orig $data(xorig)
  245.         set s1 $data(sx1)
  246.         set total [expr {$data(sx2)-$data(sx1)}]
  247.         set page  [tixWinWidth $data(w:canvas)]
  248.         set min $data(sx1)
  249.         set max [expr {$data(sx1)+$total-$page}]
  250.         set inc $data(-xscrollincrement)
  251.     }
  252.     y {
  253.         set n $data(yorig)
  254.         set orig $data(yorig)
  255.         set s1 $data(sy1)
  256.         set total [expr {$data(sy2)-$data(sy1)}]
  257.         set page  [tixWinHeight $data(w:canvas)]
  258.         set min $data(sy1)
  259.         set max [expr {$data(sy1)+$total-$page}]
  260.         set inc $data(-yscrollincrement)
  261.     }
  262.     }
  263.         
  264.     case $type {
  265.     scroll {
  266.         set amt  [lindex $args 0] 
  267.         set unit [lindex $args 1] 
  268.  
  269.         case $unit {
  270.         units {
  271.             incr n [expr int($inc)*$amt]
  272.         }
  273.         pages {
  274.             incr n [expr {$page*$amt}]
  275.         }
  276.         }
  277.     }
  278.     moveto {
  279.         set first [lindex $args 0] 
  280.         set n [expr round($first*$total)+$s1]
  281.     }
  282.     }
  283.  
  284.     if {$n < $min} {
  285.     set n $min
  286.     }
  287.     if {$n > $max} {
  288.     set n $max
  289.     }
  290.  
  291. #    puts "n=$n min=$min max=$max"
  292.  
  293.     case $dir {
  294.     x {
  295.         $data(w:canvas) xview scroll [expr {$n-$orig}] units
  296.         set data(xorig) $n
  297.     }
  298.     y {
  299.         $data(w:canvas) yview scroll [expr {$n-$orig}] units
  300.         set data(yorig) $n
  301.     }
  302.     }
  303.  
  304.     set cW [tixWinWidth $data(w:canvas)]
  305.     set cH [tixWinHeight $data(w:canvas)]
  306.     set sW [expr {$data(sx2)-$data(sx1)+1}]
  307.     set sH [expr {$data(sy2)-$data(sy1)+1}]
  308.  
  309.     tixCObjView:SetScrollBars $w $cW $cH $sW $sH
  310. }
  311.  
  312. # Junk
  313. #
  314. #
  315. proc tixCObjView:XScroll {w first last} {
  316.     upvar #0 $w data
  317.  
  318.     set sc [$data(w:canvas) cget -scrollregion]
  319.     if {$sc == ""} {
  320.     set x1 1
  321.     set x2 [tixWinWidth $data(w:canvas)]
  322.     } else {
  323.     set x1 [lindex $sc 0]
  324.     set x2 [lindex $sc 2]
  325.     }
  326.     
  327.     set W [expr {$x2 - $x1}]
  328.     if {$W < 1} {
  329.     set W 1
  330.     }
  331.  
  332.     $data(w:hsb) set $first $last
  333.  
  334. #    tixWidgetDoWhenIdle tixScrolledWidget:Configure $w
  335. }
  336.  
  337. # Junk
  338. #
  339. proc tixCObjView:YScroll {w first last} {
  340.     upvar #0 $w data
  341.  
  342.     set sc [$data(w:canvas) cget -scrollregion]
  343.  
  344.     if {$sc == ""} {
  345.     set y1 1
  346.     set y2 [tixWinHeight $data(w:canvas)]
  347.     } else {
  348.     set y1 [lindex $sc 1]
  349.     set y2 [lindex $sc 3]
  350.     }
  351.     
  352.     set H [expr {$y2 - $y1}]
  353.     if {$H < 1} {
  354.     set H 1
  355.     }
  356.  
  357.     $data(w:vsb) set $first $last
  358.  
  359. #   tixWidgetDoWhenIdle tixScrolledWidget:Configure $w
  360. }
  361.