Spaces:
Sleeping
Sleeping
# -*- mode: TCL; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*- | |
# | |
# $Id: IconView.tcl,v 1.2 2001/12/09 05:04:02 idiscovery Exp $ | |
# | |
# IconView.tcl -- | |
# | |
# This file implements the Icon View widget: the "icon" view mode of | |
# the MultiView widget. It implements: | |
# | |
# (1) Creation of the icons in the canvas subwidget. | |
# (2) Automatic arrangement of the objects | |
# | |
# Copyright (c) 1993-1999 Ioi Kim Lam. | |
# Copyright (c) 2000-2001 Tix Project Group. | |
# | |
# See the file "license.terms" for information on usage and redistribution | |
# of this file, and for a DISCLAIMER OF ALL WARRANTIES. | |
# | |
tixWidgetClass tixIconView { | |
-classname TixIconView | |
-superclass tixCObjView | |
-method { | |
add arrange | |
} | |
-flag { | |
-autoarrange | |
} | |
-static { | |
} | |
-configspec { | |
{-autoarrange autoArrange AutoArrange 0 tixVerifyBoolean} | |
} | |
-default { | |
{.scrollbar auto} | |
{*borderWidth 1} | |
{*canvas.background #c3c3c3} | |
{*canvas.highlightBackground #d9d9d9} | |
{*canvas.relief sunken} | |
{*canvas.takeFocus 1} | |
{*Scrollbar.takeFocus 0} | |
} | |
-forcecall { | |
} | |
} | |
proc tixIconView:ConstructWidget {w} { | |
upvar #0 $w data | |
tixChainMethod $w ConstructWidget | |
} | |
proc tixIconView:SetBindings {w} { | |
upvar #0 $w data | |
tixChainMethod $w SetBindings | |
set c $data(w:canvas) | |
bind $c <1> "tixIconView:StartDrag $w %x %y" | |
bind $c <B1-Motion> "tixIconView:Drag $w %x %y" | |
bind $c <ButtonRelease-1> "tixIconView:EndDrag $w" | |
} | |
proc tixIconView:StartDrag {w x y} { | |
upvar #0 $w data | |
global lastX lastY | |
set c $data(w:canvas) | |
$c raise current | |
set lastX [$c canvasx $x] | |
set lastY [$c canvasy $y] | |
} | |
proc tixIconView:Drag {w x y} { | |
upvar #0 $w data | |
global lastX lastY | |
set c $data(w:canvas) | |
set x [$c canvasx $x] | |
set y [$c canvasy $y] | |
$c move current [expr $x-$lastX] [expr $y-$lastY] | |
set lastX $x | |
set lastY $y | |
} | |
proc tixIconView:EndDrag {w} { | |
upvar #0 $w data | |
tixCallMethod $w adjustscrollregion | |
} | |
#---------------------------------------------------------------------- | |
# | |
# option configs | |
#---------------------------------------------------------------------- | |
proc tixIconView:add {w tag image text} { | |
upvar #0 $w data | |
set cmp [image create compound -window $data(w:canvas)] | |
$cmp add image -image $image | |
$cmp add line | |
$cmp add text -text $text | |
set id [$data(w:canvas) create image 0 0 -image $cmp -anchor nw] | |
$data(w:canvas) addtag $tag withtag $id | |
if {$data(-autoarrange)} { | |
tixWidgetDoWhenIdle tixIconView:Arrange $w 1 | |
} | |
} | |
# Do it in an idle handler, so that Arrange is not called before the window | |
# is properly mapped. | |
# | |
proc tixIconView:arrange {w} { | |
tixWidgetDoWhenIdle tixIconView:Arrange $w 1 | |
} | |
proc tixIconView:PackOneRow {w row y maxH bd padX padY} { | |
upvar #0 $w data | |
set iX [expr $bd+$padX] | |
foreach i $row { | |
set box [$data(w:canvas) bbox $i] | |
set W [expr [lindex $box 2]-[lindex $box 0]+1] | |
set H [expr [lindex $box 3]-[lindex $box 1]+1] | |
set iY [expr $y + $maxH - $H] | |
$data(w:canvas) coords $i $iX $iY | |
incr iX [expr $W+$padX] | |
} | |
} | |
# virtual method | |
# | |
proc tixIconView:PlaceWindow {w} { | |
upvar #0 $w data | |
if {$data(-autoarrange)} { | |
tixWidgetDoWhenIdle tixIconView:Arrange $w 0 | |
} | |
tixChainMethod $w PlaceWindow | |
} | |
proc tixIconView:Arrange {w adjust} { | |
upvar #0 $w data | |
set padX 2 | |
set padY 2 | |
tixIconView:ArrangeGrid $w $padX $padY | |
if {$adjust} { | |
tixCallMethod $w adjustscrollregion | |
} | |
} | |
# the items are not packed | |
# | |
proc tixIconView:ArrangeGrid {w padX padY} { | |
upvar #0 $w data | |
set maxW 0 | |
set maxH 0 | |
foreach item [$data(w:canvas) find all] { | |
set box [$data(w:canvas) bbox $item] | |
set itemW [expr [lindex $box 2]-[lindex $box 0]+1] | |
set itemH [expr [lindex $box 3]-[lindex $box 1]+1] | |
if {$maxW < $itemW} { | |
set maxW $itemW | |
} | |
if {$maxH < $itemH} { | |
set maxH $itemH | |
} | |
} | |
if {$maxW == 0 || $maxH == 0} { | |
return | |
} | |
set winW [tixWinWidth $data(w:canvas)] | |
set bd [expr [$data(w:canvas) cget -bd]+\ | |
[$data(w:canvas) cget -highlightthickness]] | |
set cols [expr $winW / ($maxW+$padX)] | |
if {$cols < 1} { | |
set cols 1 | |
} | |
set y $bd | |
set c 0 | |
set x $bd | |
foreach item [$data(w:canvas) find all] { | |
set box [$data(w:canvas) bbox $item] | |
set itemW [expr [lindex $box 2]-[lindex $box 0]+1] | |
set itemH [expr [lindex $box 3]-[lindex $box 1]+1] | |
set iX [expr $x + $padX + ($maxW-$itemW)/2] | |
set iY [expr $y + $padY + ($maxH-$itemH) ] | |
$data(w:canvas) coords $item $iX $iY | |
incr c | |
incr x [expr $maxW + $padY] | |
if {$c == $cols} { | |
set c 0 | |
incr y [expr $maxH + $padY] | |
set x $bd | |
} | |
} | |
} | |
# the items are packed | |
# | |
proc tixIconView:ArrangePack {w padX padY} { | |
upvar #0 $w data | |
set winW [tixWinWidth $data(w:canvas)] | |
set bd [expr [$data(w:canvas) cget -bd]+\ | |
[$data(w:canvas) cget -highlightthickness]] | |
set y [expr $bd + $padY] | |
set maxH 0 | |
set usedW $padX | |
set row "" | |
foreach item [$data(w:canvas) find all] { | |
set box [$data(w:canvas) bbox $item] | |
set itemW [expr [lindex $box 2]-[lindex $box 0]+1] | |
set itemH [expr [lindex $box 3]-[lindex $box 1]+1] | |
if {[expr $usedW + $itemW] > $winW} { | |
if {$row == ""} { | |
# only one item in this row | |
# | |
$data(w:canvas) coords $item [expr $bd + $padX] $y | |
incr y [expr $itemH+$padY] | |
continue | |
} else { | |
# this item is not in this row. Arrange the previous items | |
# first | |
# | |
tixIconView:PackOneRow $w $row $y $maxH $bd $padX $padY | |
incr y $maxH | |
set row "" | |
set maxH 0 | |
set usedW $padX | |
} | |
} | |
lappend row $item | |
if {$maxH < $itemH} { | |
set maxH $itemH | |
} | |
incr usedW [expr $padX+$itemW] | |
} | |
if {$row != ""} { | |
tixIconView:PackOneRow $w $row $y $maxH $bd $padX $padY | |
} | |
} | |
#---------------------------------------------------------------------- | |
# | |
# Widget commands | |
#---------------------------------------------------------------------- | |
#---------------------------------------------------------------------- | |
# | |
# Private Methods | |
#---------------------------------------------------------------------- | |