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 / IconView.tcl < prev    next >
Text File  |  2001-12-08  |  6KB  |  273 lines

  1. # -*- mode: TCL; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
  2. #
  3. #    $Id: IconView.tcl,v 1.1.1.1.2.2 2001/12/09 02:54:02 idiscovery Exp $
  4. #
  5. # IconView.tcl --
  6. #
  7. #    This file implements the Icon View widget: the "icon" view mode of
  8. #    the MultiView widget. It implements:
  9. #
  10. #    (1) Creation of the icons in the canvas subwidget.
  11. #    (2) Automatic arrangement of the objects
  12. #
  13. # Copyright (c) 1993-1999 Ioi Kim Lam.
  14. # Copyright (c) 2000-2001 Tix Project Group.
  15. #
  16. # See the file "license.terms" for information on usage and redistribution
  17. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  18. #
  19.  
  20. tixWidgetClass tixIconView {
  21.     -classname TixIconView
  22.     -superclass tixCObjView
  23.     -method {
  24.     add arrange
  25.     }
  26.     -flag {
  27.     -autoarrange
  28.     }
  29.     -static {
  30.     }
  31.     -configspec {
  32.     {-autoarrange autoArrange AutoArrange 0 tixVerifyBoolean}
  33.     }
  34.     -default {
  35.     {.scrollbar            auto}
  36.     {*borderWidth            1}
  37.     {*canvas.background        #c3c3c3}
  38.     {*canvas.highlightBackground    #d9d9d9}
  39.     {*canvas.relief            sunken}
  40.     {*canvas.takeFocus        1}
  41.     {*Scrollbar.takeFocus        0}
  42.     }
  43.     -forcecall {
  44.     }
  45. }
  46.  
  47. proc tixIconView:ConstructWidget {w} {
  48.     upvar #0 $w data
  49.  
  50.     tixChainMethod $w ConstructWidget
  51. }
  52.  
  53. proc tixIconView:SetBindings {w} {
  54.     upvar #0 $w data
  55.  
  56.     tixChainMethod $w SetBindings
  57.  
  58.     set c $data(w:canvas)
  59.  
  60.     bind $c <1>         "tixIconView:StartDrag $w %x %y"
  61.     bind $c <B1-Motion> "tixIconView:Drag $w %x %y"
  62.     bind $c <ButtonRelease-1> "tixIconView:EndDrag $w"
  63. }
  64.  
  65. proc tixIconView:StartDrag {w x y} {
  66.     upvar #0 $w data
  67.     global lastX lastY
  68.  
  69.     set c $data(w:canvas)
  70.     $c raise current
  71.  
  72.     set lastX [$c canvasx $x]
  73.     set lastY [$c canvasy $y]
  74. }
  75.  
  76.  
  77. proc tixIconView:Drag {w x y} {
  78.     upvar #0 $w data
  79.     global lastX lastY
  80.  
  81.     set c $data(w:canvas)
  82.     set x [$c canvasx $x]
  83.     set y [$c canvasy $y]
  84.     $c move current [expr $x-$lastX] [expr $y-$lastY]
  85.     set lastX $x
  86.     set lastY $y
  87. }
  88.  
  89. proc tixIconView:EndDrag {w} {
  90.     upvar #0 $w data
  91.  
  92.     tixCallMethod $w adjustscrollregion
  93. }
  94.  
  95. #----------------------------------------------------------------------
  96. #
  97. #        option configs
  98. #----------------------------------------------------------------------
  99. proc tixIconView:add {w tag image text} {
  100.     upvar #0 $w data
  101.  
  102.     set cmp [image create compound -window $data(w:canvas)]
  103.  
  104.     $cmp add image -image $image
  105.     $cmp add line
  106.     $cmp add text -text $text
  107.  
  108.     set id [$data(w:canvas) create image 0 0 -image $cmp -anchor nw]
  109.     $data(w:canvas) addtag $tag withtag $id
  110.  
  111.     if {$data(-autoarrange)} {
  112.     tixWidgetDoWhenIdle tixIconView:Arrange $w 1
  113.     }
  114. }
  115.  
  116. # Do it in an idle handler, so that Arrange is not called before the window
  117. # is properly mapped.
  118. #
  119. proc tixIconView:arrange {w} {
  120.     tixWidgetDoWhenIdle tixIconView:Arrange $w 1
  121. }
  122.  
  123.  
  124. proc tixIconView:PackOneRow {w row y maxH bd padX padY} {
  125.     upvar #0 $w data
  126.  
  127.     set iX [expr $bd+$padX]
  128.     foreach i $row {
  129.     set box [$data(w:canvas) bbox $i]
  130.     set W [expr [lindex $box 2]-[lindex $box 0]+1]
  131.     set H [expr [lindex $box 3]-[lindex $box 1]+1]
  132.  
  133.     set iY [expr $y + $maxH - $H]
  134.     $data(w:canvas) coords $i $iX $iY
  135.     incr iX [expr $W+$padX]
  136.     }
  137. }
  138.  
  139. # virtual method
  140. #
  141. proc tixIconView:PlaceWindow {w} {
  142.     upvar #0 $w data
  143.  
  144.     if {$data(-autoarrange)} {
  145.     tixWidgetDoWhenIdle tixIconView:Arrange $w 0
  146.     }
  147.  
  148.     tixChainMethod $w PlaceWindow
  149. }
  150.  
  151. proc tixIconView:Arrange {w adjust} {
  152.     upvar #0 $w data
  153.  
  154.     set padX 2
  155.     set padY 2
  156.  
  157.     tixIconView:ArrangeGrid $w $padX $padY
  158.     if {$adjust} {
  159.     tixCallMethod $w adjustscrollregion
  160.     }
  161. }
  162.  
  163. # the items are not packed
  164. #
  165. proc tixIconView:ArrangeGrid {w padX padY} {
  166.     upvar #0 $w data
  167.  
  168.     set maxW 0
  169.     set maxH 0
  170.     foreach item [$data(w:canvas) find all] {
  171.     set box [$data(w:canvas) bbox $item]
  172.     set itemW [expr [lindex $box 2]-[lindex $box 0]+1]
  173.     set itemH [expr [lindex $box 3]-[lindex $box 1]+1]
  174.     if {$maxW < $itemW} {
  175.         set maxW $itemW
  176.     }
  177.     if {$maxH < $itemH} {
  178.         set maxH $itemH
  179.     }
  180.     }
  181.     if {$maxW == 0 || $maxH == 0} {
  182.     return
  183.     }
  184.  
  185.     set winW [tixWinWidth $data(w:canvas)]
  186.     set bd [expr [$data(w:canvas) cget -bd]+\
  187.     [$data(w:canvas) cget -highlightthickness]]
  188.     set cols [expr $winW / ($maxW+$padX)]
  189.     if {$cols < 1} {
  190.     set cols 1
  191.     }
  192.     set y $bd
  193.  
  194.     set c 0
  195.     set x $bd
  196.     foreach item [$data(w:canvas) find all] {
  197.     set box [$data(w:canvas) bbox $item]
  198.     set itemW [expr [lindex $box 2]-[lindex $box 0]+1]
  199.     set itemH [expr [lindex $box 3]-[lindex $box 1]+1]
  200.  
  201.     set iX [expr $x + $padX + ($maxW-$itemW)/2]
  202.     set iY [expr $y + $padY + ($maxH-$itemH)  ]
  203.  
  204.     $data(w:canvas) coords $item $iX $iY
  205.     incr c
  206.     incr x [expr $maxW + $padY]
  207.     if {$c == $cols} {
  208.         set c 0
  209.         incr y [expr $maxH + $padY]
  210.         set x $bd
  211.     }
  212.     }
  213. }
  214.  
  215. # the items are packed
  216. #
  217. proc tixIconView:ArrangePack {w padX padY} {
  218.     upvar #0 $w data
  219.  
  220.     set winW [tixWinWidth $data(w:canvas)]
  221.     set bd [expr [$data(w:canvas) cget -bd]+\
  222.     [$data(w:canvas) cget -highlightthickness]]
  223.     set y [expr $bd + $padY]
  224.  
  225.     set maxH 0
  226.     set usedW $padX
  227.     set row ""
  228.     foreach item [$data(w:canvas) find all] {
  229.     set box [$data(w:canvas) bbox $item]
  230.     set itemW [expr [lindex $box 2]-[lindex $box 0]+1]
  231.     set itemH [expr [lindex $box 3]-[lindex $box 1]+1]
  232.  
  233.     if {[expr $usedW + $itemW] > $winW} {
  234.         if {$row == ""} {
  235.         # only one item in this row
  236.         #
  237.         $data(w:canvas) coords $item [expr $bd + $padX] $y
  238.         incr y [expr $itemH+$padY]
  239.         continue
  240.         } else {
  241.         # this item is not in this row. Arrange the previous items
  242.         # first
  243.         #
  244.         tixIconView:PackOneRow $w $row $y $maxH $bd $padX $padY
  245.  
  246.         incr y $maxH
  247.         set row ""
  248.         set maxH 0
  249.         set usedW $padX
  250.         }
  251.     }
  252.     lappend row $item
  253.     if {$maxH < $itemH} {
  254.         set maxH $itemH
  255.     }
  256.     incr usedW [expr $padX+$itemW]
  257.     }
  258.     if {$row != ""} {
  259.     tixIconView:PackOneRow $w $row $y $maxH $bd $padX $padY
  260.     }
  261. }
  262.  
  263. #----------------------------------------------------------------------
  264. #
  265. #        Widget commands
  266. #----------------------------------------------------------------------
  267.  
  268. #----------------------------------------------------------------------
  269. #
  270. #        Private Methods
  271. #----------------------------------------------------------------------
  272.  
  273.